From 1e046c00333fe3799e63663acc01147cff107d33 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Fri, 6 Jan 2023 08:56:03 +0100 Subject: [PATCH] Optimize GPU Resource name to prevent memory allocs when changing name frequently --- Source/Engine/Graphics/GPUDevice.cpp | 28 +++++++++++++++---- Source/Engine/Graphics/GPUResource.h | 7 +++-- Source/Engine/Graphics/GPUSwapChain.cpp | 2 +- .../DirectX/DX12/GPUBufferDX12.cpp | 2 +- .../GraphicsDevice/Vulkan/GPUBufferVulkan.cpp | 2 +- 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/Source/Engine/Graphics/GPUDevice.cpp b/Source/Engine/Graphics/GPUDevice.cpp index 16f13d522..6332aa9e1 100644 --- a/Source/Engine/Graphics/GPUDevice.cpp +++ b/Source/Engine/Graphics/GPUDevice.cpp @@ -195,7 +195,11 @@ GPUResource::~GPUResource() { #if !BUILD_RELEASE && GPU_ENABLE_RESOURCE_NAMING if (_memoryUsage != 0) - LOG(Error, "{0} '{1}' has not been disposed before destruction", ScriptingObject::ToString(), _name); + LOG(Error, "{0} '{1}' has not been disposed before destruction", ScriptingObject::ToString(), GetName()); +#endif +#if GPU_ENABLE_RESOURCE_NAMING + if (_namePtr) + Platform::Free(_namePtr); #endif } @@ -208,14 +212,26 @@ static_assert((GPU_ENABLE_RESOURCE_NAMING) == (!BUILD_RELEASE), "Update build co #if GPU_ENABLE_RESOURCE_NAMING -String GPUResource::GetName() const +StringView GPUResource::GetName() const { - return _name; + return StringView(_namePtr, _nameSize); } void GPUResource::SetName(const StringView& name) { - _name = name; + if (_nameCapacity < name.Length() + 1) + { + if (_namePtr) + Platform::Free(_namePtr); + _nameCapacity = name.Length() + 1; + _namePtr = (Char*)Platform::Allocate(_nameCapacity * sizeof(Char), 16); + } + _nameSize = name.Length(); + if (name.HasChars()) + { + Platform::MemoryCopy(_namePtr, name.Get(), _nameSize * sizeof(Char)); + _namePtr[_nameSize] = 0; + } } #endif @@ -243,8 +259,8 @@ void GPUResource::OnReleaseGPU() String GPUResource::ToString() const { #if GPU_ENABLE_RESOURCE_NAMING - if (_name.HasChars()) - return _name; + if (_namePtr) + return String(_namePtr, _nameSize); #endif return ScriptingObject::ToString(); } diff --git a/Source/Engine/Graphics/GPUResource.h b/Source/Engine/Graphics/GPUResource.h index 5e27d679b..434220fa7 100644 --- a/Source/Engine/Graphics/GPUResource.h +++ b/Source/Engine/Graphics/GPUResource.h @@ -49,7 +49,8 @@ API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API GPUResource : public Scripting protected: uint64 _memoryUsage = 0; #if GPU_ENABLE_RESOURCE_NAMING - String _name; + Char* _namePtr = nullptr; + int32 _nameSize = 0, _nameCapacity = 0; #endif public: @@ -95,7 +96,7 @@ public: /// /// Gets the resource name. /// - API_PROPERTY() String GetName() const; + API_PROPERTY() StringView GetName() const; /// /// Sets the resource name. @@ -149,7 +150,7 @@ public: { #if GPU_ENABLE_RESOURCE_NAMING if (name.HasChars()) - GPUResource::_name = name; + GPUResource::SetName(name); #endif device->AddResource(this); } diff --git a/Source/Engine/Graphics/GPUSwapChain.cpp b/Source/Engine/Graphics/GPUSwapChain.cpp index 43a2582ca..31f751fcb 100644 --- a/Source/Engine/Graphics/GPUSwapChain.cpp +++ b/Source/Engine/Graphics/GPUSwapChain.cpp @@ -38,7 +38,7 @@ public: GPUSwapChain::GPUSwapChain() { #if GPU_ENABLE_RESOURCE_NAMING - _name = TEXT("Swap Chain (backbuffers)"); + SetName(TEXT("Swap Chain (backbuffers)")); #endif } diff --git a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUBufferDX12.cpp b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUBufferDX12.cpp index e13f30dc8..b82dbd9fd 100644 --- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUBufferDX12.cpp +++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUBufferDX12.cpp @@ -175,7 +175,7 @@ bool GPUBufferDX12::OnInit() if (_desc.Flags & GPUBufferFlags::Counter || _desc.Flags & GPUBufferFlags::Append) { #if GPU_ENABLE_RESOURCE_NAMING - String name = GetName() + TEXT(".Counter"); + String name = String(GetName()) + TEXT(".Counter"); _counter = ::New(_device, name); #else _counter = ::New(_device, String::Empty); diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp index e4e432f98..bfc88c14c 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp @@ -165,7 +165,7 @@ bool GPUBufferVulkan::OnInit() if (_desc.Flags & GPUBufferFlags::Counter || _desc.Flags & GPUBufferFlags::Append) { #if GPU_ENABLE_RESOURCE_NAMING - String name = GetName() + TEXT(".Counter"); + String name = String(GetName()) + TEXT(".Counter"); Counter = ::New(_device, name); #else Counter = ::New(_device, StringView::Empty);