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