From: Adeel Kazmi Date: Thu, 23 Mar 2017 14:47:38 +0000 (+0000) Subject: (Renderer) Fix memory leak when using blend-color X-Git-Tag: dali_1.2.33~6 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-core.git;a=commitdiff_plain;h=9de19438afa81a779f245e07b34af6d80d047b2f (Renderer) Fix memory leak when using blend-color Change-Id: Iaf7a0ae464fa0c354e1111f9313972349a2b9b45 --- diff --git a/dali/internal/common/blending-options.cpp b/dali/internal/common/blending-options.cpp index 17668a0..b682fc4 100644 --- a/dali/internal/common/blending-options.cpp +++ b/dali/internal/common/blending-options.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. @@ -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 diff --git a/dali/internal/common/blending-options.h b/dali/internal/common/blending-options.h index c5284bb..b469c26 100644 --- a/dali/internal/common/blending-options.h +++ b/dali/internal/common/blending-options.h @@ -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 #include +#include 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) }; diff --git a/dali/internal/event/rendering/renderer-impl.cpp b/dali/internal/event/rendering/renderer-impl.cpp index 64d5651..3b82ab6 100644 --- a/dali/internal/event/rendering/renderer-impl.cpp +++ b/dali/internal/event/rendering/renderer-impl.cpp @@ -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() ) diff --git a/dali/internal/event/rendering/renderer-impl.h b/dali/internal/event/rendering/renderer-impl.h index 20574b3..bd9b8df 100644 --- a/dali/internal/event/rendering/renderer-impl.h +++ b/dali/internal/event/rendering/renderer-impl.h @@ -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 diff --git a/dali/internal/render/renderers/render-renderer.cpp b/dali/internal/render/renderers/render-renderer.cpp index c353daf..b59eb20 100644 --- a/dali/internal/render/renderers/render-renderer.cpp +++ b/dali/internal/render/renderers/render-renderer.cpp @@ -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 ) diff --git a/dali/internal/render/renderers/render-renderer.h b/dali/internal/render/renderers/render-renderer.h index 4a3ef30..6332d52 100644 --- a/dali/internal/render/renderers/render-renderer.h +++ b/dali/internal/render/renderers/render-renderer.h @@ -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 diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index 243635f..af7d93e 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -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; diff --git a/dali/internal/update/rendering/scene-graph-renderer.h b/dali/internal/update/rendering/scene-graph-renderer.h index b68c7ff..aa530e1 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.h +++ b/dali/internal/update/rendering/scene-graph-renderer.h @@ -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