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:
parent
da36577558
commit
88f392f6f8
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue