diff options
author | Derek Foreman <derekf@osg.samsung.com> | 2017-10-30 15:52:22 -0500 |
---|---|---|
committer | Andres Gomez <agomez@igalia.com> | 2017-11-22 18:41:23 +0200 |
commit | 0d02e91c2cd43f0ca0ef658997785b5dddbfb417 (patch) | |
tree | d42e28601187fabaae78242ad7c44c43709e8b4a | |
parent | f288607eb76c8ab2afef2bb01405e5b7331e3dc2 (diff) | |
download | mesa-0d02e91c2cd43f0ca0ef658997785b5dddbfb417.tar.gz |
egl/wayland: Add a fallback when fourcc query isn't supported
When queryImage doesn't support __DRI_IMAGE_ATTRIB_FOURCC wayland clients
will die with a NULL derefence in wl_proxy_add_listener.
Attempt to provide a simple fallback to keep ancient systems working.
Fixes: 6595c699511 ("egl/wayland: Remove more surface specifics from
create_wl_buffer")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103519
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
(cherry picked from commit 0db36caa192b129cb4f22d152f82f38fcf6f06d4)
Squashed with:
egl: fix var type
queryImage() takes an `int*`; compiler is warning about the
signed<->unsigned pointer mismatch.
Fixes: 0db36caa192b129cb4f2 "egl/wayland: Add a fallback when fourcc
query isn't supported"
Signed-off-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
(cherry picked from commit ca95d7ad4e1b900eb3d559ed5bda0b96b232961d)
-rw-r--r-- | src/egl/drivers/dri2/platform_wayland.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index b4b412ca4a0..087d24d1f5f 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -712,6 +712,35 @@ static const struct wl_callback_listener throttle_listener = { .done = wayland_throttle_callback }; +static EGLBoolean +get_fourcc(struct dri2_egl_display *dri2_dpy, + __DRIimage *image, int *fourcc) +{ + EGLBoolean query; + int dri_format; + + query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FOURCC, + fourcc); + if (query) + return true; + + query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, + &dri_format); + if (!query) + return false; + + switch (dri_format) { + case __DRI_IMAGE_FORMAT_ARGB8888: + *fourcc = __DRI_IMAGE_FOURCC_ARGB8888; + return true; + case __DRI_IMAGE_FORMAT_XRGB8888: + *fourcc = __DRI_IMAGE_FOURCC_XRGB8888; + return true; + default: + return false; + } +} + static struct wl_buffer * create_wl_buffer(struct dri2_egl_display *dri2_dpy, struct dri2_egl_surface *dri2_surf, @@ -725,8 +754,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width); query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, &height); - query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FOURCC, - &fourcc); + query &= get_fourcc(dri2_dpy, image, &fourcc); if (!query) return NULL; |