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:

committed by
Marge Bot

parent
8ec0a4c89c
commit
8a25a9f4dd
@@ -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:
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user