summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2017-05-02 12:27:01 -0400
committerAdam Jackson <ajax@redhat.com>2017-05-04 12:52:18 -0400
commitddb99127a6f6c6d0284f3395e0b06aed575f0ecd (patch)
tree575cdd13039615992811e91f7fc110a69dcdf21f
parent939b015736d5091faeabde4f5a373e6a1612c5ed (diff)
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 <eric@anholt.net> Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r--src/egl/drivers/dri2/platform_x11.c2
-rw-r--r--src/egl/main/egldisplay.c19
-rw-r--r--src/egl/main/egldisplay.h1
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 */