Lock uniform buffer only 1 times per each render + minor fixup of uniforms
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / uniform-buffer-view-pool.cpp
index ef57ea8..6cc5150 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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.
 #include <dali/internal/render/renderers/uniform-buffer-view-pool.h>
 
 // INTERNAL INCLUDES
-#include <dali/internal/render/renderers/uniform-buffer-manager.h>
-#include <dali/internal/render/renderers/uniform-buffer.h>
-#include <dali/internal/render/renderers/uniform-buffer-view.h>
 #include <dali/graphics-api/graphics-buffer-create-info.h>
 #include <dali/graphics-api/graphics-buffer.h>
+#include <dali/internal/render/renderers/uniform-buffer-manager.h>
+#include <dali/internal/render/renderers/uniform-buffer-view.h>
+#include <dali/internal/render/renderers/uniform-buffer.h>
 
 namespace Dali::Internal::Render
 {
@@ -31,15 +31,15 @@ namespace
 {
 // Default UBO page size set to 32kb
 const uint32_t DEFAULT_UBO_PAGE_SIZE = 32768;
-}
+} // namespace
 
-UniformBufferViewPool::UniformBufferViewPool( UniformBufferManager& manager, uint32_t alignment ) :
-  mUboManager(manager)
+UniformBufferViewPool::UniformBufferViewPool(UniformBufferManager& manager, uint32_t alignment)
+: mUboManager(manager)
 {
   // Create initial UBO
-  mUniformBufferStorage = mUboManager.AllocateUniformBuffer( DEFAULT_UBO_PAGE_SIZE, alignment );
-  mAlignment = alignment;
-  mCurrentOffset = 0;
+  mUniformBufferStorage = mUboManager.AllocateUniformBuffer(DEFAULT_UBO_PAGE_SIZE, alignment);
+  mAlignment            = alignment;
+  mCurrentOffset        = 0;
 }
 
 UniformBufferViewPool::~UniformBufferViewPool() = default;
@@ -52,10 +52,10 @@ void UniformBufferViewPool::Rollback()
   // turn buffer into single allocation by resizing it
   // to current size with invalidation
   auto currentSize = mUniformBufferStorage->GetSize();
-  mUniformBufferStorage->Resize( currentSize ? currentSize : DEFAULT_UBO_PAGE_SIZE, true );
+  mUniformBufferStorage->Resize(currentSize ? currentSize : DEFAULT_UBO_PAGE_SIZE, true);
 }
 
-Graphics::UniquePtr<UniformBufferView> UniformBufferViewPool::CreateUniformBufferView( size_t size )
+Graphics::UniquePtr<UniformBufferView> UniformBufferViewPool::CreateUniformBufferView(size_t size)
 {
   // find new offset
   auto newOffset = ((mCurrentOffset + size) / mAlignment) * mAlignment;
@@ -65,20 +65,19 @@ Graphics::UniquePtr<UniformBufferView> UniformBufferViewPool::CreateUniformBuffe
   }
 
   // resize Ubo if needed
-  if( newOffset >= mUniformBufferStorage->GetSize())
+  if(newOffset >= mUniformBufferStorage->GetSize())
   {
     // move offset to the new buffer
     mCurrentOffset = mUniformBufferStorage->GetSize();
-    newOffset = ((mCurrentOffset + size) / mAlignment) * mAlignment;
-
-    // Adjust current offset so the view doesn't intersect multiple buffers
-    auto prevSize = mUniformBufferStorage->GetSize();
-    if(mCurrentOffset + size >= prevSize )
+    newOffset      = ((mCurrentOffset + size) / mAlignment) * mAlignment;
+    if(mAlignment > 1 && newOffset < mCurrentOffset + size)
     {
-      mCurrentOffset = prevSize;
-      newOffset = ((mCurrentOffset + size) / mAlignment) * mAlignment;
+      newOffset += mAlignment;
     }
-    mUniformBufferStorage->Resize( mUniformBufferStorage->GetSize()+DEFAULT_UBO_PAGE_SIZE, false );
+
+    size_t increaseBufferStorageSize = DALI_LIKELY(size > 0) ? ((size - 1) / DEFAULT_UBO_PAGE_SIZE + 1) * DEFAULT_UBO_PAGE_SIZE : DEFAULT_UBO_PAGE_SIZE;
+
+    mUniformBufferStorage->Resize(mUniformBufferStorage->GetSize() + increaseBufferStorageSize, false);
   }
 
   // create buffer view from
@@ -90,4 +89,14 @@ Graphics::UniquePtr<UniformBufferView> UniformBufferViewPool::CreateUniformBuffe
   return uboView;
 }
 
+void UniformBufferViewPool::ReadyToLockUniformBuffer()
+{
+  mUniformBufferStorage->ReadyToLockUniformBuffer();
+}
+
+void UniformBufferViewPool::UnlockUniformBuffer()
+{
+  mUniformBufferStorage->UnlockUniformBuffer();
+}
+
 } // namespace Dali::Internal::Render
\ No newline at end of file