summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_cb_eglimage.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2017-05-16 10:29:44 -0400
committerRob Clark <robdclark@gmail.com>2017-05-16 16:34:21 -0400
commit8b4588b090826a2da7c1b99497ed07705b149ae1 (patch)
tree211d582bcd71ab5c25f27ad6189c911db1bd9557 /src/mesa/state_tracker/st_cb_eglimage.c
parent12aa1d15d5b30c49ee424e50a20cadcb7c3ac0c9 (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 <ndec@linaro.org> Fixes: 83e9de2 ("st/mesa: EGLImageTarget* error handling") Cc: 17.1 <mesa-stable@lists.freedesktop.org Signed-off-by: Rob Clark <robdclark@gmail.com> Tested-by: Nicolas Dechesne <ndec@linaro.org> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Diffstat (limited to 'src/mesa/state_tracker/st_cb_eglimage.c')
-rw-r--r--src/mesa/state_tracker/st_cb_eglimage.c32
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;