Adding OpenGL 3.0 context detection for Windows per e-mail from Paul Martz dated Thu 2/12/2009 9:03 AM (more or less)
git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@766 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
100396cef0
commit
91e715a11b
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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 )
|
||||
{
|
||||
|
Reference in New Issue
Block a user