X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frendering%2Fscene-graph-renderer.cpp;h=a6b720bc28993395287d5076f9c8a2ed2d940c3f;hb=e317f59daa2ce5577e08c07f515d607a2dbc34e1;hp=ec8965fa6f3e223ec0e371b21ec95b941eea45f8;hpb=7c148d3457051e5d101756203ccc6df1a206eab0;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index ec8965f..a6b720b 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -89,14 +89,17 @@ void AddMappings( Dali::Internal::SceneGraph::CollectedUniformMap& localMap, con // flags for resending data to renderer enum Flags { - RESEND_DATA_PROVIDER = 1, - RESEND_GEOMETRY = 1 << 1, - RESEND_FACE_CULLING_MODE = 1 << 2, - RESEND_BLEND_COLOR = 1 << 3, - RESEND_BLEND_BIT_MASK = 1 << 4, - RESEND_PREMULTIPLIED_ALPHA = 1 << 5, - RESEND_INDEXED_DRAW_FIRST_ELEMENT = 1 << 6, + RESEND_DATA_PROVIDER = 1, + RESEND_GEOMETRY = 1 << 1, + RESEND_FACE_CULLING_MODE = 1 << 2, + RESEND_BLEND_COLOR = 1 << 3, + RESEND_BLEND_BIT_MASK = 1 << 4, + RESEND_PREMULTIPLIED_ALPHA = 1 << 5, + RESEND_INDEXED_DRAW_FIRST_ELEMENT = 1 << 6, RESEND_INDEXED_DRAW_ELEMENTS_COUNT = 1 << 7, + RESEND_DEPTH_WRITE_MODE = 1 << 8, + RESEND_DEPTH_TEST_MODE = 1 << 9, + RESEND_DEPTH_FUNCTION = 1 << 10, }; } @@ -114,23 +117,27 @@ Renderer* Renderer::New() } Renderer::Renderer() -:mSceneController( 0 ), - mRenderer( NULL ), - mTextureSet( NULL ), - mGeometry( NULL ), - mShader( NULL ), - mBlendColor( NULL ), - mBlendBitmask( 0u ), - mFaceCullingMode( Dali::Renderer::NONE ), - mBlendingMode( Dali::BlendingMode::AUTO ), - mIndexedDrawFirstElement( 0 ), - mIndexedDrawElementsCount( 0 ), - mReferenceCount( 0 ), - mRegenerateUniformMap( 0 ), - mResendFlag( 0 ), - mResourcesReady( false ), - mFinishedResourceAcquisition( false ), - mDepthIndex( 0 ) +: mSceneController( 0 ), + mRenderer( NULL ), + mTextureSet( NULL ), + mGeometry( NULL ), + mShader( NULL ), + mBlendColor( NULL ), + mIndexedDrawFirstElement( 0u ), + mIndexedDrawElementsCount( 0u ), + mBlendBitmask( 0u ), + mReferenceCount( 0u ), + mRegenerateUniformMap( 0u ), + mResendFlag( 0u ), + mDepthFunction( DepthFunction::LESS ), + mFaceCullingMode( FaceCullingMode::NONE ), + mBlendMode( BlendMode::AUTO ), + mDepthWriteMode( DepthWriteMode::AUTO ), + mDepthTestMode( DepthTestMode::AUTO ), + mResourcesReady( false ), + mFinishedResourceAcquisition( false ), + mPremultipledAlphaEnabled( false ), + mDepthIndex( 0 ) { mUniformMapChanged[0] = false; mUniformMapChanged[1] = false; @@ -191,7 +198,11 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap(); AddMappings( localMap, rendererUniformMap ); - AddMappings( localMap, mShader->GetUniformMap() ); + + if( mShader ) + { + AddMappings( localMap, mShader->GetUniformMap() ); + } } else if( mRegenerateUniformMap == COPY_UNIFORM_MAP ) { @@ -212,76 +223,89 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex ) mRegenerateUniformMap--; } - if( mResendFlag == 0 ) + if( mResendFlag != 0 ) { - return; - } + if( mResendFlag & RESEND_DATA_PROVIDER ) + { + RenderDataProvider* dataProvider = NewRenderDataProvider(); - if( mResendFlag & RESEND_DATA_PROVIDER ) - { - RenderDataProvider* dataProvider = NewRenderDataProvider(); + typedef MessageValue1< Render::Renderer, OwnerPointer > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetRenderDataProvider, dataProvider ); + } - typedef MessageValue1< Render::Renderer, OwnerPointer > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetRenderDataProvider, dataProvider ); - mResendFlag &= ~RESEND_DATA_PROVIDER; - } + if( mResendFlag & RESEND_GEOMETRY ) + { + typedef MessageValue1< Render::Renderer, Render::Geometry* > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - if( mResendFlag & RESEND_GEOMETRY ) - { - typedef MessageValue1< Render::Renderer, Render::Geometry* > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetGeometry, mGeometry ); + } - new (slot) DerivedType( mRenderer, &Render::Renderer::SetGeometry, mGeometry ); - mResendFlag &= ~RESEND_GEOMETRY; - } + if( mResendFlag & RESEND_FACE_CULLING_MODE ) + { + typedef MessageValue1< Render::Renderer, FaceCullingMode::Type > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode ); + } - if( mResendFlag & RESEND_FACE_CULLING_MODE ) - { - typedef MessageValue1< Render::Renderer, Dali::Renderer::FaceCullingMode > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode ); - mResendFlag &= ~RESEND_FACE_CULLING_MODE; - } + if( mResendFlag & RESEND_BLEND_BIT_MASK ) + { + typedef MessageValue1< Render::Renderer, unsigned int > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendingBitMask, mBlendBitmask ); + } - if( mResendFlag & RESEND_BLEND_BIT_MASK ) - { - typedef MessageValue1< Render::Renderer, unsigned int > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendingBitMask, mBlendBitmask ); - mResendFlag &= ~RESEND_BLEND_BIT_MASK; - } + if( mResendFlag & RESEND_BLEND_COLOR ) + { + typedef MessageValue1< Render::Renderer, const Vector4* > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendColor, mBlendColor ); + } - if( mResendFlag & RESEND_BLEND_COLOR ) - { - typedef MessageValue1< Render::Renderer, const Vector4* > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendColor, mBlendColor ); - mResendFlag &= ~RESEND_BLEND_COLOR; - } + if( mResendFlag & RESEND_PREMULTIPLIED_ALPHA ) + { + typedef MessageValue1< Render::Renderer, bool > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled ); + } - if( mResendFlag & RESEND_PREMULTIPLIED_ALPHA ) - { - typedef MessageValue1< Render::Renderer, bool > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled ); - mResendFlag &= ~RESEND_PREMULTIPLIED_ALPHA; - } + if( mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT ) + { + typedef MessageValue1< Render::Renderer, size_t > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement ); + } - if( mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT ) - { - typedef MessageValue1< Render::Renderer, size_t > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement ); - mResendFlag &= ~RESEND_INDEXED_DRAW_FIRST_ELEMENT; - } + if( mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT ) + { + typedef MessageValue1< Render::Renderer, size_t > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount ); + } - if( mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT ) - { - typedef MessageValue1< Render::Renderer, size_t > DerivedType; - unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); - new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount ); - mResendFlag &= ~RESEND_INDEXED_DRAW_FIRST_ELEMENT; + if( mResendFlag & RESEND_DEPTH_WRITE_MODE ) + { + typedef MessageValue1< Render::Renderer, DepthWriteMode::Type > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode ); + } + + if( mResendFlag & RESEND_DEPTH_TEST_MODE ) + { + typedef MessageValue1< Render::Renderer, DepthTestMode::Type > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthTestMode, mDepthTestMode ); + } + + if( mResendFlag & RESEND_DEPTH_FUNCTION ) + { + typedef MessageValue1< Render::Renderer, DepthFunction::Type > DerivedType; + unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) ); + new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthFunction, mDepthFunction ); + } + + mResendFlag = 0; } } @@ -331,15 +355,15 @@ void Renderer::SetDepthIndex( int depthIndex ) mDepthIndex = depthIndex; } -void Renderer::SetFaceCullingMode( unsigned int faceCullingMode ) +void Renderer::SetFaceCullingMode( FaceCullingMode::Type faceCullingMode ) { - mFaceCullingMode = static_cast(faceCullingMode); + mFaceCullingMode = faceCullingMode; mResendFlag |= RESEND_FACE_CULLING_MODE; } -void Renderer::SetBlendingMode( unsigned int blendingMode ) +void Renderer::SetBlendMode( BlendMode::Type blendingMode ) { - mBlendingMode = static_cast< BlendingMode::Type >( blendingMode ); + mBlendMode = blendingMode; } void Renderer::SetBlendingOptions( unsigned int options ) @@ -383,6 +407,24 @@ void Renderer::EnablePreMultipliedAlpha( bool preMultipled ) mResendFlag |= RESEND_PREMULTIPLIED_ALPHA; } +void Renderer::SetDepthWriteMode( DepthWriteMode::Type depthWriteMode ) +{ + mDepthWriteMode = depthWriteMode; + mResendFlag |= RESEND_DEPTH_WRITE_MODE; +} + +void Renderer::SetDepthTestMode( DepthTestMode::Type depthTestMode ) +{ + mDepthTestMode = depthTestMode; + mResendFlag |= RESEND_DEPTH_TEST_MODE; +} + +void Renderer::SetDepthFunction( DepthFunction::Type depthFunction ) +{ + mDepthFunction = depthFunction; + mResendFlag |= RESEND_DEPTH_FUNCTION; +} + //Called when a node with this renderer is added to the stage void Renderer::OnStageConnect() { @@ -393,8 +435,12 @@ void Renderer::OnStageConnect() mRenderer = Render::Renderer::New( dataProvider, mGeometry, mBlendBitmask, mBlendColor, - static_cast< Dali::Renderer::FaceCullingMode >( mFaceCullingMode ), - mPremultipledAlphaEnabled ); + static_cast< FaceCullingMode::Type >( mFaceCullingMode ), + mPremultipledAlphaEnabled, + mDepthWriteMode, + mDepthTestMode, + mDepthFunction ); + mSceneController->GetRenderMessageDispatcher().AddRenderer( *mRenderer ); mResendFlag = 0; } @@ -442,10 +488,20 @@ RenderDataProvider* Renderer::NewRenderDataProvider() { size_t textureCount( mTextureSet->GetTextureCount() ); dataProvider->mTextures.resize( textureCount ); + dataProvider->mSamplers.resize( textureCount ); + for( unsigned int i(0); imTextures[i] = Render::Texture( mTextureSet->GetTextureId(i),0); + dataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i); + } + + textureCount = mTextureSet->GetNewTextureCount(); + dataProvider->mNewTextures.resize( textureCount ); + dataProvider->mSamplers.resize( textureCount ); for( unsigned int i(0); imTextures[i] = Render::Texture( mTextureSet->GetTextureId(i), - mTextureSet->GetTextureSampler(i)); + dataProvider->mNewTextures[i] = mTextureSet->GetNewTexture(i); + dataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i); } } @@ -472,16 +528,16 @@ Renderer::Opacity Renderer::GetOpacity( BufferIndex updateBufferIndex, const Nod { Renderer::Opacity opacity = Renderer::OPAQUE; - switch( mBlendingMode ) + switch( mBlendMode ) { - case BlendingMode::ON: // If the renderer should always be use blending + case BlendMode::ON: // If the renderer should always be use blending { opacity = Renderer::TRANSLUCENT; break; } - case BlendingMode::AUTO: + case BlendMode::AUTO: { - bool shaderRequiresBlending( mShader->GeometryHintEnabled( Dali::ShaderEffect::HINT_BLENDING ) ); + bool shaderRequiresBlending( mShader->HintEnabled( Dali::Shader::HINT_OUTPUT_IS_TRANSPARENT ) ); if( shaderRequiresBlending || ( mTextureSet && mTextureSet->HasAlpha() ) ) { opacity = Renderer::TRANSLUCENT; @@ -500,7 +556,7 @@ Renderer::Opacity Renderer::GetOpacity( BufferIndex updateBufferIndex, const Nod } break; } - case BlendingMode::OFF: // the renderer should never use blending + case BlendMode::OFF: // the renderer should never use blending default: { opacity = Renderer::OPAQUE;