From b3882c44883efec60b65185c4e4805c5821497b1 Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Mon, 9 Sep 2024 14:00:54 -0400 Subject: [PATCH] intel: Avoid no-op calls to anv_image_clear_color Whenever we execute a fast-clear due to LOAD_OP_CLEAR, we decrease the number of layers to clear by one. We then enter the slow clear function and possibly exit without clearing if the layer count is zero. Unfortunately, we've already compiled the shader for slow clears by the time we exit. Skip the slow clear function if there are no layers to clear. Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/blorp/blorp_clear.c | 2 ++ src/intel/vulkan/anv_blorp.c | 1 + src/intel/vulkan/genX_cmd_buffer.c | 2 +- src/intel/vulkan_hasvk/genX_cmd_buffer.c | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c index b40a501e07d..6a2477ebde0 100644 --- a/src/intel/blorp/blorp_clear.c +++ b/src/intel/blorp/blorp_clear.c @@ -608,6 +608,7 @@ blorp_clear(struct blorp_batch *batch, if (!compute && !blorp_ensure_sf_program(batch, ¶ms)) return; + assert(num_layers > 0); while (num_layers > 0) { blorp_surface_info_init(batch, ¶ms.dst, surf, level, start_layer, format, true); @@ -834,6 +835,7 @@ blorp_clear_depth_stencil(struct blorp_batch *batch, uint8_t stencil_mask, uint8_t stencil_value) { assert((batch->flags & BLORP_BATCH_USE_COMPUTE) == 0); + assert(num_layers > 0); if (!clear_depth && blorp_clear_stencil_as_rgba(batch, stencil, level, start_layer, num_layers, diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index d7f3d7578dd..f71ca65bb77 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -2310,6 +2310,7 @@ anv_image_clear_depth_stencil(struct anv_cmd_buffer *cmd_buffer, { assert(image->vk.aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)); + assert(layer_count > 0); struct blorp_batch batch; anv_blorp_batch_init(cmd_buffer, &batch, 0); diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 16ccc1823da..be4595431c8 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -5309,7 +5309,7 @@ void genX(CmdBeginRendering)( iview->vk.base_array_layer + view, 1, render_area, clear_color); } - } else { + } else if (clear_rect.layerCount > 0) { anv_image_clear_color(cmd_buffer, iview->image, VK_IMAGE_ASPECT_COLOR_BIT, aux_usage, diff --git a/src/intel/vulkan_hasvk/genX_cmd_buffer.c b/src/intel/vulkan_hasvk/genX_cmd_buffer.c index 16463f9ed2e..a6706e8ca3a 100644 --- a/src/intel/vulkan_hasvk/genX_cmd_buffer.c +++ b/src/intel/vulkan_hasvk/genX_cmd_buffer.c @@ -5227,7 +5227,7 @@ void genX(CmdBeginRendering)( iview->vk.base_array_layer + view, 1, render_area, clear_color); } - } else { + } else if (clear_layer_count > 0) { anv_image_clear_color(cmd_buffer, iview->image, VK_IMAGE_ASPECT_COLOR_BIT, aux_usage,