x11: Correctly restore previous GL context after sacrificial context is done.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
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);
}
}