radv: rework radv_layout_fmask_compressed

Rename radv_layout_fmask_compressed and make it return an enum.  We will
add partial compression (fmask decompressed and not expanded) in a
following commit.

Drop the check for VK_IMAGE_USAGE_STORAGE_BIT and
VK_IMAGE_USAGE_TRANSFER_DST_BIT.  When transitioning to
VK_IMAGE_LAYOUT_GENERAL, we should decompress and expand FMASK even when
those usage bits are not set.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21615>
This commit is contained in:
Chia-I Wu 2023-03-07 13:01:37 -08:00 committed by Marge Bot
parent 8e84a23697
commit 3cf7ac4e9c
3 changed files with 33 additions and 19 deletions

View file

@ -2665,10 +2665,10 @@ radv_emit_fb_color_state(struct radv_cmd_buffer *cmd_buffer, int index,
}
}
if (!radv_layout_fmask_compressed(
cmd_buffer->device, image, layout,
radv_image_queue_family_mask(image, cmd_buffer->qf,
cmd_buffer->qf))) {
const enum radv_fmask_compression fmask_comp =
radv_layout_fmask_compression(cmd_buffer->device, image, layout,
radv_image_queue_family_mask(image, cmd_buffer->qf, cmd_buffer->qf));
if (fmask_comp == RADV_FMASK_COMPRESSION_NONE) {
cb_color_info &= C_028C70_COMPRESSION;
}
@ -10301,10 +10301,14 @@ radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffer, struct ra
}
/* MSAA color decompress. */
if (radv_image_has_fmask(image) &&
(image->vk.usage & (VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)) &&
radv_layout_fmask_compressed(cmd_buffer->device, image, src_layout, src_queue_mask) &&
!radv_layout_fmask_compressed(cmd_buffer->device, image, dst_layout, dst_queue_mask)) {
const enum radv_fmask_compression src_fmask_comp = radv_layout_fmask_compression(cmd_buffer->device,
image, src_layout, src_queue_mask);
const enum radv_fmask_compression dst_fmask_comp = radv_layout_fmask_compression(cmd_buffer->device,
image, dst_layout, dst_queue_mask);
if (src_fmask_comp <= dst_fmask_comp)
return;
if (src_fmask_comp == RADV_FMASK_COMPRESSION_FULL) {
if (radv_dcc_enabled(image, range->baseMipLevel) &&
!radv_image_use_dcc_image_stores(cmd_buffer->device, image) && !dcc_decompressed) {
/* A DCC decompress is required before expanding FMASK
@ -10319,7 +10323,9 @@ radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffer, struct ra
*/
radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
}
}
if (dst_fmask_comp == RADV_FMASK_COMPRESSION_NONE) {
struct radv_barrier_data barrier = {0};
barrier.layout_transitions.fmask_color_expand = 1;
radv_describe_layout_transition(cmd_buffer, &barrier);

View file

@ -2449,23 +2449,25 @@ radv_layout_dcc_compressed(const struct radv_device *device, const struct radv_i
return device->physical_device->rad_info.gfx_level >= GFX10 || layout != VK_IMAGE_LAYOUT_GENERAL;
}
bool
radv_layout_fmask_compressed(const struct radv_device *device, const struct radv_image *image,
VkImageLayout layout, unsigned queue_mask)
enum radv_fmask_compression
radv_layout_fmask_compression(const struct radv_device *device, const struct radv_image *image,
VkImageLayout layout, unsigned queue_mask)
{
if (!radv_image_has_fmask(image))
return false;
return RADV_FMASK_COMPRESSION_NONE;
if (layout == VK_IMAGE_LAYOUT_GENERAL)
return RADV_FMASK_COMPRESSION_NONE;
/* Don't compress compute transfer dst because image stores ignore FMASK and it needs to be
* expanded before.
*/
if ((layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || layout == VK_IMAGE_LAYOUT_GENERAL) &&
(queue_mask & (1u << RADV_QUEUE_COMPUTE)))
return false;
if (layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && (queue_mask & (1u << RADV_QUEUE_COMPUTE)))
return RADV_FMASK_COMPRESSION_NONE;
/* Only compress concurrent images if TC-compat CMASK is enabled (no FMASK decompression). */
return layout != VK_IMAGE_LAYOUT_GENERAL &&
(queue_mask == (1u << RADV_QUEUE_GENERAL) || radv_image_is_tc_compat_cmask(image));
return (queue_mask == (1u << RADV_QUEUE_GENERAL) || radv_image_is_tc_compat_cmask(image)) ?
RADV_FMASK_COMPRESSION_FULL : RADV_FMASK_COMPRESSION_NONE;
}
unsigned

View file

@ -2547,8 +2547,14 @@ bool radv_layout_can_fast_clear(const struct radv_device *device, const struct r
bool radv_layout_dcc_compressed(const struct radv_device *device, const struct radv_image *image,
unsigned level, VkImageLayout layout, unsigned queue_mask);
bool radv_layout_fmask_compressed(const struct radv_device *device, const struct radv_image *image,
VkImageLayout layout, unsigned queue_mask);
enum radv_fmask_compression {
RADV_FMASK_COMPRESSION_NONE,
RADV_FMASK_COMPRESSION_FULL,
};
enum radv_fmask_compression radv_layout_fmask_compression(
const struct radv_device *device, const struct radv_image *image, VkImageLayout layout,
unsigned queue_mask);
/**
* Return whether the image has CMASK metadata for color surfaces.