summaryrefslogtreecommitdiff
path: root/src/video/x11/SDL_x11opengl.c
diff options
context:
space:
mode:
authorRyan C. Gordon <icculus@icculus.org>2017-01-07 19:55:29 -0500
committerRyan C. Gordon <icculus@icculus.org>2017-01-07 19:55:29 -0500
commit9750a9a17b9c00a405ae972bcce3480d2b559baf (patch)
tree45d772d1647a05a34afa5c8929f54da2965a25ac /src/video/x11/SDL_x11opengl.c
parentbda48fafc95ead97a258f332b7e097b626a1b324 (diff)
x11: make the X11 target work on macOS with Xquartz.
Diffstat (limited to 'src/video/x11/SDL_x11opengl.c')
-rw-r--r--src/video/x11/SDL_x11opengl.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c
index b412dc7c85..e407c2922a 100644
--- a/src/video/x11/SDL_x11opengl.c
+++ b/src/video/x11/SDL_x11opengl.c
@@ -391,12 +391,17 @@ X11_GL_InitExtensions(_THIS)
/* glXChooseVisual and glXChooseFBConfig have some small differences in
* the attribute encoding, it can be chosen with the for_FBConfig parameter.
+ * Some targets fail if you use GLX_X_VISUAL_TYPE_EXT/GLX_DIRECT_COLOR_EXT,
+ * so it gets specified last if used and is pointed to by *_pvistypeattr.
+ * In case of failure, if that pointer is not NULL, set that pointer to None
+ * and try again.
*/
static int
-X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int size, Bool for_FBConfig)
+X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int size, Bool for_FBConfig, int **_pvistypeattr)
{
int i = 0;
const int MAX_ATTRIBUTES = 64;
+ int *pvistypeattr = NULL;
/* assert buffer is large enough to hold all SDL attributes. */
SDL_assert(size >= MAX_ATTRIBUTES);
@@ -488,6 +493,7 @@ X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int si
EXT_visual_info extension, then add GLX_X_VISUAL_TYPE_EXT. */
if (X11_UseDirectColorVisuals() &&
_this->gl_data->HAS_GLX_EXT_visual_info) {
+ pvistypeattr = &attribs[i];
attribs[i++] = GLX_X_VISUAL_TYPE_EXT;
attribs[i++] = GLX_DIRECT_COLOR_EXT;
}
@@ -496,6 +502,10 @@ X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int si
SDL_assert(i <= MAX_ATTRIBUTES);
+ if (_pvistypeattr) {
+ *_pvistypeattr = pvistypeattr;
+ }
+
return i;
}
@@ -505,14 +515,21 @@ X11_GL_GetVisual(_THIS, Display * display, int screen)
/* 64 seems nice. */
int attribs[64];
XVisualInfo *vinfo;
+ int *pvistypeattr = NULL;
if (!_this->gl_data) {
/* The OpenGL library wasn't loaded, SDL_GetError() should have info */
return NULL;
}
- X11_GL_GetAttributes(_this, display, screen, attribs, 64, SDL_FALSE);
+ X11_GL_GetAttributes(_this, display, screen, attribs, 64, SDL_FALSE, &pvistypeattr);
vinfo = _this->gl_data->glXChooseVisual(display, screen, attribs);
+
+ if (!vinfo && (pvistypeattr != NULL)) {
+ *pvistypeattr = None;
+ vinfo = _this->gl_data->glXChooseVisual(display, screen, attribs);
+ }
+
if (!vinfo) {
SDL_SetError("Couldn't find matching GLX visual");
}
@@ -626,20 +643,28 @@ X11_GL_CreateContext(_THIS, SDL_Window * window)
/* Create a GL 3.x context */
GLXFBConfig *framebuffer_config = NULL;
int fbcount = 0;
+ int *pvistypeattr = NULL;
+
+ X11_GL_GetAttributes(_this,display,screen,glxAttribs,64,SDL_TRUE,&pvistypeattr);
- X11_GL_GetAttributes(_this,display,screen,glxAttribs,64,SDL_TRUE);
+ if (_this->gl_data->glXChooseFBConfig) {
+ framebuffer_config = _this->gl_data->glXChooseFBConfig(display,
+ DefaultScreen(display), glxAttribs,
+ &fbcount);
- if (!_this->gl_data->glXChooseFBConfig
- || !(framebuffer_config =
- _this->gl_data->glXChooseFBConfig(display,
+ if (!framebuffer_config && (pvistypeattr != NULL)) {
+ *pvistypeattr = None;
+ framebuffer_config = _this->gl_data->glXChooseFBConfig(display,
DefaultScreen(display), glxAttribs,
- &fbcount))) {
- SDL_SetError("No good framebuffers found. OpenGL 3.0 and later unavailable");
- } else {
- context = _this->gl_data->glXCreateContextAttribsARB(display,
- framebuffer_config[0],
- share_context, True, attribs);
- X11_XFree(framebuffer_config);
+ &fbcount);
+ }
+
+ if (framebuffer_config) {
+ context = _this->gl_data->glXCreateContextAttribsARB(display,
+ framebuffer_config[0],
+ share_context, True, attribs);
+ X11_XFree(framebuffer_config);
+ }
}
}
}