Adding OpenGL 3.0 context detection for Windows per e-mail from Paul Martz dated...
authorJohn F. Fay <johnffay@nettally.com>
Fri, 13 Feb 2009 03:22:17 +0000 (03:22 +0000)
committerJohn F. Fay <johnffay@nettally.com>
Fri, 13 Feb 2009 03:22:17 +0000 (03:22 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@766 7f0cb862-5218-0410-a997-914c9d46530a

src/freeglut_internal.h
src/freeglut_main.c
src/freeglut_window.c

index 9b3b2d2..4f8fd96 100644 (file)
@@ -813,6 +813,7 @@ GLXFBConfig* fgChooseFBConfig( void );
 #if TARGET_HOST_MS_WINDOWS
 LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg,
                                WPARAM wParam, LPARAM lParam );
+GLboolean fgNewWGLCreateContext( SFG_Window* window );
 GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
                               unsigned char layer_type );
 #endif
index dd83de8..3a6de78 100644 (file)
@@ -1621,6 +1621,10 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                     window->Window.Context =
                         wglCreateContext( window->Window.Device );
             }
+
+#if !defined(_WIN32_WCE)
+            fgNewWGLCreateContext( window );
+#endif
         }
 
         window->State.NeedToResize = GL_TRUE;
index 8602396..b474bf9 100644 (file)
@@ -283,6 +283,83 @@ typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAt
 #define WGL_SAMPLES_ARB                0x2042
 
 
+#ifndef WGL_ARB_create_context
+#define WGL_ARB_create_context 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern HGLRC WINAPI wglCreateContextAttribsARB (HDC, HGLRC, const int *);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
+
+#define WGL_CONTEXT_DEBUG_BIT_ARB      0x0001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+#define WGL_CONTEXT_MAJOR_VERSION_ARB  0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB  0x2092
+#define WGL_CONTEXT_LAYER_PLANE_ARB    0x2093
+#define WGL_CONTEXT_FLAGS_ARB          0x2094
+#define ERROR_INVALID_VERSION_ARB      0x2095
+#endif
+
+
+GLboolean fgNewWGLCreateContext( SFG_Window* window )
+{
+    if( (fgState.ContextFlags & GLUT_FORWARD_COMPATIBLE) &&
+        (fgState.MajorVersion > 2) )
+    {
+        PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetEntensionsStringARB=NULL;
+
+        wglMakeCurrent( window->Window.Device,
+                        window->Window.Context );
+
+        wglGetEntensionsStringARB=(PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
+        if (wglGetEntensionsStringARB)
+        {
+            const char * pWglExtString=wglGetEntensionsStringARB(window->Window.Device);
+            if (pWglExtString)
+            {
+                if (strstr(pWglExtString, "WGL_ARB_create_context"))
+                {
+                    /* new context creation */
+                    HGLRC context;
+                    int attribs[7];
+                    PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
+
+                    attribs[0] = WGL_CONTEXT_MAJOR_VERSION_ARB;
+                    attribs[1] = fgState.MajorVersion;
+                    attribs[2] = WGL_CONTEXT_MINOR_VERSION_ARB;
+                    attribs[3] = fgState.MinorVersion;
+                    attribs[4] = WGL_CONTEXT_FLAGS_ARB;
+                    attribs[5] = ((fgState.ContextFlags & GLUT_DEBUG) ? WGL_CONTEXT_DEBUG_BIT_ARB : 0) |
+                        ((fgState.ContextFlags & GLUT_FORWARD_COMPATIBLE) ? WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB : 0);
+                    attribs[6] = 0;
+
+                    wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress( "wglCreateContextAttribsARB" );
+                    if ( wglCreateContextAttribsARB == NULL )
+                    {
+                        fgError( "wglCreateContextAttribsARB not found" );
+                    }
+
+                    context = wglCreateContextAttribsARB( window->Window.Device, 0, attribs );
+                    if ( context == NULL )
+                    {
+                        fgError( "Unable to create OpenGL %d.%d context (flags %x)",
+                            fgState.MajorVersion, fgState.MinorVersion, fgState.ContextFlags );
+                    }
+                    else
+                    {
+                        fgWarning( "Success 3.0" );
+                        wglMakeCurrent( NULL, NULL );
+                        wglDeleteContext( window->Window.Context );
+                        window->Window.Context = context;
+                    }
+                }
+            }
+        }
+    }
+
+    return GL_TRUE;
+}
+
+
 GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
                               unsigned char layer_type )
 {