X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frender-tasks%2Fscene-graph-render-task.h;h=4ac9c287d254cd3f388dee31eea8c713b1068bce;hb=9c0479e4604ff5be5cc7d274e56d65964b05be9d;hp=170b80f0878aeec9b00a77d470bc5159e57255de;hpb=df59eea2434495c32414fcf9ffafe4cb7dff5324;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/render-tasks/scene-graph-render-task.h b/dali/internal/update/render-tasks/scene-graph-render-task.h index 170b80f..4ac9c28 100644 --- a/dali/internal/update/render-tasks/scene-graph-render-task.h +++ b/dali/internal/update/render-tasks/scene-graph-render-task.h @@ -2,7 +2,7 @@ #define __DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,11 +22,11 @@ #include #include #include -#include #include -#include +#include #include #include +#include namespace Dali { @@ -34,13 +34,19 @@ namespace Dali namespace Internal { class FrameBufferTexture; -class CompleteStatusManager; +class ResourceManager; + +namespace Render +{ +class RenderTracker; +} namespace SceneGraph { class Node; -class CameraAttachment; +class Camera; class RenderInstruction; +class RenderMessageDispatcher; /** * RenderTasks describe how the Dali scene should be rendered. @@ -48,6 +54,7 @@ class RenderInstruction; class RenderTask : public PropertyOwner { public: + enum State { RENDER_CONTINUOUSLY, ///< mRefreshRate > 0 @@ -67,6 +74,13 @@ public: virtual ~RenderTask(); /** + * Initialize the render task. Called in update thread + * @param[in] renderMessageDispatcher to send messages to render thread + * @param[in] resourceManager to check and update status of FBOs + */ + void Initialize( RenderMessageDispatcher& renderMessageDispatcher, ResourceManager& resourceManager ); + + /** * Set the nodes to be rendered. * @param[in] node This node and its children will be rendered. */ @@ -91,31 +105,39 @@ public: bool IsExclusive() const; /** - * Set the node from which the scene is viewed. - * @param[in] node The scene is viewed from the perspective of this node. + * Set the camera from which the scene is viewed. + * @param[in] cameraNode that camera is connected with + * @param[in] camera to use. */ - void SetCameraNode( Node* node ); + void SetCamera( Node* cameraNode, Camera* camera ); /** - * Retrieve the camera node. - * @return The scene is viewed from the perspective of this node. + * Set the frame-buffer used as a render target. + * @param[in] resourceId The resource ID of the frame-buffer, or zero if not rendering off-screen. + * @param[in] isNativeFBO if this render task is targeting a native FBO + */ + void SetFrameBufferId( unsigned int resourceId, bool isNativeFBO ); + + /** + * Retrieve the resource ID of the frame-buffer. + * @return The resource ID, or zero if not rendering off-screen. */ - Node* GetCameraNode() const; + unsigned int GetFrameBufferId() const; /** * Set the frame-buffer used as a render target. - * @param[in] resourceId The resource ID of the frame-buffer, or zero if not rendering off-screen. + * @param[in] frameBuffer The framebuffer */ - void SetFrameBufferId( unsigned int resourceId ); + void SetFrameBuffer( Render::FrameBuffer* frameBuffer ); /** * Retrieve the resource ID of the frame-buffer. * @return The resource ID, or zero if not rendering off-screen. */ - unsigned int GetFrameBufferId() const; + Render::FrameBuffer* GetFrameBuffer(); /** - * Set the value of property viewport-position + * Set the value of property viewportPosition * This value will persist only for the current frame. * @param[in] updateBufferIndex The current update buffer index. * @param[in] value The value of the property @@ -123,7 +145,7 @@ public: void SetViewportPosition( BufferIndex updateBufferIndex, const Vector2& value ); /** - * Get the value of property viewport-position + * Get the value of property viewportPosition * @warning Should only be called from the Update thread * @param[in] bufferIndex The buffer to read from. * @return the value of the property. @@ -131,7 +153,7 @@ public: const Vector2& GetViewportPosition( BufferIndex bufferIndex ) const; /** - * Bake the value of the property viewport-position + * Bake the value of the property viewportPosition * This will also set the base value * @param[in] updateBufferIndex The current update buffer index. * @param[in] value The new value for property. @@ -139,7 +161,7 @@ public: void BakeViewportPosition( BufferIndex updateBufferIndex, const Vector2& value ); /** - * Set the value of property viewport-size + * Set the value of property viewportSize * This value will persist only for the current frame. * @param[in] updateBufferIndex The current update buffer index. * @param[in] value The value of the property @@ -147,7 +169,7 @@ public: void SetViewportSize( BufferIndex updateBufferIndex, const Vector2& value ); /** - * Get the value of property viewport-size + * Get the value of property viewportSize * @warning Should only be called from the Update thread * @param[in] bufferIndex The buffer to read from. * @return the value of the property. @@ -155,7 +177,7 @@ public: const Vector2& GetViewportSize( BufferIndex bufferIndex ) const; /** - * Bake the value of the property viewport-size + * Bake the value of the property viewportSize * This will also set the base value * @param[in] updateBufferIndex The current update buffer index. * @param[in] value The new value for property. @@ -163,7 +185,7 @@ public: void BakeViewportSize( BufferIndex updateBufferIndex, const Vector2& value ); /** - * Get the value of property viewport-enabled + * Get the value of property viewportEnabled * @warning Should only be called from the Update thread * @param[in] bufferIndex The buffer to read from. * @return the value of the property. @@ -179,7 +201,7 @@ public: bool QueryViewport( BufferIndex bufferIndex, Viewport& viewport ) const; /** - * Set the value of property clear-color + * Set the value of property clearColor * This value will persist only for the current frame. * @param[in] updateBufferIndex The current update buffer index. * @param[in] value The value of the property @@ -187,7 +209,7 @@ public: void SetClearColor( BufferIndex updateBufferIndex, const Vector4& value ); /** - * Get the value of property clear-color + * Get the value of property clearColor * @warning Should only be called from the Update thread * @param[in] bufferIndex The buffer to read from. * @return the value of the property. @@ -195,7 +217,7 @@ public: const Vector4& GetClearColor( BufferIndex bufferIndex ) const; /** - * Bake the value of the property clear-color + * Bake the value of the property clearColor * This will also set the base value * @param[in] updateBufferIndex The current update buffer index. * @param[in] value The new value for property. @@ -213,6 +235,16 @@ public: bool GetClearEnabled() const; /** + * @copydoc Dali::RenderTask::SetCullMode() + */ + void SetCullMode( bool mode ); + + /** + * @copydoc Dali::RenderTask::GetCullMode() + */ + bool GetCullMode() const; + + /** * Set the refresh-rate of the RenderTask. * @param[in] refreshRate The new refresh rate. */ @@ -239,11 +271,16 @@ public: bool IsRenderRequired(); /** + * Set whether all resources were available when the render-task was processed + * @param[in] resourcesComplete True if the resources of the source tree are completely loaded. + */ + void SetResourcesFinished( bool resourcesFinished ); + + /** * Process a frame. This method is called each frame for every ready render task, regardless * of whether it needs to render (so that the frame counter can be updated). - * @param[in] resourcesComplete true if the resources of the source tree are completely loaded. */ - void UpdateState( bool resourcesComplete ); + void UpdateState(); /** * Return true only if currently waiting for the render task to @@ -266,15 +303,23 @@ public: /** * Retrieve the view-matrix; this is double buffered for input handling. - * @pre GetCameraNode() returns a node with valid CameraAttachment. + * @pre GetCameraNode() returns a node with valid Camera. * @param[in] bufferIndex The buffer to read from. * @return The view-matrix. */ const Matrix& GetViewMatrix( BufferIndex bufferIndex ) const; /** + * @brief Retrieve the camera. + * @pre GetCameraNode() returns a node with valid Camera. + * + * @return The camera. + */ + SceneGraph::Camera& GetCamera() const; + + /** * Retrieve the projection-matrix; this is double buffered for input handling. - * @pre GetCameraNode() returns a node with valid CameraAttachment. + * @pre GetCameraNode() returns a node with valid Camera. * @param[in] bufferIndex The buffer to read from. * @return The projection-matrix. */ @@ -282,6 +327,11 @@ public: /** * Prepares the render-instruction buffer to be populated with instructions. + * + * If the render task is a render-once framebuffer backed by a native image, + * then this method will ensure that a GL sync object is created to track + * when the rendering has finished. + * * @param[out] instruction to prepare * @param[in] updateBufferIndex The current update buffer index. */ @@ -293,10 +343,10 @@ public: bool ViewMatrixUpdated(); /** - * Set the complete status tracker. - * @param[in] completeStatusManager The complete status Tracker (not owned) + * Indicate whether GL sync is required for native render target. + * @param[in] requiresSync whether GL sync is required for native render target */ - void SetCompleteStatusManager( CompleteStatusManager* completeStatusManager ); + void SetSyncRequired( bool requiresSync ); private: @@ -316,91 +366,119 @@ private: // PropertyOwner virtual void ResetDefaultProperties( BufferIndex currentBufferIndex ); public: // Animatable Properties - AnimatableProperty< Vector2 > mViewportPosition; ///< viewport-position - AnimatableProperty< Vector2 > mViewportSize; ///< viewport-size - AnimatableProperty< Vector4 > mClearColor; ///< clear-color + AnimatableProperty< Vector2 > mViewportPosition; ///< viewportPosition + AnimatableProperty< Vector2 > mViewportSize; ///< viewportSize + AnimatableProperty< Vector4 > mClearColor; ///< clearColor private: - CompleteStatusManager* mCompleteStatusManager; + RenderMessageDispatcher* mRenderMessageDispatcher; + ResourceManager* mResourceManager; + Render::RenderTracker* mRenderSyncTracker; Node* mSourceNode; Node* mCameraNode; - CameraAttachment* mCameraAttachment; + SceneGraph::Camera* mCamera; unsigned int mFrameBufferResourceId; + Render::FrameBuffer* mFrameBuffer; + bool mResourcesFinished:1; ///< True if all resources were available when the render-task was processed bool mWaitingToRender:1; ///< True when an render once to FBO is waiting bool mNotifyTrigger:1; ///< True if a render once render task has finished renderering bool mExclusive: 1; ///< Whether the render task has exclusive access to the source actor (node in the scene graph implementation). bool mClearEnabled: 1; ///< Whether previous results are cleared. + bool mCullMode: 1; ///< Whether renderers should be frustum culled FrameBufferTexture* mRenderTarget; - Viewport mViewport; State mState; ///< Render state. unsigned int mRefreshRate; ///< REFRESH_ONCE, REFRESH_ALWAYS or render every N frames unsigned int mFrameCounter; ///< counter for rendering every N frames unsigned int mRenderedOnceCounter; ///< Incremented whenever state changes to RENDERED_ONCE_AND_NOTIFIED + bool mTargetIsNativeFramebuffer; ///< Tells if our target is a native framebuffer + bool mRequiresSync; ///< Whether sync is needed to track the render }; // Messages for RenderTask -inline void SetFrameBufferIdMessage( EventToUpdate& eventToUpdate, RenderTask& task, unsigned int resourceId ) +inline void SetFrameBufferIdMessage( EventThreadServices& eventThreadServices, RenderTask& task, unsigned int resourceId, bool isNativeFBO ) { - typedef MessageValue1< RenderTask, unsigned int > LocalType; + typedef MessageValue2< RenderTask, unsigned int, bool > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &task, &RenderTask::SetFrameBufferId, resourceId, isNativeFBO ); +} + +inline void SetFrameBufferMessage( EventThreadServices& eventThreadServices, RenderTask& task, Render::FrameBuffer* frameBuffer ) +{ + typedef MessageValue1< RenderTask, Render::FrameBuffer*> LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &task, &RenderTask::SetFrameBufferId, resourceId ); + new (slot) LocalType( &task, &RenderTask::SetFrameBuffer, frameBuffer ); } -inline void SetClearColorMessage( EventToUpdate& eventToUpdate, RenderTask& task, const Vector4& value ) +inline void SetClearColorMessage( EventThreadServices& eventThreadServices, RenderTask& task, const Vector4& value ) { typedef MessageDoubleBuffered1< RenderTask, Vector4 > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::SetClearColor, value ); } -inline void BakeClearColorMessage( EventToUpdate& eventToUpdate, const RenderTask& task, const Vector4& value ) +inline void BakeClearColorMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector4& value ) { typedef MessageDoubleBuffered1< RenderTask, Vector4 > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::BakeClearColor, value ); } -inline void SetClearEnabledMessage( EventToUpdate& eventToUpdate, RenderTask& task, bool enabled ) +inline void SetClearEnabledMessage( EventThreadServices& eventThreadServices, RenderTask& task, bool enabled ) { typedef MessageValue1< RenderTask, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::SetClearEnabled, enabled ); } -inline void SetRefreshRateMessage( EventToUpdate& eventToUpdate, RenderTask& task, unsigned int refreshRate ) +inline void SetCullModeMessage( EventThreadServices& eventThreadServices, RenderTask& task, bool mode ) +{ + typedef MessageValue1< RenderTask, bool > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &task, &RenderTask::SetCullMode, mode ); +} + +inline void SetRefreshRateMessage( EventThreadServices& eventThreadServices, RenderTask& task, unsigned int refreshRate ) { typedef MessageValue1< RenderTask, unsigned int > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::SetRefreshRate, refreshRate ); } -inline void SetSourceNodeMessage( EventToUpdate& eventToUpdate, RenderTask& task, const Node* constNode ) +inline void SetSourceNodeMessage( EventThreadServices& eventThreadServices, RenderTask& task, const Node* constNode ) { // Scene graph thread can destroy this object. Node* node = const_cast< Node* >( constNode ); @@ -408,54 +486,64 @@ inline void SetSourceNodeMessage( EventToUpdate& eventToUpdate, RenderTask& task typedef MessageValue1< RenderTask, Node* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::SetSourceNode, node ); } -inline void SetCameraNodeMessage( EventToUpdate& eventToUpdate, RenderTask& task, const Node* constNode ) +inline void SetCameraMessage( EventThreadServices& eventThreadServices, RenderTask& task, const Node* constNode, const Camera* constCamera ) { - // Scene graph thread can destroy this object. + typedef MessageValue2< RenderTask, Node*, Camera* > LocalType; + Node* node = const_cast< Node* >( constNode ); + Camera* camera = const_cast< Camera* >( constCamera ); + // Reserve memory inside the message queue + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); - typedef MessageValue1< RenderTask, Node* > LocalType; + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &task, &RenderTask::SetCamera, node, camera ); +} + +inline void SetExclusiveMessage( EventThreadServices& eventThreadServices, RenderTask& task, bool exclusive ) +{ + typedef MessageValue1< RenderTask, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &task, &RenderTask::SetCameraNode, node ); + new (slot) LocalType( &task, &RenderTask::SetExclusive, exclusive ); } -inline void SetExclusiveMessage( EventToUpdate& eventToUpdate, RenderTask& task, bool exclusive ) +inline void SetSyncRequiredMessage(EventThreadServices& eventThreadServices, RenderTask& task, bool requiresSync ) { typedef MessageValue1< RenderTask, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &task, &RenderTask::SetExclusive, exclusive ); + new (slot) LocalType( &task, &RenderTask::SetSyncRequired, requiresSync ); } -inline void BakeViewportPositionMessage( EventToUpdate& eventToUpdate, const RenderTask& task, const Vector2& value ) +inline void BakeViewportPositionMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector2& value ) { typedef MessageDoubleBuffered1< RenderTask, Vector2 > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::BakeViewportPosition, value ); } -inline void BakeViewportSizeMessage( EventToUpdate& eventToUpdate, const RenderTask& task, const Vector2& value ) +inline void BakeViewportSizeMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector2& value ) { typedef MessageDoubleBuffered1< RenderTask, Vector2 > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &task, &RenderTask::BakeViewportSize, value );