From 6cb5185916fd782e9da6d21b018d8f1abd372d3a Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 30 May 2023 15:43:16 -0700 Subject: [PATCH] radv: fix msaa feedback loop without tc-compat cmask When in an msaa feedback loop and when the image does not have tc-compat cmask, we have to decompress and expand fmask. This can happen on gfx9 when sample count > 2 or when RADV_DEBUG=notccompatcmask is specified. Fixes: a38de4c011d ("radv: disable tc_compatible_cmask on GFX9 in some cases") Part-of: --- src/amd/vulkan/radv_image.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 93965eacdc9..cc6ae6ef37d 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -2500,15 +2500,23 @@ radv_layout_fmask_compression(const struct radv_device *device, const struct rad if (layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && (queue_mask & (1u << RADV_QUEUE_COMPUTE))) return RADV_FMASK_COMPRESSION_NONE; - if (layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL || - layout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) { - return radv_image_is_tc_compat_cmask(image) ? RADV_FMASK_COMPRESSION_FULL : - RADV_FMASK_COMPRESSION_PARTIAL; - } + /* Compress images if TC-compat CMASK is enabled. */ + if (radv_image_is_tc_compat_cmask(image)) + return RADV_FMASK_COMPRESSION_FULL; - /* Only compress concurrent images if TC-compat CMASK is enabled (no FMASK decompression). */ - return (queue_mask == (1u << RADV_QUEUE_GENERAL) || radv_image_is_tc_compat_cmask(image)) ? - RADV_FMASK_COMPRESSION_FULL : RADV_FMASK_COMPRESSION_NONE; + switch (layout) { + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + /* Don't compress images but no need to expand FMASK. */ + return RADV_FMASK_COMPRESSION_PARTIAL; + case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT: + /* Don't compress images that are in feedback loops. */ + return RADV_FMASK_COMPRESSION_NONE; + default: + /* Don't compress images that are concurrent. */ + return queue_mask == (1u << RADV_QUEUE_GENERAL) ? + RADV_FMASK_COMPRESSION_FULL : RADV_FMASK_COMPRESSION_NONE; + } } unsigned