x11: Clean up sacrificial GL context code. Check for failures, restore any previously-current context.
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c
index 05f83c8..bf9a98e 100644
--- a/src/video/x11/SDL_x11opengl.c
+++ b/src/video/x11/SDL_x11opengl.c
@@ -331,31 +331,41 @@ X11_GL_InitExtensions(_THIS)
{
Display *display = ((SDL_VideoData *) _this->driverdata)->display;
const int screen = DefaultScreen(display);
- XVisualInfo *vinfo;
- XSetWindowAttributes xattr;
- Window w;
- GLXContext context;
+ XVisualInfo *vinfo = NULL;
+ Window w = 0;
+ GLXContext current_context = 0;
+ GLXContext context = 0;
const char *(*glXQueryExtensionsStringFunc) (Display *, int);
const char *extensions;
vinfo = X11_GL_GetVisual(_this, display, screen);
- if (!vinfo) {
- return;
- }
+ if (vinfo) {
+ GLXContext (*glXGetCurrentContextFunc) (void) =
+ (GLXContext(*)(void))
+ X11_GL_GetProcAddress(_this, "glXGetCurrentContextFunc");
+
+ if (glXGetCurrentContextFunc) {
+ XSetWindowAttributes xattr;
+ current_context = glXGetCurrentContextFunc();
+
+ xattr.background_pixel = 0;
+ xattr.border_pixel = 0;
+ xattr.colormap =
+ X11_XCreateColormap(display, RootWindow(display, screen),
+ vinfo->visual, AllocNone);
+ w = X11_XCreateWindow(display, RootWindow(display, screen), 0, 0,
+ 32, 32, 0, vinfo->depth, InputOutput, vinfo->visual,
+ (CWBackPixel | CWBorderPixel | CWColormap), &xattr);
+
+ context = _this->gl_data->glXCreateContext(display, vinfo,
+ NULL, True);
+ if (context) {
+ _this->gl_data->glXMakeCurrent(display, w, context);
+ }
+ }
- xattr.background_pixel = 0;
- xattr.border_pixel = 0;
- xattr.colormap =
- X11_XCreateColormap(display, RootWindow(display, screen), vinfo->visual,
- AllocNone);
- w = X11_XCreateWindow(display, RootWindow(display, screen), 0, 0, 32, 32, 0,
- vinfo->depth, InputOutput, vinfo->visual,
- (CWBackPixel | CWBorderPixel | CWColormap), &xattr);
- context = _this->gl_data->glXCreateContext(display, vinfo, NULL, True);
- if (context) {
- _this->gl_data->glXMakeCurrent(display, w, context);
+ X11_XFree(vinfo);
}
- X11_XFree(vinfo);
glXQueryExtensionsStringFunc =
(const char *(*)(Display *, int)) X11_GL_GetProcAddress(_this,
@@ -442,6 +452,7 @@ X11_GL_InitExtensions(_THIS)
if (context) {
_this->gl_data->glXMakeCurrent(display, None, NULL);
_this->gl_data->glXDestroyContext(display, context);
+ _this->gl_data->glXMakeCurrent(display, w, current_context);
}
X11_XDestroyWindow(display, w);