mesa: Add support for NV61, NV24 and NV42 pixel formats

Which are essentially variants of NV12. All of them have been tested
with the Weston client-buffer test with llvmpipe and radeonsi.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36890>
This commit is contained in:
Robert Mader 2025-08-12 13:29:27 +02:00 committed by Marge Bot
parent 61fd24c552
commit 6c83ae95a2
9 changed files with 69 additions and 0 deletions

View file

@ -2201,6 +2201,8 @@ dri2_num_fourcc_format_planes(EGLint format)
case DRM_FORMAT_NV21:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV61:
case DRM_FORMAT_NV24:
case DRM_FORMAT_NV42:
case DRM_FORMAT_NV15:
case DRM_FORMAT_NV20:
case DRM_FORMAT_NV30:

View file

@ -617,6 +617,18 @@ static const struct dri2_format_mapping dri2_format_table[] = {
PIPE_FORMAT_NV16, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
{ 1, 1, 0, __DRI_IMAGE_FORMAT_GR88 } } },
{ DRM_FORMAT_NV61, __DRI_IMAGE_FORMAT_NONE,
PIPE_FORMAT_NV61, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
{ 1, 1, 0, __DRI_IMAGE_FORMAT_GR88 } } },
{ DRM_FORMAT_NV24, __DRI_IMAGE_FORMAT_NONE,
PIPE_FORMAT_NV24, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
{ 1, 0, 0, __DRI_IMAGE_FORMAT_GR88 } } },
{ DRM_FORMAT_NV42, __DRI_IMAGE_FORMAT_NONE,
PIPE_FORMAT_NV42, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
{ 1, 0, 0, __DRI_IMAGE_FORMAT_GR88 } } },
{ DRM_FORMAT_AYUV, __DRI_IMAGE_FORMAT_ABGR8888,
PIPE_FORMAT_AYUV, 1,

View file

@ -288,6 +288,9 @@ update_shader_samplers(struct st_context *st,
/* no additional views needed */
break;
FALLTHROUGH;
case PIPE_FORMAT_NV61:
case PIPE_FORMAT_NV24:
case PIPE_FORMAT_NV42:
case PIPE_FORMAT_P010:
case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:

View file

@ -207,6 +207,17 @@ st_get_sampler_views(struct st_context *st,
/* no additional views needed */
break;
/* we need one additional R8G8 view: */
tmpl.format = PIPE_FORMAT_RG88_UNORM;
tmpl.swizzle_g = PIPE_SWIZZLE_Y; /* tmpl from Y plane is R8 */
extra = u_bit_scan(&free_slots);
sampler_views[extra] =
pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl);
(*extra_sampler_views) |= 1 << extra;
break;
case PIPE_FORMAT_NV61:
case PIPE_FORMAT_NV24:
case PIPE_FORMAT_NV42:
/* we need one additional R8G8 view: */
tmpl.format = PIPE_FORMAT_RG88_UNORM;
tmpl.swizzle_g = PIPE_SWIZZLE_Y; /* tmpl from Y plane is R8 */

View file

@ -72,6 +72,9 @@ is_format_supported(struct pipe_screen *screen, enum pipe_format format,
case PIPE_FORMAT_NV12:
case PIPE_FORMAT_NV21:
case PIPE_FORMAT_NV16:
case PIPE_FORMAT_NV61:
case PIPE_FORMAT_NV24:
case PIPE_FORMAT_NV42:
supported = screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM,
PIPE_TEXTURE_2D, nr_samples,
nr_storage_samples, usage) &&
@ -493,6 +496,12 @@ st_bind_egl_image(struct gl_context *ctx,
texObj->RequiredTextureImageUnits = 2;
}
break;
case PIPE_FORMAT_NV61:
case PIPE_FORMAT_NV24:
case PIPE_FORMAT_NV42:
texFormat = MESA_FORMAT_R_UNORM8;
texObj->RequiredTextureImageUnits = 2;
break;
case PIPE_FORMAT_NV15:
if (stimg->texture->format == PIPE_FORMAT_R10_G10B10_420_UNORM) {
texFormat = MESA_FORMAT_R10G10B10X2_UNORM;

View file

@ -117,6 +117,7 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
break;
}
FALLTHROUGH;
case PIPE_FORMAT_NV24:
case PIPE_FORMAT_P010:
case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
@ -128,6 +129,9 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
key.lower_yuv |= (1 << unit);
break;
}
FALLTHROUGH;
case PIPE_FORMAT_NV61:
case PIPE_FORMAT_NV42:
key.lower_nv21 |= (1 << unit);
break;
case PIPE_FORMAT_NV20:

View file

@ -389,6 +389,10 @@ st_get_sampler_view_format(const struct st_context *st,
format = texObj->pt->format;
break;
}
FALLTHROUGH;
case PIPE_FORMAT_NV61:
case PIPE_FORMAT_NV24:
case PIPE_FORMAT_NV42:
format = PIPE_FORMAT_R8_UNORM;
break;
case PIPE_FORMAT_NV15:

View file

@ -2189,6 +2189,27 @@
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y8_V8U8_422_UNORM
alias: NV61
layout: planar2
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y8_U8V8_444_UNORM
alias: NV24
layout: planar2
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y8_V8U8_444_UNORM
alias: NV42
layout: planar2
colorspace: YUV
block: {width: 1, height: 1, depth: 1}
channels: []
swizzles: [X, Y, Z, W]
- name: Y8_U8_V8_444_UNORM
layout: planar3
colorspace: YUV

View file

@ -85,7 +85,10 @@ def has_access(format):
'y8_u8_v8_420_unorm',
'y8_u8v8_420_unorm',
'y8_u8v8_422_unorm',
'y8_u8v8_444_unorm',
'y8_v8u8_420_unorm',
'y8_v8u8_422_unorm',
'y8_v8u8_444_unorm',
'y10_u10v10_420_unorm',
'y10_u10v10_422_unorm',
'x6y10_x6u10x6v10_420_unorm',