Module: Mesa
Branch: main
Commit: 8a25a9f4dd51b0c4287fadeaf7b346b7ec386a4f
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8a25a9f4dd51b0c4287fadeaf7b346b7ec386a4f

Author: Samuel Pitoiset <[email protected]>
Date:   Thu Oct 12 14:08:55 2023 +0200

radv: implement VK_EXT_image_compression_control

Signed-off-by: Samuel Pitoiset <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25681>

---

 src/amd/vulkan/radv_formats.c | 19 +++++++++++++++++++
 src/amd/vulkan/radv_image.c   | 32 ++++++++++++++++++++++++++++----
 2 files changed, 47 insertions(+), 4 deletions(-)

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

Reply via email to