gallium/st: Teach the state tracker about YU08 and YU10 formats
Add the necessary bits to the state tracker to support single plane YUV 420 formats (YU08 and YU10 fourcc codes). Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35318>
This commit is contained in:
committed by
Boris Brezillon
parent
d4f83a96c9
commit
8c68512b84
@@ -232,6 +232,42 @@ is_fmt_as_r10_g10b10_supported(struct pipe_screen *screen, struct st_egl_image *
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_yuv420_as_r8g8b8_supported(struct pipe_screen *screen,
|
||||
struct st_egl_image *out,
|
||||
unsigned usage, bool *native_supported)
|
||||
{
|
||||
if (out->format == PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED &&
|
||||
out->texture->format == PIPE_FORMAT_R8G8B8_420_UNORM_PACKED &&
|
||||
screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8_420_UNORM_PACKED,
|
||||
PIPE_TEXTURE_2D,
|
||||
out->texture->nr_samples,
|
||||
out->texture->nr_storage_samples,
|
||||
usage)) {
|
||||
*native_supported = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_yuv420_as_r10g10b10_supported(struct pipe_screen *screen,
|
||||
struct st_egl_image *out,
|
||||
unsigned usage, bool *native_supported)
|
||||
{
|
||||
if (out->format == PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED &&
|
||||
out->texture->format == PIPE_FORMAT_R10G10B10_420_UNORM_PACKED &&
|
||||
screen->is_format_supported(screen, PIPE_FORMAT_R10G10B10_420_UNORM_PACKED,
|
||||
PIPE_TEXTURE_2D,
|
||||
out->texture->nr_samples,
|
||||
out->texture->nr_storage_samples,
|
||||
usage)) {
|
||||
*native_supported = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_i420_as_r8_g8_b8_420_supported(struct pipe_screen *screen,
|
||||
struct st_egl_image *out,
|
||||
@@ -287,6 +323,8 @@ st_get_egl_image(struct gl_context *ctx, GLeglImageOES image_handle,
|
||||
if (!is_fmt_as_r8_g8b8_supported(screen, out, usage, native_supported) &&
|
||||
!is_fmt_as_r10_g10b10_supported(screen, out, usage, native_supported) &&
|
||||
!is_i420_as_r8_g8_b8_420_supported(screen, out, usage, native_supported) &&
|
||||
!is_yuv420_as_r8g8b8_supported(screen, out, usage, native_supported) &&
|
||||
!is_yuv420_as_r10g10b10_supported(screen, out, usage, native_supported) &&
|
||||
!is_format_supported(screen, out->format, out->texture->nr_samples,
|
||||
out->texture->nr_storage_samples, usage,
|
||||
native_supported)) {
|
||||
@@ -404,6 +442,16 @@ st_bind_egl_image(struct gl_context *ctx,
|
||||
*/
|
||||
if (!native_supported) {
|
||||
switch (stimg->format) {
|
||||
case PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED:
|
||||
assert(stimg->texture->format == PIPE_FORMAT_R8G8B8_420_UNORM_PACKED);
|
||||
texFormat = MESA_FORMAT_R8G8B8X8_UNORM;
|
||||
texObj->RequiredTextureImageUnits = 1;
|
||||
break;
|
||||
case PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED:
|
||||
assert(stimg->texture->format == PIPE_FORMAT_R10G10B10_420_UNORM_PACKED);
|
||||
texFormat = MESA_FORMAT_R10G10B10X2_UNORM;
|
||||
texObj->RequiredTextureImageUnits = 1;
|
||||
break;
|
||||
case PIPE_FORMAT_NV12:
|
||||
case PIPE_FORMAT_NV21:
|
||||
if (stimg->texture->format == PIPE_FORMAT_R8_G8B8_420_UNORM ||
|
||||
@@ -511,6 +559,7 @@ st_bind_egl_image(struct gl_context *ctx,
|
||||
}
|
||||
} else {
|
||||
texFormat = st_pipe_format_to_mesa_format(stimg->format);
|
||||
|
||||
/* Use previously derived internalformat as specified by
|
||||
* EXT_EGL_image_storage.
|
||||
*/
|
||||
|
||||
@@ -84,6 +84,19 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
|
||||
continue;
|
||||
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED:
|
||||
/* This format is HW-defined, so we can't lower it to anything but its
|
||||
* YUV-as-RGB variant. */
|
||||
assert(stObj->pt->format == PIPE_FORMAT_R8G8B8_420_UNORM_PACKED);
|
||||
key.lower_yuv |= (1 << unit);
|
||||
break;
|
||||
case PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED:
|
||||
/* This format is HW-defined, so we can't lower it to anything but its
|
||||
* YUV-as-RGB variant. */
|
||||
assert(stObj->pt->format == PIPE_FORMAT_R10G10B10_420_UNORM_PACKED);
|
||||
key.lower_yuv |= (1 << unit);
|
||||
break;
|
||||
|
||||
case PIPE_FORMAT_NV16:
|
||||
if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_422_UNORM) {
|
||||
key.lower_yuv |= (1 << unit);
|
||||
|
||||
@@ -352,6 +352,19 @@ st_get_sampler_view_format(const struct st_context *st,
|
||||
|
||||
/* Use R8_UNORM for video formats */
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED:
|
||||
/* This format is HW-defined, so we can't lower it to anything but its
|
||||
* YUV-as-RGB variant. */
|
||||
assert(texObj->pt->format == PIPE_FORMAT_R8G8B8_420_UNORM_PACKED);
|
||||
format = PIPE_FORMAT_R8G8B8_420_UNORM_PACKED;
|
||||
break;
|
||||
case PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED:
|
||||
/* This format is HW-defined, so we can't lower it to anything but its
|
||||
* YUV-as-RGB variant. */
|
||||
assert(texObj->pt->format == PIPE_FORMAT_R10G10B10_420_UNORM_PACKED);
|
||||
format = PIPE_FORMAT_R10G10B10_420_UNORM_PACKED;
|
||||
break;
|
||||
|
||||
case PIPE_FORMAT_NV12:
|
||||
if (texObj->pt->format == PIPE_FORMAT_R8_G8B8_420_UNORM) {
|
||||
format = PIPE_FORMAT_R8_G8B8_420_UNORM;
|
||||
|
||||
Reference in New Issue
Block a user