egl/wayland: Add a fallback when fourcc query isn't supported
authorDerek Foreman <derekf@osg.samsung.com>
Mon, 30 Oct 2017 20:52:22 +0000 (15:52 -0500)
committerEmil Velikov <emil.l.velikov@gmail.com>
Tue, 14 Nov 2017 15:38:43 +0000 (15:38 +0000)
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>
src/egl/drivers/dri2/platform_wayland.c

index b38eb1c3354cfb0c5015c319e4d59d915a1672bd..7010dfdcb2beeafe30d8a23d373a2ce1f11c17ed 100644 (file)
@@ -671,6 +671,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,
@@ -684,8 +713,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;