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:
@@ -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,
|
||||
|
||||
|
||||
Reference in New Issue
Block a user