summaryrefslogtreecommitdiff
path: root/glamor
diff options
context:
space:
mode:
authorHans De Goede <hdegoede@redhat.com>2016-12-20 13:00:43 +0100
committerAdam Jackson <ajax@redhat.com>2017-01-11 15:03:34 -0500
commit862c1c43c10eda955db1440cc72ff0387e24a35f (patch)
tree70ef3b618633d686d49e0882ee4e68eb2758c520 /glamor
parent8790bd993ac2f8f8dd54a1946312e6b6dc929e00 (diff)
glamor: Trust eglGetPlatformDisplayEXT if it exists
If the libEGL we are using has eglGetPlatformDisplayEXT, yet it still returns NULL, then this very likely means that it does not support the type (e.g. EGL_PLATFORM_GBM_MESA) passed in, and then returning NULL is the right thing to do. This avoids falling back to an eglGetDisplay() implementation which does not understands the passed in gbm handle, treats it as a pointer to something else completely, followed by a crash sooner or later. Specifically this fixes using the nvidia binary driver, with nvidia's libEGL + the modesetting driver on a secondary GPU crashing inside glamor_egl_init() sometimes. [1.19: squash in typo fix from 29a4f3db - ajax] Cc: Eric Anholt <eric@anholt.net> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> (cherry picked from commit 05e19644250698aa126a60bc671e85425df784d1)
Diffstat (limited to 'glamor')
-rw-r--r--glamor/glamor_egl.c4
-rw-r--r--glamor/glamor_egl.h6
2 files changed, 5 insertions, 5 deletions
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 9cc0f8d6e..4bde637a0 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -769,6 +769,10 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
glamor_egl->display = glamor_egl_get_display(EGL_PLATFORM_GBM_MESA,
glamor_egl->gbm);
+ if (!glamor_egl->display) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglGetDisplay() failed\n");
+ goto error;
+ }
#else
glamor_egl->display = eglGetDisplay((EGLNativeDisplayType) (intptr_t) fd);
#endif
diff --git a/glamor/glamor_egl.h b/glamor/glamor_egl.h
index 6b05f576f..6bb1185bf 100644
--- a/glamor/glamor_egl.h
+++ b/glamor/glamor_egl.h
@@ -60,16 +60,12 @@
static inline EGLDisplay
glamor_egl_get_display(EGLint type, void *native)
{
- EGLDisplay dpy = NULL;
-
/* In practise any EGL 1.5 implementation would support the EXT extension */
if (epoxy_has_egl_extension(NULL, "EGL_EXT_platform_base")) {
PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplayEXT =
(void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
if (getPlatformDisplayEXT)
- dpy = getPlatformDisplayEXT(type, native, NULL);
- if (dpy)
- return dpy;
+ return getPlatformDisplayEXT(type, native, NULL);
}
/* Welp, everything is awful. */