Merge branch 'master' into blender2.8
[blender.git] / intern / ghost / intern / GHOST_ContextWGL.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2013 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Jason Wilkins
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file ghost/intern/GHOST_ContextWGL.h
29  *  \ingroup GHOST
30  */
31
32 #ifndef __GHOST_CONTEXTWGL_H__
33 #define __GHOST_CONTEXTWGL_H__
34
35 //#define WIN32_COMPOSITING
36
37 #include "GHOST_Context.h"
38
39 #include <GL/wglew.h>
40
41 #ifndef GHOST_OPENGL_WGL_RESET_NOTIFICATION_STRATEGY
42 #define GHOST_OPENGL_WGL_RESET_NOTIFICATION_STRATEGY 0
43 #endif
44
45
46 class GHOST_ContextWGL : public GHOST_Context
47 {
48 public:
49         /**
50          * Constructor.
51          */
52         GHOST_ContextWGL(
53                 bool stereoVisual,
54                         bool alphaBackground,
55                 GHOST_TUns16 numOfAASamples,
56                 HWND hWnd,
57                 HDC hDC,
58                 int contextProfileMask,
59                 int contextMajorVersion,
60                 int contextMinorVersion,
61                 int contextFlags,
62                 int contextResetNotificationStrategy);
63
64         /**
65          * Destructor.
66          */
67         ~GHOST_ContextWGL();
68
69         /**
70          * Swaps front and back buffers of a window.
71          * \return  A boolean success indicator.
72          */
73         GHOST_TSuccess swapBuffers();
74
75         /**
76          * Activates the drawing context of this window.
77          * \return  A boolean success indicator.
78          */
79         GHOST_TSuccess activateDrawingContext();
80
81         /**
82          * Release the drawing context of the calling thread.
83          * \return  A boolean success indicator.
84          */
85         GHOST_TSuccess releaseDrawingContext();
86
87         /**
88          * Call immediately after new to initialize.  If this fails then immediately delete the object.
89          * \return Indication as to whether initialization has succeeded.
90          */
91         GHOST_TSuccess initializeDrawingContext();
92
93         /**
94          * Removes references to native handles from this context and then returns
95          * \return GHOST_kSuccess if it is OK for the parent to release the handles and
96          * GHOST_kFailure if releasing the handles will interfere with sharing
97          */
98         GHOST_TSuccess releaseNativeHandles();
99
100         /**
101          * Sets the swap interval for swapBuffers.
102          * \param interval The swap interval to use.
103          * \return A boolean success indicator.
104          */
105         GHOST_TSuccess setSwapInterval(int interval);
106
107         /**
108          * Gets the current swap interval for swapBuffers.
109          * \param intervalOut Variable to store the swap interval if it can be read.
110          * \return Whether the swap interval can be read.
111          */
112         GHOST_TSuccess getSwapInterval(int &intervalOut);
113
114 private:
115         int choose_pixel_format(
116                 bool stereoVisual,
117                 int numOfAASamples,
118                 bool needAlpha,
119                 bool needStencil,
120                 bool sRGB);
121
122         int choose_pixel_format_arb(
123                 bool stereoVisual,
124                 int numOfAASamples,
125                 bool needAlpha,
126                 bool needStencil,
127                 bool sRGB);
128
129         int _choose_pixel_format_arb_1(
130                 bool stereoVisual,
131                 int numOfAASamples,
132                 bool needAlpha,
133                 bool needStencil,
134                 bool sRGB,
135                 int *swapMethodOut);
136
137         int _choose_pixel_format_arb_2(bool stereoVisual,
138                 int *numOfAASamples,
139                 bool needAlpha,
140                 bool needStencil,
141                 bool sRGB,
142                 int  swapMethod);
143
144         void initContextWGLEW(PIXELFORMATDESCRIPTOR &preferredPFD);
145
146         /* offscreen buffer with size of 1x1 pixel,
147          * kept here to release the device constext when closing the program. */
148         HPBUFFERARB m_dummyPbuffer;
149
150         HWND m_hWnd;
151         HDC  m_hDC;
152
153         const int m_contextProfileMask;
154         const int m_contextMajorVersion;
155         const int m_contextMinorVersion;
156         const int m_contextFlags;
157         const bool m_alphaBackground;
158         const int m_contextResetNotificationStrategy;
159
160         HGLRC m_hGLRC;
161
162 #ifndef NDEBUG
163         const char *m_dummyVendor;
164         const char *m_dummyRenderer;
165         const char *m_dummyVersion;
166 #endif
167
168         static HGLRC s_sharedHGLRC;
169         static int   s_sharedCount;
170 };
171
172 #endif  // __GHOST_CONTEXTWGL_H__