From 566ea76d8e2d5d63539745a274f7500e446629e4 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Wed, 16 Jul 2025 11:34:45 +0200 Subject: [PATCH] radv/video: Support DRM format modifier tiling Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_formats.c | 10 ++++++-- src/amd/vulkan/radv_video.c | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 498512c805a..44331da31e5 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -830,9 +830,15 @@ radv_check_modifier_support(struct radv_physical_device *pdev, const VkPhysicalD !need_dcc_sign_reinterpret) return VK_ERROR_FORMAT_NOT_SUPPORTED; + const bool video = info->usage & (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); + if (video && !ac_modifier_supports_video(&pdev->info, modifier)) + return VK_ERROR_FORMAT_NOT_SUPPORTED; + /* We can expand this as needed and implemented but there is not much demand - * for more. */ - if (ac_modifier_has_dcc(modifier)) { + * for more. + * Video can't support array layers with swizzle modes that use slice index + * for addressing. */ + if (ac_modifier_has_dcc(modifier) || video) { props->maxMipLevels = 1; props->maxArrayLayers = 1; } diff --git a/src/amd/vulkan/radv_video.c b/src/amd/vulkan/radv_video.c index ac8b90b0b46..71ef2c3e179 100644 --- a/src/amd/vulkan/radv_video.c +++ b/src/amd/vulkan/radv_video.c @@ -1128,6 +1128,22 @@ radv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice, p->imageUsageFlags = pVideoFormatInfo->imageUsage; } + if (pVideoFormatInfo->imageUsage & + (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR)) { + vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p) + { + p->format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16; + p->componentMapping.r = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.g = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.b = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.a = VK_COMPONENT_SWIZZLE_IDENTITY; + p->imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT; + p->imageType = VK_IMAGE_TYPE_2D; + p->imageTiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + p->imageUsageFlags = pVideoFormatInfo->imageUsage; + } + } + if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) { need_8bit = false; need_10bit = false; @@ -1151,6 +1167,22 @@ radv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice, p->imageUsageFlags = pVideoFormatInfo->imageUsage; } + if (pVideoFormatInfo->imageUsage & + (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR)) { + vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p) + { + p->format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16; + p->componentMapping.r = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.g = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.b = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.a = VK_COMPONENT_SWIZZLE_IDENTITY; + p->imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT; + p->imageType = VK_IMAGE_TYPE_2D; + p->imageTiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + p->imageUsageFlags = pVideoFormatInfo->imageUsage; + } + } + if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) need_8bit = false; } @@ -1171,6 +1203,22 @@ radv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice, p->imageTiling = VK_IMAGE_TILING_OPTIMAL; p->imageUsageFlags = pVideoFormatInfo->imageUsage; } + + if (pVideoFormatInfo->imageUsage & + (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR)) { + vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p) + { + p->format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM; + p->componentMapping.r = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.g = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.b = VK_COMPONENT_SWIZZLE_IDENTITY; + p->componentMapping.a = VK_COMPONENT_SWIZZLE_IDENTITY; + p->imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT; + p->imageType = VK_IMAGE_TYPE_2D; + p->imageTiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + p->imageUsageFlags = pVideoFormatInfo->imageUsage; + } + } } return vk_outarray_status(&out);