mesa/formats: Add support for 10 and 12 bit SW decoder YCbCr formats

Matching e.g. I420_10LE in Gstreamer / yuv420p10 in ffmpeg. The formats
are notably used for HDR10 videos by software decoders like dav1d, libav,
libaom and libvpx.

Use-cases include video players and editors that can allocate DMA buffers
- e.g. via udmabuf, dma-heaps, VA-API, V4L2, etc. - allowing them to avoid
unnecessary copies. Testing HDR10 playback on CI might also become easier.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
Reviewed-by: Eric R. Smith <eric.smith@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34303>
This commit is contained in:
Robert Mader
2025-05-31 23:11:17 +02:00
committed by Marge Bot
parent df09c3b0e7
commit 76095b2cb0
4 changed files with 81 additions and 5 deletions
+23 -2
View File
@@ -1323,6 +1323,12 @@ util_format_get_plane_format(enum pipe_format format, unsigned plane)
case PIPE_FORMAT_R8_B8G8_420_UNORM:
case PIPE_FORMAT_R8_B8G8_422_UNORM:
return !plane ? PIPE_FORMAT_R8_UNORM : PIPE_FORMAT_GR88_UNORM;
case PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM:
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
case PIPE_FORMAT_Y16_U16_V16_422_UNORM:
case PIPE_FORMAT_Y16_U16_V16_444_UNORM:
@@ -1352,10 +1358,17 @@ util_format_get_plane_width(enum pipe_format format, unsigned plane,
case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_P030:
case PIPE_FORMAT_Y8_U8_V8_422_UNORM:
case PIPE_FORMAT_NV16:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM:
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
case PIPE_FORMAT_Y16_U16_V16_422_UNORM:
case PIPE_FORMAT_Y16_U16_V16_444_UNORM:
case PIPE_FORMAT_Y8_U8_V8_422_UNORM:
case PIPE_FORMAT_NV16:
case PIPE_FORMAT_Y16_U16V16_422_UNORM:
case PIPE_FORMAT_R8_G8B8_420_UNORM:
case PIPE_FORMAT_R8_B8G8_420_UNORM:
@@ -1389,7 +1402,15 @@ util_format_get_plane_height(enum pipe_format format, unsigned plane,
case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_P030:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM:
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
case PIPE_FORMAT_Y16_U16_V16_422_UNORM:
case PIPE_FORMAT_Y16_U16_V16_444_UNORM:
case PIPE_FORMAT_Y8_U8_V8_440_UNORM:
case PIPE_FORMAT_R8_G8B8_420_UNORM:
case PIPE_FORMAT_R8_B8G8_420_UNORM:
+38 -2
View File
@@ -2180,20 +2180,50 @@
swizzles: [X, Y, Z, W]
- name: Y10X6_U10X6_V10X6_420_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y12X4_U12X4_V12X4_420_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y16_U16_V16_420_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y10X6_U10X6_V10X6_422_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y12X4_U12X4_V12X4_422_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y16_U16_V16_422_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y16_U16V16_422_UNORM
layout: planar2
- name: Y10X6_U10X6_V10X6_444_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y12X4_U12X4_V12X4_444_UNORM
layout: planar3
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
@@ -2204,6 +2234,12 @@
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y16_U16V16_422_UNORM
layout: planar2
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: P010
+7 -1
View File
@@ -113,10 +113,16 @@ def has_access(format):
'y8_u8_v8_422_unorm',
'y8_u8_v8_444_unorm',
'y8_u8_v8_440_unorm',
'y10x6_u10x6_v10x6_420_unorm',
'y12x4_u12x4_v12x4_420_unorm',
'y16_u16_v16_420_unorm',
'y10x6_u10x6_v10x6_422_unorm',
'y12x4_u12x4_v12x4_422_unorm',
'y16_u16_v16_422_unorm',
'y16_u16v16_422_unorm',
'y10x6_u10x6_v10x6_444_unorm',
'y12x4_u12x4_v12x4_444_unorm',
'y16_u16_v16_444_unorm',
'y16_u16v16_422_unorm',
'r8_g8b8_420_unorm',
'r8_b8g8_420_unorm',
'g8_b8r8_420_unorm',
+13
View File
@@ -317,6 +317,13 @@ enum pipe_format {
PIPE_FORMAT_Y8_U8_V8_444_UNORM,
PIPE_FORMAT_Y8_U8_V8_440_UNORM,
PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM,
PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM,
PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM,
PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM,
PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM,
PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM,
PIPE_FORMAT_Y16_U16_V16_420_UNORM,
/* PIPE_FORMAT_Y16_U16V16_420_UNORM */
PIPE_FORMAT_Y16_U16_V16_422_UNORM,
@@ -602,6 +609,8 @@ pipe_format_to_chroma_format(enum pipe_format format)
case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_P030:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM:
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
case PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED:
case PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED:
@@ -613,10 +622,14 @@ pipe_format_to_chroma_format(enum pipe_format format)
case PIPE_FORMAT_YV16:
case PIPE_FORMAT_NV16:
case PIPE_FORMAT_Y8_U8_V8_422_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM:
case PIPE_FORMAT_Y16_U16_V16_422_UNORM:
case PIPE_FORMAT_Y16_U16V16_422_UNORM:
return PIPE_VIDEO_CHROMA_FORMAT_422;
case PIPE_FORMAT_Y8_U8_V8_444_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM:
case PIPE_FORMAT_Y16_U16_V16_444_UNORM:
return PIPE_VIDEO_CHROMA_FORMAT_444;
case PIPE_FORMAT_Y8_U8_V8_440_UNORM: