From e20a10f29f3bb79bf4a19e6b32fdf7c3358ff4f3 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Mon, 30 Oct 2017 15:52:22 -0500 Subject: [PATCH] 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. Signed-off-by: Derek Foreman --- src/egl/drivers/dri2/platform_wayland.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index b4b412ca4a..3fc28cdf6b 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; + uint32_t 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; -- 2.15.0.rc2