summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/anv_blorp.c8
-rw-r--r--src/intel/vulkan/anv_private.h8
-rw-r--r--src/intel/vulkan/genX_cmd_buffer.c37
3 files changed, 35 insertions, 18 deletions
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);
+ }
}
/**