diff options
author | Rob Clark <[email protected]> | 2017-05-16 10:29:44 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2017-05-16 16:34:21 -0400 |
commit | 8b4588b090826a2da7c1b99497ed07705b149ae1 (patch) | |
tree | 211d582bcd71ab5c25f27ad6189c911db1bd9557 /src/mesa/state_tracker | |
parent | 12aa1d15d5b30c49ee424e50a20cadcb7c3ac0c9 (diff) |
mesa/st: fix yuv EGLImage's
Don't reject YUV formats that the driver doesn't handle natively, since
mesa/st already knows how to lower this in shader.
Reported-by: Nicolas Dechesne <[email protected]>
Fixes: 83e9de2 ("st/mesa: EGLImageTarget* error handling")
Cc: 17.1 <[email protected]
Signed-off-by: Rob Clark <[email protected]>
Tested-by: Nicolas Dechesne <[email protected]>
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_cb_eglimage.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c index 3a62ef7304d..a104b649eae 100644 --- a/src/mesa/state_tracker/st_cb_eglimage.c +++ b/src/mesa/state_tracker/st_cb_eglimage.c @@ -39,6 +39,35 @@ #include "st_sampler_view.h" #include "util/u_surface.h" +static bool +is_format_supported(struct pipe_screen *screen, enum pipe_format format, + unsigned nr_samples, unsigned usage) +{ + bool supported = screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, + nr_samples, usage); + + /* for sampling, some formats can be emulated.. it doesn't matter that + * the surface will have a format that the driver can't cope with because + * we'll give it sampler view formats that it can deal with and generate + * a shader variant that converts. + */ + if ((usage == PIPE_BIND_SAMPLER_VIEW) && !supported) { + if (format == PIPE_FORMAT_IYUV) { + supported = screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, + PIPE_TEXTURE_2D, nr_samples, + usage); + } else if (format == PIPE_FORMAT_NV12) { + supported = screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, + PIPE_TEXTURE_2D, nr_samples, + usage) && + screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, + PIPE_TEXTURE_2D, nr_samples, + usage); + } + } + + return supported; +} /** * Return the surface of an EGLImage. @@ -65,8 +94,7 @@ st_egl_image_get_surface(struct gl_context *ctx, GLeglImageOES image_handle, return NULL; } - if (!screen->is_format_supported(screen, stimg.format, PIPE_TEXTURE_2D, - stimg.texture->nr_samples, usage)) { + if (!is_format_supported(screen, stimg.format, stimg.texture->nr_samples, usage)) { /* unable to specify a texture object using the specified EGL image */ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(format not supported)", error); return NULL; |