1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_H__
5 * Copyright (c) 2016 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.
22 #include <dali/public-api/math/viewport.h>
23 #include <dali/public-api/render-tasks/render-task.h>
24 #include <dali/internal/common/buffer-index.h>
25 #include <dali/internal/common/message.h>
26 #include <dali/internal/event/common/event-thread-services.h>
27 #include <dali/internal/update/common/property-owner.h>
28 #include <dali/internal/update/common/animatable-property.h>
29 #include <dali/internal/render/renderers/render-frame-buffer.h>
36 class FrameBufferTexture;
47 class RenderInstruction;
48 class RenderMessageDispatcher;
51 * RenderTasks describe how the Dali scene should be rendered.
53 class RenderTask : public PropertyOwner
59 RENDER_CONTINUOUSLY, ///< mRefreshRate > 0
60 RENDER_ONCE_WAITING_FOR_RESOURCES, ///< mRefreshRate = REFRESH_ONCE
61 RENDERED_ONCE, ///< mRefreshRate = REFRESH_ONCE & rendered
62 RENDERED_ONCE_AND_NOTIFIED ///< mRefreshRate = REFRESH_ONCE & rendered & notified
66 * Create a new RenderTask
68 static RenderTask* New();
73 virtual ~RenderTask();
76 * Initialize the render task. Called in update thread
77 * @param[in] renderMessageDispatcher to send messages to render thread
79 void Initialize( RenderMessageDispatcher& renderMessageDispatcher );
82 * Set the nodes to be rendered.
83 * @param[in] node This node and its children will be rendered.
85 void SetSourceNode( Node* node );
88 * Retrieve the source node.
89 * @return This node and its children will be rendered.
91 Node* GetSourceNode() const;
94 * Set whether the RenderTask has exclusive access to the source nodes.
95 * @param[in] exclusive True if the source nodes will only be rendered by this render-task.
97 void SetExclusive( bool exclusive );
100 * Query whether the RenderTask has exclusive access to the source actors.
101 * @return True if the source actors will only be rendered by this render-task.
103 bool IsExclusive() const;
106 * Set the camera from which the scene is viewed.
107 * @param[in] cameraNode that camera is connected with
108 * @param[in] camera to use.
110 void SetCamera( Node* cameraNode, Camera* camera );
113 * Set the frame-buffer used as a render target.
114 * @param[in] resourceId The resource ID of the frame-buffer, or zero if not rendering off-screen.
115 * @param[in] isNativeFBO if this render task is targeting a native FBO
117 void SetFrameBufferId( unsigned int resourceId, bool isNativeFBO );
120 * Retrieve the resource ID of the frame-buffer.
121 * @return The resource ID, or zero if not rendering off-screen.
123 unsigned int GetFrameBufferId() const;
126 * Set the frame-buffer used as a render target.
127 * @param[in] frameBuffer The framebuffer
129 void SetFrameBuffer( Render::FrameBuffer* frameBuffer );
132 * Retrieve the resource ID of the frame-buffer.
133 * @return The resource ID, or zero if not rendering off-screen.
135 Render::FrameBuffer* GetFrameBuffer();
138 * Set the value of property viewportPosition
139 * This value will persist only for the current frame.
140 * @param[in] updateBufferIndex The current update buffer index.
141 * @param[in] value The value of the property
143 void SetViewportPosition( BufferIndex updateBufferIndex, const Vector2& value );
146 * Get the value of property viewportPosition
147 * @warning Should only be called from the Update thread
148 * @param[in] bufferIndex The buffer to read from.
149 * @return the value of the property.
151 const Vector2& GetViewportPosition( BufferIndex bufferIndex ) const;
154 * Bake the value of the property viewportPosition
155 * This will also set the base value
156 * @param[in] updateBufferIndex The current update buffer index.
157 * @param[in] value The new value for property.
159 void BakeViewportPosition( BufferIndex updateBufferIndex, const Vector2& value );
162 * Set the value of property viewportSize
163 * This value will persist only for the current frame.
164 * @param[in] updateBufferIndex The current update buffer index.
165 * @param[in] value The value of the property
167 void SetViewportSize( BufferIndex updateBufferIndex, const Vector2& value );
170 * Get the value of property viewportSize
171 * @warning Should only be called from the Update thread
172 * @param[in] bufferIndex The buffer to read from.
173 * @return the value of the property.
175 const Vector2& GetViewportSize( BufferIndex bufferIndex ) const;
178 * Bake the value of the property viewportSize
179 * This will also set the base value
180 * @param[in] updateBufferIndex The current update buffer index.
181 * @param[in] value The new value for property.
183 void BakeViewportSize( BufferIndex updateBufferIndex, const Vector2& value );
186 * Get the value of property viewportEnabled
187 * @warning Should only be called from the Update thread
188 * @param[in] bufferIndex The buffer to read from.
189 * @return the value of the property.
191 bool GetViewportEnabled( BufferIndex bufferIndex ) const;
194 * Query whether the optional viewport is set.
195 * @param[in] bufferIndex The buffer to read from.
196 * @param[out] viewport The viewport position and size is populated.
197 * @return true if the viewport has been set
199 bool QueryViewport( BufferIndex bufferIndex, Viewport& viewport ) const;
202 * Set the value of property clearColor
203 * This value will persist only for the current frame.
204 * @param[in] updateBufferIndex The current update buffer index.
205 * @param[in] value The value of the property
207 void SetClearColor( BufferIndex updateBufferIndex, const Vector4& value );
210 * Get the value of property clearColor
211 * @warning Should only be called from the Update thread
212 * @param[in] bufferIndex The buffer to read from.
213 * @return the value of the property.
215 const Vector4& GetClearColor( BufferIndex bufferIndex ) const;
218 * Bake the value of the property clearColor
219 * This will also set the base value
220 * @param[in] updateBufferIndex The current update buffer index.
221 * @param[in] value The new value for property.
223 void BakeClearColor( BufferIndex updateBufferIndex, const Vector4& value );
226 * @copydoc Dali::RenderTask::SetClearEnabled()
228 void SetClearEnabled( bool enabled );
231 * @copydoc Dali::RenderTask::GetClearEnabled()
233 bool GetClearEnabled() const;
236 * @copydoc Dali::RenderTask::SetCullMode()
238 void SetCullMode( bool mode );
241 * @copydoc Dali::RenderTask::GetCullMode()
243 bool GetCullMode() const;
246 * Set the refresh-rate of the RenderTask.
247 * @param[in] refreshRate The new refresh rate.
249 void SetRefreshRate( unsigned int refreshRate );
252 * Retrieve the refresh-rate of the RenderTask.
253 * @return The refresh rate.
255 unsigned int GetRefreshRate() const;
258 * Check if the render task is ready for rendering.
259 * @param[in] updateBufferIndex The current update buffer index.
260 * @return True if the render-task is ready for rendering.
262 bool ReadyToRender( BufferIndex updateBufferIndex );
265 * True if a render is required. If the current state is RENDER_CONTINUOUSLY, then
266 * this returns true if the frame count is zero. If the current state is RENDER_ONCE_WAITING_FOR_RESOURCES, then it always returns true. In all other states, it returns false.
267 * @return true if a render is required
269 bool IsRenderRequired();
272 * Set whether all resources were available when the render-task was processed
273 * @param[in] resourcesComplete True if the resources of the source tree are completely loaded.
275 void SetResourcesFinished( bool resourcesFinished );
278 * Process a frame. This method is called each frame for every ready render task, regardless
279 * of whether it needs to render (so that the frame counter can be updated).
284 * Return true only if currently waiting for the render task to
285 * finish rendering and the update thread should be kept alive.
286 * @return true if waiting to be rendered
288 bool IsWaitingToRender();
291 * Return true when the render task has finished rendering and a notification
292 * needs sending. (Only one notification is sent per render once request)
293 * @return true if notification is required.
298 * @return The number of times we have transited from RENDERED_ONCE to RENDERED_ONCE_AND_NOTIFIED state.
300 unsigned int GetRenderedOnceCounter() const;
303 * Retrieve the view-matrix; this is double buffered for input handling.
304 * @pre GetCameraNode() returns a node with valid Camera.
305 * @param[in] bufferIndex The buffer to read from.
306 * @return The view-matrix.
308 const Matrix& GetViewMatrix( BufferIndex bufferIndex ) const;
311 * @brief Retrieve the camera.
312 * @pre GetCameraNode() returns a node with valid Camera.
314 * @return The camera.
316 SceneGraph::Camera& GetCamera() const;
319 * Retrieve the projection-matrix; this is double buffered for input handling.
320 * @pre GetCameraNode() returns a node with valid Camera.
321 * @param[in] bufferIndex The buffer to read from.
322 * @return The projection-matrix.
324 const Matrix& GetProjectionMatrix( BufferIndex bufferIndex ) const;
327 * Prepares the render-instruction buffer to be populated with instructions.
329 * If the render task is a render-once framebuffer backed by a native image,
330 * then this method will ensure that a GL sync object is created to track
331 * when the rendering has finished.
333 * @param[out] instruction to prepare
334 * @param[in] updateBufferIndex The current update buffer index.
336 void PrepareRenderInstruction( RenderInstruction& instruction, BufferIndex updateBufferIndex );
339 * @return true if the view matrix has been updated during this or last frame
341 bool ViewMatrixUpdated();
344 * Indicate whether GL sync is required for native render target.
345 * @param[in] requiresSync whether GL sync is required for native render target
347 void SetSyncRequired( bool requiresSync );
352 * Protected constructor.
357 RenderTask(const RenderTask&);
360 RenderTask& operator=(const RenderTask&);
362 private: // PropertyOwner
364 virtual void ResetDefaultProperties( BufferIndex currentBufferIndex );
366 public: // Animatable Properties
367 AnimatableProperty< Vector2 > mViewportPosition; ///< viewportPosition
368 AnimatableProperty< Vector2 > mViewportSize; ///< viewportSize
369 AnimatableProperty< Vector4 > mClearColor; ///< clearColor
372 RenderMessageDispatcher* mRenderMessageDispatcher;
373 Render::RenderTracker* mRenderSyncTracker;
376 SceneGraph::Camera* mCamera;
377 Render::FrameBuffer* mFrameBuffer;
379 bool mResourcesFinished:1; ///< True if all resources were available when the render-task was processed
380 bool mWaitingToRender:1; ///< True when an render once to FBO is waiting
381 bool mNotifyTrigger:1; ///< True if a render once render task has finished renderering
382 bool mExclusive: 1; ///< Whether the render task has exclusive access to the source actor (node in the scene graph implementation).
383 bool mClearEnabled: 1; ///< Whether previous results are cleared.
384 bool mCullMode: 1; ///< Whether renderers should be frustum culled
386 FrameBufferTexture* mRenderTarget;
388 State mState; ///< Render state.
389 unsigned int mRefreshRate; ///< REFRESH_ONCE, REFRESH_ALWAYS or render every N frames
390 unsigned int mFrameCounter; ///< counter for rendering every N frames
392 unsigned int mRenderedOnceCounter; ///< Incremented whenever state changes to RENDERED_ONCE_AND_NOTIFIED
393 bool mRequiresSync; ///< Whether sync is needed to track the render
397 // Messages for RenderTask
398 inline void SetFrameBufferMessage( EventThreadServices& eventThreadServices, RenderTask& task, Render::FrameBuffer* frameBuffer )
400 typedef MessageValue1< RenderTask, Render::FrameBuffer*> LocalType;
402 // Reserve some memory inside the message queue
403 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
405 // Construct message in the message queue memory; note that delete should not be called on the return value
406 new (slot) LocalType( &task, &RenderTask::SetFrameBuffer, frameBuffer );
409 inline void SetClearColorMessage( EventThreadServices& eventThreadServices, RenderTask& task, const Vector4& value )
411 typedef MessageDoubleBuffered1< RenderTask, Vector4 > LocalType;
413 // Reserve some memory inside the message queue
414 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
416 // Construct message in the message queue memory; note that delete should not be called on the return value
417 new (slot) LocalType( &task, &RenderTask::SetClearColor, value );
420 inline void BakeClearColorMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector4& value )
422 typedef MessageDoubleBuffered1< RenderTask, Vector4 > LocalType;
424 // Reserve some memory inside the message queue
425 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
427 // Construct message in the message queue memory; note that delete should not be called on the return value
428 new (slot) LocalType( &task, &RenderTask::BakeClearColor, value );
431 inline void SetClearEnabledMessage( EventThreadServices& eventThreadServices, RenderTask& task, bool enabled )
433 typedef MessageValue1< RenderTask, bool > LocalType;
435 // Reserve some memory inside the message queue
436 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
438 // Construct message in the message queue memory; note that delete should not be called on the return value
439 new (slot) LocalType( &task, &RenderTask::SetClearEnabled, enabled );
442 inline void SetCullModeMessage( EventThreadServices& eventThreadServices, RenderTask& task, bool mode )
444 typedef MessageValue1< RenderTask, bool > LocalType;
446 // Reserve some memory inside the message queue
447 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
449 // Construct message in the message queue memory; note that delete should not be called on the return value
450 new (slot) LocalType( &task, &RenderTask::SetCullMode, mode );
453 inline void SetRefreshRateMessage( EventThreadServices& eventThreadServices, RenderTask& task, unsigned int refreshRate )
455 typedef MessageValue1< RenderTask, unsigned int > LocalType;
457 // Reserve some memory inside the message queue
458 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
460 // Construct message in the message queue memory; note that delete should not be called on the return value
461 new (slot) LocalType( &task, &RenderTask::SetRefreshRate, refreshRate );
464 inline void SetSourceNodeMessage( EventThreadServices& eventThreadServices, RenderTask& task, const Node* constNode )
466 // Scene graph thread can destroy this object.
467 Node* node = const_cast< Node* >( constNode );
469 typedef MessageValue1< RenderTask, Node* > LocalType;
471 // Reserve some memory inside the message queue
472 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
474 // Construct message in the message queue memory; note that delete should not be called on the return value
475 new (slot) LocalType( &task, &RenderTask::SetSourceNode, node );
478 inline void SetCameraMessage( EventThreadServices& eventThreadServices, RenderTask& task, const Node* constNode, const Camera* constCamera )
480 typedef MessageValue2< RenderTask, Node*, Camera* > LocalType;
482 Node* node = const_cast< Node* >( constNode );
483 Camera* camera = const_cast< Camera* >( constCamera );
484 // Reserve memory inside the message queue
485 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
487 // Construct message in the message queue memory; note that delete should not be called on the return value
488 new (slot) LocalType( &task, &RenderTask::SetCamera, node, camera );
491 inline void SetExclusiveMessage( EventThreadServices& eventThreadServices, RenderTask& task, bool exclusive )
493 typedef MessageValue1< RenderTask, bool > LocalType;
495 // Reserve some memory inside the message queue
496 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
498 // Construct message in the message queue memory; note that delete should not be called on the return value
499 new (slot) LocalType( &task, &RenderTask::SetExclusive, exclusive );
502 inline void SetSyncRequiredMessage(EventThreadServices& eventThreadServices, RenderTask& task, bool requiresSync )
504 typedef MessageValue1< RenderTask, bool > LocalType;
506 // Reserve some memory inside the message queue
507 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
509 // Construct message in the message queue memory; note that delete should not be called on the return value
510 new (slot) LocalType( &task, &RenderTask::SetSyncRequired, requiresSync );
513 inline void BakeViewportPositionMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector2& value )
515 typedef MessageDoubleBuffered1< RenderTask, Vector2 > LocalType;
517 // Reserve some memory inside the message queue
518 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
520 // Construct message in the message queue memory; note that delete should not be called on the return value
521 new (slot) LocalType( &task, &RenderTask::BakeViewportPosition, value );
524 inline void BakeViewportSizeMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector2& value )
526 typedef MessageDoubleBuffered1< RenderTask, Vector2 > LocalType;
528 // Reserve some memory inside the message queue
529 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
531 // Construct message in the message queue memory; note that delete should not be called on the return value
532 new (slot) LocalType( &task, &RenderTask::BakeViewportSize, value );
535 } // namespace SceneGraph
537 } // namespace Internal
541 #endif // __DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_H__