diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 3230862878a..5646a8fa1e5 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -1620,6 +1620,7 @@ radv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, struct VkAndroidHardwareBufferUsageANDROID *android_usage = NULL; VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = NULL; VkTextureLODGatherFormatPropertiesAMD *texture_lod_props = NULL; + VkImageCompressionPropertiesEXT *image_compression_props = NULL; VkResult result; VkFormat format = radv_select_android_external_format(base_info->pNext, base_info->format); @@ -1653,6 +1654,9 @@ radv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: texture_lod_props = (void *)s; break; + case VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT: + image_compression_props = (void *)s; + break; default: break; } @@ -1706,6 +1710,21 @@ radv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, } } + if (image_compression_props) { + image_compression_props->imageCompressionFixedRateFlags = VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT; + + if (vk_format_is_depth_or_stencil(format)) { + image_compression_props->imageCompressionFlags = (physical_device->instance->debug_flags & RADV_DEBUG_NO_HIZ) + ? VK_IMAGE_COMPRESSION_DISABLED_EXT + : VK_IMAGE_COMPRESSION_DEFAULT_EXT; + } else { + image_compression_props->imageCompressionFlags = + ((physical_device->instance->debug_flags & RADV_DEBUG_NO_DCC) || physical_device->rad_info.gfx_level < GFX8) + ? VK_IMAGE_COMPRESSION_DISABLED_EXT + : VK_IMAGE_COMPRESSION_DEFAULT_EXT; + } + } + return VK_SUCCESS; fail: diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 3771dab9c57..1663c65ec96 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -230,8 +230,13 @@ radv_use_dcc_for_image_early(struct radv_device *device, struct radv_image *imag if (device->physical_device->rad_info.gfx_level < GFX8) return false; - if (device->instance->debug_flags & RADV_DEBUG_NO_DCC) + const VkImageCompressionControlEXT *compression = + vk_find_struct_const(pCreateInfo->pNext, IMAGE_COMPRESSION_CONTROL_EXT); + + if (device->instance->debug_flags & RADV_DEBUG_NO_DCC || + (compression && compression->flags == VK_IMAGE_COMPRESSION_DISABLED_EXT)) { return false; + } if (image->shareable && image->vk.tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) return false; @@ -337,11 +342,16 @@ radv_use_fmask_for_image(const struct radv_device *device, const struct radv_ima } static inline bool -radv_use_htile_for_image(const struct radv_device *device, const struct radv_image *image) +radv_use_htile_for_image(const struct radv_device *device, const struct radv_image *image, + const VkImageCreateInfo *pCreateInfo) { const enum amd_gfx_level gfx_level = device->physical_device->rad_info.gfx_level; - if (device->instance->debug_flags & RADV_DEBUG_NO_HIZ) + const VkImageCompressionControlEXT *compression = + vk_find_struct_const(pCreateInfo->pNext, IMAGE_COMPRESSION_CONTROL_EXT); + + if (device->instance->debug_flags & RADV_DEBUG_NO_HIZ || + (compression && compression->flags == VK_IMAGE_COMPRESSION_DISABLED_EXT)) return false; /* TODO: @@ -604,7 +614,7 @@ radv_get_surface_flags(struct radv_device *device, struct radv_image *image, uns flags |= RADEON_SURF_NO_STENCIL_ADJUST; } - if (radv_use_htile_for_image(device, image) && !(flags & RADEON_SURF_NO_RENDER_TARGET)) { + if (radv_use_htile_for_image(device, image, pCreateInfo) && !(flags & RADEON_SURF_NO_RENDER_TARGET)) { if (radv_use_tc_compat_htile_for_image(device, pCreateInfo, image_format)) flags |= RADEON_SURF_TC_COMPATIBLE_HTILE; } else { @@ -2544,6 +2554,20 @@ radv_GetImageSubresourceLayout2KHR(VkDevice _device, VkImage _image, const VkIma if (image->vk.image_type == VK_IMAGE_TYPE_3D) pLayout->subresourceLayout.size *= u_minify(image->vk.extent.depth, level); } + + VkImageCompressionPropertiesEXT *image_compression_props = + vk_find_struct(pLayout->pNext, IMAGE_COMPRESSION_PROPERTIES_EXT); + if (image_compression_props) { + image_compression_props->imageCompressionFixedRateFlags = VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT; + + if (image->vk.aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { + image_compression_props->imageCompressionFlags = + radv_image_has_htile(image) ? VK_IMAGE_COMPRESSION_DEFAULT_EXT : VK_IMAGE_COMPRESSION_DISABLED_EXT; + } else { + image_compression_props->imageCompressionFlags = + radv_image_has_dcc(image) ? VK_IMAGE_COMPRESSION_DEFAULT_EXT : VK_IMAGE_COMPRESSION_DISABLED_EXT; + } + } } VKAPI_ATTR VkResult VKAPI_CALL