(Renderer) Fix memory leak when using blend-color 68/120668/6
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Thu, 23 Mar 2017 14:47:38 +0000 (14:47 +0000)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Fri, 24 Mar 2017 15:03:50 +0000 (08:03 -0700)
Change-Id: Iaf7a0ae464fa0c354e1111f9313972349a2b9b45

dali/internal/common/blending-options.cpp
dali/internal/common/blending-options.h
dali/internal/event/rendering/renderer-impl.cpp
dali/internal/event/rendering/renderer-impl.h
dali/internal/render/renderers/render-renderer.cpp
dali/internal/render/renderers/render-renderer.h
dali/internal/update/rendering/scene-graph-renderer.cpp
dali/internal/update/rendering/scene-graph-renderer.h

index 17668a0..b682fc4 100644 (file)
@@ -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.
@@ -251,7 +251,6 @@ BlendingOptions::BlendingOptions()
 
 BlendingOptions::~BlendingOptions()
 {
-  delete mBlendColor;
 }
 
 void BlendingOptions::SetBitmask( unsigned int bitmask )
@@ -315,31 +314,27 @@ BlendEquation::Type BlendingOptions::GetBlendEquationAlpha() const
 
 void BlendingOptions::SetBlendColor( const Vector4& color )
 {
-  if( Vector4::ZERO == color )
+  if( Color::TRANSPARENT == color )
   {
-    if( mBlendColor )
-    {
-      // Discard unnecessary vector
-      delete mBlendColor;
-      mBlendColor = NULL;
-    }
-    return;
-  }
-
-  if( mBlendColor )
-  {
-    *mBlendColor = color;
+    mBlendColor = NULL;
   }
   else
   {
-    // Lazy allocation when non-default is set
-    mBlendColor = new Vector4( color );
+    if( mBlendColor )
+    {
+      *mBlendColor = color;
+    }
+    else
+    {
+      // Lazy allocation when non-default is set
+      mBlendColor = new Vector4( color );
+    }
   }
 }
 
 const Vector4* BlendingOptions::GetBlendColor() const
 {
-  return mBlendColor;
+  return mBlendColor.Get();
 }
 
 } // namespace Internal
index c5284bb..b469c26 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_BLENDING_OPTIONS_H
 
 /*
- * Copyright (c) 2016 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.
@@ -21,6 +21,7 @@
 // INTERNAL INCLUDES
 #include <dali/public-api/rendering/renderer.h>
 #include <dali/public-api/math/vector4.h>
+#include <dali/internal/common/owner-pointer.h>
 
 namespace Dali
 {
@@ -119,7 +120,7 @@ private:
 
   unsigned int mBitmask; ///< A bitmask of blending options
 
-  Vector4* mBlendColor; ///< A heap-allocated color (owned)
+  OwnerPointer< Vector4> mBlendColor; ///< A heap-allocated color (owned)
 
 };
 
index 64d5651..3b82ab6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 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.
@@ -290,28 +290,6 @@ void Renderer::GetBlendEquation( BlendEquation::Type& equationRgb,
   equationAlpha = mBlendingOptions.GetBlendEquationAlpha();
 }
 
-void Renderer::SetBlendColor( const Vector4& color )
-{
-  if( !mBlendColor )
-  {
-    mBlendColor = new Vector4();
-  }
-  if( *mBlendColor != color )
-  {
-    *mBlendColor = color;
-    SetBlendColorMessage( GetEventThreadServices(), *mSceneObject, *mBlendColor );
-  }
-}
-
-Vector4 Renderer::GetBlendColor() const
-{
-  if( mBlendColor )
-  {
-    return *mBlendColor;
-  }
-  return Color::TRANSPARENT; // GL default
-}
-
 void Renderer::SetIndexedDrawFirstElement( size_t firstElement )
 {
   if( firstElement != mIndexedDrawFirstElement )
@@ -729,14 +707,7 @@ Property::Value Renderer::GetDefaultProperty( Property::Index index ) const
     }
     case Dali::Renderer::Property::BLEND_COLOR:
     {
-      if( mBlendColor )
-      {
-        value = *mBlendColor;
-      }
-      else
-      {
-        value = Color::TRANSPARENT;
-      }
+      value = GetBlendColor();
       break;
     }
     case Dali::Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA:
@@ -858,7 +829,6 @@ int Renderer::GetPropertyComponentIndex( Property::Index index ) const
 
 Renderer::Renderer()
 : mSceneObject(NULL ),
-  mBlendColor( NULL ),
   mDepthIndex( 0 ),
   mIndexedDrawFirstElement( 0 ),
   mIndexedDrawElementCount( 0 ),
@@ -884,6 +854,22 @@ void Renderer::Initialize()
   eventThreadServices.RegisterObject( this );
 }
 
+void Renderer::SetBlendColor( const Vector4& blendColor )
+{
+  mBlendingOptions.SetBlendColor( blendColor );
+  SetBlendColorMessage( GetEventThreadServices(), *mSceneObject, GetBlendColor() );
+}
+
+const Vector4& Renderer::GetBlendColor() const
+{
+  const Vector4* blendColor = mBlendingOptions.GetBlendColor();
+  if( blendColor )
+  {
+    return *blendColor;
+  }
+  return Color::TRANSPARENT; // GL default
+}
+
 Renderer::~Renderer()
 {
   if( EventThreadServices::IsCoreRunning() )
index 20574b3..bd9b8df 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RENDERER_H
 
 /*
- * Copyright (c) 2016 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.
@@ -137,16 +137,6 @@ public:
    void GetBlendEquation( BlendEquation::Type& equationRgb, BlendEquation::Type& equationAlpha ) const;
 
    /**
-    * @copydoc Dali::Renderer::SetBlendColor()
-    */
-   void SetBlendColor( const Vector4& color );
-
-   /**
-    * @copydoc Dali::Renderer::GetBlendColor()
-    */
-   Vector4 GetBlendColor() const;
-
-   /**
     * @copydoc Dali::Renderer::SetIndexedDrawFirstElement
     */
    void SetIndexedDrawFirstElement( size_t firstElement );
@@ -260,10 +250,29 @@ public: // Default property extensions from Object
   virtual int GetPropertyComponentIndex( Property::Index index ) const;
 
 private: // implementation
+
+  /**
+   * @brief Default constructor.
+   */
   Renderer();
 
+  /**
+   * @brief Initializes the Renderer.
+   */
   void Initialize();
 
+  /**
+   * @brief Sets the blend color.
+   * @param[in] blendColor The blend color to set.
+   */
+  void SetBlendColor( const Vector4& blendColor );
+
+  /**
+   * @brief Retrieves the blend-color.
+   * @return A const reference to the blend-color
+   */
+  const Vector4& GetBlendColor() const;
+
 protected:
   /**
    * A reference counted object may only be deleted by calling Unreference()
@@ -275,26 +284,25 @@ private: // unimplemented methods
   Renderer& operator=( const Renderer& );
 
 private: // data
-  SceneGraph::Renderer* mSceneObject;
-  Vector4* mBlendColor;               ///< Local copy of blend color, pointer only as its rarely used
-  GeometryPtr mGeometry;              ///< Connector that holds the geometry used by this renderer
-  TextureSetPtr mTextureSet;          ///< Connector that holds the texture set used by this renderer
-  ShaderPtr mShader;                  ///< Connector that holds the shader used by this renderer
-
-  int mDepthIndex;
-
-  size_t mIndexedDrawFirstElement;                            ///< Offset of first element to draw from bound index buffer
-  size_t mIndexedDrawElementCount;                            ///< Number of elements to draw
-
-  Render::Renderer::StencilParameters mStencilParameters;     ///< Struct containing all stencil related options
-  BlendingOptions              mBlendingOptions;              ///< Local copy of blending options bitmask
-
-  DepthFunction::Type          mDepthFunction:3;              ///< Local copy of the depth function
-  FaceCullingMode::Type        mFaceCullingMode:2;            ///< Local copy of the mode of face culling
-  BlendMode::Type              mBlendMode:2;                  ///< Local copy of the mode of blending
-  DepthWriteMode::Type         mDepthWriteMode:2;             ///< Local copy of the depth write mode
-  DepthTestMode::Type          mDepthTestMode:2;              ///< Local copy of the depth test mode
-  bool                         mPremultipledAlphaEnabled:1;   ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
+  SceneGraph::Renderer*               mSceneObject;
+  GeometryPtr                         mGeometry;                     ///< Connector that holds the geometry used by this renderer
+  TextureSetPtr                       mTextureSet;                   ///< Connector that holds the texture set used by this renderer
+  ShaderPtr                           mShader;                       ///< Connector that holds the shader used by this renderer
+
+  int                                 mDepthIndex;
+
+  size_t                              mIndexedDrawFirstElement;      ///< Offset of first element to draw from bound index buffer
+  size_t                              mIndexedDrawElementCount;      ///< Number of elements to draw
+
+  Render::Renderer::StencilParameters mStencilParameters;            ///< Struct containing all stencil related options
+  BlendingOptions                     mBlendingOptions;              ///< Local copy of blending options bitmask
+
+  DepthFunction::Type                 mDepthFunction:3;              ///< Local copy of the depth function
+  FaceCullingMode::Type               mFaceCullingMode:2;            ///< Local copy of the mode of face culling
+  BlendMode::Type                     mBlendMode:2;                  ///< Local copy of the mode of blending
+  DepthWriteMode::Type                mDepthWriteMode:2;             ///< Local copy of the depth write mode
+  DepthTestMode::Type                 mDepthTestMode:2;              ///< Local copy of the depth test mode
+  bool                                mPremultipledAlphaEnabled:1;   ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
 };
 
 } // namespace Internal
index c353daf..b59eb20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 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.
@@ -108,7 +108,7 @@ namespace Render
 Renderer* Renderer::New( SceneGraph::RenderDataProvider* dataProvider,
                          Render::Geometry* geometry,
                          unsigned int blendingBitmask,
-                         const Vector4* blendColor,
+                         const Vector4& blendColor,
                          FaceCullingMode::Type faceCullingMode,
                          bool preMultipliedAlphaEnabled,
                          DepthWriteMode::Type depthWriteMode,
@@ -124,7 +124,7 @@ Renderer* Renderer::New( SceneGraph::RenderDataProvider* dataProvider,
 Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider,
                     Render::Geometry* geometry,
                     unsigned int blendingBitmask,
-                    const Vector4* blendColor,
+                    const Vector4& blendColor,
                     FaceCullingMode::Type faceCullingMode,
                     bool preMultipliedAlphaEnabled,
                     DepthWriteMode::Type depthWriteMode,
@@ -147,15 +147,12 @@ Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider,
   mUpdateAttributesLocation( true ),
   mPremultipledAlphaEnabled( preMultipliedAlphaEnabled )
 {
-  if(  blendingBitmask != 0u )
+  if( blendingBitmask != 0u )
   {
     mBlendingOptions.SetBitmask( blendingBitmask );
   }
 
-  if( blendColor )
-  {
-    mBlendingOptions.SetBlendColor( *blendColor );
-  }
+  mBlendingOptions.SetBlendColor( blendColor );
 }
 
 void Renderer::Initialize( Context& context )
@@ -394,9 +391,9 @@ void Renderer::SetBlendingBitMask( unsigned int bitmask )
   mBlendingOptions.SetBitmask( bitmask );
 }
 
-void Renderer::SetBlendColor( const Vector4* color )
+void Renderer::SetBlendColor( const Vector4& color )
 {
-  mBlendingOptions.SetBlendColor( *color );
+  mBlendingOptions.SetBlendColor( color );
 }
 
 void Renderer::SetIndexedDrawFirstElement( size_t firstElement )
index 4a3ef30..6332d52 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RENDER_RENDERER_H
 
 /*
- * Copyright (c) 2016 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.
@@ -115,7 +115,7 @@ public:
   static Renderer* New( SceneGraph::RenderDataProvider* dataProviders,
                         Render::Geometry* geometry,
                         unsigned int blendingBitmask,
-                        const Vector4* blendColor,
+                        const Vector4& blendColor,
                         FaceCullingMode::Type faceCullingMode,
                         bool preMultipliedAlphaEnabled,
                         DepthWriteMode::Type depthWriteMode,
@@ -139,7 +139,7 @@ public:
   Renderer( SceneGraph::RenderDataProvider* dataProviders,
             Render::Geometry* geometry,
             unsigned int blendingBitmask,
-            const Vector4* blendColor,
+            const Vector4& blendColor,
             FaceCullingMode::Type faceCullingMode,
             bool preMultipliedAlphaEnabled,
             DepthWriteMode::Type depthWriteMode,
@@ -187,7 +187,7 @@ public:
    * Set the blend color for blending options
    * @param[in] blendColor The blend color to pass to GL
    */
-  void SetBlendColor( const Vector4* color );
+  void SetBlendColor( const Vector4& color );
 
   /**
    * Set the first element index to draw by the indexed draw
index 243635f..af7d93e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 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.
@@ -258,9 +258,9 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex )
 
     if( mResendFlag & RESEND_BLEND_COLOR )
     {
-      typedef MessageValue1< Render::Renderer, const Vector4* > DerivedType;
+      typedef MessageValue1< Render::Renderer, Vector4 > DerivedType;
       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
-      new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendColor, mBlendColor );
+      new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendColor, GetBlendColor() );
     }
 
     if( mResendFlag & RESEND_PREMULTIPLIED_ALPHA  )
@@ -433,13 +433,20 @@ void Renderer::SetBlendingOptions( unsigned int options )
 
 void Renderer::SetBlendColor( const Vector4& blendColor )
 {
-  if( !mBlendColor )
+  if( blendColor == Color::TRANSPARENT )
   {
-    mBlendColor = new Vector4( blendColor );
+    mBlendColor = NULL;
   }
   else
   {
-    *mBlendColor = blendColor;
+    if( !mBlendColor )
+    {
+      mBlendColor = new Vector4( blendColor );
+    }
+    else
+    {
+      *mBlendColor = blendColor;
+    }
   }
 
   mResendFlag |= RESEND_BLEND_COLOR;
@@ -536,7 +543,7 @@ void Renderer::ConnectToSceneGraph( SceneController& sceneController, BufferInde
   mSceneController = &sceneController;
   RenderDataProvider* dataProvider = NewRenderDataProvider();
 
-  mRenderer = Render::Renderer::New( dataProvider, mGeometry, mBlendBitmask, mBlendColor, static_cast< FaceCullingMode::Type >( mFaceCullingMode ),
+  mRenderer = Render::Renderer::New( dataProvider, mGeometry, mBlendBitmask, GetBlendColor(), static_cast< FaceCullingMode::Type >( mFaceCullingMode ),
                                          mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters );
 
   mSceneController->GetRenderMessageDispatcher().AddRenderer( *mRenderer );
@@ -576,6 +583,15 @@ RenderDataProvider* Renderer::NewRenderDataProvider()
   return dataProvider;
 }
 
+const Vector4& Renderer::GetBlendColor() const
+{
+  if( mBlendColor )
+  {
+    return *mBlendColor;
+  }
+  return Color::TRANSPARENT;
+}
+
 Render::Renderer& Renderer::GetRenderer()
 {
   return *mRenderer;
index b68c7ff..aa530e1 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_RENDERER_H
 
 /*
- * Copyright (c) 2016 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.
@@ -361,6 +361,12 @@ private:
    */
   RenderDataProvider* NewRenderDataProvider();
 
+  /**
+   * Helper function to retrieve the blend color.
+   * @return The blend color.
+   */
+  const Vector4& GetBlendColor() const;
+
 private:
 
   CollectedUniformMap          mCollectedUniformMap[2];           ///< Uniform maps collected by the renderer
@@ -369,7 +375,7 @@ private:
   TextureSet*                  mTextureSet;                       ///< The texture set this renderer uses. (Not owned)
   Render::Geometry*            mGeometry;                         ///< The geometry this renderer uses. (Not owned)
   Shader*                      mShader;                           ///< The shader this renderer uses. (Not owned)
-  Vector4*                     mBlendColor;                       ///< The blend color for blending operation
+  OwnerPointer< Vector4 >      mBlendColor;                       ///< The blend color for blending operation
 
   Dali::Internal::Render::Renderer::StencilParameters mStencilParameters;         ///< Struct containing all stencil related options