X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frender-tasks%2Fscene-graph-render-task.cpp;h=42dcba55a7808f10ccba951537a4e6546333b94b;hb=ef69dab91f1e3d7f0b7cb345933ef22046bf70a8;hp=379cb39556d398dc754c673842a94d1621e85819;hpb=111e4590a7f0b90fbf9683e29d6d39d9da15ef60;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 379cb39..42dcba5 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) 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. @@ -20,10 +20,11 @@ // INTERNAL INCLUDES #include +#include #include -#include #include #include +#include #include @@ -50,12 +51,18 @@ RenderTask::~RenderTask() mSourceNode->SetExclusiveRenderTask( NULL ); } } - if( mFrameBufferResourceId ) + if( mRenderSyncTracker ) { - mCompleteStatusManager->StopTrackingResource( mFrameBufferResourceId ); + mRenderMessageDispatcher->RemoveRenderTracker( *mRenderSyncTracker ); } } +void RenderTask::Initialize( RenderMessageDispatcher& renderMessageDispatcher, ResourceManager& resourceManager ) +{ + mRenderMessageDispatcher = &renderMessageDispatcher; + mResourceManager = &resourceManager; +} + void RenderTask::SetSourceNode( Node* node ) { // Remove exclusive flag from the old node, if necessary @@ -100,42 +107,17 @@ 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( 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 = cameraNode; + mCamera = camera; } -void RenderTask::SetFrameBufferId( unsigned int resourceId ) +void RenderTask::SetFrameBufferId( unsigned int resourceId, bool isNativeFBO ) { - if ( mFrameBufferResourceId != resourceId ) - { - DALI_ASSERT_DEBUG(mCompleteStatusManager && "Complete status tracker is null"); - if( mCompleteStatusManager ) - { - if( resourceId && mState == RENDER_ONCE_WAITING_FOR_RESOURCES ) - { - mCompleteStatusManager->TrackResource( resourceId ); - } - - if( mFrameBufferResourceId ) - { - mCompleteStatusManager->StopTrackingResource( mFrameBufferResourceId ); - } - } - - mFrameBufferResourceId = resourceId; - } + // note that we might already have a RenderTracker + mTargetIsNativeFramebuffer = isNativeFBO; + mFrameBufferResourceId = resourceId; } unsigned int RenderTask::GetFrameBufferId() const @@ -143,6 +125,17 @@ unsigned int RenderTask::GetFrameBufferId() const return mFrameBufferResourceId; } +void RenderTask::SetFrameBuffer( Render::FrameBuffer* frameBuffer ) +{ + mTargetIsNativeFramebuffer = false; + mFrameBuffer = frameBuffer; +} + +Render::FrameBuffer* RenderTask::GetFrameBuffer() +{ + return mFrameBuffer; +} + bool RenderTask::QueryViewport( BufferIndex bufferIndex, Viewport& viewport ) const { if( ! GetViewportEnabled( bufferIndex ) ) @@ -202,31 +195,14 @@ void RenderTask::SetRefreshRate( unsigned int refreshRate ) if( mRefreshRate > 0 ) { mState = RENDER_CONTINUOUSLY; - - if( mFrameBufferResourceId ) - { - // Don't need tracking - DALI_ASSERT_DEBUG(mCompleteStatusManager && "Ready state tracker is null"); - if( mCompleteStatusManager != NULL ) - { - mCompleteStatusManager->StopTrackingResource( mFrameBufferResourceId ); - } - } } else { mState = RENDER_ONCE_WAITING_FOR_RESOURCES; mWaitingToRender = true; mNotifyTrigger = false; - - if( mFrameBufferResourceId ) - { - DALI_ASSERT_DEBUG(mCompleteStatusManager && "Ready state tracker is null"); - if( mCompleteStatusManager != NULL ) - { - mCompleteStatusManager->TrackResource( mFrameBufferResourceId ); - } - } + // need at least on other render on the FBO + mResourceManager->SetFrameBufferBeenRenderedTo( mFrameBufferResourceId, false ); } mFrameCounter = 0u; @@ -255,7 +231,7 @@ bool RenderTask::ReadyToRender( BufferIndex updateBufferIndex ) // Check camera node if ( NULL == mCameraNode || NULL == mCameraNode->GetParent() || - !mCameraNode->HasAttachment() ) + NULL == mCamera ) { // Camera node is missing or disconnected TASK_LOG_FMT(Debug::General, " =F No Camera FC:%d\n", mFrameCounter ); @@ -263,6 +239,8 @@ bool RenderTask::ReadyToRender( BufferIndex updateBufferIndex ) return false; } + mCamera->Update( updateBufferIndex, *mCameraNode ); + TASK_LOG_FMT(Debug::General, " =T (FBO ID:%d) FC:%d\n", mFrameBufferResourceId , mFrameCounter ); return true; } @@ -274,16 +252,20 @@ bool RenderTask::IsRenderRequired() switch( mState ) { case RENDER_CONTINUOUSLY: + { required = (mFrameCounter == 0); break; - + } case RENDER_ONCE_WAITING_FOR_RESOURCES: + { required = true; break; - + } default: + { required = false; break; + } } TASK_LOG_FMT( Debug::General, " State:%s = %s\n", STATE_STRING(mState), required?"T":"F" ); @@ -293,7 +275,12 @@ bool RenderTask::IsRenderRequired() 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. @@ -339,27 +326,30 @@ void RenderTask::UpdateState() case RENDERED_ONCE: { + mWaitingToRender = true; + mNotifyTrigger = false; if( mFrameBufferResourceId > 0 ) { - // Query if the framebuffer is complete: - DALI_ASSERT_DEBUG(mCompleteStatusManager && "Complete status tracker is null"); - if( mCompleteStatusManager != NULL && - CompleteStatusManager::COMPLETE == mCompleteStatusManager->GetStatus( mFrameBufferResourceId ) ) + if( mTargetIsNativeFramebuffer ) { - mWaitingToRender = false; - mNotifyTrigger = true; + if( mRenderSyncTracker && mRenderSyncTracker->IsSynced() ) + { + mWaitingToRender = false; + mNotifyTrigger = true; + } } - else + else if( mResourceManager->HasFrameBufferBeenRenderedTo( mFrameBufferResourceId ) ) { - mWaitingToRender = true; + mWaitingToRender = false; + mNotifyTrigger = true; } } else { - mWaitingToRender = false; mNotifyTrigger = true; } } + break; default: @@ -378,7 +368,7 @@ bool RenderTask::IsWaitingToRender() bool RenderTask::HasRendered() { bool notify = false; - if( mNotifyTrigger == true ) + if( mNotifyTrigger ) { ++mRenderedOnceCounter; mState = RENDERED_ONCE_AND_NOTIFIED; @@ -398,54 +388,68 @@ unsigned int RenderTask::GetRenderedOnceCounter() const const Matrix& RenderTask::GetViewMatrix( BufferIndex bufferIndex ) const { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); + DALI_ASSERT_DEBUG( NULL != 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( NULL != mCamera ); + return *mCamera; } const Matrix& RenderTask::GetProjectionMatrix( BufferIndex bufferIndex ) const { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); + DALI_ASSERT_DEBUG( NULL != mCamera ); - return mCameraAttachment->GetProjectionMatrix( bufferIndex ); + return mCamera->GetProjectionMatrix( bufferIndex ); } void RenderTask::PrepareRenderInstruction( RenderInstruction& instruction, BufferIndex updateBufferIndex ) { - DALI_ASSERT_DEBUG( NULL != mCameraAttachment ); + DALI_ASSERT_DEBUG( NULL != mCamera ); TASK_LOG(Debug::General); Viewport viewport; bool viewportSet = QueryViewport( updateBufferIndex, viewport ); - instruction.Reset( mCameraAttachment, + instruction.Reset( mCamera, GetFrameBufferId(), + GetFrameBuffer(), viewportSet ? &viewport : NULL, mClearEnabled ? &GetClearColor( updateBufferIndex ) : NULL ); + + if( mTargetIsNativeFramebuffer && mRequiresSync && + mRefreshRate == Dali::RenderTask::REFRESH_ONCE && + mResourcesFinished ) + { + // create tracker if one doesn't yet exist. + if( !mRenderSyncTracker ) + { + mRenderSyncTracker = new Render::RenderTracker(); + mRenderMessageDispatcher->AddRenderTracker( *mRenderSyncTracker ); + } + instruction.mRenderTracker = mRenderSyncTracker; + } + else + { + // no sync needed, texture FBOs are "ready" the same frame they are rendered to + instruction.mRenderTracker = NULL; + } } bool RenderTask::ViewMatrixUpdated() { bool retval = false; - if( mCameraAttachment ) + if( mCamera ) { - retval = mCameraAttachment->ViewMatrixUpdated(); + retval = mCamera->ViewMatrixUpdated(); } return retval; } -void RenderTask::SetCompleteStatusManager(CompleteStatusManager* completeStatusManager) -{ - mCompleteStatusManager = completeStatusManager; -} - void RenderTask::SetViewportPosition( BufferIndex updateBufferIndex, const Vector2& value ) { mViewportPosition.Set( updateBufferIndex, value ); @@ -489,9 +493,9 @@ 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 ) @@ -506,11 +510,14 @@ RenderTask::RenderTask() : mViewportPosition( Vector2::ZERO), mViewportSize( Vector2::ZERO), mClearColor( Dali::RenderTask::DEFAULT_CLEAR_COLOR ), - mCompleteStatusManager( NULL ), + mRenderMessageDispatcher( NULL ), + mResourceManager( NULL ), + mRenderSyncTracker( NULL ), mSourceNode( NULL ), mCameraNode( NULL ), - mCameraAttachment( NULL ), + mCamera( NULL ), mFrameBufferResourceId( 0 ), + mFrameBuffer(0), mResourcesFinished( false ), mWaitingToRender( false ), mNotifyTrigger( false ), @@ -523,7 +530,9 @@ RenderTask::RenderTask() : RENDER_ONCE_WAITING_FOR_RESOURCES ), mRefreshRate( Dali::RenderTask::DEFAULT_REFRESH_RATE ), mFrameCounter( 0u ), - mRenderedOnceCounter( 0u ) + mRenderedOnceCounter( 0u ), + mTargetIsNativeFramebuffer( false ), + mRequiresSync( false ) { }