Hi,

On 24/04/2025 16:31, Laurent Pinchart wrote:
On Thu, Apr 24, 2025 at 02:53:18PM +0200, Robert Mader wrote:
Chris, Javier, Laurent - sorry for the noise, but given you reviewed
changes in the respective files before, maybe you can help me moving
this forward? I'd be very happy for any feedback to get this landed,
thanks! :)

I don't have spare bandwidth at the moment, sorry :-( One comment below
though.

Tomi, can you check if there's any overlap with the formats you're
adding for the Xilinx FPGA drivers ?

No overlap, they are quite different.

On 07.04.25 21:13, Robert Mader wrote:
This adds FOURCCs for 10/12bit YCbCr formats used by software decoders
like ffmpeg, dav1d and libvpx. The intended use-case is buffer sharing
between SW-decoders and GPUs by allocating buffers with udmabuf or
dma-heaps, avoiding unnecessary copies or format conversions.

Unlike formats typically used by hardware decoders these formats
use a LSB alignment. In order to allow fast implementations in GL
and Vulkan the padding must contain only zeros, so the float
representation can calculated by simple multiplicating with 2^6=64

"can be"

or 2^4=16.

This needs to be documented somewhere.

Reviewed-by: Tomi Valkeinen <tomi.valkei...@ideasonboard.com>

 Tomi


WIP MRs for Mesa, Vulkan and Gstreamer can be found at:
   - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34303
   - https://github.com/rmader/Vulkan-Docs/commits/ycbcr-16bit-lsb-formats/
   - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8540

The values where inspired by the corresponding VA_FOURCC_I010, however
suggestions are very welcome.

Signed-off-by: Robert Mader <robert.ma...@collabora.com>
---
   drivers/gpu/drm/drm_fourcc.c  | 18 ++++++++++++++++++
   include/uapi/drm/drm_fourcc.h | 20 ++++++++++++++++++++
   2 files changed, 38 insertions(+)

diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
index 3a94ca211f9c..917f77703645 100644
--- a/drivers/gpu/drm/drm_fourcc.c
+++ b/drivers/gpu/drm/drm_fourcc.c
@@ -346,6 +346,24 @@ const struct drm_format_info *__drm_format_info(u32 format)
                { .format = DRM_FORMAT_P030,            .depth = 0,  
.num_planes = 2,
                  .char_per_block = { 4, 8, 0 }, .block_w = { 3, 3, 0 }, 
.block_h = { 1, 1, 0 },
                  .hsub = 2, .vsub = 2, .is_yuv = true},
+               { .format = DRM_FORMAT_I010,            .depth = 0,  
.num_planes = 3,
+                 .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, 
.block_h = { 1, 1, 1 },
+                 .hsub = 2, .vsub = 2, .is_yuv = true},
+               { .format = DRM_FORMAT_I210,            .depth = 0,  
.num_planes = 3,
+                 .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, 
.block_h = { 1, 1, 1 },
+                 .hsub = 2, .vsub = 1, .is_yuv = true},
+               { .format = DRM_FORMAT_I410,            .depth = 0,  
.num_planes = 3,
+                 .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, 
.block_h = { 1, 1, 1 },
+                 .hsub = 1, .vsub = 1, .is_yuv = true},
+               { .format = DRM_FORMAT_I012,            .depth = 0,  
.num_planes = 3,
+                 .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, 
.block_h = { 1, 1, 1 },
+                 .hsub = 2, .vsub = 2, .is_yuv = true},
+               { .format = DRM_FORMAT_I212,            .depth = 0,  
.num_planes = 3,
+                 .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, 
.block_h = { 1, 1, 1 },
+                 .hsub = 2, .vsub = 1, .is_yuv = true},
+               { .format = DRM_FORMAT_I412,            .depth = 0,  
.num_planes = 3,
+                 .char_per_block = { 2, 2, 2 }, .block_w = { 1, 1, 1 }, 
.block_h = { 1, 1, 1 },
+                 .hsub = 1, .vsub = 1, .is_yuv = true},
        };
unsigned int i;
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
index e41a3cec6a9e..f22c80031595 100644
--- a/include/uapi/drm/drm_fourcc.h
+++ b/include/uapi/drm/drm_fourcc.h
@@ -397,6 +397,26 @@ extern "C" {
   #define DRM_FORMAT_YUV444    fourcc_code('Y', 'U', '2', '4') /* 
non-subsampled Cb (1) and Cr (2) planes */
   #define DRM_FORMAT_YVU444    fourcc_code('Y', 'V', '2', '4') /* 
non-subsampled Cr (1) and Cb (2) planes */
+/*
+ * 3 plane YCbCr LSB aligned
+ * index 0 = Y plane, [15:0] x:Y [6:10] little endian
+ * index 1 = Cr plane, [15:0] x:Cr [6:10] little endian
+ * index 2 = Cb plane, [15:0] x:Cb [6:10] little endian
+ */
+#define DRM_FORMAT_I010        fourcc_code('I', '0', '1', '0') /* 2x2 
subsampled Cb (1) and Cr (2) planes 10 bits per channel */
+#define DRM_FORMAT_I210        fourcc_code('I', '2', '1', '0') /* 2x1 
subsampled Cb (1) and Cr (2) planes 10 bits per channel */
+#define DRM_FORMAT_I410        fourcc_code('I', '4', '1', '0') /* 
non-subsampled Cb (1) and Cr (2) planes 10 bits per channel */
+
+/*
+ * 3 plane YCbCr LSB aligned
+ * index 0 = Y plane, [15:0] x:Y [4:12] little endian
+ * index 1 = Cr plane, [15:0] x:Cr [4:12] little endian
+ * index 2 = Cb plane, [15:0] x:Cb [4:12] little endian
+ */
+#define DRM_FORMAT_I012        fourcc_code('I', '0', '1', '2') /* 2x2 
subsampled Cb (1) and Cr (2) planes 12 bits per channel */
+#define DRM_FORMAT_I212        fourcc_code('I', '2', '1', '2') /* 2x1 
subsampled Cb (1) and Cr (2) planes 12 bits per channel */
+#define DRM_FORMAT_I412        fourcc_code('I', '4', '1', '2') /* 
non-subsampled Cb (1) and Cr (2) planes 12 bits per channel */
+
/*
    * Format Modifiers:


Reply via email to