ClangFormat: apply to source, most of intern
[blender.git] / intern / ghost / intern / GHOST_ContextEGL.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2013 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup GHOST
22  */
23
24 #ifndef __GHOST_CONTEXTEGL_H__
25 #define __GHOST_CONTEXTEGL_H__
26
27 #include "GHOST_Context.h"
28
29 #include <GL/eglew.h>
30
31 #ifndef GHOST_OPENGL_EGL_CONTEXT_FLAGS
32 #  define GHOST_OPENGL_EGL_CONTEXT_FLAGS 0
33 #endif
34
35 #ifndef GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY
36 #  define GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY 0
37 #endif
38
39 class GHOST_ContextEGL : public GHOST_Context {
40  public:
41   /**
42    * Constructor.
43    */
44   GHOST_ContextEGL(bool stereoVisual,
45                    GHOST_TUns16 numOfAASamples,
46                    EGLNativeWindowType nativeWindow,
47                    EGLNativeDisplayType nativeDisplay,
48                    EGLint contextProfileMask,
49                    EGLint contextMajorVersion,
50                    EGLint contextMinorVersion,
51                    EGLint contextFlags,
52                    EGLint contextResetNotificationStrategy,
53                    EGLenum api);
54
55   /**
56    * Destructor.
57    */
58   ~GHOST_ContextEGL();
59
60   /**
61    * Swaps front and back buffers of a window.
62    * \return  A boolean success indicator.
63    */
64   GHOST_TSuccess swapBuffers();
65
66   /**
67    * Activates the drawing context of this window.
68    * \return  A boolean success indicator.
69    */
70   GHOST_TSuccess activateDrawingContext();
71
72   /**
73    * Release the drawing context of the calling thread.
74    * \return  A boolean success indicator.
75    */
76   GHOST_TSuccess releaseDrawingContext();
77
78   /**
79    * Call immediately after new to initialize.  If this fails then immediately delete the object.
80    * \return Indication as to whether initialization has succeeded.
81    */
82   GHOST_TSuccess initializeDrawingContext();
83
84   /**
85    * Removes references to native handles from this context and then returns
86    * \return GHOST_kSuccess if it is OK for the parent to release the handles and
87    * GHOST_kFailure if releasing the handles will interfere with sharing
88    */
89   GHOST_TSuccess releaseNativeHandles();
90
91   /**
92    * Sets the swap interval for swapBuffers.
93    * \param interval The swap interval to use.
94    * \return A boolean success indicator.
95    */
96   GHOST_TSuccess setSwapInterval(int interval);
97
98   /**
99    * Gets the current swap interval for swapBuffers.
100    * \param intervalOut Variable to store the swap interval if it can be read.
101    * \return Whether the swap interval can be read.
102    */
103   GHOST_TSuccess getSwapInterval(int &intervalOut);
104
105  private:
106   void initContextEGLEW();
107
108   EGLNativeDisplayType m_nativeDisplay;
109   EGLNativeWindowType m_nativeWindow;
110
111   const EGLint m_contextProfileMask;
112   const EGLint m_contextMajorVersion;
113   const EGLint m_contextMinorVersion;
114   const EGLint m_contextFlags;
115   const EGLint m_contextResetNotificationStrategy;
116
117   const EGLenum m_api;
118
119   EGLContext m_context;
120   EGLSurface m_surface;
121   EGLDisplay m_display;
122
123   EGLint m_swap_interval;
124
125   EGLContext &m_sharedContext;
126   EGLint &m_sharedCount;
127
128   static EGLContext s_gl_sharedContext;
129   static EGLint s_gl_sharedCount;
130
131   static EGLContext s_gles_sharedContext;
132   static EGLint s_gles_sharedCount;
133
134   static EGLContext s_vg_sharedContext;
135   static EGLint s_vg_sharedCount;
136
137 #ifdef WITH_GL_ANGLE
138   static HMODULE s_d3dcompiler;
139 #endif
140 };
141
142 #endif  // __GHOST_CONTEXTEGL_H__