From: Nanley Chery Date: Tue, 11 Jul 2017 17:46:58 +0000 (-0700) Subject: anv: Transition MCS buffers from the undefined layout X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b178e239dd7205a93ae3cf6c0a24c2c555bf333f;p=mesa.git anv: Transition MCS buffers from the undefined layout v2: Define MCS buffers with any sample count (Jason) Cc: Suggested-by: Jason Ekstrand Signed-off-by: Nanley Chery --- diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index eca7a7e9dbc..232bee4bb53 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1436,10 +1436,10 @@ void anv_CmdResolveImage( } void -anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer, - const struct anv_image *image, - const uint32_t base_level, const uint32_t level_count, - const uint32_t base_layer, uint32_t layer_count) +anv_image_fast_clear(struct anv_cmd_buffer *cmd_buffer, + const struct anv_image *image, + const uint32_t base_level, const uint32_t level_count, + const uint32_t base_layer, uint32_t layer_count) { assert(image->type == VK_IMAGE_TYPE_3D || image->extent.depth == 1); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 4dce360c76e..9a5d2d6fa49 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -2108,10 +2108,10 @@ anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer, const enum blorp_fast_clear_op op); void -anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer, - const struct anv_image *image, - const uint32_t base_level, const uint32_t level_count, - const uint32_t base_layer, uint32_t layer_count); +anv_image_fast_clear(struct anv_cmd_buffer *cmd_buffer, + const struct anv_image *image, + const uint32_t base_level, const uint32_t level_count, + const uint32_t base_layer, uint32_t layer_count); enum isl_aux_usage anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 9b3bb101645..963634f55e3 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -392,7 +392,9 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, VkImageLayout initial_layout, VkImageLayout final_layout) { - if (image->aux_usage != ISL_AUX_USAGE_CCS_E) + assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); + + if (image->aux_usage == ISL_AUX_USAGE_NONE) return; if (initial_layout != VK_IMAGE_LAYOUT_UNDEFINED && @@ -405,15 +407,30 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, layer_count = anv_minify(image->extent.depth, base_level); } -#if GEN_GEN >= 9 - /* We're transitioning from an undefined layout so it doesn't really matter - * what data ends up in the color buffer. We do, however, need to ensure - * that the CCS has valid data in it. One easy way to do that is to - * fast-clear the specified range. - */ - anv_image_ccs_clear(cmd_buffer, image, base_level, level_count, - base_layer, layer_count); -#endif + if (image->aux_usage == ISL_AUX_USAGE_CCS_E || + image->aux_usage == ISL_AUX_USAGE_MCS) { + /* We're transitioning from an undefined layout so it doesn't really + * matter what data ends up in the color buffer. We do, however, need to + * ensure that the auxiliary surface is not in an undefined state. This + * state is possible for CCS buffers SKL+ and MCS buffers with certain + * sample counts that require certain bits to be reserved (2x and 8x). + * One easy way to get to a valid state is to fast-clear the specified + * range. + * + * Even for MCS buffers that have sample counts that don't require + * certain bits to be reserved (4x and 8x), we're unsure if the hardware + * will be okay with the sample mappings given by the undefined buffer. + * We don't have any data to show that this is a problem, but we want to + * avoid causing difficult-to-debug problems. + */ + if (image->samples == 4 || image->samples == 16) { + anv_perf_warn("Doing a potentially unnecessary fast-clear to define " + "an MCS buffer."); + } + + anv_image_fast_clear(cmd_buffer, image, base_level, level_count, + base_layer, layer_count); + } } /**