summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video/SDL_video.c8
-rw-r--r--src/video/x11/SDL_x11opengl.c43
2 files changed, 41 insertions, 10 deletions
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 8008e6e8f0..321eb25666 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -2941,8 +2941,8 @@ SDL_GL_ExtensionSupported(const char *extension)
void
SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor)
{
-/* This function breaks games because OpenGL functions are being called before a context is current - see bug 3725 */
-#if 0
+/* THIS REQUIRES AN EXISTING GL CONTEXT THAT HAS BEEN MADE CURRENT. */
+/* Please refer to https://bugzilla.libsdl.org/show_bug.cgi?id=3725 for discussion. */
#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
/* XXX This is fragile; it will break in the event of release of
* new versions of OpenGL ES.
@@ -2961,10 +2961,6 @@ SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor)
*minor = 0;
}
#endif
-#else
- *major = 2;
- *minor = 0;
-#endif /* 0 */
}
void
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