Remove Unused Retention policy
[platform/core/uifw/dali-core.git] / dali / integration-api / core.h
1 #ifndef DALI_INTEGRATION_CORE_H
2 #define DALI_INTEGRATION_CORE_H
3
4 /*
5  * Copyright (c) 2020 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 // EXTERNAL INCLUDES
22 #include <cstdint> // uint32_t
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/common/dali-common.h>
26 #include <dali/integration-api/context-notifier.h>
27 #include <dali/integration-api/core-enumerations.h>
28
29 namespace Dali
30 {
31
32 class Layer;
33 class RenderTaskList;
34
35 namespace Internal
36 {
37 class Core;
38 }
39
40 namespace Integration
41 {
42 class Core;
43 class GlAbstraction;
44 class GlSyncAbstraction;
45 class GlContextHelperAbstraction;
46 class PlatformAbstraction;
47 class Processor;
48 class RenderController;
49 class RenderSurface;
50 struct Event;
51 struct TouchData;
52
53
54 /**
55  * The reasons why further updates are required.
56  */
57 namespace KeepUpdating
58 {
59 enum Reasons
60 {
61   NOT_REQUESTED           = 0,    ///< Zero means that no further updates are required
62   STAGE_KEEP_RENDERING    = 1<<1, ///<  - Stage::KeepRendering() is being used
63   ANIMATIONS_RUNNING      = 1<<2, ///< - Animations are ongoing
64   MONITORING_PERFORMANCE  = 1<<3, ///< - The --enable-performance-monitor option is being used
65   RENDER_TASK_SYNC        = 1<<4  ///< - A render task is waiting for render sync
66 };
67 }
68
69 /**
70  * The status of the Core::Update operation.
71  */
72 class UpdateStatus
73 {
74 public:
75
76   /**
77    * Constructor
78    */
79   UpdateStatus()
80   : keepUpdating(false),
81     needsNotification(false),
82     surfaceRectChanged(false),
83     secondsFromLastFrame( 0.0f )
84   {
85   }
86
87 public:
88
89   /**
90    * Query whether the Core has further frames to update & render e.g. when animations are ongoing.
91    * @return A bitmask of KeepUpdating values
92    */
93   uint32_t KeepUpdating() { return keepUpdating; }
94
95   /**
96    * Query whether the Core requires an Notification event.
97    * This should be sent through the same mechanism (e.g. event loop) as input events.
98    * @return True if an Notification event should be sent.
99    */
100   bool NeedsNotification() { return needsNotification; }
101
102   /**
103    * Query wheter the default surface rect is changed or not.
104    * @return true if the default surface rect is changed.
105    */
106   bool SurfaceRectChanged() { return surfaceRectChanged; }
107
108   /**
109    * This method is provided so that FPS can be easily calculated with a release version
110    * of Core.
111    * @return the seconds from last frame as float
112    */
113   float SecondsFromLastFrame() { return secondsFromLastFrame; }
114
115 public:
116
117   uint32_t keepUpdating; ///< A bitmask of KeepUpdating values
118   bool needsNotification;
119   bool surfaceRectChanged;
120   float secondsFromLastFrame;
121 };
122
123 /**
124  * The status of the Core::Render operation.
125  */
126 class RenderStatus
127 {
128 public:
129
130   /**
131    * Constructor
132    */
133   RenderStatus()
134   : needsUpdate( false ),
135     needsPostRender( false )
136   {
137   }
138
139   /**
140    * Set whether update needs to run following a render.
141    * @param[in] updateRequired Set to true if an update is required to be run
142    */
143   void SetNeedsUpdate( bool updateRequired )
144   {
145     needsUpdate = updateRequired;
146   }
147
148   /**
149    * Query the update status following rendering of a frame.
150    * @return True if update is required to be run
151    */
152   bool NeedsUpdate() const
153   {
154     return needsUpdate;
155   }
156
157   /**
158    * Sets if a post-render should be run.
159    * If nothing is rendered this frame, we can skip post-render.
160    * @param[in] postRenderRequired Set to True if post-render is required to be run
161    */
162   void SetNeedsPostRender( bool postRenderRequired )
163   {
164     needsPostRender = postRenderRequired;
165   }
166
167   /**
168    * Queries if a post-render should be run.
169    * @return True if post-render is required to be run
170    */
171   bool NeedsPostRender() const
172   {
173     return needsPostRender;
174   }
175
176 private:
177
178   bool needsUpdate      :1;  ///< True if update is required to be run
179   bool needsPostRender  :1;  ///< True if post-render is required to be run.
180 };
181
182
183 /**
184  * Integration::Core is used for integration with the native windowing system.
185  * The following integration tasks must be completed:
186  *
187  * 1) Handle GL context creation, and notify the Core when this occurs.
188  *
189  * 2) Provide suspend/resume behaviour (see below for more details).
190  *
191  * 3) Run an event loop, for passing events to the Core e.g. multi-touch input events.
192  * Notification events should be sent after a frame is updated (see UpdateStatus).
193  *
194  * 4) Run a rendering loop, instructing the Core to render each frame.
195  * A separate rendering thread is recommended; see multi-threading options below.
196  *
197  * 5) Provide an implementation of the PlatformAbstraction interface, used to access platform specific services.
198  *
199  * 6) Provide an implementation of the GlAbstraction interface, used to access OpenGL services.
200  *
201  * Multi-threading notes:
202  *
203  * The Dali API methods are not reentrant.  If you access the API from multiple threads simultaneously, then the results
204  * are undefined. This means that your application might segfault, or behave unpredictably.
205  *
206  * Rendering strategies:
207  *
208  * 1) Single-threaded. Call every Core method from the same thread. Event handling and rendering will occur in the same thread.
209  * This is not recommended, since processing input (slowly) can affect the smooth flow of animations.
210  *
211  * 2) Multi-threaded. The Core update & render operations can be processed in separate threads.
212  * See the method descriptions in Core to see which thread they should be called from.
213  * This is the recommended option, so that input processing will not affect the smoothness of animations.
214  * Note that the rendering thread must be halted, before destroying the GL context.
215  */
216 class DALI_CORE_API Core
217 {
218 public:
219
220   /**
221    * Create a new Core.
222    * This object is used for integration with the native windowing system.
223    * @param[in] renderController The interface to an object which controls rendering.
224    * @param[in] platformAbstraction The interface providing platform specific services.
225    * @param[in] glAbstraction The interface providing OpenGL services.
226    * @param[in] glSyncAbstraction The interface providing OpenGL sync objects.
227    * @param[in] glContextHelperAbstraction The interface providing OpenGL context helper objects.
228    * @param[in] renderToFboEnabled Whether rendering into the Frame Buffer Object is enabled.
229    * @param[in] depthBufferAvailable Whether the depth buffer is available
230    * @param[in] stencilBufferAvailable Whether the stencil buffer is available
231    * @return A newly allocated Core.
232    */
233   static Core* New( RenderController& renderController,
234                     PlatformAbstraction& platformAbstraction,
235                     GlAbstraction& glAbstraction,
236                     GlSyncAbstraction& glSyncAbstraction,
237                     GlContextHelperAbstraction& glContextHelperAbstraction,
238                     RenderToFrameBuffer renderToFboEnabled,
239                     DepthBufferAvailable depthBufferAvailable,
240                     StencilBufferAvailable stencilBufferAvailable );
241
242   /**
243    * Non-virtual destructor. Core is not intended as a base class.
244    */
245   ~Core();
246
247   /**
248    * Initialize the core
249    */
250   void Initialize();
251
252   // GL Context Lifecycle
253
254   /**
255    * Get the object that will notify the application/toolkit when context is lost/regained
256    */
257   ContextNotifierInterface* GetContextNotifier();
258
259   /**
260    * Notify the Core that the GL context has been created.
261    * The context must be created before the Core can render.
262    * Multi-threading note: this method should be called from the rendering thread only
263    * @post The Core is aware of the GL context.
264    */
265   void ContextCreated();
266
267   /**
268    * Notify the Core that that GL context is about to be destroyed.
269    * The Core will free any previously allocated GL resources.
270    * Multi-threading note: this method should be called from the rendering thread only
271    * @post The Core is unaware of any GL context.
272    */
273   void ContextDestroyed();
274
275   /**
276    * Notify the Core that the GL context has been re-created, e.g. after ReplaceSurface
277    * or Context loss.
278    *
279    * In the case of ReplaceSurface, both ContextToBeDestroyed() and ContextCreated() will have
280    * been called on the render thread before this is called on the event thread.
281    *
282    * Multi-threading note: this method should be called from the main thread
283    */
284   void RecoverFromContextLoss();
285
286   /**
287    * Notify the Core that the GL surface has been deleted.
288    * Multi-threading note: this method should be called from the main thread
289    * @param[in] surface The deleted surface
290    */
291   void SurfaceDeleted( Integration::RenderSurface* surface );
292
293   // Core Lifecycle
294
295   /**
296    * Notify Core that the scene has been created.
297    */
298   void SceneCreated();
299
300   /**
301    * Queue an event with Core.
302    * Pre-processing of events may be beneficial e.g. a series of motion events could be throttled, so that only the last event is queued.
303    * Multi-threading note: this method should be called from the main thread.
304    * @param[in] event The new event.
305    */
306   void QueueEvent(const Event& event);
307
308   /**
309    * Process the events queued with QueueEvent().
310    * Multi-threading note: this method should be called from the main thread.
311    * @pre ProcessEvents should not be called during ProcessEvents.
312    */
313   void ProcessEvents();
314
315   /**
316    * The Core::Update() method prepares a frame for rendering. This method determines how many frames
317    * may be prepared, ahead of the rendering.
318    * For example if the maximum update count is 2, then Core::Update() for frame N+1 may be processed
319    * whilst frame N is being rendered. However the Core::Update() for frame N+2 may not be called, until
320    * the Core::Render() method for frame N has returned.
321    * @return The maximum update count (>= 1).
322    */
323   uint32_t GetMaximumUpdateCount() const;
324
325   /**
326    * Update the scene for the next frame. This method must be called before each frame is rendered.
327    * Multi-threading notes: this method should be called from a dedicated update-thread.
328    * The update for frame N+1 may be processed whilst frame N is being rendered.
329    * However the update-thread must wait until frame N has been rendered, before processing frame N+2.
330    * After this method returns, messages may be queued internally for the main thread.
331    * In order to process these messages, a notification is sent via the main thread's event loop.
332    * @param[in] elapsedSeconds Number of seconds since the last call
333    * @param[in] lastVSyncTimeMilliseconds The last vsync time in milliseconds
334    * @param[in] nextVSyncTimeMilliseconds The time of the next predicted VSync in milliseconds
335    * @param[out] status showing whether further updates are required. This also shows
336    * whether a Notification event should be sent, regardless of whether the multi-threading is used.
337    * @param[in] renderToFboEnabled Whether rendering into the Frame Buffer Object is enabled.
338    * @param[in] isRenderingToFbo Whether this frame is being rendered into the Frame Buffer Object.
339    */
340   void Update( float elapsedSeconds,
341                uint32_t lastVSyncTimeMilliseconds,
342                uint32_t nextVSyncTimeMilliseconds,
343                UpdateStatus& status,
344                bool renderToFboEnabled,
345                bool isRenderingToFbo );
346
347   /**
348    * Render the next frame. This method should be preceded by a call up Update.
349    * Multi-threading note: this method should be called from a dedicated rendering thread.
350    * @pre The GL context must have been created, and made current.
351    * @param[out] status showing whether update is required to run.
352    * @param[in] forceClear force the Clear on the framebuffer even if nothing is rendered.
353    * @param[in] uploadOnly uploadOnly Upload the resource only without rendering.
354    */
355   void Render( RenderStatus& status, bool forceClear, bool uploadOnly );
356
357   /**
358    * @brief Register a processor
359    *
360    * Note, Core does not take ownership of this processor.
361    * @param[in] processor The process to register
362    */
363   void RegisterProcessor( Processor& processor );
364
365   /**
366    * @brief Unregister a processor
367    * @param[in] processor The process to unregister
368    */
369   void UnregisterProcessor( Processor& processor );
370
371 private:
372
373   /**
374    * Private constructor; see also Core::New()
375    */
376   Core();
377
378   /**
379    * Undefined copy-constructor.
380    * This avoids accidental calls to a default copy-constructor.
381    * @param[in] core A reference to the object to copy.
382    */
383   Core(const Core& core);
384
385   /**
386    * Undefined assignment operator.
387    * This avoids accidental calls to a default assignment operator.
388    * @param[in] rhs A reference to the object to copy.
389    */
390   Core& operator=(const Core& rhs);
391
392 private:
393
394   Internal::Core* mImpl;
395
396 };
397
398 } // namespace Integration
399
400 } // namespace Dali
401
402 #endif // DALI_INTEGRATION_CORE_H