Merge branch 'devel/master' into devel/graphics
[platform/core/uifw/dali-adaptor.git] / automated-tests / src / dali-adaptor / dali-test-suite-utils / test-graphics-application.h
1 #ifndef DALI_TEST_GRAPHICS_APPLICATION_H
2 #define DALI_TEST_GRAPHICS_APPLICATION_H
3
4 /*
5  * Copyright (c) 2021 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/core.h>
23 #include <dali/integration-api/resource-policies.h>
24 #include <dali/integration-api/scene.h>
25 #include <dali/integration-api/trace.h>
26
27 #include <dali/internal/graphics/common/graphics-interface.h>
28 #include <dali/internal/graphics/gles-impl/egl-graphics-controller.h>
29 #include <dali/public-api/common/dali-common.h>
30
31 #include <test-gl-abstraction.h>
32 #include <test-gl-context-helper-abstraction.h>
33 #include <test-gl-sync-abstraction.h>
34 #include <test-platform-abstraction.h>
35 #include <test-render-controller.h>
36
37 namespace Dali
38 {
39 namespace Internal::Adaptor
40 {
41 class ConfigurationManager;
42 }
43
44 class TestGraphicsImpl : public Internal::Adaptor::GraphicsInterface
45 {
46 public:
47   TestGraphicsImpl()
48   : GraphicsInterface()
49   {
50   }
51   virtual ~TestGraphicsImpl() = default;
52
53   Dali::Graphics::Controller& GetController() override
54   {
55     Dali::Graphics::Controller* controller{nullptr};
56     return *controller;
57   }
58
59   /**
60    * Initialize the graphics subsystem, configured from environment
61    */
62   void Initialize() override
63   {
64     mCallstack.PushCall("Initialize()", "");
65   }
66
67   /**
68    * Initialize the graphics subsystem, providing explicit parameters.
69    *
70    * @param[in] depth True if depth buffer is required
71    * @param[in] stencil True if stencil buffer is required
72    * @param[in] partialRendering True if partial rendering is required
73    * @param[in] msaa level of anti-aliasing required (-1 = off)
74    */
75   void Initialize(bool depth, bool stencil, bool partialRendering, int msaa) override
76   {
77     TraceCallStack::NamedParams namedParams;
78     namedParams["depth"] << depth;
79     namedParams["stencil"] << stencil;
80     namedParams["partialRendering"] << partialRendering;
81     namedParams["msaa"] << msaa;
82     mCallstack.PushCall("Initialize()", "");
83   }
84
85   /**
86    * Configure the graphics surface
87    *
88    * @param[in] surface The surface to configure, or NULL if not present
89    */
90   void ConfigureSurface(Dali::RenderSurfaceInterface* surface) override
91   {
92   }
93
94   /**
95    * Activate the resource context
96    */
97   void ActivateResourceContext() override
98   {
99     mCallstack.PushCall("ActivateResourceContext()", "");
100   }
101
102   /**
103    * Activate the resource context
104    *
105    * @param[in] surface The surface whose context to be switched to.
106    */
107   void ActivateSurfaceContext(Dali::RenderSurfaceInterface* surface) override
108   {
109     TraceCallStack::NamedParams namedParams;
110     namedParams["surface"] << std::hex << surface;
111     mCallstack.PushCall("ActivateResourceContext()", namedParams.str(), namedParams);
112   }
113
114   /**
115    * Inform graphics interface that this is the first frame after a resume.
116    */
117   void SetFirstFrameAfterResume() override
118   {
119   }
120
121   /**
122    * Shut down the graphics implementation
123    */
124   void Shutdown() override
125   {
126     mCallstack.PushCall("Shutdown()", "");
127   }
128
129   /**
130    * Destroy the Graphics implementation
131    */
132   void Destroy() override
133   {
134     mCallstack.PushCall("Destroy()", "");
135   }
136
137   /**
138    * @return true if advanced blending options are supported
139    */
140   bool IsAdvancedBlendEquationSupported() override
141   {
142     return true;
143   }
144
145   /**
146    * @return true if graphics subsystem is initialized
147    */
148   bool IsInitialized() override
149   {
150     return true;
151   }
152
153   /**
154    * @return true if a separate resource context is supported
155    */
156   bool IsResourceContextSupported() override
157   {
158     return true;
159   }
160
161   /**
162    * @return the maximum texture size
163    */
164   uint32_t GetMaxTextureSize() override
165   {
166     return 32768u;
167   }
168
169   /**
170    * @return the version number of the shader language
171    */
172   uint32_t GetShaderLanguageVersion() override
173   {
174     return 320;
175   }
176
177   /**
178    * Store cached configurations
179    */
180   void CacheConfigurations(Internal::Adaptor::ConfigurationManager& configurationManager) override
181   {
182   }
183
184 public:
185   TraceCallStack mCallstack{true, "GraphicsImpl"};
186 };
187
188 class DALI_CORE_API TestGraphicsApplication : public ConnectionTracker
189 {
190 public:
191   // Default values derived from H2 device.
192   static const uint32_t DEFAULT_SURFACE_WIDTH  = 480;
193   static const uint32_t DEFAULT_SURFACE_HEIGHT = 800;
194
195   static constexpr uint32_t DEFAULT_HORIZONTAL_DPI = 220;
196   static constexpr uint32_t DEFAULT_VERTICAL_DPI   = 217;
197
198   static const uint32_t DEFAULT_RENDER_INTERVAL = 1;
199
200   static const uint32_t RENDER_FRAME_INTERVAL = 16;
201
202   TestGraphicsApplication(uint32_t surfaceWidth        = DEFAULT_SURFACE_WIDTH,
203                           uint32_t surfaceHeight       = DEFAULT_SURFACE_HEIGHT,
204                           uint32_t horizontalDpi       = DEFAULT_HORIZONTAL_DPI,
205                           uint32_t verticalDpi         = DEFAULT_VERTICAL_DPI,
206                           bool     initialize          = true,
207                           bool     enablePartialUpdate = false);
208
209   void Initialize();
210   void CreateCore();
211   void CreateScene();
212   void InitializeCore();
213   ~TestGraphicsApplication() override;
214   static void              LogMessage(Dali::Integration::Log::DebugPriority level, std::string& message);
215   static void              LogContext(bool start, const char* tag);
216   Dali::Integration::Core& GetCore();
217   TestPlatformAbstraction& GetPlatform();
218   TestRenderController&    GetRenderController();
219   Graphics::Controller&    GetGraphicsController();
220
221   TestGlAbstraction&              GetGlAbstraction();
222   TestGlSyncAbstraction&          GetGlSyncAbstraction();
223   TestGlContextHelperAbstraction& GetGlContextHelperAbstraction();
224
225   void        ProcessEvent(const Integration::Event& event);
226   void        SendNotification();
227   bool        Render(uint32_t intervalMilliseconds = DEFAULT_RENDER_INTERVAL, const char* location = NULL);
228   bool        PreRenderWithPartialUpdate(uint32_t intervalMilliseconds, const char* location, std::vector<Rect<int>>& damagedRects);
229   bool        RenderWithPartialUpdate(std::vector<Rect<int>>& damagedRects, Rect<int>& clippingRect);
230   uint32_t    GetUpdateStatus();
231   bool        UpdateOnly(uint32_t intervalMilliseconds = DEFAULT_RENDER_INTERVAL);
232   bool        RenderOnly();
233   void        ResetContext();
234   bool        GetRenderNeedsUpdate();
235   bool        GetRenderNeedsPostRender();
236   uint32_t    Wait(uint32_t durationToWait);
237   static void EnableLogging(bool enabled)
238   {
239     mLoggingEnabled = enabled;
240   }
241
242   Integration::Scene GetScene() const
243   {
244     return mScene;
245   }
246
247 private:
248   void DoUpdate(uint32_t intervalMilliseconds, const char* location = NULL);
249
250 protected:
251   TestPlatformAbstraction                     mPlatformAbstraction;
252   TestRenderController                        mRenderController;
253   Graphics::EglGraphicsController             mGraphicsController; // Use real controller in Adaptor
254   TestGlAbstraction                           mGlAbstraction;
255   TestGlSyncAbstraction                       mGlSyncAbstraction;
256   TestGlContextHelperAbstraction              mGlContextHelperAbstraction;
257   TestGraphicsImpl                            mGraphics;
258   Graphics::UniquePtr<Graphics::RenderTarget> mRenderTarget{nullptr};
259
260   Integration::UpdateStatus mStatus;
261   Integration::RenderStatus mRenderStatus;
262
263   Integration::Core*       mCore;
264   Dali::Integration::Scene mScene;
265
266   uint32_t mSurfaceWidth;
267   uint32_t mSurfaceHeight;
268   uint32_t mFrame;
269
270   struct
271   {
272     uint32_t x;
273     uint32_t y;
274   } mDpi;
275   uint32_t    mLastVSyncTime;
276   bool        mPartialUpdateEnabled;
277   static bool mLoggingEnabled;
278 };
279
280 } // namespace Dali
281
282 #endif // DALI_TEST_GRAPHICS_APPLICATION_H