[Tizen] Implement partial update
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-renderer.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 9b9d8d7..b7180cb
@@ -141,7 +141,9 @@ Renderer::Renderer()
   mBlendMode( BlendMode::AUTO ),
   mDepthWriteMode( DepthWriteMode::AUTO ),
   mDepthTestMode( DepthTestMode::AUTO ),
+  mRenderingBehavior( DevelRenderer::Rendering::IF_REQUIRED ),
   mPremultipledAlphaEnabled( false ),
+  mDirty( false ),
   mOpacity( 1.0f ),
   mDepthIndex( 0 )
 {
@@ -174,12 +176,14 @@ void Renderer::operator delete( void* ptr )
 
 void Renderer::PrepareRender( BufferIndex updateBufferIndex )
 {
+  SetDirty( false );
   if( mRegenerateUniformMap == UNIFORM_MAP_READY )
   {
     mUniformMapChanged[updateBufferIndex] = false;
   }
   else
   {
+    mDirty = true;
     if( mRegenerateUniformMap == REGENERATE_UNIFORM_MAP)
     {
       CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ];
@@ -214,6 +218,7 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex )
 
   if( mResendFlag != 0 )
   {
+    mDirty = true;
     if( mResendFlag & RESEND_GEOMETRY )
     {
       typedef MessageValue1< Render::Renderer, Render::Geometry* > DerivedType;
@@ -394,6 +399,7 @@ void Renderer::SetGeometry( Render::Geometry* geometry )
 void Renderer::SetDepthIndex( int depthIndex )
 {
   mDepthIndex = depthIndex;
+  mDirty = true;
 }
 
 void Renderer::SetFaceCullingMode( FaceCullingMode::Type faceCullingMode )
@@ -410,6 +416,7 @@ FaceCullingMode::Type Renderer::GetFaceCullingMode() const
 void Renderer::SetBlendMode( BlendMode::Type blendingMode )
 {
   mBlendMode = blendingMode;
+  mDirty = true;
 }
 
 BlendMode::Type Renderer::GetBlendMode() const
@@ -582,6 +589,7 @@ const Render::Renderer::StencilParameters& Renderer::GetStencilParameters() cons
 
 void Renderer::BakeOpacity( BufferIndex updateBufferIndex, float opacity )
 {
+  mDirty = true;
   mOpacity.Bake( updateBufferIndex, opacity );
 }
 
@@ -590,6 +598,17 @@ float Renderer::GetOpacity( BufferIndex updateBufferIndex ) const
   return mOpacity[updateBufferIndex];
 }
 
+void Renderer::SetRenderingBehavior( DevelRenderer::Rendering::Type renderingBehavior )
+{
+  mRenderingBehavior = renderingBehavior;
+  mDirty = true;
+}
+
+DevelRenderer::Rendering::Type Renderer::GetRenderingBehavior() const
+{
+  return mRenderingBehavior;
+}
+
 //Called when SceneGraph::Renderer is added to update manager ( that happens when an "event-thread renderer" is created )
 void Renderer::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
 {
@@ -601,7 +620,6 @@ void Renderer::ConnectToSceneGraph( SceneController& sceneController, BufferInde
 
   mRenderer = Render::Renderer::New( mRenderDataProvider, mGeometry, mBlendBitmask, GetBlendColor(), static_cast< FaceCullingMode::Type >( mFaceCullingMode ),
                                          mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters );
-
   OwnerPointer< Render::Renderer > transferOwnership( mRenderer );
   mSceneController->GetRenderMessageDispatcher().AddRenderer( transferOwnership );
 }
@@ -639,6 +657,7 @@ void Renderer::UpdateTextureSet()
       mRenderDataProvider->mTextures.clear();
       mRenderDataProvider->mSamplers.clear();
     }
+    mDirty = true;
   }
 }
 
@@ -744,6 +763,49 @@ void Renderer::ObservedObjectDestroyed(PropertyOwner& owner)
   }
 }
 
+void Renderer::SetDirty( bool value )
+{
+  mDirty = value;
+  if( mShader )
+  {
+    mShader->SetPropertyDirty( value );
+  }
+}
+
+bool Renderer::IsDirty() const
+{
+  bool ret = false;
+
+  if( !mDirty )
+  {
+    if( mShader )
+    {
+      ret = mShader->IsPropertyDirty();
+    }
+
+    // check native image
+    if( !ret && mTextureSet )
+    {
+      uint32_t textureCount = mTextureSet->GetTextureCount();
+
+      if(textureCount > 0)
+      {
+        Dali::Internal::Render::Texture* texture;
+        for( uint32_t i = 0; i<textureCount; ++i )
+        {
+          texture = const_cast<Dali::Internal::SceneGraph::TextureSet *>(mTextureSet)->GetTexture(i);
+          if( texture && texture->IsNativeImage() )
+          {
+            ret = true;
+            break;
+          }
+        }
+      }
+    }
+  }
+  return ret | mDirty;
+}
+
 } // namespace SceneGraph
 } // namespace Internal
 } // namespace Dali