Merge branch 'devel/master' into devel/graphics
[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] scene The rotated scene.
142    * @param[in] orientation The orientation value representing the surface.
143    */
144   void SetSurfaceOrientation(int32_t orientation);
145
146   /**
147    * Get the surface orientation.
148    *
149    * @return the current surface orientation
150    */
151   int32_t GetSurfaceOrientation() const;
152
153   /**
154    * Query wheter the surface rect is changed or not.
155    * @return true if the surface rect is changed.
156    */
157   bool IsSurfaceRectChanged();
158
159   /**
160    * Set the render target of the surface
161    *
162    * @param[in] renderTarget The render target.
163    */
164   void SetSurfaceRenderTarget(Graphics::RenderTarget* renderTarget)
165   {
166     mRenderTarget = renderTarget;
167   }
168
169   /**
170    * Get the render target created for the scene
171    *
172    * @return the render target
173    */
174   [[nodiscard]] Graphics::RenderTarget* GetSurfaceRenderTarget() const
175   {
176     return mRenderTarget;
177   }
178
179   /**
180    * Get the graphics render pass created for the scene
181    *
182    * @return the graphics render pass
183    */
184   [[nodiscard]] Graphics::RenderPass* GetGraphicsRenderPass(Graphics::AttachmentLoadOp loadOp, Graphics::AttachmentStoreOp storeOp) const
185   {
186     if(loadOp == Graphics::AttachmentLoadOp::CLEAR)
187     {
188       return mRenderPass.get();
189     }
190     else
191     {
192       return mRenderPassNoClear.get();
193     }
194   }
195
196   /**
197    * Get an initialized array of clear values which then can be modified and accessed to BeginRenderPass() command.
198    *
199    * @return the array of clear values
200    */
201   [[nodiscard]] auto& GetGraphicsRenderPassClearValues()
202   {
203     return mClearValues;
204   }
205
206 private:
207   // Render instructions describe what should be rendered during RenderManager::RenderScene()
208   // Update manager updates instructions for the next frame while we render the current one
209
210   RenderInstructionContainer mInstructions; ///< Render instructions for the scene
211
212   Dali::Integration::Scene::FrameCallbackContainer mFrameRenderedCallbacks;  ///< Frame rendered callbacks
213   Dali::Integration::Scene::FrameCallbackContainer mFramePresentedCallbacks; ///< Frame presented callbacks
214
215   bool mSkipRendering; ///< A flag to skip rendering
216
217   Rect<int32_t> mSurfaceRect;        ///< The rectangle of surface which is related ot this scene.
218   int32_t       mSurfaceOrientation; ///< The orientation of surface which is related of this scene
219   bool          mSurfaceRectChanged; ///< The flag of surface's rectangle is changed when is resized, moved or rotated.
220
221   // Render pass and render target
222
223   /**
224    * Render pass is created on fly depending on Load and Store operations
225    * The default render pass (most likely to be used) is the load = CLEAR
226    * and store = STORE for color attachment.
227    */
228   Graphics::UniquePtr<Graphics::RenderPass> mRenderPass{nullptr};        ///< The render pass created to render the surface
229   Graphics::UniquePtr<Graphics::RenderPass> mRenderPassNoClear{nullptr}; ///< The render pass created to render the surface without clearing color
230   Graphics::RenderTarget*                   mRenderTarget{nullptr};      ///< This is created in the event thread when surface is created/resized/replaced
231
232   // clear colors
233   std::vector<Graphics::ClearValue> mClearValues{};
234 };
235
236 /// Messages
237 inline void AddFrameRenderedCallbackMessage(EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId)
238 {
239   using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
240
241   // Reserve some memory inside the message queue
242   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
243
244   // Construct message in the message queue memory; note that delete should not be called on the return value
245   new(slot) LocalType(&scene, &Scene::AddFrameRenderedCallback, const_cast<CallbackBase*>(callback), frameId);
246 }
247
248 inline void AddFramePresentedCallbackMessage(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::AddFramePresentedCallback, const_cast<CallbackBase*>(callback), frameId);
257 }
258
259 inline void SetSurfaceRectMessage(EventThreadServices& eventThreadServices, const Scene& scene, const Rect<int32_t>& rect)
260 {
261   using LocalType = MessageValue1<Scene, Rect<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::SetSurfaceRect, rect);
268 }
269
270 inline void SetSurfaceOrientationMessage(EventThreadServices& eventThreadServices, const Scene& scene, int32_t orientation)
271 {
272   using LocalType = MessageValue1<Scene, 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::SetSurfaceOrientation, orientation);
279 }
280
281 inline void SetSurfaceRenderTargetMessage(EventThreadServices& eventThreadServices, const Scene& scene, Graphics::RenderTarget* renderTarget)
282 {
283   using LocalType = MessageValue1<Scene, Graphics::RenderTarget*>;
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::SetSurfaceRenderTarget, renderTarget);
290 }
291
292 } // namespace SceneGraph
293
294 } // namespace Internal
295
296 } // namespace Dali
297
298 #endif // DALI_INTERNAL_SCENE_GRAPH_SCENE_H