fix(linux/vulkan): add 16-bit DRM format support for HDR DMA-BUF import (#4962)

This commit is contained in:
neatnoise
2026-04-08 21:49:27 +02:00
committed by GitHub
parent a4c253f333
commit 6c1612de65

View File

@@ -384,23 +384,53 @@ namespace vk {
return true;
}
static VkFormat drm_fourcc_to_vk_format(uint32_t fourcc) {
struct drm_format_info {
VkFormat format;
VkComponentMapping swizzle;
};
static drm_format_info drm_fourcc_to_vk_format(uint32_t fourcc) {
static constexpr VkComponentMapping identity = {
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
};
static constexpr VkComponentMapping bgr_swap = {
VK_COMPONENT_SWIZZLE_B,
VK_COMPONENT_SWIZZLE_G,
VK_COMPONENT_SWIZZLE_R,
VK_COMPONENT_SWIZZLE_A,
};
switch (fourcc) {
case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_ARGB8888:
return VK_FORMAT_B8G8R8A8_UNORM;
return {VK_FORMAT_B8G8R8A8_UNORM, identity};
case DRM_FORMAT_XBGR8888:
case DRM_FORMAT_ABGR8888:
return VK_FORMAT_R8G8B8A8_UNORM;
return {VK_FORMAT_R8G8B8A8_UNORM, identity};
case DRM_FORMAT_XRGB2101010:
case DRM_FORMAT_ARGB2101010:
return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
return {VK_FORMAT_A2R10G10B10_UNORM_PACK32, identity};
case DRM_FORMAT_XBGR2101010:
case DRM_FORMAT_ABGR2101010:
return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
return {VK_FORMAT_A2B10G10R10_UNORM_PACK32, identity};
case DRM_FORMAT_XBGR16161616:
case DRM_FORMAT_ABGR16161616:
return {VK_FORMAT_R16G16B16A16_UNORM, identity};
case DRM_FORMAT_XRGB16161616:
case DRM_FORMAT_ARGB16161616:
return {VK_FORMAT_R16G16B16A16_UNORM, bgr_swap};
case DRM_FORMAT_XBGR16161616F:
case DRM_FORMAT_ABGR16161616F:
return {VK_FORMAT_R16G16B16A16_SFLOAT, identity};
case DRM_FORMAT_XRGB16161616F:
case DRM_FORMAT_ARGB16161616F:
return {VK_FORMAT_R16G16B16A16_SFLOAT, bgr_swap};
default:
BOOST_LOG(warning) << "Unknown DRM fourcc 0x" << std::hex << fourcc << std::dec << ", assuming B8G8R8A8";
return VK_FORMAT_B8G8R8A8_UNORM;
return {VK_FORMAT_B8G8R8A8_UNORM, identity};
}
}
@@ -444,7 +474,7 @@ namespace vk {
tiling = VK_IMAGE_TILING_LINEAR;
}
auto vk_format = drm_fourcc_to_vk_format(sd.fourcc);
auto [vk_format, vk_swizzle] = drm_fourcc_to_vk_format(sd.fourcc);
VkImageCreateInfo img_ci = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO};
img_ci.pNext = &ext_ci;
@@ -494,11 +524,12 @@ namespace vk {
vkBindImageMemory(vk_dev.dev, src.image, src_mem, 0);
// Create image view (Vulkan sampling always returns RGBA order regardless of memory layout)
// Create image view
VkImageViewCreateInfo view_ci = {VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO};
view_ci.image = src.image;
view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
view_ci.format = vk_format;
view_ci.components = vk_swizzle;
view_ci.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
VK_CHECK_BOOL(vkCreateImageView(vk_dev.dev, &view_ci, nullptr, &src.view));