1 #ifndef DALI_INTERNAL_EGL_IMPLEMENTATION_H
2 #define DALI_INTERNAL_EGL_IMPLEMENTATION_H
5 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
23 #include <EGL/eglext.h>
24 #include <dali/public-api/common/dali-vector.h>
25 #include <dali/public-api/common/vector-wrapper.h>
26 #include <dali/integration-api/core-enumerations.h>
29 #include <dali/integration-api/egl-interface.h>
40 * EglImplementation class provides an EGL implementation.
42 class EglImplementation : public EglInterface
48 * @param[in] multiSamplingLevel The Multi-sampling level required
49 * @param[in] depthBufferRequired Whether the depth buffer is required
50 * @param[in] stencilBufferRequired Whether the stencil buffer is required
52 EglImplementation( int multiSamplingLevel,
53 Integration::DepthBufferAvailable depthBufferRequired,
54 Integration::StencilBufferAvailable stencilBufferRequired );
59 virtual ~EglImplementation();
64 * (Called from ECoreX::RenderSurface, not RenderThread, so not in i/f, hence, not virtual)
66 * @param display The display
67 * @param isOwnSurface whether the surface is own or not
68 * @return true on success, false on failure
70 bool InitializeGles( EGLNativeDisplayType display, bool isOwnSurface = true );
73 * Create the OpenGL context for the shared resource.
74 * @return true if successful
76 virtual bool CreateContext();
79 * Create the OpenGL context for the window.
80 * @return true if successful
82 bool CreateWindowContext( EGLContext& mEglContext );
85 * Destroy the OpenGL context.
87 void DestroyContext( EGLContext& eglContext );
90 * Destroy the OpenGL surface.
92 void DestroySurface( EGLSurface& eglSurface );
95 * Make the OpenGL context current
97 virtual void MakeContextCurrent( EGLSurface eglSurface, EGLContext eglContext );
100 * clear the OpenGL context
102 void MakeContextNull();
105 * @brief Make the OpenGL surface current
107 * @param pixmap The pixmap to replace the current surface
108 * @param eglSurface The eglSurface to replace the current OpenGL surface.
110 void MakeCurrent( EGLNativePixmapType pixmap, EGLSurface eglSurface );
115 virtual void TerminateGles();
118 * Checks if GL is initialised
119 * @return true if it is
121 bool IsGlesInitialized() const;
124 * Performs an OpenGL swap buffers command
126 virtual void SwapBuffers( EGLSurface& eglSurface );
129 * Performs an OpenGL copy buffers command
131 virtual void CopyBuffers( EGLSurface& eglSurface );
134 * Performs an EGL wait GL command
136 virtual void WaitGL();
139 * Choose config of egl
140 * @param isWindowType whether the config for window or pixmap
141 * @param colorDepth Bit per pixel value (ex. 32 or 24)
143 void ChooseConfig( bool isWindowType, ColorDepth depth );
146 * Create an OpenGL surface using a window
147 * @param window The window to create the surface on
148 * @param colorDepth Bit per pixel value (ex. 32 or 24)
149 * @return Handle to an on-screen EGL window surface (the requester has an ownership of this egl surface)
151 EGLSurface CreateSurfaceWindow( EGLNativeWindowType window, ColorDepth depth );
154 * Create the OpenGL surface using a pixmap
155 * @param pixmap The pixmap to create the surface on
156 * @param colorDepth Bit per pixel value (ex. 32 or 24)
157 * @return Handle to an off-screen EGL pixmap surface (the requester has an ownership of this egl surface)
159 EGLSurface CreateSurfacePixmap( EGLNativePixmapType pixmap, ColorDepth depth );
162 * Replaces the render surface
163 * @param[in] window, the window to create the new surface on
164 * @return true if the context was lost due to a change in display
165 * between old surface and new surface
167 bool ReplaceSurfaceWindow( EGLNativeWindowType window, EGLSurface& eglSurface, EGLContext& eglContext );
170 * Replaces the render surface
171 * @param[in] pixmap, the pixmap to replace the new surface on
172 * @param[out] eglSurface, the eglSurface is created using a pixmap.
173 * @return true if the context was lost due to a change in x-display
174 * between old surface and new surface
176 bool ReplaceSurfacePixmap( EGLNativePixmapType pixmap, EGLSurface& eglSurface );
179 * returns the display with which this object was initialized
180 * @return the EGL Display.
182 EGLDisplay GetDisplay() const;
185 * Returns the EGL context
186 * @return the EGL context.
188 EGLContext GetContext() const;
192 Vector<EGLint> mContextAttribs;
194 EGLNativeDisplayType mEglNativeDisplay;
196 EGLNativeWindowType mEglNativeWindow;
198 EGLNativePixmapType mCurrentEglNativePixmap;
200 EGLDisplay mEglDisplay;
201 EGLConfig mEglConfig;
202 EGLContext mEglContext; ///< The resource context holding assets such as textures to be shared
204 typedef std::vector<EGLContext> EglWindowContextContainer;
205 EglWindowContextContainer mEglWindowContexts; ///< The EGL context for the window
207 EGLSurface mCurrentEglSurface;
209 typedef std::vector<EGLSurface> EglWindowSurfaceContainer;
210 EglWindowSurfaceContainer mEglWindowSurfaces; ///< The EGL surface for the window
212 int mMultiSamplingLevel;
214 ColorDepth mColorDepth;
216 bool mGlesInitialized;
219 bool mDepthBufferRequired;
220 bool mStencilBufferRequired;
223 } // namespace Adaptor
225 } // namespace Internal
229 #endif // DALI_INTERNAL_EGL_IMPLEMENTATION_H