From 27919ac86b075cb3bc715cec0f66b33b9e7008fd Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 12 Jul 2007 06:31:36 +0000 Subject: [PATCH] Creating a context makes it current, per the documentation. Applied a variant of the multi-card OpenGL fix from SDL 1.2 --- src/video/cocoa/SDL_cocoaopengl.m | 16 ++++-- src/video/win32/SDL_win32opengl.c | 82 +++++++++++++++++++------------ src/video/x11/SDL_x11opengl.c | 9 +++- test/testgl2.c | 4 -- 4 files changed, 70 insertions(+), 41 deletions(-) diff --git a/src/video/cocoa/SDL_cocoaopengl.m b/src/video/cocoa/SDL_cocoaopengl.m index bbcf6ffa7..7442a8189 100644 --- a/src/video/cocoa/SDL_cocoaopengl.m +++ b/src/video/cocoa/SDL_cocoaopengl.m @@ -150,7 +150,7 @@ - (CGLContextObj)CGLContextObj; SDL_DisplayData *displaydata = (SDL_DisplayData *)display->driverdata; NSOpenGLPixelFormatAttribute attr[32]; NSOpenGLPixelFormat *fmt; - NSOpenGLContext *nscontext; + NSOpenGLContext *context; int i = 0; pool = [[NSAutoreleasePool alloc] init]; @@ -212,11 +212,11 @@ - (CGLContextObj)CGLContextObj; return NULL; } - nscontext = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; + context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; [fmt release]; - if (nscontext == nil) { + if (context == nil) { SDL_SetError ("Failed creating OpenGL context"); [pool release]; return NULL; @@ -240,7 +240,7 @@ - (CGLContextObj)CGLContextObj; { long cache_max = 64; - CGLContextObj ctx = [nscontext CGLContextObj]; + CGLContextObj ctx = [context CGLContextObj]; CGLSetParameter (ctx, GLI_SUBMIT_FUNC_CACHE_MAX, &cache_max); CGLSetParameter (ctx, GLI_ARRAY_FUNC_CACHE_MAX, &cache_max); } @@ -248,7 +248,13 @@ - (CGLContextObj)CGLContextObj; /* End Wisdom from Apple Engineer section. --ryan. */ [pool release]; - return nscontext; + + if ( Cocoa_GL_MakeCurrent(_this, window, context) < 0 ) { + Cocoa_GL_DeleteContext(_this, context); + return NULL; + } + + return context; } int diff --git a/src/video/win32/SDL_win32opengl.c b/src/video/win32/SDL_win32opengl.c index c158ce922..a79f665db 100644 --- a/src/video/win32/SDL_win32opengl.c +++ b/src/video/win32/SDL_win32opengl.c @@ -292,32 +292,11 @@ HasExtension(const char *extension, const char *extensions) } static void -WIN_GL_InitExtensions(_THIS) +WIN_GL_InitExtensions(_THIS, HDC hdc) { - HWND hwnd; - HDC hdc; - PIXELFORMATDESCRIPTOR pfd; - int pixel_format; - HGLRC hglrc; const char *(WINAPI * wglGetExtensionsStringARB) (HDC) = 0; const char *extensions; - hwnd = - CreateWindow(SDL_Appname, SDL_Appname, (WS_POPUP | WS_DISABLED), 0, 0, - 10, 10, NULL, NULL, SDL_Instance, NULL); - WIN_PumpEvents(_this); - - hdc = GetDC(hwnd); - - WIN_GL_SetupPixelFormat(_this, &pfd); - pixel_format = ChoosePixelFormat(hdc, &pfd); - SetPixelFormat(hdc, pixel_format, &pfd); - - hglrc = _this->gl_data->wglCreateContext(hdc); - if (hglrc) { - _this->gl_data->wglMakeCurrent(hdc, hglrc); - } - wglGetExtensionsStringARB = (const char *(WINAPI *) (HDC)) _this->gl_data->wglGetProcAddress("wglGetExtensionsStringARB"); if (wglGetExtensionsStringARB) { @@ -350,15 +329,48 @@ WIN_GL_InitExtensions(_THIS) WIN_GL_GetProcAddress(_this, "wglSwapIntervalEXT"); _this->gl_data->wglGetSwapIntervalEXT = WIN_GL_GetProcAddress(_this, "wglGetSwapIntervalEXT"); + } else { + _this->gl_data->wglSwapIntervalEXT = NULL; + _this->gl_data->wglGetSwapIntervalEXT = NULL; } +} + +static int +WIN_GL_ChoosePixelFormatARB(_THIS, int *iAttribs, float *fAttribs) +{ + HWND hwnd; + HDC hdc; + HGLRC hglrc; + int pixel_format = 0; + unsigned int matching; + + hwnd = + CreateWindow(SDL_Appname, SDL_Appname, (WS_POPUP | WS_DISABLED), 0, 0, + 10, 10, NULL, NULL, SDL_Instance, NULL); + WIN_PumpEvents(_this); + hdc = GetDC(hwnd); + + hglrc = _this->gl_data->wglCreateContext(hdc); if (hglrc) { + _this->gl_data->wglMakeCurrent(hdc, hglrc); + + WIN_GL_InitExtensions(_this, hdc); + + if (_this->gl_data->WGL_ARB_pixel_format) { + _this->gl_data->wglChoosePixelFormatARB(hdc, iAttribs, fAttribs, + 1, &pixel_format, + &matching); + } + _this->gl_data->wglMakeCurrent(NULL, NULL); _this->gl_data->wglDeleteContext(hglrc); } ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); WIN_PumpEvents(_this); + + return pixel_format; } static int @@ -383,9 +395,6 @@ WIN_GL_Initialize(_THIS) return -1; } - /* Initialize extensions */ - WIN_GL_InitExtensions(_this); - return 0; } @@ -408,7 +417,6 @@ WIN_GL_SetupWindow(_THIS, SDL_Window * window) HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; PIXELFORMATDESCRIPTOR pfd; int pixel_format; - unsigned int matching; int iAttribs[64]; int *iAttr; float fAttribs[1] = { 0 }; @@ -495,10 +503,8 @@ WIN_GL_SetupWindow(_THIS, SDL_Window * window) *iAttr = 0; /* Choose and set the closest available pixel format */ - if (!_this->gl_data->WGL_ARB_pixel_format - || !_this->gl_data->wglChoosePixelFormatARB(hdc, iAttribs, fAttribs, - 1, &pixel_format, - &matching) || !matching) { + pixel_format = WIN_GL_ChoosePixelFormatARB(_this, iAttribs, fAttribs); + if (!pixel_format) { pixel_format = WIN_GL_ChoosePixelFormat(hdc, &pfd); } if (!pixel_format) { @@ -522,8 +528,22 @@ SDL_GLContext WIN_GL_CreateContext(_THIS, SDL_Window * window) { HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; + HGLRC context; + + context = _this->gl_data->wglCreateContext(hdc); + if (!context) { + SDL_SetError("Could not create GL context"); + return NULL; + } + + if (WIN_GL_MakeCurrent(_this, window, context) < 0) { + WIN_GL_DeleteContext(_this, context); + return NULL; + } + + WIN_GL_InitExtensions(_this, hdc); - return _this->gl_data->wglCreateContext(hdc); + return context; } int diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index 36b31bbe9..4cad36b83 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -426,8 +426,15 @@ X11_GL_CreateContext(_THIS, SDL_Window * window) if (!context) { SDL_SetError("Could not create GL context"); + return NULL; } - return (SDL_GLContext) context; + + if (X11_GL_MakeCurrent(_this, window, context) < 0) { + X11_GL_DeleteContext(_this, context); + return NULL; + } + + return context; } int diff --git a/test/testgl2.c b/test/testgl2.c index 02aa25d28..5d3fff231 100644 --- a/test/testgl2.c +++ b/test/testgl2.c @@ -225,10 +225,6 @@ main(int argc, char *argv[]) fprintf(stderr, "SDL_GL_CreateContext(): %s\n", SDL_GetError()); quit(2); } - if (SDL_GL_MakeCurrent(state->windows[0], context) < 0) { - fprintf(stderr, "SDL_GL_MakeCurrent(): %s\n", SDL_GetError()); - quit(2); - } if (state->render_flags & SDL_RENDERER_PRESENTVSYNC) { SDL_GL_SetSwapInterval(1);