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,