X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glws_wgl.cpp;h=efefff0e1e784faef84ba4928f7f9e0d64bcf068;hb=fbcf683ea1396da28ec31eeeec24dc64d197ab76;hp=63ce5fea1444748ef2f6c3956d1a732cb3fdef6d;hpb=d31700077ae75f450b12ad7d9276c08cbad57d1b;p=apitrace diff --git a/glws_wgl.cpp b/glws_wgl.cpp index 63ce5fe..efefff0 100644 --- a/glws_wgl.cpp +++ b/glws_wgl.cpp @@ -23,6 +23,14 @@ * **************************************************************************/ + +/* + * WGL bindings. + */ + + +#include + #include "glproc.hpp" #include "glws.hpp" @@ -30,6 +38,27 @@ namespace glws { +/* + * Several WGL functions come in two flavors: + * - GDI (ChoosePixelFormat, SetPixelFormat, SwapBuffers, etc) + * - WGL (wglChoosePixelFormat, wglSetPixelFormat, wglSwapBuffers, etc) + * + * The GDI entrypoints will inevitably dispatch to the first module named + * "OPENGL32", loading "C:\Windows\System32\opengl32.dll" if none was loaded so + * far. + * + * In order to use a implementation other than the one installed in the system + * (when specified via the TRACE_LIBGL environment variable), we need to use + * WGL entrypoints. + * + * See also: + * - http://www.opengl.org/archives/resources/faq/technical/mswindows.htm + */ +static __PFNWGLCHOOSEPIXELFORMAT pfnChoosePixelFormat = &ChoosePixelFormat; +static __PFNWGLSETPIXELFORMAT pfnSetPixelFormat = &SetPixelFormat; +static __PFNWGLSWAPBUFFERS pfnSwapBuffers = &SwapBuffers; + + static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -66,6 +95,7 @@ public: { static bool first = TRUE; RECT rect; + BOOL bRet; if (first) { WNDCLASS wc; @@ -124,9 +154,17 @@ public: pfd.dwFlags |= PFD_DOUBLEBUFFER; } - iPixelFormat = ChoosePixelFormat(hDC, &pfd); + iPixelFormat = pfnChoosePixelFormat(hDC, &pfd); + if (iPixelFormat <= 0) { + std::cerr << "error: ChoosePixelFormat failed\n"; + exit(1); + } - SetPixelFormat(hDC, iPixelFormat, &pfd); + bRet = pfnSetPixelFormat(hDC, iPixelFormat, &pfd); + if (!bRet) { + std::cerr << "error: SetPixelFormat failed\n"; + exit(1); + } } ~WglDrawable() { @@ -161,7 +199,19 @@ public: } void swapBuffers(void) { - SwapBuffers(hDC); + BOOL bRet; + bRet = pfnSwapBuffers(hDC); + if (!bRet) { + std::cerr << "warning: SwapBuffers failed\n"; + } + + // Drain message queue to prevent window from being considered + // non-responsive + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } }; @@ -191,7 +241,22 @@ init(void) { /* * OpenGL library must be loaded by the time we call GDI. */ - __libGlHandle = LoadLibraryA("OPENGL32"); + + const char * libgl_filename = getenv("TRACE_LIBGL"); + + if (libgl_filename) { + pfnChoosePixelFormat = &wglChoosePixelFormat; + pfnSetPixelFormat = &wglSetPixelFormat; + pfnSwapBuffers = &wglSwapBuffers; + } else { + libgl_filename = "OPENGL32"; + } + + __libGlHandle = LoadLibraryA(libgl_filename); + if (!__libGlHandle) { + std::cerr << "error: unable to open " << libgl_filename << "\n"; + exit(1); + } } void @@ -199,7 +264,11 @@ cleanup(void) { } Visual * -createVisual(bool doubleBuffer) { +createVisual(bool doubleBuffer, Profile profile) { + if (profile != PROFILE_COMPAT) { + return NULL; + } + Visual *visual = new Visual(); visual->doubleBuffer = doubleBuffer; @@ -235,11 +304,17 @@ makeCurrent(Drawable *drawable, Context *context) if (!wglContext->hglrc) { wglContext->hglrc = wglCreateContext(wglDrawable->hDC); if (!wglContext->hglrc) { + std::cerr << "error: wglCreateContext failed\n"; + exit(1); return false; } if (wglContext->shareContext) { - wglShareLists(wglContext->shareContext->hglrc, - wglContext->hglrc); + BOOL bRet; + bRet = wglShareLists(wglContext->shareContext->hglrc, + wglContext->hglrc); + if (!bRet) { + std::cerr << "warning: wglShareLists failed\n"; + } } }