radv: implement VK_EXT_image_compression_control

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25681>
This commit is contained in:
Samuel Pitoiset
2023-10-12 14:08:55 +02:00
committed by Marge Bot
parent 8ec0a4c89c
commit 8a25a9f4dd
2 changed files with 47 additions and 4 deletions

View File

@@ -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:

View File

@@ -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