# HG changeset patch # User Sam Lantinga # Date 1184221896 0 # Node ID 114a541cfae2c88675b990bab5896b99d0186f6a # Parent 4f896c20caf6bea28c02e39b6b8e161899de45c1 Creating a context makes it current, per the documentation. Applied a variant of the multi-card OpenGL fix from SDL 1.2 diff -r 4f896c20caf6 -r 114a541cfae2 src/video/cocoa/SDL_cocoaopengl.m --- a/src/video/cocoa/SDL_cocoaopengl.m Thu Jul 12 05:32:07 2007 +0000 +++ b/src/video/cocoa/SDL_cocoaopengl.m Thu Jul 12 06:31:36 2007 +0000 @@ -150,7 +150,7 @@ 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 @@ 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 @@ { 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 @@ /* 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 -r 4f896c20caf6 -r 114a541cfae2 src/video/win32/SDL_win32opengl.c --- a/src/video/win32/SDL_win32opengl.c Thu Jul 12 05:32:07 2007 +0000 +++ b/src/video/win32/SDL_win32opengl.c Thu Jul 12 06:31:36 2007 +0000 @@ -292,32 +292,11 @@ } 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_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 @@ return -1; } - /* Initialize extensions */ - WIN_GL_InitExtensions(_this); - return 0; } @@ -408,7 +417,6 @@ 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 @@ *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 @@ WIN_GL_CreateContext(_THIS, SDL_Window * window) { HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; + HGLRC context; - return _this->gl_data->wglCreateContext(hdc); + 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 context; } int diff -r 4f896c20caf6 -r 114a541cfae2 src/video/x11/SDL_x11opengl.c --- a/src/video/x11/SDL_x11opengl.c Thu Jul 12 05:32:07 2007 +0000 +++ b/src/video/x11/SDL_x11opengl.c Thu Jul 12 06:31:36 2007 +0000 @@ -426,8 +426,15 @@ 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 -r 4f896c20caf6 -r 114a541cfae2 test/testgl2.c --- a/test/testgl2.c Thu Jul 12 05:32:07 2007 +0000 +++ b/test/testgl2.c Thu Jul 12 06:31:36 2007 +0000 @@ -225,10 +225,6 @@ 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);