From 93e42f9700e27233ab82bcadbf9de2f6c197d698 Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Fri, 6 Sep 2024 08:50:53 -0400 Subject: [PATCH] anv: Store fast-clear colors with the view swizzle Prevents the next patch from failing CTS tests such as: dEQP-VK.api.image_clearing.core.clear_color_image.*.b4g4r4a4* Brings back the feature that was introduced in commit 46187bb54fe ("anv: Swizzle fast-clear values"), but went unused in commit 721d0c3e775 ("anv,hasvk: Always use BLORP_BATCH_NO_UPDATE_CLEAR_COLOR"). Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_blorp.c | 2 ++ src/intel/vulkan/anv_cmd_buffer.c | 3 ++- src/intel/vulkan/anv_genX.h | 1 + src/intel/vulkan/anv_private.h | 1 + src/intel/vulkan/genX_cmd_buffer.c | 6 +++++- 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index bc43ed60c14..90ba3ee2f77 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1474,6 +1474,7 @@ void anv_CmdClearColorImage( if (cmd_buffer->device->info->ver < 20) { anv_cmd_buffer_mark_image_fast_cleared(cmd_buffer, image, src_format.isl_format, + src_format.swizzle, clear_color); } @@ -1705,6 +1706,7 @@ clear_color_attachment(struct anv_cmd_buffer *cmd_buffer, if (cmd_buffer->device->info->ver < 20) { anv_cmd_buffer_mark_image_fast_cleared(cmd_buffer, iview->image, iview->planes[0].isl.format, + iview->planes[0].isl.swizzle, clear_color); anv_cmd_buffer_load_clear_color(cmd_buffer, att->surface_state.state, iview); diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index cb2ab15f413..1d5e6cef1c4 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -345,10 +345,11 @@ void anv_cmd_buffer_mark_image_fast_cleared(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, const enum isl_format format, + const struct isl_swizzle swizzle, union isl_color_value clear_color) { const struct intel_device_info *devinfo = cmd_buffer->device->info; - anv_genX(devinfo, set_fast_clear_state)(cmd_buffer, image, format, + anv_genX(devinfo, set_fast_clear_state)(cmd_buffer, image, format, swizzle, clear_color); } diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index 4c141048ded..52f8115d332 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -75,6 +75,7 @@ void genX(set_fast_clear_state)(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, const enum isl_format format, + const struct isl_swizzle swizzle, union isl_color_value clear_color); void diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 803c55573eb..15b1267e06d 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -5791,6 +5791,7 @@ void anv_cmd_buffer_mark_image_fast_cleared(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, const enum isl_format format, + const struct isl_swizzle swizzle, union isl_color_value clear_color); void diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 2dddb3e290f..f42714861d3 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -977,10 +977,13 @@ void genX(set_fast_clear_state)(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, const enum isl_format format, + const struct isl_swizzle swizzle, union isl_color_value clear_color) { uint32_t pixel[4] = {}; - isl_color_value_pack(&clear_color, format, pixel); + union isl_color_value swiz_color = + isl_color_value_swizzle_inv(clear_color, swizzle); + isl_color_value_pack(&swiz_color, format, pixel); set_image_clear_color(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, pixel); if (isl_color_value_is_zero(clear_color, format)) { @@ -5414,6 +5417,7 @@ void genX(CmdBeginRendering)( #if GFX_VER < 20 genX(set_fast_clear_state)(cmd_buffer, iview->image, iview->planes[0].isl.format, + iview->planes[0].isl.swizzle, clear_color); #endif }