summaryrefslogtreecommitdiff
path: root/src/video/x11/SDL_x11opengl.c
diff options
context:
space:
mode:
authorRyan C. Gordon <icculus@icculus.org>2017-09-01 13:27:53 -0400
committerRyan C. Gordon <icculus@icculus.org>2017-09-01 13:27:53 -0400
commit94f0e1ebf1e9d75c8cfb12617aea1e31f3fb43cc (patch)
treee9be174dd356019081a657aa922b4f588ae19297 /src/video/x11/SDL_x11opengl.c
parent6317f517bc2178a4beb4240e7b321b5beef915d8 (diff)
x11: Make a sacrificial glX context to check for extensions during init.
This is necessary because we need to see if GLES compat extensions exist. All of this code (including ShouldUseTextureFramebuffer()) should be revisited after 2.0.6 ships; ideally we don't make throwaway contexts if we can avoid it...but maybe we can't. I hear Vulkan is pretty cool. Fixes Bugzilla #3725.
Diffstat (limited to 'src/video/x11/SDL_x11opengl.c')
-rw-r--r--src/video/x11/SDL_x11opengl.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c
index 9bbcb05dbc..05f83c8f67 100644
--- a/src/video/x11/SDL_x11opengl.c
+++ b/src/video/x11/SDL_x11opengl.c
@@ -331,9 +331,32 @@ X11_GL_InitExtensions(_THIS)
{
Display *display = ((SDL_VideoData *) _this->driverdata)->display;
const int screen = DefaultScreen(display);
+ XVisualInfo *vinfo;
+ XSetWindowAttributes xattr;
+ Window w;
+ GLXContext context;
const char *(*glXQueryExtensionsStringFunc) (Display *, int);
const char *extensions;
+ vinfo = X11_GL_GetVisual(_this, display, screen);
+ if (!vinfo) {
+ return;
+ }
+
+ 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);
+
glXQueryExtensionsStringFunc =
(const char *(*)(Display *, int)) X11_GL_GetProcAddress(_this,
"glXQueryExtensionsString");
@@ -391,10 +414,14 @@ X11_GL_InitExtensions(_THIS)
/* Check for GLX_EXT_create_context_es2_profile */
if (HasExtension("GLX_EXT_create_context_es2_profile", extensions)) {
- SDL_GL_DeduceMaxSupportedESProfile(
- &_this->gl_data->es_profile_max_supported_version.major,
- &_this->gl_data->es_profile_max_supported_version.minor
- );
+ /* this wants to call glGetString(), so it needs a context. */
+ /* !!! FIXME: it would be nice not to make a context here though! */
+ if (context) {
+ SDL_GL_DeduceMaxSupportedESProfile(
+ &_this->gl_data->es_profile_max_supported_version.major,
+ &_this->gl_data->es_profile_max_supported_version.minor
+ );
+ }
}
/* Check for GLX_ARB_context_flush_control */
@@ -411,6 +438,14 @@ X11_GL_InitExtensions(_THIS)
if (HasExtension("GLX_ARB_create_context_no_error", extensions)) {
_this->gl_data->HAS_GLX_ARB_create_context_no_error = SDL_TRUE;
}
+
+ if (context) {
+ _this->gl_data->glXMakeCurrent(display, None, NULL);
+ _this->gl_data->glXDestroyContext(display, context);
+ }
+
+ X11_XDestroyWindow(display, w);
+ X11_PumpEvents(_this);
}
/* glXChooseVisual and glXChooseFBConfig have some small differences in