xserver: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 8 15:31:58 UTC 2020


 glamor/glamor_egl.c |   39 ++++++++++++++++++++++++++++-----------
 1 file changed, 28 insertions(+), 11 deletions(-)

New commits:
commit 26004df63c25061586a967f3586795a75280acc2
Author: Lubomir Rintel <lkundrak at v3.sk>
Date:   Wed Dec 25 18:54:03 2019 +0100

    glamor_egl: Reject OpenGL < 2.1 early on
    
    The Etnaviv driver on GC2000 reports desktop OpenGL 1.3 but also OpenGL ES 2.0.
    However, with the modesetting driver, GLES2 never gets a chance:
    
      [ 11233.393] Require OpenGL version 2.1 or later.
      [ 11233.393] (EE) modeset(0): Failed to initialize glamor at ScreenInit() time.
      [ 11233.393] (EE)
      Fatal server error:
      [ 11233.395] (EE) AddScreen/ScreenInit failed for driver 0
    
    Let's reject old desktop GL early on, just like XWayland seems to do.
    
    This is perhaps a slightly bit more complicated that one would expect, since we
    need to call eglMakeCurrent() before we query the GL version.
    
    Signed-off-by: Lubomir Rintel <lkundrak at v3.sk>

diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index ea3450152..be7c3bf19 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -999,6 +999,22 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
                                                    config_attribs);
     }
 
+    if (glamor_egl->context != EGL_NO_CONTEXT) {
+        if (!eglMakeCurrent(glamor_egl->display,
+                            EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
+            xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                       "Failed to make GL context current\n");
+            goto error;
+        }
+
+        if (epoxy_gl_version() < 21) {
+            xf86DrvMsg(scrn->scrnIndex, X_INFO,
+                       "glamor: Ignoring GL < 2.1, falling back to GLES.\n");
+            eglDestroyContext(glamor_egl->display, glamor_egl->context);
+            glamor_egl->context = EGL_NO_CONTEXT;
+        }
+    }
+
     if (glamor_egl->context == EGL_NO_CONTEXT) {
         static const EGLint config_attribs[] = {
             EGL_CONTEXT_CLIENT_VERSION, 2,
@@ -1019,18 +1035,19 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
         glamor_egl->context = eglCreateContext(glamor_egl->display,
                                                egl_config, EGL_NO_CONTEXT,
                                                config_attribs);
-    }
-    if (glamor_egl->context == EGL_NO_CONTEXT) {
-        xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-                   "glamor: Failed to create GL or GLES2 contexts\n");
-        goto error;
-    }
 
-    if (!eglMakeCurrent(glamor_egl->display,
-                        EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
-        xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-                   "Failed to make EGL context current\n");
-        goto error;
+        if (glamor_egl->context == EGL_NO_CONTEXT) {
+            xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                       "glamor: Failed to create GL or GLES2 contexts\n");
+            goto error;
+        }
+
+        if (!eglMakeCurrent(glamor_egl->display,
+                            EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
+            xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                       "Failed to make GLES2 context current\n");
+            goto error;
+        }
     }
 
     renderer = glGetString(GL_RENDERER);


More information about the xorg-commit mailing list