changeset 2178:114a541cfae2

Creating a context makes it current, per the documentation. Applied a variant of the multi-card OpenGL fix from SDL 1.2
author Sam Lantinga <slouken@libsdl.org>
date Thu, 12 Jul 2007 06:31:36 +0000
parents 4f896c20caf6
children 8b76cc268771
files src/video/cocoa/SDL_cocoaopengl.m src/video/win32/SDL_win32opengl.c src/video/x11/SDL_x11opengl.c test/testgl2.c
diffstat 4 files changed, 70 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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
--- 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);