X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frender-tasks%2Fscene-graph-render-task.cpp;h=641e4e2238d3698f0f6deded723bcbc46c72d62a;hb=79881246746f65474b24ea4fe14151ccef8df3f4;hp=95b90153b23179cb4fa86ffca914fe09229892cd;hpb=3097b08c7ca6bd59481f1e0bdf9f8558332789a2;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/render-tasks/scene-graph-render-task.cpp b/dali/internal/update/render-tasks/scene-graph-render-task.cpp index 95b9015..641e4e2 100644 --- a/dali/internal/update/render-tasks/scene-graph-render-task.cpp +++ b/dali/internal/update/render-tasks/scene-graph-render-task.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -21,7 +21,6 @@ // INTERNAL INCLUDES #include #include -#include #include #include #include @@ -43,41 +42,52 @@ RenderTask* RenderTask::New() RenderTask::~RenderTask() { - // Remove exclusive flag from source node - if( mExclusive ) + if ( mSourceNode ) { - if( mSourceNode && (this == mSourceNode->GetExclusiveRenderTask() ) ) + mSourceNode->RemoveObserver( *this ); + if( mExclusive ) { - mSourceNode->SetExclusiveRenderTask( NULL ); + mSourceNode->SetExclusiveRenderTask( nullptr ); } } + if ( mCameraNode ) + { + mCameraNode->RemoveObserver( *this ); + } if( mRenderSyncTracker ) { mRenderMessageDispatcher->RemoveRenderTracker( *mRenderSyncTracker ); } } -void RenderTask::Initialize( RenderMessageDispatcher& renderMessageDispatcher, ResourceManager& resourceManager ) +void RenderTask::Initialize( RenderMessageDispatcher& renderMessageDispatcher ) { mRenderMessageDispatcher = &renderMessageDispatcher; - mResourceManager = &resourceManager; } void RenderTask::SetSourceNode( Node* node ) { - // Remove exclusive flag from the old node, if necessary - if ( mSourceNode && - this == mSourceNode->GetExclusiveRenderTask() ) + // Stop observing the old node (if we were) + if ( mSourceNode ) { - mSourceNode->SetExclusiveRenderTask( NULL ); + mSourceNode->RemoveObserver( *this ); + if( this == mSourceNode->GetExclusiveRenderTask() ) + { + mSourceNode->SetExclusiveRenderTask( nullptr ); + } } mSourceNode = node; - if ( mSourceNode && mExclusive ) + if ( mSourceNode ) { - mSourceNode->SetExclusiveRenderTask( this ); + mSourceNode->AddObserver( *this ); + if( mExclusive ) + { + mSourceNode->SetExclusiveRenderTask( this ); + } } + SetActiveStatus(); } Node* RenderTask::GetSourceNode() const @@ -97,7 +107,7 @@ void RenderTask::SetExclusive( bool exclusive ) } else if ( this == mSourceNode->GetExclusiveRenderTask() ) { - mSourceNode->SetExclusiveRenderTask( NULL ); + mSourceNode->SetExclusiveRenderTask( nullptr ); } } } @@ -107,32 +117,31 @@ bool RenderTask::IsExclusive() const return mExclusive; } -void RenderTask::SetCameraNode( Node* cameraNode ) +void RenderTask::SetCamera( Node* cameraNode, Camera* camera ) { - // if camera changed - if( cameraNode != mCameraNode ) + if ( mCameraNode ) { - if( cameraNode ) - { - // get attachment. when camera node is changed we will get a message from event thread object - // so no need to observe the node here - mCameraAttachment = dynamic_cast< CameraAttachment* >( &cameraNode->GetAttachment() ); - DALI_ASSERT_DEBUG( mCameraAttachment && "Camera without attachment" ); - } - mCameraNode = cameraNode; + mCameraNode->RemoveObserver( *this ); + } + + mCameraNode = cameraNode; + mCamera = camera; + + if ( mCameraNode ) + { + mCameraNode->AddObserver( *this ); } + SetActiveStatus(); } -void RenderTask::SetFrameBufferId( unsigned int resourceId, bool isNativeFBO ) +void RenderTask::SetFrameBuffer( Render::FrameBuffer* frameBuffer ) { - // note that we might already have a RenderTracker - mTargetIsNativeFramebuffer = isNativeFBO; - mFrameBufferResourceId = resourceId; + mFrameBuffer = frameBuffer; } -unsigned int RenderTask::GetFrameBufferId() const +Render::FrameBuffer* RenderTask::GetFrameBuffer() { - return mFrameBufferResourceId; + return mFrameBuffer; } bool RenderTask::QueryViewport( BufferIndex bufferIndex, Viewport& viewport ) const @@ -142,10 +151,10 @@ bool RenderTask::QueryViewport( BufferIndex bufferIndex, Viewport& viewport ) co return false; } - viewport.x = mViewportPosition[bufferIndex].x; - viewport.y = mViewportPosition[bufferIndex].y; - viewport.width = mViewportSize[bufferIndex].width; - viewport.height = mViewportSize[bufferIndex].height; + viewport.x = static_cast( mViewportPosition[bufferIndex].x ); // truncated + viewport.y = static_cast( mViewportPosition[bufferIndex].y ); // truncated + viewport.width = static_cast( mViewportSize[bufferIndex].width ); // truncated + viewport.height = static_cast( mViewportSize[bufferIndex].height ); // truncated return true; } @@ -185,7 +194,7 @@ bool RenderTask::GetCullMode() const return mCullMode; } -void RenderTask::SetRefreshRate( unsigned int refreshRate ) +void RenderTask::SetRefreshRate( uint32_t refreshRate ) { DALI_LOG_TRACE_METHOD_FMT(gRenderTaskLogFilter, "this:%p RefreshRate:%d\n", this, refreshRate); @@ -200,46 +209,19 @@ void RenderTask::SetRefreshRate( unsigned int refreshRate ) mState = RENDER_ONCE_WAITING_FOR_RESOURCES; mWaitingToRender = true; mNotifyTrigger = false; - // need at least on other render on the FBO - mResourceManager->SetFrameBufferBeenRenderedTo( mFrameBufferResourceId, false ); } mFrameCounter = 0u; } -unsigned int RenderTask::GetRefreshRate() const +uint32_t RenderTask::GetRefreshRate() const { return mRefreshRate; } bool RenderTask::ReadyToRender( BufferIndex updateBufferIndex ) { - // If the source node of the render task is invisible we should still render - // We want the render task to complete and possible clear colors to happen - - // Check source node - if ( NULL == mSourceNode || - ( !mSourceNode->IsRoot() && NULL == mSourceNode->GetParent() ) ) - { - TASK_LOG_FMT(Debug::General, " =F No source actor FC:%d\n", mFrameCounter ); - - // Source node is missing or disconnected - return false; - } - - // Check camera node - if ( NULL == mCameraNode || - NULL == mCameraNode->GetParent() || - !mCameraNode->HasAttachment() ) - { - // Camera node is missing or disconnected - TASK_LOG_FMT(Debug::General, " =F No Camera FC:%d\n", mFrameCounter ); - - return false; - } - - TASK_LOG_FMT(Debug::General, " =T (FBO ID:%d) FC:%d\n", mFrameBufferResourceId , mFrameCounter ); - return true; + return mActive; } bool RenderTask::IsRenderRequired() @@ -270,21 +252,11 @@ bool RenderTask::IsRenderRequired() return required; } -void RenderTask::SetResourcesFinished( bool resourcesFinished ) -{ - // resourcesFinished tells us that this render task will render to its FBO - mResourcesFinished = resourcesFinished; - if( mResourcesFinished ) - { - mResourceManager->SetFrameBufferBeenRenderedTo( mFrameBufferResourceId, true ); - } -} - // Called every frame regardless of whether render was required. // If render was not required, ignore resourcesFinished. void RenderTask::UpdateState() { - TASK_LOG_FMT( Debug::General, "(mResourcesFinished:%s) FC:%d State:%s RR:%d\n", mResourcesFinished?"T":"F", mFrameCounter, STATE_STRING(mState), mRefreshRate ); + TASK_LOG_FMT( Debug::General, "FC:%d State:%s RR:%d\n", mFrameCounter, STATE_STRING(mState), mRefreshRate ); switch( mState ) { @@ -294,10 +266,7 @@ void RenderTask::UpdateState() { if( mFrameCounter == 0 ) { - if( mResourcesFinished ) - { - ++mFrameCounter; // Only start skipping frames when resources are loaded - } + ++mFrameCounter; // Only start skipping frames when resources are loaded } else // Continue counting to skip frames { @@ -314,10 +283,7 @@ void RenderTask::UpdateState() case RENDER_ONCE_WAITING_FOR_RESOURCES: { - if( mResourcesFinished ) - { - mState = RENDERED_ONCE; - } + mState = RENDERED_ONCE; } break; @@ -325,17 +291,9 @@ void RenderTask::UpdateState() { mWaitingToRender = true; mNotifyTrigger = false; - if( mFrameBufferResourceId > 0 ) + if( mFrameBuffer ) { - if( mTargetIsNativeFramebuffer ) - { - if( mRenderSyncTracker && mRenderSyncTracker->IsSynced() ) - { - mWaitingToRender = false; - mNotifyTrigger = true; - } - } - else if( mResourceManager->HasFrameBufferBeenRenderedTo( mFrameBufferResourceId ) ) + if( !mRenderSyncTracker || (mRenderSyncTracker && mRenderSyncTracker->IsSynced() )) { mWaitingToRender = false; mNotifyTrigger = true; @@ -343,6 +301,7 @@ void RenderTask::UpdateState() } else { + mWaitingToRender = false; mNotifyTrigger = true; } } @@ -377,70 +336,71 @@ bool RenderTask::HasRendered() return notify; } -unsigned int RenderTask::GetRenderedOnceCounter() const +uint32_t RenderTask::GetRenderedOnceCounter() const { return mRenderedOnceCounter; } - const Matrix& RenderTask::GetViewMatrix( BufferIndex bufferIndex ) const { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); + DALI_ASSERT_DEBUG( nullptr != mCamera ); - return mCameraAttachment->GetViewMatrix( bufferIndex ); + return mCamera->GetViewMatrix( bufferIndex ); } -SceneGraph::CameraAttachment& RenderTask::GetCameraAttachment() const +SceneGraph::Camera& RenderTask::GetCamera() const { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); - return *mCameraAttachment; + DALI_ASSERT_DEBUG( nullptr != mCamera ); + return *mCamera; } const Matrix& RenderTask::GetProjectionMatrix( BufferIndex bufferIndex ) const { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); + DALI_ASSERT_DEBUG( nullptr != mCamera ); - return mCameraAttachment->GetProjectionMatrix( bufferIndex ); + return mCamera->GetProjectionMatrix( bufferIndex ); } -void RenderTask::PrepareRenderInstruction( RenderInstruction& instruction, BufferIndex updateBufferIndex ) +RenderInstruction& RenderTask::PrepareRenderInstruction( BufferIndex updateBufferIndex ) { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); + DALI_ASSERT_DEBUG( nullptr != mCamera ); TASK_LOG(Debug::General); Viewport viewport; bool viewportSet = QueryViewport( updateBufferIndex, viewport ); - instruction.Reset( mCameraAttachment, - GetFrameBufferId(), - viewportSet ? &viewport : NULL, - mClearEnabled ? &GetClearColor( updateBufferIndex ) : NULL ); + mRenderInstruction[updateBufferIndex].Reset( mCamera, + GetFrameBuffer(), + viewportSet ? &viewport : nullptr, + mClearEnabled ? &GetClearColor( updateBufferIndex ) : nullptr ); - // if using native framebuffer, add a tracker - if( mTargetIsNativeFramebuffer ) + if( mRequiresSync && + mRefreshRate == Dali::RenderTask::REFRESH_ONCE ) { - // create tracker if not yet exists. if we switch to on-screen fbo, we still keep the tracker in case we need it again + // create tracker if one doesn't yet exist. if( !mRenderSyncTracker ) { mRenderSyncTracker = new Render::RenderTracker(); mRenderMessageDispatcher->AddRenderTracker( *mRenderSyncTracker ); } - instruction.mRenderTracker = mRenderSyncTracker; + mRenderInstruction[updateBufferIndex].mRenderTracker = mRenderSyncTracker; } else { // no sync needed, texture FBOs are "ready" the same frame they are rendered to - instruction.mRenderTracker = NULL; + mRenderInstruction[updateBufferIndex].mRenderTracker = nullptr; } + + return mRenderInstruction[updateBufferIndex]; } bool RenderTask::ViewMatrixUpdated() { bool retval = false; - if( mCameraAttachment ) + if( mCamera ) { - retval = mCameraAttachment->ViewMatrixUpdated(); + retval = mCamera->ViewMatrixUpdated(); } return retval; } @@ -488,45 +448,67 @@ bool RenderTask::GetViewportEnabled( BufferIndex bufferIndex ) const return false; } -Node* RenderTask::GetCamera() const +void RenderTask::SetSyncRequired( bool requiresSync ) { - return mCameraNode; + mRequiresSync = requiresSync; } -void RenderTask::ResetDefaultProperties( BufferIndex updateBufferIndex ) +void RenderTask::PropertyOwnerConnected( PropertyOwner& owner ) { - // Reset default properties - mViewportPosition.ResetToBaseValue( updateBufferIndex ); - mViewportSize.ResetToBaseValue( updateBufferIndex ); - mClearColor.ResetToBaseValue( updateBufferIndex ); + // check if we've gone from inactive to active + SetActiveStatus(); +} + +void RenderTask::PropertyOwnerDisconnected( BufferIndex /*updateBufferIndex*/, PropertyOwner& owner ) +{ + mActive = false; // if either source or camera disconnected, we're no longer active +} + +void RenderTask::PropertyOwnerDestroyed( PropertyOwner& owner ) +{ + if( static_cast( mSourceNode ) == &owner ) + { + mSourceNode = nullptr; + } + else if( static_cast( mCameraNode ) == &owner ) + { + mCameraNode = nullptr; + } } RenderTask::RenderTask() : mViewportPosition( Vector2::ZERO), mViewportSize( Vector2::ZERO), mClearColor( Dali::RenderTask::DEFAULT_CLEAR_COLOR ), - mRenderMessageDispatcher( NULL ), - mResourceManager( NULL ), - mRenderSyncTracker( NULL ), - mSourceNode( NULL ), - mCameraNode( NULL ), - mCameraAttachment( NULL ), - mFrameBufferResourceId( 0 ), - mResourcesFinished( false ), + mRenderMessageDispatcher( nullptr ), + mRenderSyncTracker( nullptr ), + mSourceNode( nullptr ), + mCameraNode( nullptr ), + mCamera( nullptr ), + mFrameBuffer(0), + mRefreshRate( Dali::RenderTask::DEFAULT_REFRESH_RATE ), + mFrameCounter( 0u ), + mRenderedOnceCounter( 0u ), + mState( (Dali::RenderTask::DEFAULT_REFRESH_RATE == Dali::RenderTask::REFRESH_ALWAYS) + ? RENDER_CONTINUOUSLY + : RENDER_ONCE_WAITING_FOR_RESOURCES ), + mRequiresSync( false ), + mActive( false ), mWaitingToRender( false ), mNotifyTrigger( false ), mExclusive( Dali::RenderTask::DEFAULT_EXCLUSIVE ), mClearEnabled( Dali::RenderTask::DEFAULT_CLEAR_ENABLED ), - mCullMode( Dali::RenderTask::DEFAULT_CULL_MODE ), - mRenderTarget( NULL ), - mState( (Dali::RenderTask::DEFAULT_REFRESH_RATE == Dali::RenderTask::REFRESH_ALWAYS) - ? RENDER_CONTINUOUSLY - : RENDER_ONCE_WAITING_FOR_RESOURCES ), - mRefreshRate( Dali::RenderTask::DEFAULT_REFRESH_RATE ), - mFrameCounter( 0u ), - mRenderedOnceCounter( 0u ), - mTargetIsNativeFramebuffer( false ) + mCullMode( Dali::RenderTask::DEFAULT_CULL_MODE ) +{ +} + +void RenderTask::SetActiveStatus() { + // must have a source and camera both connected to scene + mActive = ( mSourceNode && mSourceNode->ConnectedToScene() && + mCameraNode && mCameraNode->ConnectedToScene() && mCamera ); + TASK_LOG_FMT( Debug::General, " Source node(%x) active %d. Frame counter: %d\n", mSourceNode, mSourceNode && mSourceNode->ConnectedToScene(), mFrameCounter ); + TASK_LOG_FMT( Debug::General, " Camera node(%x) active %d\n", mCameraNode, mCameraNode && mCameraNode->ConnectedToScene() ); } } // namespace SceneGraph