From ddb99127a6f6c6d0284f3395e0b06aed575f0ecd Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Tue, 2 May 2017 12:27:01 -0400 Subject: [PATCH] egl/x11: Honor the EGL_PLATFORM_X11_SCREEN_EXT attribute Introduce _egl_display::Options::Platforms for private storage. For X11 platforms we can use it for the screen number as set by EGL_PLATFORM_X11_SCREEN_EXT. Reviewed-by: Eric Anholt Reviewed-by: Emil Velikov Signed-off-by: Adam Jackson --- src/egl/drivers/dri2/platform_x11.c | 2 +- src/egl/main/egldisplay.c | 19 ++++++++++++------- src/egl/main/egldisplay.h | 1 + 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 2f1086e28f0..c78656a5be1 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -1191,7 +1191,7 @@ dri2_get_xcb_connection(_EGLDriver *drv, _EGLDisplay *disp, struct dri2_egl_display *dri2_dpy) { xcb_screen_iterator_t s; - int screen = 0; + int screen = (uintptr_t)disp->Options.Platform; const char *msg; disp->DriverData = (void *) dri2_dpy; diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index 37711bd8695..b047a5de429 100644 --- a/src/egl/main/egldisplay.c +++ b/src/egl/main/egldisplay.c @@ -472,7 +472,7 @@ _eglUnlinkResource(_EGLResource *res, _EGLResourceType type) #ifdef HAVE_X11_PLATFORM static EGLBoolean -_eglParseX11DisplayAttribList(const EGLint *attrib_list) +_eglParseX11DisplayAttribList(_EGLDisplay *display, const EGLint *attrib_list) { int i; @@ -486,11 +486,10 @@ _eglParseX11DisplayAttribList(const EGLint *attrib_list) /* EGL_EXT_platform_x11 recognizes exactly one attribute, * EGL_PLATFORM_X11_SCREEN_EXT, which is optional. - * - * Mesa supports connecting to only the default screen, so we reject - * screen != 0. */ - if (attrib != EGL_PLATFORM_X11_SCREEN_EXT || value != 0) { + if (attrib == EGL_PLATFORM_X11_SCREEN_EXT) { + display->Options.Platform = (void *)value; + } else { _eglError(EGL_BAD_ATTRIBUTE, "eglGetPlatformDisplay"); return EGL_FALSE; } @@ -503,11 +502,17 @@ _EGLDisplay* _eglGetX11Display(Display *native_display, const EGLint *attrib_list) { - if (!_eglParseX11DisplayAttribList(attrib_list)) { + _EGLDisplay *display = _eglFindDisplay(_EGL_PLATFORM_X11, + native_display); + + if (!display) + _eglError(EGL_BAD_ALLOC, "eglGetPlatformDisplay"); + + if (!_eglParseX11DisplayAttribList(display, attrib_list)) { return NULL; } - return _eglFindDisplay(_EGL_PLATFORM_X11, native_display); + return display; } #endif /* HAVE_X11_PLATFORM */ diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index 6c1049d23c3..4d3d96e1749 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -151,6 +151,7 @@ struct _egl_display struct { EGLBoolean TestOnly; /**< Driver should not set fields when true */ EGLBoolean UseFallback; /**< Use fallback driver (sw or less features) */ + void *Platform; /**< Platform-specific options */ } Options; /* these fields are set by the driver during init */ -- 2.30.2