dri, mesa: fix NV16 texture format

Support for NV16 was kind of half done, by declaring it to be
NV12. That didn't actually work though, so add some more stuff
to make it work.

Signed-off-by: Eric R. Smith <eric.smith@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31854>
This commit is contained in:
Eric R. Smith 2024-11-12 19:11:45 -04:00 committed by Marge Bot
parent b6531e45ed
commit 440b69210a
7 changed files with 54 additions and 1 deletions

View file

@ -568,7 +568,7 @@ static const struct dri2_format_mapping dri2_format_table[] = {
{ 1, 1, 1, __DRI_IMAGE_FORMAT_GR1616 } } },
{ DRM_FORMAT_NV16, __DRI_IMAGE_FORMAT_NONE,
__DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_NV12, 2,
__DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_NV16, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
{ 1, 1, 0, __DRI_IMAGE_FORMAT_GR88 } } },

View file

@ -273,6 +273,11 @@ update_shader_samplers(struct st_context *st,
continue;
switch (st_get_view_format(stObj)) {
case PIPE_FORMAT_NV16:
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_422_UNORM)
/* no additional views needed */
break;
FALLTHROUGH;
case PIPE_FORMAT_NV12:
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_420_UNORM)
/* no additional views needed */

View file

@ -174,6 +174,18 @@ st_get_sampler_views(struct st_context *st,
continue;
switch (st_get_view_format(stObj)) {
case PIPE_FORMAT_NV16:
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_422_UNORM)
/* 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);
break;
case PIPE_FORMAT_NV12:
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_420_UNORM)
/* no additional views needed */

View file

@ -64,6 +64,7 @@ is_format_supported(struct pipe_screen *screen, enum pipe_format format,
break;
case PIPE_FORMAT_NV12:
case PIPE_FORMAT_NV21:
case PIPE_FORMAT_NV16:
supported = screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM,
PIPE_TEXTURE_2D, nr_samples,
nr_storage_samples, usage) &&
@ -190,6 +191,16 @@ is_nv12_as_r8_g8b8_supported(struct pipe_screen *screen, struct st_egl_image *ou
*native_supported = false;
return true;
}
if (out->format == PIPE_FORMAT_NV16 &&
out->texture->format == PIPE_FORMAT_R8_G8B8_422_UNORM &&
screen->is_format_supported(screen, PIPE_FORMAT_R8_G8B8_422_UNORM,
PIPE_TEXTURE_2D,
out->texture->nr_samples,
out->texture->nr_storage_samples,
usage)) {
*native_supported = false;
return true;
}
return false;
}
@ -383,6 +394,16 @@ st_bind_egl_image(struct gl_context *ctx,
texObj->RequiredTextureImageUnits = 2;
}
break;
case PIPE_FORMAT_NV16:
if (stimg->texture->format == PIPE_FORMAT_R8_G8B8_422_UNORM ||
stimg->texture->format == PIPE_FORMAT_R8_B8G8_422_UNORM) {
texFormat = MESA_FORMAT_R8G8B8X8_UNORM;
texObj->RequiredTextureImageUnits = 1;
} else {
texFormat = MESA_FORMAT_R_UNORM8;
texObj->RequiredTextureImageUnits = 2;
}
break;
case PIPE_FORMAT_P010:
case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:

View file

@ -84,6 +84,12 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
continue;
switch (format) {
case PIPE_FORMAT_NV16:
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_422_UNORM) {
key.lower_yuv |= (1 << unit);
break;
}
FALLTHROUGH;
case PIPE_FORMAT_NV12:
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_420_UNORM) {
key.lower_yuv |= (1 << unit);

View file

@ -401,6 +401,12 @@ st_get_sampler_view_format(const struct st_context *st,
break;
}
FALLTHROUGH;
case PIPE_FORMAT_NV16:
if (texObj->pt->format == PIPE_FORMAT_R8_G8B8_422_UNORM) {
format = PIPE_FORMAT_R8_G8B8_422_UNORM;
break;
}
FALLTHROUGH;
case PIPE_FORMAT_IYUV:
if (texObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
texObj->pt->format == PIPE_FORMAT_R8_B8_G8_420_UNORM) {

View file

@ -529,6 +529,9 @@ enum pipe_format {
PIPE_FORMAT_R8_G8_B8_420_UNORM,
PIPE_FORMAT_R8_B8_G8_420_UNORM,
PIPE_FORMAT_G8_B8_R8_420_UNORM,
PIPE_FORMAT_R8_G8B8_422_UNORM,
PIPE_FORMAT_R8_B8G8_422_UNORM,
PIPE_FORMAT_G8_B8R8_422_UNORM,
PIPE_FORMAT_R8_G8_B8_UNORM,
PIPE_FORMAT_Y8_UNORM,