x11: Clean up sacrificial GL context code.

Check for failures, restore any previously-current context.
This commit is contained in:
Ryan C. Gordon 2017-09-01 13:57:40 -04:00
parent 507659c6ac
commit 4649ac463c
1 changed files with 30 additions and 19 deletions

View File

@ -331,31 +331,41 @@ X11_GL_InitExtensions(_THIS)
{ {
Display *display = ((SDL_VideoData *) _this->driverdata)->display; Display *display = ((SDL_VideoData *) _this->driverdata)->display;
const int screen = DefaultScreen(display); const int screen = DefaultScreen(display);
XVisualInfo *vinfo; XVisualInfo *vinfo = NULL;
XSetWindowAttributes xattr; Window w = 0;
Window w; GLXContext current_context = 0;
GLXContext context; GLXContext context = 0;
const char *(*glXQueryExtensionsStringFunc) (Display *, int); const char *(*glXQueryExtensionsStringFunc) (Display *, int);
const char *extensions; const char *extensions;
vinfo = X11_GL_GetVisual(_this, display, screen); vinfo = X11_GL_GetVisual(_this, display, screen);
if (!vinfo) { if (vinfo) {
return; GLXContext (*glXGetCurrentContextFunc) (void) =
} (GLXContext(*)(void))
X11_GL_GetProcAddress(_this, "glXGetCurrentContextFunc");
if (glXGetCurrentContextFunc) {
XSetWindowAttributes xattr;
current_context = glXGetCurrentContextFunc();
xattr.background_pixel = 0; xattr.background_pixel = 0;
xattr.border_pixel = 0; xattr.border_pixel = 0;
xattr.colormap = xattr.colormap =
X11_XCreateColormap(display, RootWindow(display, screen), vinfo->visual, X11_XCreateColormap(display, RootWindow(display, screen),
AllocNone); vinfo->visual, AllocNone);
w = X11_XCreateWindow(display, RootWindow(display, screen), 0, 0, 32, 32, 0, w = X11_XCreateWindow(display, RootWindow(display, screen), 0, 0,
vinfo->depth, InputOutput, vinfo->visual, 32, 32, 0, vinfo->depth, InputOutput, vinfo->visual,
(CWBackPixel | CWBorderPixel | CWColormap), &xattr); (CWBackPixel | CWBorderPixel | CWColormap), &xattr);
context = _this->gl_data->glXCreateContext(display, vinfo, NULL, True);
context = _this->gl_data->glXCreateContext(display, vinfo,
NULL, True);
if (context) { if (context) {
_this->gl_data->glXMakeCurrent(display, w, context); _this->gl_data->glXMakeCurrent(display, w, context);
} }
}
X11_XFree(vinfo); X11_XFree(vinfo);
}
glXQueryExtensionsStringFunc = glXQueryExtensionsStringFunc =
(const char *(*)(Display *, int)) X11_GL_GetProcAddress(_this, (const char *(*)(Display *, int)) X11_GL_GetProcAddress(_this,
@ -442,6 +452,7 @@ X11_GL_InitExtensions(_THIS)
if (context) { if (context) {
_this->gl_data->glXMakeCurrent(display, None, NULL); _this->gl_data->glXMakeCurrent(display, None, NULL);
_this->gl_data->glXDestroyContext(display, context); _this->gl_data->glXDestroyContext(display, context);
_this->gl_data->glXMakeCurrent(display, w, current_context);
} }
X11_XDestroyWindow(display, w); X11_XDestroyWindow(display, w);