1 #ifndef DALI_INTERNAL_SCENE_GRAPH_SCENE_H
2 #define DALI_INTERNAL_SCENE_GRAPH_SCENE_H
5 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
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>
37 class RenderInstructionContainer;
44 * @param[in] surface The render surface
54 * Creates a scene object in the GPU.
55 * @param[in] context The GL context
56 * @param[in] graphicsController The graphics controller
57 * @param[in] depthBufferAvailable True if there is a depth buffer
58 * @param[in] stencilBufferAvailable True if there is a stencil buffer
60 void Initialize(Context& context, Graphics::Controller& graphicsController, Integration::DepthBufferAvailable depthBufferAvailable, Integration::StencilBufferAvailable stencilBufferAvailable);
63 * Gets the context holding the GL state of rendering for the scene
66 Context* GetContext();
69 * Gets the render instructions for the scene
70 * @return the render instructions
72 RenderInstructionContainer& GetRenderInstructions();
75 * @brief Adds a callback that is called when the frame rendering is done by the graphics driver.
77 * @param[in] callback The function to call
78 * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
80 * @note A callback of the following type may be used:
82 * void MyFunction( int frameId );
84 * This callback will be deleted once it is called.
86 * @note Ownership of the callback is passed onto this class.
88 void AddFrameRenderedCallback(CallbackBase* callback, int32_t frameId);
91 * @brief Adds a callback that is called when the frame is displayed on the display.
93 * @param[in] callback The function to call
94 * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
96 * @note A callback of the following type may be used:
98 * void MyFunction( int frameId );
100 * This callback will be deleted once it is called.
102 * @note Ownership of the callback is passed onto this class.
104 void AddFramePresentedCallback(CallbackBase* callback, int32_t frameId);
107 * @brief Gets the callback list that is called when the frame rendering is done by the graphics driver.
109 * @param[out] callbacks The callback list
111 void GetFrameRenderedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks);
114 * @brief Gets the callback list that is called when the frame is displayed on the display.
116 * @param[out] callbacks The callback list
118 void GetFramePresentedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks);
121 * @brief Sets whether rendering should be skipped or not.
122 * @param[in] skip true if rendering should be skipped.
124 void SetSkipRendering(bool skip);
127 * @brief Query whether rendering should be skipped or not.
128 * @return true if rendering should be skipped, false otherwise.
130 bool IsRenderingSkipped() const;
133 * Set the surface rectangle when surface is resized.
135 * @param[in] scene The resized scene.
136 * @param[in] rect The retangle representing the surface.
138 void SetSurfaceRect(const Rect<int32_t>& rect);
141 * Get the surface rectangle.
143 * @return the current surface rectangle
145 const Rect<int32_t>& GetSurfaceRect() const;
148 * Set the surface orientation when surface is rotated.
150 * @param[in] scene The rotated scene.
151 * @param[in] orientation The orientation value representing the surface.
153 void SetSurfaceOrientation(int32_t orientation);
156 * Get the surface orientation.
158 * @return the current surface orientation
160 int32_t GetSurfaceOrientation() const;
163 * Query wheter the surface rect is changed or not.
164 * @return true if the surface rect is changed.
166 bool IsSurfaceRectChanged();
169 * Set the render target of the surface
171 * @param[in] renderTarget The render target.
173 void SetSurfaceRenderTarget(Graphics::RenderTarget* renderTarget)
175 mRenderTarget = renderTarget;
179 * Get the render target created for the scene
181 * @return the render target
183 [[nodiscard]] Graphics::RenderTarget* GetSurfaceRenderTarget() const
185 return mRenderTarget;
189 * Get the graphics render pass created for the scene
191 * @return the graphics render pass
193 [[nodiscard]] Graphics::RenderPass* GetGraphicsRenderPass(Graphics::AttachmentLoadOp loadOp, Graphics::AttachmentStoreOp storeOp) const
195 if(loadOp == Graphics::AttachmentLoadOp::CLEAR)
197 return mRenderPass.get();
201 return mRenderPassNoClear.get();
206 * Get an initialized array of clear values which then can be modified and accessed to BeginRenderPass() command.
208 * @return the array of clear values
210 [[nodiscard]] auto& GetGraphicsRenderPassClearValues()
216 Context* mContext; ///< The context holding the GL state of rendering for the scene, not owned
218 // Render instructions describe what should be rendered during RenderManager::RenderScene()
219 // Update manager updates instructions for the next frame while we render the current one
221 RenderInstructionContainer mInstructions; ///< Render instructions for the scene
223 Dali::Integration::Scene::FrameCallbackContainer mFrameRenderedCallbacks; ///< Frame rendered callbacks
224 Dali::Integration::Scene::FrameCallbackContainer mFramePresentedCallbacks; ///< Frame presented callbacks
226 bool mSkipRendering; ///< A flag to skip rendering
228 Rect<int32_t> mSurfaceRect; ///< The rectangle of surface which is related ot this scene.
229 int32_t mSurfaceOrientation; ///< The orientation of surface which is related of this scene
230 bool mSurfaceRectChanged; ///< The flag of surface's rectangle is changed when is resized, moved or rotated.
232 // Render pass and render target
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.
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
244 std::vector<Graphics::ClearValue> mClearValues{};
248 inline void AddFrameRenderedCallbackMessage(EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId)
250 using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
252 // Reserve some memory inside the message queue
253 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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);
259 inline void AddFramePresentedCallbackMessage(EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId)
261 using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
263 // Reserve some memory inside the message queue
264 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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);
270 inline void SetSurfaceRectMessage(EventThreadServices& eventThreadServices, const Scene& scene, const Rect<int32_t>& rect)
272 using LocalType = MessageValue1<Scene, Rect<int32_t> >;
274 // Reserve some memory inside the message queue
275 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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);
281 inline void SetSurfaceOrientationMessage(EventThreadServices& eventThreadServices, const Scene& scene, int32_t orientation)
283 using LocalType = MessageValue1<Scene, int32_t>;
285 // Reserve some memory inside the message queue
286 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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);
292 inline void SetSurfaceRenderTargetMessage(EventThreadServices& eventThreadServices, const Scene& scene, Graphics::RenderTarget* renderTarget)
294 using LocalType = MessageValue1<Scene, Graphics::RenderTarget*>;
296 // Reserve some memory inside the message queue
297 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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::SetSurfaceRenderTarget, renderTarget);
303 } // namespace SceneGraph
305 } // namespace Internal
309 #endif // DALI_INTERNAL_SCENE_GRAPH_SCENE_H