Skip to content

Commit 6c1612d

Browse files
authored
fix(linux/vulkan): add 16-bit DRM format support for HDR DMA-BUF import (#4962)
1 parent a4c253f commit 6c1612d

1 file changed

Lines changed: 39 additions & 8 deletions

File tree

src/platform/linux/vulkan_encode.cpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -384,23 +384,53 @@ namespace vk {
384384
return true;
385385
}
386386

387-
static VkFormat drm_fourcc_to_vk_format(uint32_t fourcc) {
387+
struct drm_format_info {
388+
VkFormat format;
389+
VkComponentMapping swizzle;
390+
};
391+
392+
static drm_format_info drm_fourcc_to_vk_format(uint32_t fourcc) {
393+
static constexpr VkComponentMapping identity = {
394+
VK_COMPONENT_SWIZZLE_IDENTITY,
395+
VK_COMPONENT_SWIZZLE_IDENTITY,
396+
VK_COMPONENT_SWIZZLE_IDENTITY,
397+
VK_COMPONENT_SWIZZLE_IDENTITY,
398+
};
399+
static constexpr VkComponentMapping bgr_swap = {
400+
VK_COMPONENT_SWIZZLE_B,
401+
VK_COMPONENT_SWIZZLE_G,
402+
VK_COMPONENT_SWIZZLE_R,
403+
VK_COMPONENT_SWIZZLE_A,
404+
};
405+
388406
switch (fourcc) {
389407
case DRM_FORMAT_XRGB8888:
390408
case DRM_FORMAT_ARGB8888:
391-
return VK_FORMAT_B8G8R8A8_UNORM;
409+
return {VK_FORMAT_B8G8R8A8_UNORM, identity};
392410
case DRM_FORMAT_XBGR8888:
393411
case DRM_FORMAT_ABGR8888:
394-
return VK_FORMAT_R8G8B8A8_UNORM;
412+
return {VK_FORMAT_R8G8B8A8_UNORM, identity};
395413
case DRM_FORMAT_XRGB2101010:
396414
case DRM_FORMAT_ARGB2101010:
397-
return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
415+
return {VK_FORMAT_A2R10G10B10_UNORM_PACK32, identity};
398416
case DRM_FORMAT_XBGR2101010:
399417
case DRM_FORMAT_ABGR2101010:
400-
return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
418+
return {VK_FORMAT_A2B10G10R10_UNORM_PACK32, identity};
419+
case DRM_FORMAT_XBGR16161616:
420+
case DRM_FORMAT_ABGR16161616:
421+
return {VK_FORMAT_R16G16B16A16_UNORM, identity};
422+
case DRM_FORMAT_XRGB16161616:
423+
case DRM_FORMAT_ARGB16161616:
424+
return {VK_FORMAT_R16G16B16A16_UNORM, bgr_swap};
425+
case DRM_FORMAT_XBGR16161616F:
426+
case DRM_FORMAT_ABGR16161616F:
427+
return {VK_FORMAT_R16G16B16A16_SFLOAT, identity};
428+
case DRM_FORMAT_XRGB16161616F:
429+
case DRM_FORMAT_ARGB16161616F:
430+
return {VK_FORMAT_R16G16B16A16_SFLOAT, bgr_swap};
401431
default:
402432
BOOST_LOG(warning) << "Unknown DRM fourcc 0x" << std::hex << fourcc << std::dec << ", assuming B8G8R8A8";
403-
return VK_FORMAT_B8G8R8A8_UNORM;
433+
return {VK_FORMAT_B8G8R8A8_UNORM, identity};
404434
}
405435
}
406436

@@ -444,7 +474,7 @@ namespace vk {
444474
tiling = VK_IMAGE_TILING_LINEAR;
445475
}
446476

447-
auto vk_format = drm_fourcc_to_vk_format(sd.fourcc);
477+
auto [vk_format, vk_swizzle] = drm_fourcc_to_vk_format(sd.fourcc);
448478

449479
VkImageCreateInfo img_ci = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO};
450480
img_ci.pNext = &ext_ci;
@@ -494,11 +524,12 @@ namespace vk {
494524

495525
vkBindImageMemory(vk_dev.dev, src.image, src_mem, 0);
496526

497-
// Create image view (Vulkan sampling always returns RGBA order regardless of memory layout)
527+
// Create image view
498528
VkImageViewCreateInfo view_ci = {VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO};
499529
view_ci.image = src.image;
500530
view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
501531
view_ci.format = vk_format;
532+
view_ci.components = vk_swizzle;
502533
view_ci.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
503534
VK_CHECK_BOOL(vkCreateImageView(vk_dev.dev, &view_ci, nullptr, &src.view));
504535

0 commit comments

Comments
 (0)