radv: Never allow fast clears on DCC images that are not compressed.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7004>
This commit is contained in:
Bas Nieuwenhuizen 2020-09-19 01:52:32 +02:00 committed by Marge Bot
parent da36577558
commit 88f392f6f8
4 changed files with 19 additions and 9 deletions

View File

@ -1622,7 +1622,7 @@ radv_emit_fb_color_state(struct radv_cmd_buffer *cmd_buffer,
cb_color_info &= C_028C70_DCC_ENABLE; 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, radv_image_queue_family_mask(image,
cmd_buffer->queue_family_index, cmd_buffer->queue_family_index,
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). * layout).
*/ */
if (radv_image_has_fmask(image) && 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)) { dst_render_loop, dst_queue_mask)) {
value = 0xccccccccu; 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) && } 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_layout_dcc_compressed(cmd_buffer->device, image, dst_layout, dst_render_loop, dst_queue_mask)) {
radv_decompress_dcc(cmd_buffer, image, range); radv_decompress_dcc(cmd_buffer, image, range);
} else if (radv_layout_can_fast_clear(image, src_layout, src_render_loop, src_queue_mask) && } else if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout,
!radv_layout_can_fast_clear(image, dst_layout, dst_render_loop, dst_queue_mask)) { 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); radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
} }
} else if (radv_image_has_cmask(image) || radv_image_has_fmask(image)) { } else if (radv_image_has_cmask(image) || radv_image_has_fmask(image)) {
bool fce_eliminate = false, fmask_expand = false; bool fce_eliminate = false, fmask_expand = false;
if (radv_layout_can_fast_clear(image, src_layout, src_render_loop, src_queue_mask) && if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout,
!radv_layout_can_fast_clear(image, dst_layout, dst_render_loop, dst_queue_mask)) { 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; fce_eliminate = true;
} }

View File

@ -1779,11 +1779,16 @@ bool radv_layout_is_htile_compressed(const struct radv_image *image,
queue_mask == (1u << RADV_QUEUE_GENERAL))); 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, VkImageLayout layout,
bool in_render_loop, bool in_render_loop,
unsigned queue_mask) 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 && return layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL &&
queue_mask == (1u << RADV_QUEUE_GENERAL); queue_mask == (1u << RADV_QUEUE_GENERAL);
} }

View File

@ -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)) if (!radv_image_view_can_fast_clear(cmd_buffer->device, iview))
return false; 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, radv_image_queue_family_mask(iview->image,
cmd_buffer->queue_family_index, cmd_buffer->queue_family_index,
cmd_buffer->queue_family_index))) cmd_buffer->queue_family_index)))

View File

@ -1927,7 +1927,8 @@ bool radv_layout_is_htile_compressed(const struct radv_image *image,
bool in_render_loop, bool in_render_loop,
unsigned queue_mask); 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, VkImageLayout layout,
bool in_render_loop, bool in_render_loop,
unsigned queue_mask); unsigned queue_mask);