Ghost Context Refactor
[blender-staging.git] / intern / ghost / intern / GHOST_Context.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_Context.h
29  *  \ingroup GHOST
30  * Declaration of GHOST_Context class.
31  */
32
33 #ifndef __GHOST_CONTEXT_H__
34 #define __GHOST_CONTEXT_H__
35
36 #include "GHOST_Types.h"
37
38 #include "glew-mx.h"
39
40 #include <cstdlib> // for NULL
41
42
43 class GHOST_Context
44 {
45 public:
46         /**
47          * Constructor.
48          * \param stereoVisual          Stereo visual for quad buffered stereo.
49          * \param numOfAASamples        Number of samples used for AA (zero if no AA)
50          */
51         GHOST_Context(bool stereoVisual, GHOST_TUns16 numOfAASamples)
52             : m_stereoVisual(stereoVisual),
53               m_numOfAASamples(numOfAASamples),
54               m_mxContext(NULL)
55         {}
56
57         /**
58          * Destructor.
59          */
60         virtual ~GHOST_Context() {
61                 mxDestroyContext(m_mxContext);
62         }
63
64         /**
65          * Swaps front and back buffers of a window.
66          * \return  A boolean success indicator.
67          */
68         virtual GHOST_TSuccess swapBuffers() = 0;
69
70         /**
71          * Activates the drawing context of this window.
72          * \return  A boolean success indicator.
73          */
74         virtual GHOST_TSuccess activateDrawingContext() = 0;
75
76         /**
77          * Call immediately after new to initialize.  If this fails then immediately delete the object.
78          * \return Indication as to whether initialization has succeeded.
79          */
80         virtual GHOST_TSuccess initializeDrawingContext() = 0;
81
82         /**
83          * Updates the drawing context of this window. Needed
84          * whenever the window is changed.
85          * \return Indication of success.
86          */
87         virtual GHOST_TSuccess updateDrawingContext() {
88                 return GHOST_kFailure;
89         }
90
91         /**
92          * Checks if it is OK for a remove the native display
93          * \return Indication as to whether removal has succeeded.
94          */
95         virtual GHOST_TSuccess releaseNativeHandles() = 0;
96
97         /**
98          * Sets the swap interval for swapBuffers.
99          * \param interval The swap interval to use.
100          * \return A boolean success indicator.
101          */
102         virtual GHOST_TSuccess setSwapInterval(int interval) {
103                 return GHOST_kFailure;
104         }
105
106         /**
107          * Gets the current swap interval for swapBuffers.
108          * \param intervalOut Variable to store the swap interval if it can be read.
109          * \return Whether the swap interval can be read.
110          */
111         virtual GHOST_TSuccess getSwapInterval(int&) {
112                 return GHOST_kFailure;
113         }
114
115         /** Stereo visual created. Only necessary for 'real' stereo support,
116          *  ie quad buffered stereo. This is not always possible, depends on
117          *  the graphics h/w
118          */
119         inline bool isStereoVisual() const {
120                 return m_stereoVisual;
121         }
122
123         /** Number of samples used in anti-aliasing, set to 0 if no AA **/
124         inline GHOST_TUns16 getNumOfAASamples() const {
125                 return m_numOfAASamples;
126         }
127
128 protected:
129         void initContextGLEW();
130
131         inline void activateGLEW() const {
132                 mxMakeCurrentContext(m_mxContext);
133         }
134
135         bool m_stereoVisual;
136
137         GHOST_TUns16 m_numOfAASamples;
138
139         static void initClearGL();
140
141 private:
142         MXContext *m_mxContext;
143
144 #ifdef WITH_CXX_GUARDEDALLOC
145         MEM_CXX_CLASS_ALLOC_FUNCS("GHOST:GHOST_Context")
146 #endif
147 };
148
149
150 #ifdef _WIN32
151 bool win32_chk(bool result, const char *file = NULL, int line = 0, const char *text = NULL);
152
153 #  ifndef NDEBUG
154 #    define WIN32_CHK(x) win32_chk((x), __FILE__, __LINE__, #x)
155 #  else
156 #    define WIN32_CHK(x) win32_chk(x)
157 #  endif
158 #endif  /* _WIN32 */
159
160
161 #endif // __GHOST_CONTEXT_H__