From a4c7b32f8b10e8e47dadaa50cdba4e7c2be241ff Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 3 Apr 2009 17:19:05 +0000 Subject: [PATCH] Fixed bug #721 From michalziulek@gmail.com 2009-03-28 07:43:34 (-) [reply] There is a bug in OpenGL 3.x context creation code. Function glXGetProcAddress is used directly where it should be: _this->gl_data->glXGetProcAddress. I have attached patch which fixes this on x11 and win32. Thanks. --- src/video/win32/SDL_win32opengl.c | 4 ++-- src/video/x11/SDL_x11opengl.c | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/video/win32/SDL_win32opengl.c b/src/video/win32/SDL_win32opengl.c index 75f566ba9..bcad44db2 100644 --- a/src/video/win32/SDL_win32opengl.c +++ b/src/video/win32/SDL_win32opengl.c @@ -512,7 +512,7 @@ WIN_GL_CreateContext(_THIS, SDL_Window * window) return NULL; } - wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress("wglCreateContextAttribsARB"); + wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) _this->gl_data->wglGetProcAddress("wglCreateContextAttribsARB"); if (!wglCreateContextAttribsARB) { SDL_SetError("GL 3.x is not supported"); context = temp_context; @@ -525,7 +525,7 @@ WIN_GL_CreateContext(_THIS, SDL_Window * window) /* Create the GL 3.x context */ context = wglCreateContextAttribsARB(hdc, 0, attribs); /* Delete the GL 2.x context */ - wglDeleteContext(temp_context); + _this->gl_data->wglDeleteContext(temp_context); } } diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index 7a34bec5f..bd44a72c6 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -413,21 +413,24 @@ X11_GL_CreateContext(_THIS, SDL_Window * window) }; /* Get a pointer to the context creation function for GL 3.0 */ - PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribs = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress((GLubyte*)"glXCreateContextAttribsARB"); + PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribs = (PFNGLXCREATECONTEXTATTRIBSARBPROC)_this->gl_data->glXGetProcAddress((GLubyte*)"glXCreateContextAttribsARB"); if (!glXCreateContextAttribs) { SDL_SetError("GL 3.x is not supported"); context = temp_context; } else { - /* Create a GL 3.0 context */ + /* Create a GL 3.x context */ GLXFBConfig *framebuffer_config = NULL; int fbcount = 0; - framebuffer_config = glXChooseFBConfig(display, DefaultScreen(display), NULL, &fbcount); - if (!framebuffer_config) { - SDL_SetError("No good framebuffers found. GL 3.0 disabled"); + GLXFBConfig* (*glXChooseFBConfig)(Display* disp, int screen, const int* attrib_list, int* nelements); + + glXChooseFBConfig = (GLXFBConfig* (*)(Display*, int, const int*, int*))_this->gl_data->glXGetProcAddress((GLubyte*)"glXChooseFBConfig"); + + if (!glXChooseFBConfig || !(framebuffer_config = glXChooseFBConfig(display, DefaultScreen(display), NULL, &fbcount))) { + SDL_SetError("No good framebuffers found. GL 3.x disabled"); context = temp_context; } else { context = glXCreateContextAttribs(display, framebuffer_config[0], NULL, True, attribs); - glXDestroyContext(display, temp_context); + _this->gl_data->glXDestroyContext(display, temp_context); } } }