gles: Add support for 10/12/16 bit SW decoder YCbCr formats

Signed-off-by: Robert Mader <robert.mader@collabora.com>
Co-Authored-by: Daniel Stone <daniels@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-03-12 18:16:56 +01:00 committed by Marge Bot
parent 76095b2cb0
commit a166d7609f
10 changed files with 155 additions and 0 deletions

View file

@ -5492,6 +5492,8 @@ typedef struct nir_lower_tex_options {
unsigned lower_yu_yv_external;
unsigned lower_yv_yu_external;
unsigned lower_y41x_external;
unsigned lower_sx10_external;
unsigned lower_sx12_external;
unsigned bt709_external;
unsigned bt2020_external;
unsigned yuv_full_range_external;

View file

@ -441,6 +441,16 @@ convert_yuv_to_rgb(nir_builder *b, nir_tex_instr *tex,
nir_def *m1 = nir_f2fN(b, nir_build_imm(b, 4, 32, m->v[1]), bit_size);
nir_def *m2 = nir_f2fN(b, nir_build_imm(b, 4, 32, m->v[2]), bit_size);
if (options->lower_sx10_external & (1u << texture_index)) {
m0 = nir_fmul_imm(b, m0, 64.0f);
m1 = nir_fmul_imm(b, m1, 64.0f);
m2 = nir_fmul_imm(b, m2, 64.0f);
} else if (options->lower_sx12_external & (1u << texture_index)) {
m0 = nir_fmul_imm(b, m0, 16.0f);
m1 = nir_fmul_imm(b, m1, 16.0f);
m2 = nir_fmul_imm(b, m2, 16.0f);
}
nir_def *result =
nir_ffma(b, y, m0, nir_ffma(b, u, m1, nir_ffma(b, v, m2, offset)));

View file

@ -2315,6 +2315,15 @@ dri2_num_fourcc_format_planes(EGLint format)
case DRM_FORMAT_YVU422:
case DRM_FORMAT_YUV444:
case DRM_FORMAT_YVU444:
case DRM_FORMAT_S010:
case DRM_FORMAT_S210:
case DRM_FORMAT_S410:
case DRM_FORMAT_S012:
case DRM_FORMAT_S212:
case DRM_FORMAT_S412:
case DRM_FORMAT_S016:
case DRM_FORMAT_S216:
case DRM_FORMAT_S416:
return 3;
default:

View file

@ -547,6 +547,52 @@ static const struct dri2_format_mapping dri2_format_table[] = {
{ 2, 0, 0, __DRI_IMAGE_FORMAT_R8 },
{ 1, 0, 0, __DRI_IMAGE_FORMAT_R8 } } },
{ DRM_FORMAT_S010, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 1, 1, __DRI_IMAGE_FORMAT_R16 },
{ 2, 1, 1, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S210, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 1, 0, __DRI_IMAGE_FORMAT_R16 },
{ 2, 1, 0, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S410, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 2, 0, 0, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S012, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 1, 1, __DRI_IMAGE_FORMAT_R16 },
{ 2, 1, 1, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S212, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 1, 0, __DRI_IMAGE_FORMAT_R16 },
{ 2, 1, 0, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S412, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 2, 0, 0, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S016, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y16_U16_V16_420_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 1, 1, __DRI_IMAGE_FORMAT_R16 },
{ 2, 1, 1, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S216, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y16_U16_V16_422_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 1, 0, __DRI_IMAGE_FORMAT_R16 },
{ 2, 1, 0, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_S416, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_U_V, PIPE_FORMAT_Y16_U16_V16_444_UNORM, 3,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 1, 0, 0, __DRI_IMAGE_FORMAT_R16 },
{ 2, 0, 0, __DRI_IMAGE_FORMAT_R16 } } },
{ DRM_FORMAT_NV12, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_NV12, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },

View file

@ -323,6 +323,21 @@ update_shader_samplers(struct st_context *st,
extra = u_bit_scan(&free_slots);
states[extra] = sampler;
break;
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:
/* we need two additional samplers: */
extra = u_bit_scan(&free_slots);
states[extra] = sampler;
extra = u_bit_scan(&free_slots);
states[extra] = sampler;
break;
default:
break;
}

View file

@ -238,6 +238,24 @@ st_get_sampler_views(struct st_context *st,
sampler_views[extra] =
pipe->create_sampler_view(pipe, stObj->pt->next->next, &tmpl);
break;
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:
/* we need two additional R16 views: */
tmpl.format = PIPE_FORMAT_R16_UNORM;
extra = u_bit_scan(&free_slots);
sampler_views[extra] =
pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl);
extra = u_bit_scan(&free_slots);
sampler_views[extra] =
pipe->create_sampler_view(pipe, stObj->pt->next->next, &tmpl);
break;
case PIPE_FORMAT_YUYV:
case PIPE_FORMAT_YVYU:
if (stObj->pt->format == PIPE_FORMAT_R8G8_R8B8_UNORM ||

View file

@ -83,6 +83,19 @@ is_format_supported(struct pipe_screen *screen, enum pipe_format format,
PIPE_TEXTURE_2D, nr_samples,
nr_storage_samples, usage);
break;
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:
supported = screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM,
PIPE_TEXTURE_2D, nr_samples,
nr_storage_samples, usage);
break;
case PIPE_FORMAT_Y210:
case PIPE_FORMAT_Y212:
case PIPE_FORMAT_Y216:
@ -523,6 +536,18 @@ st_bind_egl_image(struct gl_context *ctx,
texObj->RequiredTextureImageUnits = 3;
}
break;
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:
texFormat = MESA_FORMAT_R_UNORM16;
texObj->RequiredTextureImageUnits = 3;
break;
case PIPE_FORMAT_YUYV:
case PIPE_FORMAT_YVYU:
case PIPE_FORMAT_UYVY:

View file

@ -1180,6 +1180,8 @@ st_create_fp_variant(struct st_context *st,
options.lower_yu_yv_external = key->external.lower_yu_yv;
options.lower_yv_yu_external = key->external.lower_yv_yu;
options.lower_y41x_external = key->external.lower_y41x;
options.lower_sx10_external = key->external.lower_sx10;
options.lower_sx12_external = key->external.lower_sx12;
options.bt709_external = key->external.bt709;
options.bt2020_external = key->external.bt2020;
options.yuv_full_range_external = key->external.yuv_full_range;

View file

@ -60,6 +60,8 @@ struct st_external_sampler_key
GLuint lower_yu_yv;
GLuint lower_yv_yu;
GLuint lower_y41x;
GLuint lower_sx10;
GLuint lower_sx12;
GLuint bt709;
GLuint bt2020;
GLuint yuv_full_range;
@ -142,6 +144,23 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
}
key.lower_iyuv |= (1 << unit);
break;
case PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM:
case PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM:
key.lower_iyuv |= (1 << unit);
key.lower_sx10 |= (1 << unit);
break;
case PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM:
case PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM:
key.lower_iyuv |= (1 << unit);
key.lower_sx12 |= (1 << unit);
break;
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
case PIPE_FORMAT_Y16_U16_V16_422_UNORM:
case PIPE_FORMAT_Y16_U16_V16_444_UNORM:
key.lower_iyuv |= (1 << unit);
break;
case PIPE_FORMAT_YUYV:
if (stObj->pt->format == PIPE_FORMAT_R8G8_R8B8_UNORM) {
key.lower_yu_yv |= (1 << unit);

View file

@ -407,6 +407,15 @@ st_get_sampler_view_format(const struct st_context *st,
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:
format = PIPE_FORMAT_R16_UNORM;
break;
case PIPE_FORMAT_Y210: