X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fcommon%2Funiform-map.h;h=015d582f7286c32ff21a07a99896461b7f8549b9;hb=d67b366a74050ddec47340ff10a0188c0d381561;hp=4978e7c245dcf430e37755fe660698f2a48274de;hpb=0b1a36885914bce024aec63a236058f83809e1db;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/common/uniform-map.h b/dali/internal/update/common/uniform-map.h index 4978e7c..015d582 100644 --- a/dali/internal/update/common/uniform-map.h +++ b/dali/internal/update/common/uniform-map.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_SCENE_GRAPH_UNIFORM_MAP_H /* - * Copyright (c) 2018 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. @@ -18,12 +18,14 @@ */ // EXTERNAL INCLUDES -#include #include // uint32_t +#include // INTERNAL INCLUDES +#include + #include -#include + #include namespace Dali @@ -34,68 +36,63 @@ class PropertyInputImpl; namespace SceneGraph { - /** * The uniform map is used to map a uniform name to a property value. */ class UniformPropertyMapping { public: + using Hash = unsigned long; + /** * Constructor */ UniformPropertyMapping(ConstString theUniformName, const PropertyInputImpl* thePropertyPtr) : propertyPtr(thePropertyPtr), - uniformName(theUniformName) + uniformName(theUniformName), + uniformNameHash(0u), + uniformNameHashNoArray(0u), + arrayIndex(0u) { + // Look for array index closing bracket + auto nameStringView = theUniformName.GetStringView(); + auto pos = nameStringView.rfind("]"); + + // If found, extract the array index and store it, if it's an element in an array of basic types. + if(pos != std::string::npos) + { + auto pos0 = theUniformName.GetStringView().rfind("[", pos); + if(pos == nameStringView.length() - 1) // if element is in struct, don't set array index. + { + arrayIndex = atoi(theUniformName.GetCString() + pos0 + 1); + } + // Calculate hash from name without array index + uniformNameHashNoArray = Dali::CalculateHash(theUniformName.GetStringView().substr(0, pos0).data(), '['); + } + uniformName = theUniformName; + uniformNameHash = Dali::CalculateHash(theUniformName.GetCString()); } UniformPropertyMapping() = default; const PropertyInputImpl* propertyPtr{nullptr}; - ConstString uniformName; + ConstString uniformName{}; + Hash uniformNameHash{0u}; + Hash uniformNameHashNoArray{0u}; + int32_t arrayIndex{0u}; }; /** * The UniformMap class is used to map uniform names to property values. It is available - * in all of the classes responsible for rendering: - * Actor, Renderer, Geometry, TextureSet, Shader. + * 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. */ @@ -104,13 +101,13 @@ public: /** * Remove a map from the mappings table */ - void Remove( ConstString uniformName ); + void Remove(ConstString uniformName); /** * Find a property given the uniform name. * @return The address of the property if it's in the map, or NULL otherwise. */ - const PropertyInputImpl* Find( ConstString uniformName ); + const PropertyInputImpl* Find(ConstString uniformName); /** * Get the count of uniforms in the map @@ -123,7 +120,15 @@ public: * @param[in] index The index of the element to fetch * @return reference to the element in the map */ - const UniformPropertyMapping& operator[]( SizeType index ) const; + const UniformPropertyMapping& operator[](SizeType index) const; + + /** + * Return the change counter + */ + inline std::size_t GetChangeCounter() const + { + return mChangeCounter; + } private: /** @@ -134,15 +139,11 @@ private: private: using UniformMapContainer = Dali::Vector; using UniformMapIter = UniformMapContainer::Iterator; - using Observers = Dali::Vector; - using ObserversIter = Observers::Iterator; - - UniformMapContainer mUniformMaps; // Owner 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 }; - } // namespace SceneGraph } // namespace Internal } // namespace Dali