diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 8c728adf764..15e9b1e52c1 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1622,7 +1622,7 @@ radv_emit_fb_color_state(struct radv_cmd_buffer *cmd_buffer, cb_color_info &= C_028C70_DCC_ENABLE; } - if (!radv_layout_can_fast_clear(image, layout, in_render_loop, + if (!radv_layout_can_fast_clear(cmd_buffer->device, image, layout, in_render_loop, radv_image_queue_family_mask(image, cmd_buffer->queue_family_index, cmd_buffer->queue_family_index))) { @@ -6159,7 +6159,7 @@ static void radv_init_color_image_metadata(struct radv_cmd_buffer *cmd_buffer, * layout). */ if (radv_image_has_fmask(image) && - radv_layout_can_fast_clear(image, dst_layout, + radv_layout_can_fast_clear(cmd_buffer->device, image, dst_layout, dst_render_loop, dst_queue_mask)) { value = 0xccccccccu; } @@ -6221,15 +6221,19 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe } else if (radv_layout_dcc_compressed(cmd_buffer->device, image, src_layout, src_render_loop, src_queue_mask) && !radv_layout_dcc_compressed(cmd_buffer->device, image, dst_layout, dst_render_loop, dst_queue_mask)) { radv_decompress_dcc(cmd_buffer, image, range); - } else if (radv_layout_can_fast_clear(image, src_layout, src_render_loop, src_queue_mask) && - !radv_layout_can_fast_clear(image, dst_layout, dst_render_loop, dst_queue_mask)) { + } else if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout, + src_render_loop, src_queue_mask) && + !radv_layout_can_fast_clear(cmd_buffer->device, image, dst_layout, + dst_render_loop, dst_queue_mask)) { radv_fast_clear_flush_image_inplace(cmd_buffer, image, range); } } else if (radv_image_has_cmask(image) || radv_image_has_fmask(image)) { bool fce_eliminate = false, fmask_expand = false; - if (radv_layout_can_fast_clear(image, src_layout, src_render_loop, src_queue_mask) && - !radv_layout_can_fast_clear(image, dst_layout, dst_render_loop, dst_queue_mask)) { + if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout, + src_render_loop, src_queue_mask) && + !radv_layout_can_fast_clear(cmd_buffer->device, image, dst_layout, + dst_render_loop, dst_queue_mask)) { fce_eliminate = true; } diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 60632a5bed9..40d1869541d 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -1779,11 +1779,16 @@ bool radv_layout_is_htile_compressed(const struct radv_image *image, queue_mask == (1u << RADV_QUEUE_GENERAL))); } -bool radv_layout_can_fast_clear(const struct radv_image *image, +bool radv_layout_can_fast_clear(const struct radv_device *device, + const struct radv_image *image, VkImageLayout layout, bool in_render_loop, unsigned queue_mask) { + if (radv_image_has_dcc(image) && + !radv_layout_dcc_compressed(device, image, layout, in_render_loop, queue_mask)) + return false; + return layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL && queue_mask == (1u << RADV_QUEUE_GENERAL); } diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c index 143c36e1e63..63da45cfb83 100644 --- a/src/amd/vulkan/radv_meta_clear.c +++ b/src/amd/vulkan/radv_meta_clear.c @@ -1630,7 +1630,7 @@ radv_can_fast_clear_color(struct radv_cmd_buffer *cmd_buffer, if (!radv_image_view_can_fast_clear(cmd_buffer->device, iview)) return false; - if (!radv_layout_can_fast_clear(iview->image, image_layout, in_render_loop, + if (!radv_layout_can_fast_clear(cmd_buffer->device, iview->image, image_layout, in_render_loop, radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index, cmd_buffer->queue_family_index))) diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 695a971dac8..d0146d8b2bd 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1927,7 +1927,8 @@ bool radv_layout_is_htile_compressed(const struct radv_image *image, bool in_render_loop, unsigned queue_mask); -bool radv_layout_can_fast_clear(const struct radv_image *image, +bool radv_layout_can_fast_clear(const struct radv_device *device, + const struct radv_image *image, VkImageLayout layout, bool in_render_loop, unsigned queue_mask);