X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Frender-tasks%2Frender-task-impl.cpp;h=a97069bd09108981692be29f0dbabe0df0a7c86b;hb=462cbee2270984cdca45488f3733d664dcf49187;hp=50fed2dd5a4d266078a5f138457eed4dc663c4e5;hpb=c7044bf0978b26e21b8cef8bc88aa4c6a55d5539;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/render-tasks/render-task-impl.cpp b/dali/internal/event/render-tasks/render-task-impl.cpp index 50fed2d..a97069b 100644 --- a/dali/internal/event/render-tasks/render-task-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -18,17 +18,21 @@ // CLASS HEADER #include +// EXTERNAL INCLUDES +#include // for strcmp + // INTERNAL INCLUDES #include #include -#include +#include #include #include #include #include -#include +#include #include #include +#include #include #if defined(DEBUG_ENABLED) @@ -51,9 +55,10 @@ namespace // For internal properties // Name Type writable animatable constraint-input enum for index-checking DALI_PROPERTY_TABLE_BEGIN -DALI_PROPERTY( "viewport-position", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_POSITION ) -DALI_PROPERTY( "viewport-size", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_SIZE ) -DALI_PROPERTY( "clear-color", VECTOR4, true, true, true, Dali::RenderTask::Property::CLEAR_COLOR ) +DALI_PROPERTY( "viewportPosition", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_POSITION ) +DALI_PROPERTY( "viewportSize", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_SIZE ) +DALI_PROPERTY( "clearColor", VECTOR4, true, true, true, Dali::RenderTask::Property::CLEAR_COLOR ) +DALI_PROPERTY( "requiresSync", BOOLEAN, true, false, false, Dali::RenderTask::Property::REQUIRES_SYNC ) DALI_PROPERTY_TABLE_END( DEFAULT_OBJECT_PROPERTY_START_INDEX ) // Signals @@ -68,13 +73,18 @@ SignalConnectorType signalConnector1( mType, SIGNAL_FINISHED, &RenderTask::DoCon RenderTask* RenderTask::New( bool isSystemLevel ) { - RenderTask* task( new RenderTask( ThreadLocalStorage::Get().GetEventToUpdate(), isSystemLevel ) ); + RenderTask* task( new RenderTask( isSystemLevel ) ); return task; } void RenderTask::SetSourceActor( Actor* actor ) { + const Stage* stage = Stage::GetCurrent(); + if ( stage ) + { + stage->GetRenderTaskList().SetExclusive( this, mExclusive ); + } mSourceConnector.SetActor( actor ); } @@ -89,10 +99,16 @@ void RenderTask::SetExclusive( bool exclusive ) { mExclusive = exclusive; + const Stage* stage = Stage::GetCurrent(); + if ( stage ) + { + stage->GetRenderTaskList().SetExclusive( this, exclusive ); + } + if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - SetExclusiveMessage( mEventToUpdate, *mSceneObject, mExclusive ); + SetExclusiveMessage( GetEventThreadServices(), *mSceneObject, mExclusive ); } } } @@ -114,6 +130,14 @@ bool RenderTask::GetInputEnabled() const void RenderTask::SetCameraActor( CameraActor* cameraActor ) { + if( cameraActor ) + { + mCameraConnector.mCamera = cameraActor->GetCamera(); + } + else + { + mCameraConnector.mCamera = NULL; + } mCameraConnector.SetActor( cameraActor ); } @@ -123,43 +147,38 @@ CameraActor* RenderTask::GetCameraActor() const return static_cast< CameraActor* >( mCameraConnector.mActor ); } -void RenderTask::SetTargetFrameBuffer( Dali::FrameBufferImage image ) +void RenderTask::SetTargetFrameBuffer( FrameBufferImagePtr image ) { - if ( mFrameBufferImage != image ) + mFrameBufferImage = image; + FrameBuffer* frameBufferPtr( NULL ); + if( image ) { - // if we have a scene object we need to track connection status and set frame buffer id as well as updating target frame buffer - if ( mSceneObject ) - { - if(mFrameBufferImage) - { - GetImplementation(mFrameBufferImage).Disconnect(); - } + frameBufferPtr = image->GetFrameBuffer(); + } - // update target frame buffer - mFrameBufferImage = image; + SetFrameBuffer( frameBufferPtr ); +} - unsigned int resourceId = 0; - if(mFrameBufferImage) - { - GetImplementation(mFrameBufferImage).Connect(); +void RenderTask::SetFrameBuffer( FrameBufferPtr frameBuffer ) +{ + mFrameBuffer = frameBuffer; + Render::FrameBuffer* renderFrameBufferPtr( NULL ); + if( frameBuffer ) + { + renderFrameBufferPtr = mFrameBuffer->GetRenderObject(); + } - resourceId = GetImplementation( mFrameBufferImage ).GetResourceId(); - } + SetFrameBufferMessage( GetEventThreadServices(), *mSceneObject, renderFrameBufferPtr ); +} - // mSceneObject is being used in a separate thread; queue a message to set the value - SetFrameBufferIdMessage( mEventToUpdate, *mSceneObject, resourceId ); - } - else - { - // update target frame buffer - mFrameBufferImage = image; - } - } +FrameBuffer* RenderTask::GetFrameBuffer() const +{ + return mFrameBuffer.Get(); } -Dali::FrameBufferImage RenderTask::GetTargetFrameBuffer() const +FrameBufferImage* RenderTask::GetTargetFrameBuffer() const { - return mFrameBufferImage; + return mFrameBufferImage.Get(); } void RenderTask::SetScreenToFrameBufferFunction( ScreenToFrameBufferFunction conversionFunction ) @@ -184,26 +203,26 @@ Actor* RenderTask::GetScreenToFrameBufferMappingActor() const void RenderTask::SetViewportPosition(const Vector2& value) { - StagePtr stage = Stage::GetCurrent(); - BakeViewportPositionMessage( stage->GetUpdateInterface(), *mSceneObject, value ); + mViewportPosition = value; + + BakeViewportPositionMessage( GetEventThreadServices(), *mSceneObject, value ); } Vector2 RenderTask::GetCurrentViewportPosition() const { - StagePtr stage = Stage::GetCurrent(); - return mSceneObject->GetViewportPosition(stage->GetEventBufferIndex()); + return mSceneObject->GetViewportPosition( GetEventThreadServices().GetEventBufferIndex() ); } void RenderTask::SetViewportSize(const Vector2& value) { - StagePtr stage = Stage::GetCurrent(); - BakeViewportSizeMessage( stage->GetUpdateInterface(), *mSceneObject, value ); + mViewportSize = value; + + BakeViewportSizeMessage( GetEventThreadServices(), *mSceneObject, value ); } Vector2 RenderTask::GetCurrentViewportSize() const { - StagePtr stage = Stage::GetCurrent(); - return mSceneObject->GetViewportSize(stage->GetEventBufferIndex()); + return mSceneObject->GetViewportSize( GetEventThreadServices().GetEventBufferIndex() ); } void RenderTask::SetViewport( const Viewport& viewport ) @@ -214,22 +233,26 @@ void RenderTask::SetViewport( const Viewport& viewport ) void RenderTask::GetViewport( Viewport& viewPort ) const { - BufferIndex bufferIndex = Stage::GetCurrent()->GetEventBufferIndex(); + BufferIndex bufferIndex = GetEventThreadServices().GetEventBufferIndex(); if(!mSceneObject->GetViewportEnabled( bufferIndex )) { if ( mFrameBufferImage ) { viewPort.x = viewPort.y = 0; - viewPort.width = mFrameBufferImage.GetWidth(); - viewPort.height = mFrameBufferImage.GetHeight(); + viewPort.width = mFrameBufferImage->GetWidth(); + viewPort.height = mFrameBufferImage->GetHeight(); } else { - Vector2 size( Stage::GetCurrent()->GetSize() ); - viewPort.x = viewPort.y = 0; - viewPort.width = size.width; - viewPort.height = size.height; + Internal::Stage* stage = Internal::Stage::GetCurrent(); + if ( stage ) + { + Vector2 size( stage->GetSize() ); + viewPort.x = viewPort.y = 0; + viewPort.width = size.width; + viewPort.height = size.height; + } } } else @@ -252,16 +275,33 @@ void RenderTask::SetClearColor( const Vector4& color ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - StagePtr stage = Stage::GetCurrent(); - BakeClearColorMessage( stage->GetUpdateInterface(), *mSceneObject, color ); + BakeClearColorMessage( GetEventThreadServices(), *mSceneObject, color ); } } } const Vector4& RenderTask::GetClearColor() const { - StagePtr stage = Stage::GetCurrent(); - return mSceneObject->GetClearColor(stage->GetEventBufferIndex()); + return mSceneObject->GetClearColor( GetEventThreadServices().GetEventBufferIndex() ); +} + +void RenderTask::SetSyncRequired( bool requiresSync ) +{ + if( mRequiresSync != requiresSync ) + { + mRequiresSync = requiresSync; + + if( mSceneObject ) + { + // mSceneObject is being used in a separate thread; queue a message to set the value + SetSyncRequiredMessage( GetEventThreadServices(), *mSceneObject, requiresSync ); + } + } +} + +bool RenderTask::IsSyncRequired() const +{ + return mRequiresSync; } void RenderTask::SetClearEnabled( bool enabled ) @@ -273,7 +313,7 @@ void RenderTask::SetClearEnabled( bool enabled ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - SetClearEnabledMessage( mEventToUpdate, *mSceneObject, mClearEnabled ); + SetClearEnabledMessage( GetEventThreadServices(), *mSceneObject, mClearEnabled ); } } } @@ -292,7 +332,7 @@ void RenderTask::SetCullMode( bool mode ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - SetCullModeMessage( mEventToUpdate, *mSceneObject, mCullMode ); + SetCullModeMessage( GetEventThreadServices(), *mSceneObject, mCullMode ); } } } @@ -314,7 +354,7 @@ void RenderTask::SetRefreshRate( unsigned int refreshRate ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - SetRefreshRateMessage( mEventToUpdate, *mSceneObject, refreshRate ); + SetRefreshRateMessage( GetEventThreadServices(), *mSceneObject, refreshRate ); } } @@ -359,32 +399,35 @@ bool RenderTask::TranslateCoordinates( Vector2& screenCoords ) const { CameraActor* localCamera = GetCameraActor(); StagePtr stage = Stage::GetCurrent(); - CameraActor& defaultCamera = stage->GetDefaultCameraActor(); - if( localCamera ) - { - Viewport viewport; - Vector2 size( stage->GetSize() ); - viewport.x = viewport.y = 0; - viewport.width = size.width; - viewport.height = size.height; - - float localX, localY; - inside = mMappingConnector.mActor->ScreenToLocal(defaultCamera.GetViewMatrix(), defaultCamera.GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y); - Vector3 actorSize = mMappingConnector.mActor->GetCurrentSize(); - if( inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y) + if( stage ) + { + CameraActor& defaultCamera = stage->GetDefaultCameraActor(); + if( localCamera ) { - screenCoords.x = localX; - screenCoords.y = localY; + Viewport viewport; + Vector2 size( stage->GetSize() ); + viewport.x = viewport.y = 0; + viewport.width = size.width; + viewport.height = size.height; + + float localX, localY; + inside = mMappingConnector.mActor->ScreenToLocal(defaultCamera.GetViewMatrix(), defaultCamera.GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y); + Vector3 actorSize = mMappingConnector.mActor->GetCurrentSize(); + if( inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y) + { + screenCoords.x = localX; + screenCoords.y = localY; + } + else + { + inside = false; + } } else { inside = false; } } - else - { - inside = false; - } } else if ( mFrameBufferImage && mScreenToFrameBufferFunction ) { @@ -398,6 +441,40 @@ bool RenderTask::IsSystemLevel() const return mIsSystemLevel; } +bool RenderTask::WorldToViewport(const Vector3 &position, float& viewportX, float& viewportY) const +{ + CameraActor* cam = GetCameraActor(); + + Vector4 pos(position); + pos.w = 1.0; + + Vector4 viewportPosition; + + Viewport viewport; + GetViewport( viewport ); + + bool ok = ProjectFull(pos, + cam->GetViewMatrix(), + cam->GetProjectionMatrix(), + viewport.x, + viewport.y, + viewport.width, + viewport.height, + viewportPosition); + if(ok) + { + viewportX = viewportPosition.x; + viewportY = viewportPosition.y; + } + + return ok; +} + +bool RenderTask::ViewportToLocal(Actor* actor, float viewportX, float viewportY, float &localX, float &localY) const +{ + return actor->ScreenToLocal( *this, localX, localY, viewportX, viewportY ); +} + SceneGraph::RenderTask* RenderTask::CreateSceneObject() { // This should only be called once, with no existing scene-object @@ -406,24 +483,14 @@ SceneGraph::RenderTask* RenderTask::CreateSceneObject() // Keep the raw-pointer until DiscardSceneObject is called mSceneObject = SceneGraph::RenderTask::New(); - // if we have a frame buffer we need to track connection status then send a message to set the frame buffer id in case it has changed since last time we were on stage - unsigned int resourceId = 0; - if(mFrameBufferImage) - { - GetImplementation(mFrameBufferImage).Connect(); - - resourceId = GetImplementation( mFrameBufferImage ).GetResourceId(); - } - - // mSceneObject is being used in a separate thread; queue a message to set the value - SetFrameBufferIdMessage( mEventToUpdate, *mSceneObject, resourceId ); - // Send messages to set other properties that may have changed since last time we were on stage - SetExclusiveMessage( mEventToUpdate, *mSceneObject, mExclusive ); - SetClearColorMessage( mEventToUpdate, *mSceneObject, mClearColor ); - SetClearEnabledMessage( mEventToUpdate, *mSceneObject, mClearEnabled ); - SetCullModeMessage( mEventToUpdate, *mSceneObject, mCullMode ); - SetRefreshRateMessage( mEventToUpdate, *mSceneObject, mRefreshRate ); + SetExclusiveMessage( GetEventThreadServices(), *mSceneObject, mExclusive ); + SetClearColorMessage( GetEventThreadServices(), *mSceneObject, mClearColor ); + SetClearEnabledMessage( GetEventThreadServices(), *mSceneObject, mClearEnabled ); + SetCullModeMessage( GetEventThreadServices(), *mSceneObject, mCullMode ); + SetRefreshRateMessage( GetEventThreadServices(), *mSceneObject, mRefreshRate ); + SetSyncRequiredMessage( GetEventThreadServices(), *mSceneObject, mRequiresSync ); + SetFrameBuffer( mFrameBuffer ); // Caller takes ownership return mSceneObject; @@ -438,12 +505,6 @@ void RenderTask::DiscardSceneObject() { // mSceneObject is not owned; throw away the raw-pointer mSceneObject = NULL; - - // if we have a frame buffer we need to track connection status - if(mFrameBufferImage) - { - GetImplementation(mFrameBufferImage).Disconnect(); - } } /******************************************************************************** @@ -457,11 +518,11 @@ unsigned int RenderTask::GetDefaultPropertyCount() const void RenderTask::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const { - indices.reserve( DEFAULT_PROPERTY_COUNT ); + indices.Reserve( DEFAULT_PROPERTY_COUNT ); for ( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i ) { - indices.push_back( i ); + indices.PushBack( i ); } } @@ -539,6 +600,11 @@ void RenderTask::SetDefaultProperty( Property::Index index, const Property::Valu SetClearColor( property.Get() ); break; } + case Dali::RenderTask::Property::REQUIRES_SYNC: + { + SetSyncRequired( property.Get() ); + break; + } default: { // nothing to do @@ -556,6 +622,44 @@ Property::Value RenderTask::GetDefaultProperty(Property::Index index) const case Dali::RenderTask::Property::VIEWPORT_POSITION: { + value = mViewportPosition; + break; + } + case Dali::RenderTask::Property::VIEWPORT_SIZE: + { + value = mViewportSize; + break; + } + case Dali::RenderTask::Property::CLEAR_COLOR: + { + value = mClearColor; + break; + } + case Dali::RenderTask::Property::REQUIRES_SYNC: + { + value = IsSyncRequired(); + break; + } + + default: + { + DALI_ASSERT_ALWAYS(false && "RenderTask property index out of range"); // should not come here + break; + } + } + + return value; +} + +Property::Value RenderTask::GetDefaultPropertyCurrentValue( Property::Index index ) const +{ + Property::Value value; + + switch ( index ) + { + + case Dali::RenderTask::Property::VIEWPORT_POSITION: + { value = GetCurrentViewportPosition(); break; } @@ -569,6 +673,11 @@ Property::Value RenderTask::GetDefaultProperty(Property::Index index) const value = GetClearColor(); break; } + case Dali::RenderTask::Property::REQUIRES_SYNC: + { + value = IsSyncRequired(); + break; + } default: { @@ -580,6 +689,34 @@ Property::Value RenderTask::GetDefaultProperty(Property::Index index) const return value; } +void RenderTask::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::Index index, const Property::Value& value ) +{ + switch ( index ) + { + case Dali::RenderTask::Property::VIEWPORT_POSITION: + { + value.Get( mViewportPosition ); + break; + } + case Dali::RenderTask::Property::VIEWPORT_SIZE: + { + value.Get( mViewportSize ); + break; + } + case Dali::RenderTask::Property::CLEAR_COLOR: + { + value.Get( mClearColor ); + break; + } + case Dali::RenderTask::Property::REQUIRES_SYNC: + default: + { + // Nothing to do as not animatable + break; + } + } +} + const SceneGraph::PropertyOwner* RenderTask::GetSceneObject() const { return mSceneObject; @@ -632,7 +769,7 @@ const PropertyInputImpl* RenderTask::GetSceneObjectInputProperty( Property::Inde break; case Dali::RenderTask::Property::CLEAR_COLOR: - property = &mSceneObject->mViewportSize; + property = &mSceneObject->mClearColor; break; default: @@ -678,7 +815,7 @@ Dali::RenderTask::RenderTaskSignalType& RenderTask::FinishedSignal() bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) { bool connected( true ); - RenderTask* renderTask = dynamic_cast(object); + RenderTask* renderTask = static_cast< RenderTask* >(object); // TypeRegistry guarantees that this is the correct type. if ( 0 == strcmp( signalName.c_str(), SIGNAL_FINISHED ) ) { @@ -693,13 +830,14 @@ bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface return connected; } -RenderTask::RenderTask( EventToUpdate& eventToUpdate, bool isSystemLevel ) -: mEventToUpdate( eventToUpdate ), - mSceneObject( NULL ), +RenderTask::RenderTask( bool isSystemLevel ) +: mSceneObject( NULL ), mSourceConnector( Connector::SOURCE_CONNECTOR, *this ), mCameraConnector( Connector::CAMERA_CONNECTOR, *this ), mMappingConnector( Connector::MAPPING_CONNECTOR, *this ), mClearColor( Dali::RenderTask::DEFAULT_CLEAR_COLOR ), + mViewportPosition( Vector2::ZERO ), + mViewportSize( Vector2::ZERO ), mRefreshRate( Dali::RenderTask::DEFAULT_REFRESH_RATE ), mRefreshOnceCounter( 0u ), mScreenToFrameBufferFunction( Dali::RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION ), @@ -707,7 +845,8 @@ RenderTask::RenderTask( EventToUpdate& eventToUpdate, bool isSystemLevel ) mInputEnabled( Dali::RenderTask::DEFAULT_INPUT_ENABLED ), mClearEnabled( Dali::RenderTask::DEFAULT_CLEAR_ENABLED ), mCullMode( Dali::RenderTask::DEFAULT_CULL_MODE ), - mIsSystemLevel( isSystemLevel ) + mIsSystemLevel( isSystemLevel ), + mRequiresSync( false ) { DALI_LOG_INFO(gLogRender, Debug::General, "RenderTask::RenderTask(this:%p)\n", this); } @@ -722,7 +861,8 @@ RenderTask::~RenderTask() RenderTask::Connector::Connector( Type type, RenderTask& renderTask ) : mType( type ), mRenderTask( renderTask ), - mActor( NULL ) + mActor( NULL ), + mCamera( NULL ) { } @@ -763,7 +903,17 @@ void RenderTask::Connector::SceneObjectRemoved( Object& object ) void RenderTask::Connector::ObjectDestroyed( Object& object ) { + if ( SOURCE_CONNECTOR == mType ) + { + const Stage* stage = Stage::GetCurrent(); + if ( stage ) + { + stage->GetRenderTaskList().SetExclusive( &mRenderTask, false ); + } + } + mActor = NULL; + mCamera = NULL; // only meaningful for the camera connector but no simple way to distinguish UpdateRenderTask(); } @@ -790,11 +940,11 @@ void RenderTask::Connector::UpdateRenderTask() //the mapping node is not used in the scene graph if ( SOURCE_CONNECTOR == mType ) { - SetSourceNodeMessage( mRenderTask.mEventToUpdate, *(mRenderTask.mSceneObject), node ); + SetSourceNodeMessage( mRenderTask.GetEventThreadServices(), *(mRenderTask.mSceneObject), node ); } else if( CAMERA_CONNECTOR == mType ) { - SetCameraNodeMessage( mRenderTask.mEventToUpdate, *(mRenderTask.mSceneObject), node ); + SetCameraMessage( mRenderTask.GetEventThreadServices(), *(mRenderTask.mSceneObject), node, mCamera ); } } }