diff --git a/gdk/gdkdmabuf.c b/gdk/gdkdmabuf.c index ef2da2d7bc..b946ebe6fe 100644 --- a/gdk/gdkdmabuf.c +++ b/gdk/gdkdmabuf.c @@ -46,6 +46,12 @@ struct _GdkDrmFormatInfo const GdkDmabuf *dmabuf, const guchar *src_datas[GDK_DMABUF_MAX_PLANES], gsize sizes[GDK_DMABUF_MAX_PLANES]); +#ifdef GDK_RENDERING_VULKAN + struct { + VkFormat format; + VkComponentMapping swizzle; + } vk; +#endif }; static void @@ -369,6 +375,8 @@ download_yuyv (guchar *dst_data, } } +#define VULKAN_SWIZZLE(_R, _G, _B, _A) { VK_COMPONENT_SWIZZLE_ ## _R, VK_COMPONENT_SWIZZLE_ ## _G, VK_COMPONENT_SWIZZLE_ ## _B, VK_COMPONENT_SWIZZLE_ ## _A } +#define VULKAN_DEFAULT_SWIZZLE VULKAN_SWIZZLE (R, G, B, A) static const GdkDrmFormatInfo supported_formats[] = { #if 0 /* palette formats?! */ @@ -377,24 +385,48 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_C2, .memory_format = GDK_MEMORY_, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_C4, .memory_format = GDK_MEMORY_, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_C8, .memory_format = GDK_MEMORY_, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, #endif /* darkness */ @@ -403,24 +435,48 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_D2, .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_D4, .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_D8, .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* red only - we treat this as gray */ { @@ -428,42 +484,84 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_R2, .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_R4, .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_R8, .memory_format = GDK_MEMORY_G8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_R10, .memory_format = GDK_MEMORY_G16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, //VK_FORMAT_R16_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_R12, .memory_format = GDK_MEMORY_G16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, //VK_FORMAT_R16_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_R16, .memory_format = GDK_MEMORY_G16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 2 channels - FIXME: Should this be gray + alpha? */ { @@ -471,24 +569,48 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_GR88, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8_UNORM, + .swizzle = VULKAN_SWIZZLE (G, R, B, A), + }, +#endif }, { .fourcc = DRM_FORMAT_RG1616, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_GR1616, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16_UNORM, + .swizzle = VULKAN_SWIZZLE (G, R, B, A), + }, +#endif }, /* <8bit per channel RGB(A) */ { @@ -496,120 +618,240 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGR233, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XRGB4444, .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A4R4G4B4_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR4444, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A4B4G4R4_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_RGBX4444, .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R4G4B4A4_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_BGRX4444, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B4G4R4A4_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_ARGB4444, .memory_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A4R4G4B4_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_ABGR4444, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A4B4G4R4_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGBA4444, .memory_format = GDK_MEMORY_A8B8G8R8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R4G4B4A4_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGRA4444, .memory_format = GDK_MEMORY_A8R8G8B8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B4G4R4A4_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XRGB1555, .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A1R5G5B5_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR1555, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A1R5G5B5_UNORM_PACK16, // requires VK_KHR_maintenance5: VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR + .swizzle = VULKAN_SWIZZLE (B, G, R, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_RGBX5551, .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R5G5B5A1_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_BGRX5551, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B5G5R5A1_UNORM_PACK16, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_ARGB1555, .memory_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A1R5G5B5_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_ABGR1555, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A1R5G5B5_UNORM_PACK16, // requires VK_KHR_maintenance5: VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_RGBA5551, .memory_format = GDK_MEMORY_A8B8G8R8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R5G5B5A1_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGRA5551, .memory_format = GDK_MEMORY_A8R8G8B8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B5G5R5A1_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGB565, .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R5G6B5_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGR565, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B5G6R5_UNORM_PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 8bit RGB */ { @@ -617,12 +859,24 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGR888, .memory_format = GDK_MEMORY_B8G8R8, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 8bit RGBA */ { @@ -630,48 +884,96 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_A8R8G8B8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (G, B, A, R), + }, +#endif }, { .fourcc = DRM_FORMAT_ABGR8888, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_ARGB8888, .memory_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8A8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGBA8888, .memory_format = GDK_MEMORY_A8B8G8R8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (A, B, G, R), + }, +#endif }, { .fourcc = DRM_FORMAT_BGRX8888, .memory_format = GDK_MEMORY_X8R8G8B8, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (G, B, A, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR8888, .memory_format = GDK_MEMORY_R8G8B8X8, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XRGB8888, .memory_format = GDK_MEMORY_B8G8R8X8, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_RGBX8888, .memory_format = GDK_MEMORY_X8B8G8R8, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (A, B, G, ONE), + }, +#endif }, /* 10bit RGB(A) */ { @@ -679,48 +981,96 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A2B10G10R10_UNORM_PACK32, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR2101010, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A2B10G10R10_UNORM_PACK32, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_RGBX1010102, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_BGRX1010102, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_ARGB2101010, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A2B10G10R10_UNORM_PACK32, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_ABGR2101010, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_A2B10G10R10_UNORM_PACK32, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGBA1010102, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGRA1010102, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 16bit RGB(A) */ { @@ -728,54 +1078,108 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR16161616, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_UNORM, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_ARGB16161616, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_ABGR16161616, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XRGB16161616F, .memory_format = GDK_MEMORY_R16G16B16_FLOAT, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_SFLOAT, + .swizzle = VULKAN_SWIZZLE (B, G, R, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR16161616F, .memory_format = GDK_MEMORY_R16G16B16_FLOAT, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_SFLOAT, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_ARGB16161616F, .memory_format = GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_SFLOAT, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_ABGR16161616F, .memory_format = GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R16G16B16A16_SFLOAT, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_AXBXGXRX106106106106, .memory_format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, //VK_FORMAT_R16G16B16A16_SFLOAT, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 1-plane YUV formats */ { @@ -783,114 +1187,228 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuyv, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8B8G8R8_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YVYU, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuyv, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8B8G8R8_422_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_VYUY, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuyv, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8G8_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_UYVY, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuyv, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8G8_422_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_AYUV, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8A8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_AVUY8888, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XYUV8888, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B8G8R8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_XVUY8888, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8A8_UNORM, + .swizzle = VULKAN_SWIZZLE (R, G, B, ONE), + }, +#endif }, { .fourcc = DRM_FORMAT_VUY888, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_R8G8B8_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_VUY101010, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, /* NB: nonlinear-modifier only */ + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y210, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y212, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y216, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_B16G16R16G16_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y410, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y412, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y416, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XVYU2101010, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XVYU12_16161616, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XVYU16161616, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* tiled YUV */ { @@ -898,24 +1416,48 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_X0L0, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Y0L2, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_X0L2, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* non-linear YUV */ { @@ -923,12 +1465,24 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YUV420_10BIT, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 2 plane RGB + A */ { @@ -936,48 +1490,96 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_A8R8G8B8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy_3_1, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGBX8888_A8, .memory_format = GDK_MEMORY_A8B8G8R8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy_3_1, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XBGR8888_A8, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy_3_1, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_XRGB8888_A8, .memory_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = download_memcpy_3_1, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGB888_A8, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGR888_A8, .memory_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_RGB565_A8, .memory_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_BGR565_A8, .memory_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED, .is_yuv = FALSE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 2-plane YUV formats */ { @@ -985,72 +1587,144 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_nv12, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_NV21, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_nv12, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_NV16, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_nv12, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_NV61, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_nv12, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_NV24, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_nv12, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_NV42, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_nv12, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_NV15, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_P210, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_P010, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_P012, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_P016, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_P030, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, /* 3-plane YUV */ { @@ -1058,74 +1732,148 @@ static const GdkDrmFormatInfo supported_formats[] = { .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_Q401, .memory_format = GDK_MEMORY_R16G16B16, .is_yuv = TRUE, .download = NULL, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_YUV410, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YVU410, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YUV411, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YVU411, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_UNDEFINED, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YUV420, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YVU420, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_YUV422, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YVU422, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, { .fourcc = DRM_FORMAT_YUV444, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + .swizzle = VULKAN_DEFAULT_SWIZZLE, + }, +#endif }, { .fourcc = DRM_FORMAT_YVU444, .memory_format = GDK_MEMORY_R8G8B8, .is_yuv = TRUE, .download = download_yuv_3, +#ifdef GDK_RENDERING_VULKAN + .vk = { + .format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + .swizzle = VULKAN_SWIZZLE (B, G, R, A), + }, +#endif }, }; +#undef VULKAN_DEFAULT_SWIZZLE +#undef VULKAN_SWIZZLE static const GdkDrmFormatInfo * get_drm_format_info (guint32 fourcc) @@ -1170,6 +1918,23 @@ gdk_dmabuf_get_memory_format (guint32 fourcc, return TRUE; } +#ifdef GDK_RENDERING_VULKAN +VkFormat +gdk_dmabuf_get_vk_format (guint32 fourcc, + VkComponentMapping *out_components) +{ + const GdkDrmFormatInfo *info = get_drm_format_info (fourcc); + + if (info == NULL) + return VK_FORMAT_UNDEFINED; + + if (out_components) + *out_components = info->vk.swizzle; + + return info->vk.format; +} +#endif + GdkDmabufFormats * gdk_dmabuf_get_mmap_formats (void) { diff --git a/gdk/gdkdmabufprivate.h b/gdk/gdkdmabufprivate.h index c319239382..360863de2d 100644 --- a/gdk/gdkdmabufprivate.h +++ b/gdk/gdkdmabufprivate.h @@ -2,6 +2,10 @@ #include "gdkdmabufformatsbuilderprivate.h" +#ifdef GDK_RENDERING_VULKAN +#include +#endif + #define GDK_DMABUF_MAX_PLANES 4 typedef struct _GdkDmabuf GdkDmabuf; @@ -70,5 +74,9 @@ gboolean gdk_dmabuf_fourcc_is_yuv (guint32 gboolean gdk_dmabuf_get_memory_format (guint32 fourcc, gboolean premultiplied, GdkMemoryFormat *out_format); +#ifdef GDK_RENDERING_VULKAN +VkFormat gdk_dmabuf_get_vk_format (guint32 fourcc, + VkComponentMapping *out_components); +#endif #endif