Commit 74043994b832ae03094cb7f7b66b36129238e74a

Ryan C. Gordon 2017-09-01T14:08:09

x11: Correctly restore previous GL context after sacrificial context is done.

diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c
index 828a18d..ab1bf58 100644
--- a/src/video/x11/SDL_x11opengl.c
+++ b/src/video/x11/SDL_x11opengl.c
@@ -333,7 +333,8 @@ X11_GL_InitExtensions(_THIS)
     const int screen = DefaultScreen(display);
     XVisualInfo *vinfo = NULL;
     Window w = 0;
-    GLXContext current_context = 0;
+    GLXContext prev_ctx = 0;
+    GLXDrawable prev_drawable = 0;
     GLXContext context = 0;
     const char *(*glXQueryExtensionsStringFunc) (Display *, int);
     const char *extensions;
@@ -342,11 +343,16 @@ X11_GL_InitExtensions(_THIS)
     if (vinfo) {
         GLXContext (*glXGetCurrentContextFunc) (void) =
             (GLXContext(*)(void))
-                X11_GL_GetProcAddress(_this, "glXGetCurrentContextFunc");
+                X11_GL_GetProcAddress(_this, "glXGetCurrentContext");
 
-        if (glXGetCurrentContextFunc) {
+        GLXDrawable (*glXGetCurrentDrawableFunc) (void) =
+            (GLXDrawable(*)(void))
+                X11_GL_GetProcAddress(_this, "glXGetCurrentDrawable");
+
+        if (glXGetCurrentContextFunc && glXGetCurrentDrawableFunc) {
             XSetWindowAttributes xattr;
-            current_context = glXGetCurrentContextFunc();
+            prev_ctx = glXGetCurrentContextFunc();
+            prev_drawable = glXGetCurrentDrawableFunc();
 
             xattr.background_pixel = 0;
             xattr.border_pixel = 0;
@@ -452,8 +458,8 @@ X11_GL_InitExtensions(_THIS)
     if (context) {
         _this->gl_data->glXMakeCurrent(display, None, NULL);
         _this->gl_data->glXDestroyContext(display, context);
-        if (current_context) {
-            _this->gl_data->glXMakeCurrent(display, w, current_context);
+        if (prev_ctx && prev_drawable) {
+            _this->gl_data->glXMakeCurrent(display, prev_drawable, prev_ctx);
         }
     }