Module: Mesa Branch: main Commit: 3cf7ac4e9c4bbe67844437fa7f1f739076a9682b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3cf7ac4e9c4bbe67844437fa7f1f739076a9682b
Author: Chia-I Wu <[email protected]> Date: Tue Mar 7 13:01:37 2023 -0800 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> --- src/amd/vulkan/radv_cmd_buffer.c | 22 ++++++++++++++-------- src/amd/vulkan/radv_image.c | 20 +++++++++++--------- src/amd/vulkan/radv_private.h | 10 ++++++++-- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 880d060630a..c14e2194a22 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -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); diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 7715b550ecb..4de96af2ad8 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -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 diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 5a822a40746..cc1fb635c55 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -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.
