diff --git a/.pick_status.json b/.pick_status.json index 8b9ef6bcb18..2077bee5092 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -6174,7 +6174,7 @@ "description": "anv: fix clears on single aspect of YCbCr images", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index e8997ba183a..2b7fdd7b5c4 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1638,7 +1638,9 @@ void anv_CmdClearColorImage( clear_rect.rect.extent.height, false /* depth clear */, 0 /* depth value */, true /* stencil_clear */, clear_color.u32[0] /* stencil_value */); - } else if (anv_can_fast_clear_color(cmd_buffer, image, level, &clear_rect, + } else if (anv_can_fast_clear_color(cmd_buffer, image, + pRanges[r].aspectMask, + level, &clear_rect, imageLayout, src_format.isl_format, clear_color)) { assert(level == 0); @@ -1841,6 +1843,7 @@ can_fast_clear_color_att(struct anv_cmd_buffer *cmd_buffer, return false; return anv_can_fast_clear_color(cmd_buffer, att->iview->image, + att->iview->vk.aspects, att->iview->vk.base_mip_level, pRects, att->layout, att->iview->planes[0].isl.format, @@ -2466,10 +2469,11 @@ anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer, uint32_t level, uint32_t base_layer, uint32_t layer_count, VkRect2D area, union isl_color_value clear_color) { - assert(image->vk.aspects == VK_IMAGE_ASPECT_COLOR_BIT); + assert((aspect & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0); + assert(util_bitcount(aspect) == 1); /* We don't support planar images with multisampling yet */ - assert(image->n_planes == 1); + assert(image->vk.samples == 1 || image->n_planes == 1); struct blorp_batch batch; anv_blorp_batch_init(cmd_buffer, &batch, 0); diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 1d00824e314..cf8d2f144c3 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -3457,6 +3457,7 @@ anv_layout_to_fast_clear_type(const struct intel_device_info * const devinfo, bool anv_can_fast_clear_color(const struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, + VkImageAspectFlags clear_aspect, unsigned level, const struct VkClearRect *clear_rect, VkImageLayout layout, @@ -3476,7 +3477,7 @@ anv_can_fast_clear_color(const struct anv_cmd_buffer *cmd_buffer, */ enum anv_fast_clear_type fast_clear_type = anv_layout_to_fast_clear_type(cmd_buffer->device->info, image, - VK_IMAGE_ASPECT_COLOR_BIT, layout, + clear_aspect, layout, cmd_buffer->queue_family->queueFlags); switch (fast_clear_type) { case ANV_FAST_CLEAR_NONE: diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d98e8791f61..00e9522e8f0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -6094,6 +6094,7 @@ anv_can_hiz_clear_ds_view(struct anv_device *device, bool anv_can_fast_clear_color(const struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, + VkImageAspectFlags clear_aspect, unsigned level, const struct VkClearRect *clear_rect, VkImageLayout layout, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index ea876241237..a51a0ab3af6 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -5420,6 +5420,7 @@ void genX(CmdBeginRendering)( const bool fast_clear = (!is_multiview || (gfx->view_mask & 1)) && anv_can_fast_clear_color(cmd_buffer, iview->image, + iview->vk.aspects, iview->vk.base_mip_level, &clear_rect, att->imageLayout, iview->planes[0].isl.format,