diff --git a/Source/Engine/Graphics/GPUDevice.cpp b/Source/Engine/Graphics/GPUDevice.cpp
index 432acc548..27de419be 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 946c7f987..325528514 100644
--- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUBufferDX12.cpp
+++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUBufferDX12.cpp
@@ -174,7 +174,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);