Calculate align size at UniformBuffer, not external 28/323228/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 24 Apr 2025 08:55:22 +0000 (17:55 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 28 Apr 2025 01:29:10 +0000 (10:29 +0900)
We don't need to give alignment ownership of memory offset to outsize.

Let we open the size freely, and calculate offset internally.

Change-Id: I7cd0ef88f15e716a75b7caff74830e35e3da076f
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/render/renderers/uniform-buffer-manager.cpp
dali/internal/render/renderers/uniform-buffer.cpp
dali/internal/render/renderers/uniform-buffer.h

index 1935ca622c62287508333debee2c1543cd24c6b1..cd6fbe7eaf35df68aaf5ca0dd345215202228eb3 100644 (file)
@@ -77,9 +77,7 @@ Graphics::UniquePtr<UniformBufferView> UniformBufferManager::CreateUniformBuffer
   auto offset = ubo->GetCurrentOffset();
   auto retval = Graphics::UniquePtr<UniformBufferView>(UniformBufferView::TryRecycle(oldView, *ubo.get(), offset));
 
-  // make sure new offset will meet alignment requirements
-  uint32_t alignedSize = ubo->AlignSize(size);
-  ubo->IncrementOffsetBy(alignedSize);
+  ubo->IncrementOffsetBy(size);
   return retval;
 }
 
index 4f664fed4d623fc99c4b52fc1b7e7399139bb605..55f46dfa8b7deb86379cd4685bcf33f2adeab072 100644 (file)
@@ -27,10 +27,22 @@ Debug::Filter* gUniformBufferLogFilter = Debug::Filter::New(Debug::NoLogging, fa
 
 namespace Dali::Internal::Render
 {
+namespace
+{
 // GPU UBOs need to be double-buffered in order to avoid stalling the CPU during mapping/unmapping
 constexpr uint32_t INTERNAL_UBO_BUFFER_COUNT = 2u;
 constexpr uint32_t DEFAUT_MEMORY_ALIGNMENT{1};
 
+/**
+ * Align size to the current block size.
+ */
+int AlignSize(int size, int align)
+{
+  return (size % align == 0) ? size : ((size / align) + 1) * align;
+}
+
+} // namespace
+
 Graphics::UniquePtr<UniformBufferV2> UniformBufferV2::New(Dali::Graphics::Controller* controller, bool emulated, uint32_t alignment)
 {
   return Graphics::UniquePtr<UniformBufferV2>(new UniformBufferV2(controller, emulated, alignment));
@@ -137,12 +149,12 @@ uint32_t UniformBufferV2::IncrementOffsetBy(uint32_t value)
 {
   if(mEmulated && !mBufferList.empty())
   {
-    mBufferList[mCurrentGraphicsBufferIndex].currentOffset += value; // reset offset
+    mBufferList[mCurrentGraphicsBufferIndex].currentOffset += AlignSize(value, mBlockAlignment); // reset offset
     return mBufferList[mCurrentGraphicsBufferIndex].currentOffset;
   } // GPU
   else if(!mBufferList.empty())
   {
-    mBufferList[mCurrentGraphicsBufferIndex].currentOffset += value; // reset offset
+    mBufferList[mCurrentGraphicsBufferIndex].currentOffset += AlignSize(value, mBlockAlignment); // reset offset
     return mBufferList[mCurrentGraphicsBufferIndex].currentOffset;
   }
   DALI_LOG_INFO(gUniformBufferLogFilter, Debug::General, "Buffer should be allocated before incrementing offset\n");
index d1e4f3835963a131848a040991b6c77f8dbfa953..173b76b51070a8afb1d68e6f31d95367e6c1add3 100644 (file)
@@ -64,17 +64,9 @@ public:
   void Rollback();
 
   /**
-   * Align size to the current block size
+   * Increase offset by value.
+   * Note that new offset will meet alignment requirements
    */
-  uint32_t AlignSize(uint32_t size) const
-  {
-    if(size % mBlockAlignment != 0)
-    {
-      size = ((size / mBlockAlignment) + 1) * mBlockAlignment;
-    }
-    return size;
-  }
-
   uint32_t IncrementOffsetBy(uint32_t value);
 
   bool MemoryCompare(void* data, uint32_t offset, uint32_t size);