5d0444801f049946701e603652e7a4daab7b70ad
[platform/core/uifw/dali-adaptor.git] / dali / internal / graphics / gles / egl-graphics.h
1 #ifndef DALI_INTERNAL_BASE_GRAPHICS_IMPLEMENTATION_H
2 #define DALI_INTERNAL_BASE_GRAPHICS_IMPLEMENTATION_H
3
4 /*
5  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/integration-api/adaptor-framework/egl-interface.h>
23 #include <dali/internal/graphics/common/egl-image-extensions.h>
24 #include <dali/internal/graphics/common/graphics-interface.h>
25 #include <dali/internal/graphics/gles-impl/egl-graphics-controller.h>
26 #include <dali/internal/graphics/gles/egl-context-helper-implementation.h>
27 #include <dali/internal/graphics/gles/egl-implementation.h>
28 #include <dali/internal/graphics/gles/egl-sync-implementation.h>
29 #include <dali/internal/graphics/gles/gl-implementation.h>
30 #include <dali/internal/graphics/gles/gl-proxy-implementation.h>
31
32 namespace Dali
33 {
34 namespace Internal
35 {
36 namespace Adaptor
37 {
38 class EnvironmentOptions;
39 class ConfigurationManager;
40
41 class EglGraphics : public GraphicsInterface
42 {
43 public:
44   /**
45    * Constructor
46    */
47   EglGraphics(EnvironmentOptions& environmentOptions);
48
49   /**
50    * Destructor
51    */
52   virtual ~EglGraphics();
53
54   /**
55    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::Initialize()
56    */
57   void Initialize() override;
58
59   /**
60    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::Initialize(bool,bool,bool,int)
61    */
62   void Initialize(bool depth, bool stencil, bool partialRendering, int msaa);
63
64   /**
65    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::ConfigureSurface()
66    */
67   void ConfigureSurface(Dali::RenderSurfaceInterface* surface) override;
68
69   /**
70    * Set whether the surfaceless context is supported
71    * @param[in] isSupported Whether the surfaceless context is supported
72    */
73   void SetIsSurfacelessContextSupported(const bool isSupported);
74
75   /**
76    * Activate the resource context (shared surfaceless context)
77    */
78   void ActivateResourceContext() override;
79
80   /**
81    * Activate the surface context
82    *
83    * @param[in] surface The surface whose context to be switched to.
84    */
85   void ActivateSurfaceContext(Dali::RenderSurfaceInterface* surface) override;
86
87   /**
88    * This is called after all the surfaces have been rendered.
89    *
90    * @note This should not be called if uploading resource only without rendering any surface.
91    */
92   void PostRender() override;
93
94   /**
95    * Inform graphics interface that this is the first frame after a resume.
96    * (For debug only)
97    */
98   void SetFirstFrameAfterResume() override;
99
100   /**
101    * Gets the GL abstraction
102    * @return The GL abstraction
103    */
104   Integration::GlAbstraction& GetGlAbstraction() const;
105
106   /**
107    * Gets the implementation of EGL
108    * @return The implementation of EGL
109    */
110   EglImplementation& GetEglImplementation() const;
111
112   /**
113    * Gets the graphics interface for EGL
114    * @return The graphics interface for EGL
115    */
116   EglInterface& GetEglInterface() const;
117
118   /**
119    * @copydoc Dali::Integration::GlAbstraction& GetGlesInterface()
120    */
121   GlImplementation& GetGlesInterface();
122
123   /**
124    * Gets the implementation of GlSyncAbstraction for EGL.
125    * @return The implementation of GlSyncAbstraction for EGL.
126    */
127   EglSyncImplementation& GetSyncImplementation();
128
129   /**
130    * Gets the implementation of GlContextHelperAbstraction for EGL.
131    * @return The implementation of GlContextHelperAbstraction for EGL.
132    */
133   EglContextHelperImplementation& GetContextHelperImplementation();
134
135   /**
136    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::GetDepthBufferRequired()
137    */
138   Integration::DepthBufferAvailable& GetDepthBufferRequired();
139
140   /**
141    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::GetStencilBufferRequired()
142    */
143   Integration::StencilBufferAvailable GetStencilBufferRequired();
144
145   /**
146    * Gets the EGL image extension
147    * @return The EGL image extension
148    */
149   EglImageExtensions* GetImageExtensions();
150
151   /**
152    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::Shutdown()
153    */
154   void Shutdown() override;
155
156   /**
157    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::Destroy()
158    */
159   void Destroy() override;
160
161   Graphics::Controller& GetController() override;
162
163   bool IsAdvancedBlendEquationSupported() override
164   {
165     return mGLES->IsAdvancedBlendEquationSupported();
166   }
167
168   bool IsMultisampledRenderToTextureSupported() override
169   {
170     return mGLES->IsMultisampledRenderToTextureSupported();
171   }
172
173   /**
174    * @return true if graphics subsystem is initialized
175    */
176   bool IsInitialized() override
177   {
178     return mEglImplementation && mEglImplementation->IsGlesInitialized();
179   }
180
181   bool IsResourceContextSupported() override
182   {
183     return mEglImplementation && mEglImplementation->IsSurfacelessContextSupported();
184   }
185
186   uint32_t GetMaxTextureSize() override
187   {
188     return mGLES->GetMaxTextureSize();
189   }
190
191   uint8_t GetMaxTextureSamples() override
192   {
193     return mGLES->GetMaxTextureSamples();
194   }
195
196   uint32_t GetShaderLanguageVersion() override
197   {
198     return mGLES->GetShadingLanguageVersion();
199   }
200
201   bool ApplyNativeFragmentShader(std::string& shader, const char* customSamplerType)
202   {
203     return mGLES->ApplyNativeFragmentShader(shader, customSamplerType);
204   }
205
206   void CacheConfigurations(ConfigurationManager& configurationManager) override;
207
208   /**
209    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::FrameStart()
210    */
211   void FrameStart() override;
212
213   /**
214    * @copydoc Dali::Internal::Adaptor::GraphicsInterface::LogMemoryPools()
215    */
216   void LogMemoryPools() override;
217
218 private:
219   // Eliminate copy and assigned operations
220   EglGraphics(const EglGraphics& rhs) = delete;
221   EglGraphics& operator=(const EglGraphics& rhs) = delete;
222
223   /**
224    * Initialize graphics subsystems
225    */
226   void EglInitialize();
227
228 private:
229   Graphics::EglGraphicsController                 mGraphicsController; ///< Graphics Controller for Dali Core
230   std::unique_ptr<GlImplementation>               mGLES;               ///< GL implementation
231   std::unique_ptr<EglImplementation>              mEglImplementation;  ///< EGL implementation
232   std::unique_ptr<EglImageExtensions>             mEglImageExtensions; ///< EGL image extension
233   std::unique_ptr<EglSyncImplementation>          mEglSync;            ///< GlSyncAbstraction implementation for EGL
234   std::unique_ptr<EglContextHelperImplementation> mEglContextHelper;   ///< GlContextHelperAbstraction implementation for EGL
235
236   int mMultiSamplingLevel; ///< The multiple sampling level
237 };
238
239 } // namespace Adaptor
240
241 } // namespace Internal
242
243 } // namespace Dali
244
245 #endif // DALI_INTERNAL_BASE_GRAPHICS_IMPLEMENTATION_H