[Tizen] Reducing uniform memory usage
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Wed, 15 Nov 2023 06:02:40 +0000 (15:02 +0900)
committerJaehyun Cho <jae_hyun.cho@samsung.com>
Wed, 15 Nov 2023 06:02:40 +0000 (15:02 +0900)
This reverts commit ce700f8ebc635af08e6b77d7a4a7ebd78db8499f.

dali/internal/event/common/property-input-impl.h
dali/internal/render/renderers/render-renderer.cpp
dali/internal/render/renderers/render-renderer.h
dali/internal/update/common/animatable-property.h
dali/internal/update/common/inherited-property.h
dali/internal/update/gestures/gesture-properties.h
dali/internal/update/manager/transform-manager-property.h

index 2bb3a3b0e227e2e4972fd3a8f4c7780e037b490b..ab2ee093944068ce9850e27448d6960c0557a2da 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_PROPERTY_INPUT_IMPL_H
 
 /*
- * Copyright (c) 2021 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.
@@ -181,6 +181,18 @@ public:
     return reinterpret_cast<const Matrix&>(*this);
   }
 
+  /**
+   * Retrieve the address of the property value. Only for use
+   * when writing uniforms.
+   */
+  virtual const void* GetValueAddress(BufferIndex bufferIndex) const = 0;
+
+  /**
+   * Retrieve the size of the property value for use in copying.
+   * Only for use when writing uniforms.
+   */
+  virtual size_t GetValueSize() const = 0;
+
   // Accessors for Constraint functions
 
   /**
index 8eb8120ca167ee7d52dfe1b0aeb0696241fe823c..27ec4b9efe6b96203309e27663bc7c963f5de358 100644 (file)
@@ -47,98 +47,6 @@ uint32_t      mvpBufferIndex;
 
 namespace
 {
-// Helper to get the property value getter by type
-typedef const float& (PropertyInputImpl::*FuncGetter)(BufferIndex) const;
-constexpr FuncGetter GetPropertyValueGetter(Property::Type type)
-{
-  switch(type)
-  {
-    case Property::BOOLEAN:
-    {
-      return FuncGetter(&PropertyInputImpl::GetBoolean);
-    }
-    case Property::INTEGER:
-    {
-      return FuncGetter(&PropertyInputImpl::GetInteger);
-    }
-    case Property::FLOAT:
-    {
-      return FuncGetter(&PropertyInputImpl::GetFloat);
-    }
-    case Property::VECTOR2:
-    {
-      return FuncGetter(&PropertyInputImpl::GetVector2);
-    }
-    case Property::VECTOR3:
-    {
-      return FuncGetter(&PropertyInputImpl::GetVector3);
-    }
-    case Property::VECTOR4:
-    {
-      return FuncGetter(&PropertyInputImpl::GetVector4);
-    }
-    case Property::MATRIX3:
-    {
-      return FuncGetter(&PropertyInputImpl::GetMatrix3);
-    }
-    case Property::MATRIX:
-    {
-      return FuncGetter(&PropertyInputImpl::GetMatrix);
-    }
-    default:
-    {
-      return nullptr;
-    }
-  }
-}
-
-/**
- * Helper function that returns size of uniform datatypes based
- * on property type.
- */
-constexpr int GetPropertyValueSizeForUniform(Property::Type type)
-{
-  switch(type)
-  {
-    case Property::Type::BOOLEAN:
-    {
-      return sizeof(bool);
-    }
-    case Property::Type::FLOAT:
-    {
-      return sizeof(float);
-    }
-    case Property::Type::INTEGER:
-    {
-      return sizeof(int);
-    }
-    case Property::Type::VECTOR2:
-    {
-      return sizeof(Vector2);
-    }
-    case Property::Type::VECTOR3:
-    {
-      return sizeof(Vector3);
-    }
-    case Property::Type::VECTOR4:
-    {
-      return sizeof(Vector4);
-    }
-    case Property::Type::MATRIX3:
-    {
-      return sizeof(Matrix3);
-    }
-    case Property::Type::MATRIX:
-    {
-      return sizeof(Matrix);
-    }
-    default:
-    {
-      return 0;
-    }
-  };
-}
-
 /**
  * Helper function to calculate the correct alignment of data for uniform buffers
  * @param dataSize size of uniform buffer
@@ -922,7 +830,7 @@ void Renderer::FillUniformBuffer(Program&
   {
     auto& uniform    = iter;
     int   arrayIndex = uniform.arrayIndex;
-    if(!uniform.uniformFunc)
+    if(!uniform.initialized)
     {
       auto uniformInfo  = Graphics::UniformInfo{};
       auto uniformFound = program.GetUniform(uniform.uniformName.GetStringView(),
@@ -943,15 +851,13 @@ void Renderer::FillUniformBuffer(Program&
       uniform.uniformOffset     = uniformInfo.offset;
       uniform.uniformLocation   = uniformInfo.location;
       uniform.uniformBlockIndex = uniformInfo.bufferIndex;
+      uniform.initialized       = true;
 
       auto       dst      = ubo->GetOffset() + uniformInfo.offset;
-      const auto typeSize = GetPropertyValueSizeForUniform(iter.propertyValue->GetType());
+      const auto typeSize = iter.propertyValue->GetValueSize();
       const auto dest     = dst + static_cast<uint32_t>(typeSize) * arrayIndex;
-      const auto func     = GetPropertyValueGetter(iter.propertyValue->GetType());
-      uniform.uniformSize = typeSize;
-      uniform.uniformFunc = func;
 
-      ubo->Write(&(iter.propertyValue->*func)(updateBufferIndex),
+      ubo->Write(iter.propertyValue->GetValueAddress(updateBufferIndex),
                  typeSize,
                  dest);
     }
@@ -960,11 +866,10 @@ void Renderer::FillUniformBuffer(Program&
       UniformBufferView* ubo = uboViews[uniform.uniformBlockIndex].get();
 
       auto       dst      = ubo->GetOffset() + uniform.uniformOffset;
-      const auto typeSize = uniform.uniformSize;
+      const auto typeSize = iter.propertyValue->GetValueSize();
       const auto dest     = dst + static_cast<uint32_t>(typeSize) * arrayIndex;
-      const auto func     = uniform.uniformFunc;
 
-      ubo->Write(&(iter.propertyValue->*func)(updateBufferIndex),
+      ubo->Write(iter.propertyValue->GetValueAddress(updateBufferIndex),
                  typeSize,
                  dest);
     }
index ce270ee9fc20bb003569baf4e4fc0c1dbe92aa44..956536b7ecdc134e33d71a464fc6d17761942544 100644 (file)
@@ -631,8 +631,6 @@ private:
 
   using Hash = std::size_t;
 
-  typedef const float& (PropertyInputImpl::*FuncGetter)(BufferIndex) const;
-
   struct UniformIndexMap
   {
     ConstString              uniformName;            ///< The uniform name
@@ -641,11 +639,10 @@ private:
     Hash                     uniformNameHashNoArray{0u};
     int32_t                  arrayIndex{-1}; ///< The array index
 
-    int16_t    uniformLocation{0u};
-    uint16_t   uniformOffset{0u};
-    uint16_t   uniformSize{0u};
-    uint16_t   uniformBlockIndex{0u};
-    FuncGetter uniformFunc{0};
+    int16_t  uniformLocation{0u};
+    uint16_t uniformOffset{0u};
+    uint16_t uniformBlockIndex{0u};
+    bool     initialized{false};
   };
 
   StencilParameters mStencilParameters; ///< Struct containing all stencil related options
index 612af3f2e7f115914ff142da852cfb2c75a40225..c2bb6fe63c115982c101396d832e1fdaa53bedeb 100644 (file)
@@ -173,6 +173,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(bool);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -339,6 +355,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(int);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -514,6 +546,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(float);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -691,6 +739,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector2);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -957,6 +1021,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector3);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -1277,6 +1357,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector4);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -1669,6 +1765,22 @@ public:
     OnSet();
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector4);
+  }
+
   /**
    * Change the property value by a relative amount.
    * @param[in] bufferIndex The buffer to write.
@@ -1809,6 +1921,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Matrix);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
@@ -1965,6 +2093,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Matrix3);
+  }
+
   /**
    * Set the property value. This will only persist for the current frame; the property
    * will be reset with the base value, at the beginning of the next frame.
index e4a844690365074f9a6a9d90f959ca184496a531..08d62b46d2745a7419300252a738252ef76a4c08 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_INHERITED_PROPERTY_H
 
 /*
- * Copyright (c) 2021 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.
@@ -122,6 +122,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector3);
+  }
+
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputVector3()
    */
@@ -268,6 +284,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector4);
+  }
+
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputVector4()
    */
@@ -432,6 +464,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector4);
+  }
+
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputQuaternion()
    */
@@ -577,6 +625,22 @@ public:
     return mValue[bufferIndex];
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue[bufferIndex];
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Matrix);
+  }
+
   /**
    * @copydoc Dali::Internal::PropertyInputImpl::GetConstraintInputMatrix()
    */
index 33e28b5858dd33460f6bc7678ab7631a77bd88dc..92e635ee049dce829ad8a4c2fce66dfe6a22c201 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_GESTURE_PROPERTIES_H
 
 /*
- * Copyright (c) 2021 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.
@@ -151,6 +151,22 @@ public:
   {
     return mValue;
   }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue;
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector2);
+  }
 };
 
 /**
@@ -171,6 +187,22 @@ public:
   {
     return mValue;
   }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &mValue;
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(bool);
+  }
 };
 
 } // namespace SceneGraph
index fe5fec48507496a1487d8c183f9a71c12bf0477d..e093e01c0e5b698f1246fcded75b5fb083a61528 100644 (file)
@@ -196,6 +196,22 @@ struct TransformManagerPropertyVector3 final : public TransformManagerPropertyHa
     return Get(bufferIndex);
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &GetVector3(bufferIndex);
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector3);
+  }
+
   const float& GetFloatComponent(uint32_t component) const override
   {
     return GetTxManagerData()->Manager()->GetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, component);
@@ -312,6 +328,22 @@ public:
   {
     return Get(bufferIndex);
   }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &Get(bufferIndex);
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector4);
+  }
 };
 
 /**
@@ -414,6 +446,22 @@ public:
     return mValue;
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &GetVector3(bufferIndex);
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector3);
+  }
+
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputVector3()
    */
@@ -554,6 +602,22 @@ public:
     return mValue;
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    return &GetQuaternion(bufferIndex);
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Vector4);
+  }
+
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputQuaternion()
    */
@@ -682,6 +746,29 @@ public:
     return Matrix::IDENTITY;
   }
 
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
+   */
+  const void* GetValueAddress(BufferIndex bufferIndex) const override
+  {
+    static const Matrix identityMatrix(Matrix::IDENTITY);
+    auto                transformManagerData = GetTxManagerData();
+    auto                id                   = transformManagerData->Id();
+    if(id != INVALID_TRANSFORM_ID)
+    {
+      return &(transformManagerData->Manager()->GetWorldMatrix(id));
+    }
+    return &identityMatrix;
+  }
+
+  /**
+   * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
+   */
+  size_t GetValueSize() const override
+  {
+    return sizeof(Matrix);
+  }
+
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputMatrix()
    */