From 440b69210aeba3d5c9d035e79773dd81134515cc Mon Sep 17 00:00:00 2001 From: "Eric R. Smith" Date: Tue, 12 Nov 2024 19:11:45 -0400 Subject: [PATCH] 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 Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/frontends/dri/dri_helpers.c | 2 +- src/mesa/state_tracker/st_atom_sampler.c | 5 +++++ src/mesa/state_tracker/st_atom_texture.c | 12 ++++++++++++ src/mesa/state_tracker/st_cb_eglimage.c | 21 +++++++++++++++++++++ src/mesa/state_tracker/st_program.h | 6 ++++++ src/mesa/state_tracker/st_sampler_view.c | 6 ++++++ src/util/format/u_formats.h | 3 +++ 7 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c index d1c740c4357..c5bdd3aa5b3 100644 --- a/src/gallium/frontends/dri/dri_helpers.c +++ b/src/gallium/frontends/dri/dri_helpers.c @@ -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 } } }, diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index c7171ef1704..67bdba5dc2e 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -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 */ diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 6121e18576a..eaf76d2ca5c 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -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 */ diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c index d5fd63c35d7..f1294d70d9d 100644 --- a/src/mesa/state_tracker/st_cb_eglimage.c +++ b/src/mesa/state_tracker/st_cb_eglimage.c @@ -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: diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index cceb0676fd6..5358d176483 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -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); diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c index a9a771dcc5c..4b94397f8df 100644 --- a/src/mesa/state_tracker/st_sampler_view.c +++ b/src/mesa/state_tracker/st_sampler_view.c @@ -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) { diff --git a/src/util/format/u_formats.h b/src/util/format/u_formats.h index 21816463b69..677691a2a35 100644 --- a/src/util/format/u_formats.h +++ b/src/util/format/u_formats.h @@ -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,