[Tizen] Clean initialization and shutdown of UniformBufferManager 13/308913/1
authorDavid Steele <david.steele@samsung.com>
Wed, 20 Mar 2024 17:44:54 +0000 (17:44 +0000)
committerEunki Hong <eunkiki.hong@samsung.com>
Tue, 2 Apr 2024 16:12:31 +0000 (01:12 +0900)
Ensure all unique ptrs are null initialized
Clean down UBO buffers in UpdateRender thread ContextDestroyed,
rather than waiting to clean down in event thread.

Change-Id: I95a14be51e91230612d1a08808f8b151691328c3
Signed-off-by: David Steele <david.steele@samsung.com>
dali/internal/common/core-impl.cpp
dali/internal/render/common/render-manager.cpp
dali/internal/render/common/render-manager.h
dali/internal/render/renderers/uniform-buffer-manager.cpp
dali/internal/render/renderers/uniform-buffer-manager.h
dali/internal/render/renderers/uniform-buffer.cpp
dali/internal/render/renderers/uniform-buffer.h

index caa9cc1..3717aa7 100644 (file)
@@ -185,6 +185,7 @@ void Core::ContextCreated()
 
 void Core::ContextDestroyed()
 {
+  mRenderManager->ContextDestroyed();
 }
 
 void Core::Update(float elapsedSeconds, uint32_t lastVSyncTimeMilliseconds, uint32_t nextVSyncTimeMilliseconds, Integration::UpdateStatus& status, bool renderToFboEnabled, bool isRenderingToFbo, bool uploadOnly)
index 010fd32..44594ec 100644 (file)
@@ -234,6 +234,11 @@ RenderManager::~RenderManager()
   delete mImpl;
 }
 
+void RenderManager::ContextDestroyed()
+{
+  mImpl->uniformBufferManager->ContextDestroyed();
+}
+
 RenderQueue& RenderManager::GetRenderQueue()
 {
   return mImpl->renderQueue;
index 4d355cb..7e3ec33 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_RENDER_MANAGER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -85,6 +85,11 @@ public:
   ~RenderManager();
 
   /**
+   * The graphics context is being shutdown. Clean down any outstanding graphics resources.
+   */
+  void ContextDestroyed();
+
+  /**
    * Retrieve the RenderQueue. Messages should only be added to this from the update-thread.
    * @return The render queue.
    */
index 9ff8ee4..2cd8600 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -44,6 +44,13 @@ UniformBufferManager::UniformBufferManager(Dali::Graphics::Controller* controlle
 
 UniformBufferManager::~UniformBufferManager() = default;
 
+void UniformBufferManager::ContextDestroyed()
+{
+  mUBOMap.clear();
+  mCurrentUBOSet = nullptr;
+  mCurrentScene  = nullptr;
+}
+
 void UniformBufferManager::SetCurrentSceneRenderInfo(SceneGraph::Scene* scene, bool offscreen)
 {
   mCurrentSceneOffscreen = offscreen;
index fce57f6..c9f6903 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_UNIFORM_BUFFER_MANAGER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -45,6 +45,8 @@ public:
 
   ~UniformBufferManager();
 
+  void ContextDestroyed();
+
   Graphics::UniquePtr<UniformBufferView> CreateUniformBufferView(uint32_t size, bool emulated = true);
 
   /**
index a6c9502..99bdbf7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -42,6 +42,11 @@ UniformBufferV2::UniformBufferV2(Dali::Graphics::Controller* controller, bool em
   mEmulated(emulated)
 {
   mBufferList.resize(emulated ? 1 : INTERNAL_UBO_BUFFER_COUNT);
+  for(size_t i = 0; i < mBufferList.size(); ++i)
+  {
+    mBufferList[i].graphicsBuffer = nullptr;
+    mBufferList[i].graphicsMemory = nullptr;
+  }
 }
 
 void UniformBufferV2::ReSpecify(uint32_t sizeInBytes)
@@ -114,6 +119,7 @@ void UniformBufferV2::Flush()
     // Swap buffers for GPU UBOs
     auto s                      = mBufferList.size();
     mCurrentGraphicsBufferIndex = ((mCurrentGraphicsBufferIndex + 1) % s);
+    DALI_ASSERT_DEBUG(mCurrentGraphicsBufferIndex < mBufferList.size());
   }
 }
 
index 0ff24b9..2b5396c 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_UNIFORM_BUFFER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -106,17 +106,17 @@ private:
 
   struct GfxBuffer
   {
-    Graphics::UniquePtr<Graphics::Buffer> graphicsBuffer;
-    Graphics::UniquePtr<Graphics::Memory> graphicsMemory;
-    uint32_t                              capacity;
-    uint32_t                              currentOffset;
+    Graphics::UniquePtr<Graphics::Buffer> graphicsBuffer{nullptr};
+    Graphics::UniquePtr<Graphics::Memory> graphicsMemory{nullptr};
+    uint32_t                              capacity{0};
+    uint32_t                              currentOffset{0};
   };
 
   // List of buffers, in case of CPU one buffer will be sufficient
   std::vector<GfxBuffer> mBufferList;
   void*                  mMappedPtr{nullptr};
   uint32_t               mCurrentGraphicsBufferIndex{0u};
-  bool                   mEmulated;
+  bool                   mEmulated{false};
 };
 } // namespace Dali::Internal::Render
 #endif //DALI_INTERNAL_UNIFORM_BUFFER_H