From 76095b2cb06e26157ca9359b37afe7552a1c8ece Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Sat, 31 May 2025 23:11:17 +0200 Subject: [PATCH] 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 Reviewed-by: Eric R. Smith Reviewed-by: Boris Brezillon Part-of: --- src/util/format/u_format.h | 25 +++++++++++++++++-- src/util/format/u_format.yaml | 40 +++++++++++++++++++++++++++++-- src/util/format/u_format_table.py | 8 ++++++- src/util/format/u_formats.h | 13 ++++++++++ 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/src/util/format/u_format.h b/src/util/format/u_format.h index 2f8cd864a95..95b2b574063 100644 --- a/src/util/format/u_format.h +++ b/src/util/format/u_format.h @@ -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: diff --git a/src/util/format/u_format.yaml b/src/util/format/u_format.yaml index 242c556c2d6..7b627402f37 100644 --- a/src/util/format/u_format.yaml +++ b/src/util/format/u_format.yaml @@ -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 diff --git a/src/util/format/u_format_table.py b/src/util/format/u_format_table.py index a3e7cb3c08e..a890eb360b9 100644 --- a/src/util/format/u_format_table.py +++ b/src/util/format/u_format_table.py @@ -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', diff --git a/src/util/format/u_formats.h b/src/util/format/u_formats.h index 2798f8b41d6..dafc8586d0c 100644 --- a/src/util/format/u_formats.h +++ b/src/util/format/u_formats.h @@ -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: