]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/wgl/glcontext.cpp
Create a temporary context for calling wglGetProcAddress
[libs/gui.git] / source / graphics / wgl / glcontext.cpp
index 6c378a6f195979a659b5a075bf3a5909b3008b12..35ec8e9b1983471f5dd12e476f4a662d2deaa7c4 100644 (file)
@@ -1,3 +1,4 @@
+#include <vector>
 #include <windows.h>
 #include <GL/gl.h>
 #include <GL/wglext.h>
@@ -44,7 +45,10 @@ void GLContext::platform_init(const GLOptions &opts)
        priv = new Private;
        if(opts.forward_compatible || opts.gl_version_major)
        {
-               PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribs = reinterpret_cast<PFNWGLCREATECONTEXTATTRIBSARBPROC>(wglGetProcAddress("wglCreateContextAttribs"));
+               ContextHandle fake_context = wglCreateContext(dc);
+               wglMakeCurrent(dc, fake_context);
+
+               PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribs = reinterpret_cast<PFNWGLCREATECONTEXTATTRIBSARBPROC>(wglGetProcAddress("wglCreateContextAttribsARB"));
                if(!wglCreateContextAttribs)
                        throw unsupported_gl_mode(opts);
 
@@ -67,6 +71,11 @@ void GLContext::platform_init(const GLOptions &opts)
                ctx_attribs.push_back(0);
 
                priv->context = wglCreateContextAttribs(dc, 0, &ctx_attribs[0]);
+               if(!priv->context)
+                       throw unsupported_gl_mode(opts);
+
+               wglMakeCurrent(0, 0);
+               wglDeleteContext(fake_context);
        }
        else
                priv->context = wglCreateContext(dc);
@@ -85,10 +94,10 @@ GLContext::~GLContext()
 
 void GLContext::set_swap_interval(unsigned i)
 {
-       PFNWGLSWAPINTERVALEXTPROC func = reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(wglGetProcAddress("wglSwapIntervalEXT"));
-       if(!func)
+       PFNWGLSWAPINTERVALEXTPROC wglSwapInterval = reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(wglGetProcAddress("wglSwapIntervalEXT"));
+       if(!wglSwapInterval)
                throw runtime_error("wglSwapIntervalEXT not found");
-       func(i);
+       wglSwapInterval(i);
 }
 
 void GLContext::swap_buffers()