]> git.tdb.fi Git - libs/gui.git/blob - source/graphics/wgl/glcontext.cpp
3df83f3119a294fa8472729d95e84451957881a6
[libs/gui.git] / source / graphics / wgl / glcontext.cpp
1 #include <windows.h>
2 #include <GL/gl.h>
3 #include <GL/wglext.h>
4 #include "glcontext.h"
5 #include "window_private.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace Graphics {
11
12 typedef HGLRC ContextHandle;
13
14 struct GLContext::Private
15 {
16         ContextHandle context;
17 };
18
19
20 void GLContext::platform_init(const GLOptions &opts)
21 {
22         HDC dc = GetDC(window.get_private().window);
23
24         PIXELFORMATDESCRIPTOR pfd;
25         memset(&pfd, 0, sizeof(pfd));
26
27         pfd.nSize = sizeof(pfd);
28         pfd.nVersion = 1;
29         pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
30         if(opts.doublebuffer)
31                 pfd.dwFlags |= PFD_DOUBLEBUFFER;
32         pfd.iPixelType = PFD_TYPE_RGBA;
33         if(opts.alpha)
34                 pfd.cAlphaBits = 1;
35         pfd.cDepthBits = 1;
36         if(opts.stencil)
37                 pfd.cStencilBits = 1;
38
39         int pf_index = ChoosePixelFormat(dc, &pfd);
40         if(!pf_index)
41                 throw unsupported_gl_mode(opts);
42         SetPixelFormat(dc, pf_index, &pfd);
43
44         priv = new Private;
45         priv->context = wglCreateContext(dc);
46         wglMakeCurrent(dc, priv->context);
47
48         ReleaseDC(window.get_private().window, dc);
49 }
50
51 GLContext::~GLContext()
52 {
53         wglMakeCurrent(0, 0);
54         wglDeleteContext(priv->context);
55
56         delete priv;
57 }
58
59 void GLContext::set_swap_interval(unsigned i)
60 {
61         PFNWGLSWAPINTERVALEXTPROC func = reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(wglGetProcAddress("wglSwapIntervalEXT"));
62         if(!func)
63                 throw runtime_error("wglSwapIntervalEXT not found");
64         func(i);
65 }
66
67 void GLContext::swap_buffers()
68 {
69         HDC dc = GetDC(window.get_private().window);
70         SwapBuffers(dc);
71         ReleaseDC(window.get_private().window, dc);
72 }
73
74 void GLContext::window_resized(unsigned, unsigned)
75 { }
76
77 } // namespace Graphics
78 } // namespace Msp