mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 22:10:10 +01:00
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:
parent
b6531e45ed
commit
440b69210a
7 changed files with 54 additions and 1 deletions
|
|
@ -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 } } },
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue