The lifespan of the fast-clear data will surpass the render pass scope. We need CCS_D to be enabled in order to invalidate blocks previously marked as cleared and to sample cleared data correctly.
Signed-off-by: Nanley Chery <nanley.g.ch...@intel.com> --- src/intel/vulkan/anv_blorp.c | 15 ++---- src/intel/vulkan/genX_cmd_buffer.c | 94 +++++++++++++++++++------------------- 2 files changed, 52 insertions(+), 57 deletions(-) diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 7b6944ad53..3aa353c15c 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1383,7 +1383,8 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer, &cmd_buffer->state.attachments[att]; if (att_state->aux_usage == ISL_AUX_USAGE_NONE || - att_state->aux_usage == ISL_AUX_USAGE_MCS) + att_state->aux_usage == ISL_AUX_USAGE_MCS || + att_state->fast_clear == false) return; /* Nothing to resolve */ assert(att_state->aux_usage == ISL_AUX_USAGE_CCS_E || @@ -1432,7 +1433,7 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer, * the render pass. We need a full resolve. */ resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL; - } else if (att_state->fast_clear) { + } else { /* We don't know what to do with clear colors outside the render * pass. We need a partial resolve. Only transparent black is * built into the surface state object and thus no resolve is @@ -1443,11 +1444,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer, att_state->clear_value.color.uint32[2] || att_state->clear_value.color.uint32[3]) resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL; - } else { - /* The image "natively" supports all the compression we care about - * and we don't need to resolve at all. If this is the case, we also - * don't need to resolve for any of the input attachment cases below. - */ } } else if (usage & ANV_SUBPASS_USAGE_INPUT) { /* Input attachments are clear-color aware so, at least on Sky Lake, we @@ -1474,8 +1470,7 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer, struct blorp_surf surf; get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, att_state->aux_usage, &surf); - if (att_state->fast_clear) - surf.clear_color = vk_to_isl_color(att_state->clear_value.color); + surf.clear_color = vk_to_isl_color(att_state->clear_value.color); /* From the Sky Lake PRM Vol. 7, "Render Target Resolve": * @@ -1504,8 +1499,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer, /* Once we've done any sort of resolve, we're no longer fast-cleared */ att_state->fast_clear = false; - if (att_state->aux_usage == ISL_AUX_USAGE_CCS_D) - att_state->aux_usage = ISL_AUX_USAGE_NONE; } void diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index ef9b7d0554..b941447873 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -244,6 +244,50 @@ color_attachment_compute_aux_usage(struct anv_device *device, att_state->input_aux_usage = ISL_AUX_USAGE_MCS; att_state->fast_clear = false; return; + } else if (GEN_GEN == 7 && + (iview->isl.base_level > 0 || + iview->isl.base_array_layer > 0 || + iview->isl.array_len > 1)) { + /* On gen7, we can't do multi-LOD or multi-layer CCS. We technically + * can, but it comes with crazy restrictions that we don't want to deal + * with now. + */ + att_state->aux_usage = ISL_AUX_USAGE_NONE; + att_state->input_aux_usage = ISL_AUX_USAGE_NONE; + att_state->fast_clear = false; + return; + } else if (iview->image->aux_usage == ISL_AUX_USAGE_CCS_E) { + att_state->aux_usage = ISL_AUX_USAGE_CCS_E; + att_state->input_aux_usage = ISL_AUX_USAGE_CCS_E; + } else { + att_state->aux_usage = ISL_AUX_USAGE_CCS_D; + if (isl_format_supports_ccs_e(&device->info, iview->isl.format)) { + /* SKL can sample from CCS with one restriction. + * + * From the Sky Lake PRM, RENDER_SURFACE_STATE::AuxiliarySurfaceMode: + * + * "If Number of Multisamples is MULTISAMPLECOUNT_1, AUX_CCS_D + * setting is only allowed if Surface Format supported for Fast + * Clear. In addition, if the surface is bound to the sampling + * engine, Surface Format must be supported for Render Target + * Compression for surfaces bound to the sampling engine." + * + * In other words, we can only sample from a fast-cleared image if it + * also supports color compression. + * + * TODO: Consider using a heuristic to determine if temporarily enabling + * CCS_E for this image view would be beneficial. + * + * While fast-clear resolves and partial resolves are fairly cheap in the + * case where you render to most of the pixels, full resolves are not + * because they potentially involve reading and writing the entire + * framebuffer. If we can't texture with CCS_E, we should leave it off and + * limit ourselves to fast clears. + */ + att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D; + } else { + att_state->input_aux_usage = ISL_AUX_USAGE_NONE; + } } assert(iview->image->aux_surface.isl.usage & ISL_SURF_USAGE_CCS_BIT); @@ -252,6 +296,10 @@ color_attachment_compute_aux_usage(struct anv_device *device, color_is_zero_one(att_state->clear_value.color, iview->isl.format); if (att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT) { + + /* We should have returned early if the aux buffer will not be used. */ + assert(att_state->aux_usage != ISL_AUX_USAGE_NONE); + /* Start off assuming fast clears are possible */ att_state->fast_clear = true; @@ -265,17 +313,6 @@ color_attachment_compute_aux_usage(struct anv_device *device, render_area.extent.height != iview->extent.height) att_state->fast_clear = false; - if (GEN_GEN <= 7) { - /* On gen7, we can't do multi-LOD or multi-layer fast-clears. We - * technically can, but it comes with crazy restrictions that we - * don't want to deal with now. - */ - if (iview->isl.base_level > 0 || - iview->isl.base_array_layer > 0 || - iview->isl.array_len > 1) - att_state->fast_clear = false; - } - /* On Broadwell and earlier, we can only handle 0/1 clear colors */ if (GEN_GEN <= 8 && !att_state->clear_color_is_zero_one) att_state->fast_clear = false; @@ -287,41 +324,6 @@ color_attachment_compute_aux_usage(struct anv_device *device, } else { att_state->fast_clear = false; } - - /** - * TODO: Consider using a heuristic to determine if temporarily enabling - * CCS_E for this image view would be beneficial. - * - * While fast-clear resolves and partial resolves are fairly cheap in the - * case where you render to most of the pixels, full resolves are not - * because they potentially involve reading and writing the entire - * framebuffer. If we can't texture with CCS_E, we should leave it off and - * limit ourselves to fast clears. - */ - if (iview->image->aux_usage == ISL_AUX_USAGE_CCS_E) { - att_state->aux_usage = ISL_AUX_USAGE_CCS_E; - att_state->input_aux_usage = ISL_AUX_USAGE_CCS_E; - } else if (att_state->fast_clear) { - att_state->aux_usage = ISL_AUX_USAGE_CCS_D; - /* From the Sky Lake PRM, RENDER_SURFACE_STATE::AuxiliarySurfaceMode: - * - * "If Number of Multisamples is MULTISAMPLECOUNT_1, AUX_CCS_D - * setting is only allowed if Surface Format supported for Fast - * Clear. In addition, if the surface is bound to the sampling - * engine, Surface Format must be supported for Render Target - * Compression for surfaces bound to the sampling engine." - * - * In other words, we can only sample from a fast-cleared image if it - * also supports color compression. - */ - if (isl_format_supports_ccs_e(&device->info, iview->isl.format)) - att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D; - else - att_state->input_aux_usage = ISL_AUX_USAGE_NONE; - } else { - att_state->aux_usage = ISL_AUX_USAGE_NONE; - att_state->input_aux_usage = ISL_AUX_USAGE_NONE; - } } static bool -- 2.12.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev