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: 6595c69951 ("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 0db36caa19)

Squashed with:

egl: fix var type

queryImage() takes an `int*`; compiler is warning about the
signed<->unsigned pointer mismatch.

Fixes: 0db36caa19 "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 ca95d7ad4e)
This commit is contained in:
Derek Foreman 2017-10-30 15:52:22 -05:00 committed by Andres Gomez
parent f288607eb7
commit 0d02e91c2c

View file

@ -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;