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;
}
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;
}

View File

@ -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);
}

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))
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)))

View File

@ -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);