Tizen 2.4.0 rev3 SDK Public Release
[framework/graphics/dali.git] / dali / internal / update / node-attachments / scene-graph-image-attachment.cpp
index 59cb27d..8c48965 100644 (file)
@@ -65,7 +65,8 @@ ImageAttachment::ImageAttachment( unsigned int textureId )
   mIsPixelAreaSet( false ),
   mPreviousRefreshHints( 0 ),
   mStyle( Dali::ImageActor::STYLE_QUAD ),
-  mCullFaceMode( CullNone )
+  mCullFaceMode( CullNone ),
+  mUseBlend( false )
 {
 }
 
@@ -73,10 +74,10 @@ void ImageAttachment::Initialize2( BufferIndex updateBufferIndex )
 {
   DALI_ASSERT_DEBUG( NULL != mSceneController );
 
-  // Create main renderer, passing ownership to the render-thread
-  mImageRenderer = ImageRenderer::New( *mParent );
+  // Get a reusable renderer from the pool
+  mImageRenderer = mSceneController->NewImageRenderer( *mParent );
 
-  mSceneController->GetRenderMessageDispatcher().AddRenderer( *mImageRenderer );
+  mSceneController->GetRenderMessageDispatcher().AddImageRenderer( mImageRenderer, mParent );
 
   ATTACHMENT_LOG_FMT(Debug::General, " renderer: %p\n", mImageRenderer);
 
@@ -91,21 +92,25 @@ void ImageAttachment::Initialize2( BufferIndex updateBufferIndex )
     new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetTextureId, mTextureId );
   }
 
-  // After derived classes have (potentially) created their renderer
-  Renderer& renderer = GetRenderer();
-  renderer.SetCullFace( mCullFaceMode );
-
-  // set the default shader here as well
-  renderer.SetShader( mShader );
+  // send messages to renderer
+  SendCullFaceChangeMessage( updateBufferIndex );
+  SendShaderChangeMessage( updateBufferIndex );
 }
 
 void ImageAttachment::OnDestroy2()
 {
   DALI_ASSERT_DEBUG( NULL != mSceneController );
 
-  // Request deletion in the next Render
-  mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mImageRenderer );
-  mImageRenderer = NULL;
+  if( NULL != mImageRenderer )
+  {
+    // Request GL cleanup in the next Render
+    mSceneController->GetRenderMessageDispatcher().RemoveImageRenderer( mImageRenderer );
+
+    // Return reusable renderer to the pool
+    mSceneController->FreeImageRenderer( *mImageRenderer );
+
+    mImageRenderer = NULL;
+  }
 }
 
 void ImageAttachment::ConnectedToSceneGraph()
@@ -209,25 +214,25 @@ void ImageAttachment::SetBorder( BufferIndex updateBufferIndex, const Vector4& b
 void ImageAttachment::SetBlendingOptions( BufferIndex updateBufferIndex, unsigned int options )
 {
   // Blending options are forwarded to renderer in render-thread
-  typedef MessageValue1< Renderer, unsigned int > DerivedType;
+  typedef MessageValue1< ImageRenderer, unsigned int > DerivedType;
 
   // Reserve some memory inside the render queue
   unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &GetRenderer(), &Renderer::SetBlendingOptions, options );
+  new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetBlendingOptions, options );
 }
 
 void ImageAttachment::SetBlendColor( BufferIndex updateBufferIndex, const Vector4& color )
 {
   // Blend color is forwarded to renderer in render-thread
-  typedef MessageValue1< Renderer, Vector4 > DerivedType;
+  typedef MessageValue1< ImageRenderer, Vector4 > DerivedType;
 
   // Reserve some memory inside the render queue
   unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &GetRenderer(), &Renderer::SetBlendColor, color );
+  new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetBlendColor, color );
 }
 
 void ImageAttachment::SetCullFace( BufferIndex updateBufferIndex, CullFaceMode mode )
@@ -237,13 +242,7 @@ void ImageAttachment::SetCullFace( BufferIndex updateBufferIndex, CullFaceMode m
 
   mCullFaceMode = mode;
 
-  typedef MessageValue1< Renderer, CullFaceMode > DerivedType;
-
-  // Reserve some memory inside the render queue
-  unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
-
-  // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &GetRenderer(), &Renderer::SetCullFace, mode );
+  SendCullFaceChangeMessage( updateBufferIndex );
 }
 
 void ImageAttachment::SetSampler( BufferIndex updateBufferIndex, unsigned int samplerBitfield )
@@ -428,6 +427,22 @@ void ImageAttachment::DoPrepareRender( BufferIndex updateBufferIndex )
 
     mRefreshMeshData = false;
   }
+
+  bool blend = !IsFullyOpaque( updateBufferIndex );
+
+  if ( mUseBlend != blend )
+  {
+    mUseBlend = blend;
+
+    // Enable/disable blending in the next render
+    typedef MessageValue1< ImageRenderer, bool > DerivedType;
+
+    // Reserve some memory inside the render queue
+    unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+
+    // Construct message in the render queue memory; note that delete should not be called on the return value
+    new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetUseBlend, blend );
+  }
 }
 
 void RenderableAttachment::SetBlendingMode( BlendingMode::Type mode )
@@ -481,6 +496,17 @@ bool ImageAttachment::IsFullyOpaque( BufferIndex updateBufferIndex )
   return fullyOpaque;
 }
 
+void ImageAttachment::SendCullFaceChangeMessage( BufferIndex updateBufferIndex )
+{
+  typedef MessageValue1< Renderer, CullFaceMode > DerivedType;
+
+  // Reserve some memory inside the render queue
+  unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+
+  // Construct message in the render queue memory; note that delete should not be called on the return value
+  new (slot) DerivedType( &GetRenderer(), &Renderer::SetCullFace, mCullFaceMode );
+}
+
 void ImageAttachment::SendShaderChangeMessage( BufferIndex updateBufferIndex )
 {
   typedef MessageValue1< Renderer, Shader* > DerivedType;