From 9a48f12e3e6a02327df64dfb3820eb896d1a6aa3 Mon Sep 17 00:00:00 2001 From: David Steele Date: Wed, 20 Mar 2024 17:44:54 +0000 Subject: [PATCH] [Tizen] Clean initialization and shutdown of UniformBufferManager 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 --- dali/internal/common/core-impl.cpp | 1 + dali/internal/render/common/render-manager.cpp | 5 +++++ dali/internal/render/common/render-manager.h | 7 ++++++- dali/internal/render/renderers/uniform-buffer-manager.cpp | 9 ++++++++- dali/internal/render/renderers/uniform-buffer-manager.h | 4 +++- dali/internal/render/renderers/uniform-buffer.cpp | 8 +++++++- dali/internal/render/renderers/uniform-buffer.h | 12 ++++++------ 7 files changed, 36 insertions(+), 10 deletions(-) diff --git a/dali/internal/common/core-impl.cpp b/dali/internal/common/core-impl.cpp index caa9cc1..3717aa7 100644 --- a/dali/internal/common/core-impl.cpp +++ b/dali/internal/common/core-impl.cpp @@ -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) diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index 010fd32..44594ec 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -234,6 +234,11 @@ RenderManager::~RenderManager() delete mImpl; } +void RenderManager::ContextDestroyed() +{ + mImpl->uniformBufferManager->ContextDestroyed(); +} + RenderQueue& RenderManager::GetRenderQueue() { return mImpl->renderQueue; diff --git a/dali/internal/render/common/render-manager.h b/dali/internal/render/common/render-manager.h index 4d355cb..7e3ec33 100644 --- a/dali/internal/render/common/render-manager.h +++ b/dali/internal/render/common/render-manager.h @@ -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. */ diff --git a/dali/internal/render/renderers/uniform-buffer-manager.cpp b/dali/internal/render/renderers/uniform-buffer-manager.cpp index 9ff8ee4..2cd8600 100644 --- a/dali/internal/render/renderers/uniform-buffer-manager.cpp +++ b/dali/internal/render/renderers/uniform-buffer-manager.cpp @@ -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; diff --git a/dali/internal/render/renderers/uniform-buffer-manager.h b/dali/internal/render/renderers/uniform-buffer-manager.h index fce57f6..c9f6903 100644 --- a/dali/internal/render/renderers/uniform-buffer-manager.h +++ b/dali/internal/render/renderers/uniform-buffer-manager.h @@ -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 CreateUniformBufferView(uint32_t size, bool emulated = true); /** diff --git a/dali/internal/render/renderers/uniform-buffer.cpp b/dali/internal/render/renderers/uniform-buffer.cpp index a6c9502..99bdbf7 100644 --- a/dali/internal/render/renderers/uniform-buffer.cpp +++ b/dali/internal/render/renderers/uniform-buffer.cpp @@ -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()); } } diff --git a/dali/internal/render/renderers/uniform-buffer.h b/dali/internal/render/renderers/uniform-buffer.h index 0ff24b9..2b5396c 100644 --- a/dali/internal/render/renderers/uniform-buffer.h +++ b/dali/internal/render/renderers/uniform-buffer.h @@ -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 graphicsBuffer; - Graphics::UniquePtr graphicsMemory; - uint32_t capacity; - uint32_t currentOffset; + Graphics::UniquePtr graphicsBuffer{nullptr}; + Graphics::UniquePtr graphicsMemory{nullptr}; + uint32_t capacity{0}; + uint32_t currentOffset{0}; }; // List of buffers, in case of CPU one buffer will be sufficient std::vector mBufferList; void* mMappedPtr{nullptr}; uint32_t mCurrentGraphicsBufferIndex{0u}; - bool mEmulated; + bool mEmulated{false}; }; } // namespace Dali::Internal::Render #endif //DALI_INTERNAL_UNIFORM_BUFFER_H -- 2.7.4