/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
void PropertyOwner::AddUniformMapping(const UniformPropertyMapping& map)
{
mUniformMaps.Add(map);
+ OnMappingChanged();
}
void PropertyOwner::RemoveUniformMapping(const ConstString& uniformName)
{
mUniformMaps.Remove(uniformName);
+ OnMappingChanged();
}
const UniformMap& PropertyOwner::GetUniformMap() const
return mUniformMaps;
}
-void PropertyOwner::AddUniformMapObserver(UniformMap::Observer& observer)
-{
- mUniformMaps.AddObserver(observer);
-}
-
-void PropertyOwner::RemoveUniformMapObserver(UniformMap::Observer& observer)
-{
- mUniformMaps.RemoveObserver(observer);
-}
-
} // namespace SceneGraph
} // namespace Internal
#define DALI_INTERNAL_SCENE_GRAPH_PROPERTY_OWNER_H
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
const UniformMap& GetUniformMap() const;
/**
- * @copydoc UniformMap::AddUniformMapObserver
- */
- void AddUniformMapObserver(UniformMap::Observer& observer);
-
- /**
- * @copydoc UniformMap::RemoveUniformMapObserver
- */
- void RemoveUniformMapObserver(UniformMap::Observer& observer);
-
- /**
* Query whether playing an animation is possible or not.
* @return true if playing an animation is possible.
*/
*/
PropertyOwner();
+ /**
+ * Method to inform derived classes when property maps have been modified.
+ */
+ virtual void OnMappingChanged()
+ {
+ // Default behaviour is to do nothing
+ }
+
private:
// Undefined
PropertyOwner(const PropertyOwner&);
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
{
namespace SceneGraph
{
-void UniformMap::AddObserver(Observer& observer)
-{
- bool foundObserver = false;
- for(ObserversIter iter = mObservers.Begin(), endIter = mObservers.End(); iter != endIter; ++iter)
- {
- if(*iter == &observer)
- {
- foundObserver = true;
- break;
- }
- }
- if(!foundObserver)
- {
- mObservers.PushBack(&observer);
- }
-}
-
-void UniformMap::RemoveObserver(Observer& observer)
-{
- for(ObserversIter iter = mObservers.Begin(), endIter = mObservers.End(); iter != endIter; ++iter)
- {
- if(*iter == &observer)
- {
- mObservers.Erase(iter);
- return;
- }
- }
-}
-
void UniformMap::MappingChanged()
{
++mChangeCounter;
- for(ObserversIter iter = mObservers.Begin(), endIter = mObservers.End(); iter != endIter; ++iter)
- {
- Observer* observer = (*iter);
- observer->UniformMappingsChanged(*this);
- }
}
void UniformMap::Add(UniformPropertyMapping newMap)
#define DALI_INTERNAL_SCENE_GRAPH_UNIFORM_MAP_H
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
* The UniformMap class is used to map uniform names to property values. It is available
* in the following rendering classes: Node, Renderer, Shader.
*
- * It can be observed for changes to the mapping table.
+ * They can test the ChangeCounter to see if the mapping has been updated.
*/
class UniformMap
{
public:
using SizeType = uint32_t;
- class Observer
- {
- public:
- /**
- * Inform observer that uniform mappings have been changed
- * @param mappings
- */
- virtual void UniformMappingsChanged(const UniformMap& mappings) = 0;
-
- protected:
- /**
- * Virtual destructor, no deletion through this interface
- */
- virtual ~Observer() = default;
- };
-
- /**
- * Add an observer that watches for changes in the mappings
- */
- void AddObserver(Observer& observer);
-
- /**
- * Remove an observer
- */
- void RemoveObserver(Observer& observer);
-
/**
* Add a map to the mappings table.
*/
private:
using UniformMapContainer = Dali::Vector<UniformPropertyMapping>;
using UniformMapIter = UniformMapContainer::Iterator;
- using Observers = Dali::Vector<Observer*>;
- using ObserversIter = Observers::Iterator;
- UniformMapContainer mUniformMaps; ///< container of uniform maps
- Observers mObservers;
+ UniformMapContainer mUniformMaps; ///< container of uniform maps
std::size_t mChangeCounter{0u}; ///< Counter that is incremented when the map changes
};
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
mOpacity(1.0f),
mDepthIndex(0)
{
- // Observe our own PropertyOwner's uniform map.
- AddUniformMapObserver(*this);
}
Renderer::~Renderer()
{
- if(mShader)
- {
- mShader->RemoveUniformMapObserver(*this);
- mShader = nullptr;
- }
}
void Renderer::operator delete(void* ptr)
bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
{
- bool rendererUpdated = mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mUpdateDecay > 0;
+ bool rendererUpdated = mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mUpdateDecay > 0;
+ auto shaderMapChangeCounter = mShader ? mShader->GetUniformMap().GetChangeCounter() : 0u;
+ bool shaderMapChanged = mShader && (mShaderMapChangeCounter != shaderMapChangeCounter);
+ if(shaderMapChanged)
+ {
+ mShaderMapChangeCounter = shaderMapChangeCounter;
+ }
- if(mUniformMapChangeCounter != mUniformMaps.GetChangeCounter())
+ if(mUniformMapChangeCounter != mUniformMaps.GetChangeCounter() || shaderMapChanged)
{
// The map has changed since the last time we checked.
- rendererUpdated = true;
- mRegenerateUniformMap = true;
- mUpdateDecay = Renderer::Decay::INITIAL; // Render at least twice if the map has changed/actor has been added
+ rendererUpdated = true;
+ mRegenerateUniformMap = true;
+ mUpdateDecay = Renderer::Decay::INITIAL; // Render at least twice if the map has changed/actor has been added
+
+ // Update local counters to identify any future changes to maps
+ // (unlikely, but allowed by API).
mUniformMapChangeCounter = mUniformMaps.GetChangeCounter();
}
if(mUpdateDecay > 0)
{
DALI_ASSERT_DEBUG(shader != NULL && "Shader pointer is NULL");
- if(mShader)
- {
- mShader->RemoveUniformMapObserver(*this);
- }
-
- mShader = shader;
- mShader->AddUniformMapObserver(*this);
- mRegenerateUniformMap = true;
+ mShader = shader;
+ mShaderMapChangeCounter = 0u;
+ mRegenerateUniformMap = true;
mResendFlag |= RESEND_GEOMETRY | RESEND_SHADER;
mDirtyFlag = true;
}
localMap.AddMappings(mShader->GetUniformMap());
}
localMap.UpdateChangeCounter();
+
mRegenerateUniformMap = false;
SetUpdated(true);
}
return gRendererMemoryPool.GetCapacity();
}
-void Renderer::UniformMappingsChanged(const UniformMap& mappings)
+void Renderer::OnMappingChanged()
{
- // The mappings are either from PropertyOwner base class, or the Shader
+ // Properties have been registered on the base class.
mRegenerateUniformMap = true; // Should remain true until this renderer is added to a RenderList.
}
#define DALI_INTERNAL_SCENE_GRAPH_RENDERER_H
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
class Renderer : public PropertyOwner,
public UniformMapDataProvider,
- public RenderDataProvider,
- public UniformMap::Observer
+ public RenderDataProvider
{
public:
enum OpacityType
*/
static uint32_t GetMemoryPoolCapacity();
-public: // UniformMap::Observer
+public: // PropertyOwner::MappingChanged
/**
- * @copydoc UniformMap::Observer::UniformMappingsChanged
+ * @copydoc PropertyOwner::OnMappingChanged
*/
- void UniformMappingsChanged(const UniformMap& mappings) override;
+ void OnMappingChanged() override;
public: // PropertyOwner implementation
/**
Dali::Internal::Render::Renderer::StencilParameters mStencilParameters; ///< Struct containing all stencil related options
- uint64_t mUniformsHash{0}; ///< Hash of uniform map property values
- uint32_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw
- uint32_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw
- uint32_t mBlendBitmask; ///< The bitmask of blending options
- uint32_t mResendFlag; ///< Indicate whether data should be resent to the renderer
- uint32_t mUniformMapChangeCounter{0u}; ///< Value to check if uniform data should be updated
+ uint64_t mUniformsHash{0}; ///< Hash of uniform map property values
+ uint32_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw
+ uint32_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw
+ uint32_t mBlendBitmask; ///< The bitmask of blending options
+ uint32_t mResendFlag; ///< Indicate whether data should be resent to the renderer
+ UniformMap::SizeType mUniformMapChangeCounter{0u}; ///< Value to check if uniform data should be updated
+ UniformMap::SizeType mShaderMapChangeCounter{0u}; ///< Value to check if uniform data should be updated
DepthFunction::Type mDepthFunction : 4; ///< Local copy of the depth function
FaceCullingMode::Type mFaceCullingMode : 3; ///< Local copy of the mode of face culling