Merge "Protect dereferencing null in Node" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / update / common / scene-graph-scene.h
1 #ifndef DALI_INTERNAL_SCENE_GRAPH_SCENE_H
2 #define DALI_INTERNAL_SCENE_GRAPH_SCENE_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 // INTERNAL INCLUDES
21 #include <dali/graphics-api/graphics-controller.h>
22 #include <dali/integration-api/core.h>
23 #include <dali/integration-api/scene.h>
24 #include <dali/internal/common/message.h>
25 #include <dali/internal/event/common/event-thread-services.h>
26 #include <dali/internal/render/common/render-instruction-container.h>
27 #include <dali/public-api/common/vector-wrapper.h>
28
29 namespace Dali
30 {
31 namespace Internal
32 {
33 namespace SceneGraph
34 {
35 class RenderInstructionContainer;
36
37 class Scene
38 {
39 public:
40   /**
41    * Constructor
42    * @param[in] surface The render surface
43    */
44   Scene();
45
46   /**
47    * Destructor
48    */
49   virtual ~Scene();
50
51   /**
52    * Creates a scene object in the GPU.
53    * @param[in] graphicsController The graphics controller
54    * @param[in] depthBufferAvailable True if there is a depth buffer
55    * @param[in] stencilBufferAvailable True if there is a stencil buffer
56    */
57   void Initialize(Graphics::Controller& graphicsController, Integration::DepthBufferAvailable depthBufferAvailable, Integration::StencilBufferAvailable stencilBufferAvailable);
58
59   /**
60    * Gets the render instructions for the scene
61    * @return the render instructions
62    */
63   RenderInstructionContainer& GetRenderInstructions();
64
65   /**
66    * @brief Adds a callback that is called when the frame rendering is done by the graphics driver.
67    *
68    * @param[in] callback The function to call
69    * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
70    *
71    * @note A callback of the following type may be used:
72    * @code
73    *   void MyFunction( int frameId );
74    * @endcode
75    * This callback will be deleted once it is called.
76    *
77    * @note Ownership of the callback is passed onto this class.
78    */
79   void AddFrameRenderedCallback(CallbackBase* callback, int32_t frameId);
80
81   /**
82    * @brief Adds a callback that is called when the frame is displayed on the display.
83    *
84    * @param[in] callback The function to call
85    * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
86    *
87    * @note A callback of the following type may be used:
88    * @code
89    *   void MyFunction( int frameId );
90    * @endcode
91    * This callback will be deleted once it is called.
92    *
93    * @note Ownership of the callback is passed onto this class.
94    */
95   void AddFramePresentedCallback(CallbackBase* callback, int32_t frameId);
96
97   /**
98    * @brief Gets the callback list that is called when the frame rendering is done by the graphics driver.
99    *
100    * @param[out] callbacks The callback list
101    */
102   void GetFrameRenderedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks);
103
104   /**
105    * @brief Gets the callback list that is called when the frame is displayed on the display.
106    *
107    * @param[out] callbacks The callback list
108    */
109   void GetFramePresentedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks);
110
111   /**
112    * @brief Sets whether rendering should be skipped or not.
113    * @param[in] skip true if rendering should be skipped.
114    */
115   void SetSkipRendering(bool skip);
116
117   /**
118    * @brief Query whether rendering should be skipped or not.
119    * @return true if rendering should be skipped, false otherwise.
120    */
121   bool IsRenderingSkipped() const;
122
123   /**
124    * Set the surface rectangle when surface is resized.
125    *
126    * @param[in] scene The resized scene.
127    * @param[in] rect The retangle representing the surface.
128    */
129   void SetSurfaceRect(const Rect<int32_t>& rect);
130
131   /**
132    * Get the surface rectangle.
133    *
134    * @return the current surface rectangle
135    */
136   const Rect<int32_t>& GetSurfaceRect() const;
137
138   /**
139    * Set the surface orientation when surface is rotated.
140    *
141    * @param[in] orientation The orientation value representing the surface.
142    */
143   void SetSurfaceOrientation(int32_t orientation);
144
145   /**
146    * Get the surface orientation.
147    *
148    * @return the current surface orientation
149    */
150   int32_t GetSurfaceOrientation() const;
151
152   /**
153    * Query wheter the surface rect is changed or not.
154    * @return true if the surface rect is changed.
155    */
156   bool IsSurfaceRectChanged();
157
158   /**
159    * @brief Set the internal flag to acknowledge surface rotation.
160    */
161   void SetRotationCompletedAcknowledgement();
162
163   /**
164    * @brief Query wheter is set to acknowledge for completing surface rotation.
165    * @return true it should be acknowledged.
166    */
167   bool IsRotationCompletedAcknowledgementSet();
168
169   /**
170    * Set the render target of the surface
171    *
172    * @param[in] renderTarget The render target.
173    */
174   void SetSurfaceRenderTarget(Graphics::RenderTarget* renderTarget)
175   {
176     mRenderTarget = renderTarget;
177   }
178
179   /**
180    * Get the render target created for the scene
181    *
182    * @return the render target
183    */
184   [[nodiscard]] Graphics::RenderTarget* GetSurfaceRenderTarget() const
185   {
186     return mRenderTarget;
187   }
188
189   /**
190    * Get the graphics render pass created for the scene
191    *
192    * @return the graphics render pass
193    */
194   [[nodiscard]] Graphics::RenderPass* GetGraphicsRenderPass(Graphics::AttachmentLoadOp loadOp, Graphics::AttachmentStoreOp storeOp) const
195   {
196     if(loadOp == Graphics::AttachmentLoadOp::CLEAR)
197     {
198       return mRenderPass.get();
199     }
200     else
201     {
202       return mRenderPassNoClear.get();
203     }
204   }
205
206   /**
207    * Get an initialized array of clear values which then can be modified and accessed to BeginRenderPass() command.
208    *
209    * @return the array of clear values
210    */
211   [[nodiscard]] auto& GetGraphicsRenderPassClearValues()
212   {
213     return mClearValues;
214   }
215
216 private:
217   // Render instructions describe what should be rendered during RenderManager::RenderScene()
218   // Update manager updates instructions for the next frame while we render the current one
219
220   RenderInstructionContainer mInstructions; ///< Render instructions for the scene
221
222   Dali::Integration::Scene::FrameCallbackContainer mFrameRenderedCallbacks;  ///< Frame rendered callbacks
223   Dali::Integration::Scene::FrameCallbackContainer mFramePresentedCallbacks; ///< Frame presented callbacks
224
225   bool mSkipRendering; ///< A flag to skip rendering
226
227   Rect<int32_t> mSurfaceRect;        ///< The rectangle of surface which is related ot this scene.
228   int32_t       mSurfaceOrientation; ///< The orientation of surface which is related of this scene
229   bool          mSurfaceRectChanged; ///< The flag of surface's rectangle is changed when is resized, moved or rotated.
230   bool          mRotationCompletedAcknowledgement; ///< The flag of sending the acknowledgement to complete window rotation.
231
232   // Render pass and render target
233
234   /**
235    * Render pass is created on fly depending on Load and Store operations
236    * The default render pass (most likely to be used) is the load = CLEAR
237    * and store = STORE for color attachment.
238    */
239   Graphics::UniquePtr<Graphics::RenderPass> mRenderPass{nullptr};        ///< The render pass created to render the surface
240   Graphics::UniquePtr<Graphics::RenderPass> mRenderPassNoClear{nullptr}; ///< The render pass created to render the surface without clearing color
241   Graphics::RenderTarget*                   mRenderTarget{nullptr};      ///< This is created in the event thread when surface is created/resized/replaced
242
243   // clear colors
244   std::vector<Graphics::ClearValue> mClearValues{};
245 };
246
247 /// Messages
248 inline void AddFrameRenderedCallbackMessage(EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId)
249 {
250   using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
251
252   // Reserve some memory inside the message queue
253   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
254
255   // Construct message in the message queue memory; note that delete should not be called on the return value
256   new(slot) LocalType(&scene, &Scene::AddFrameRenderedCallback, const_cast<CallbackBase*>(callback), frameId);
257 }
258
259 inline void AddFramePresentedCallbackMessage(EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId)
260 {
261   using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
262
263   // Reserve some memory inside the message queue
264   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
265
266   // Construct message in the message queue memory; note that delete should not be called on the return value
267   new(slot) LocalType(&scene, &Scene::AddFramePresentedCallback, const_cast<CallbackBase*>(callback), frameId);
268 }
269
270 inline void SetSurfaceRectMessage(EventThreadServices& eventThreadServices, const Scene& scene, const Rect<int32_t>& rect)
271 {
272   using LocalType = MessageValue1<Scene, Rect<int32_t> >;
273
274   // Reserve some memory inside the message queue
275   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
276
277   // Construct message in the message queue memory; note that delete should not be called on the return value
278   new(slot) LocalType(&scene, &Scene::SetSurfaceRect, rect);
279 }
280
281 inline void SetSurfaceOrientationMessage(EventThreadServices& eventThreadServices, const Scene& scene, int32_t orientation)
282 {
283   using LocalType = MessageValue1<Scene, int32_t>;
284
285   // Reserve some memory inside the message queue
286   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
287
288   // Construct message in the message queue memory; note that delete should not be called on the return value
289   new(slot) LocalType(&scene, &Scene::SetSurfaceOrientation, orientation);
290 }
291
292 inline void SetRotationCompletedAcknowledgementMessage(EventThreadServices& eventThreadServices, const Scene& scene)
293 {
294   using LocalType = Message<Scene>;
295
296   // Reserve some memory inside the message queue
297   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
298
299   // Construct message in the message queue memory; note that delete should not be called on the return value
300   new(slot) LocalType(&scene, &Scene::SetRotationCompletedAcknowledgement);
301 }
302
303 inline void SetSurfaceRenderTargetMessage(EventThreadServices& eventThreadServices, const Scene& scene, Graphics::RenderTarget* renderTarget)
304 {
305   using LocalType = MessageValue1<Scene, Graphics::RenderTarget*>;
306
307   // Reserve some memory inside the message queue
308   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
309
310   // Construct message in the message queue memory; note that delete should not be called on the return value
311   new(slot) LocalType(&scene, &Scene::SetSurfaceRenderTarget, renderTarget);
312 }
313
314 } // namespace SceneGraph
315
316 } // namespace Internal
317
318 } // namespace Dali
319
320 #endif // DALI_INTERNAL_SCENE_GRAPH_SCENE_H