diff --git a/Source/Engine/Graphics/GPUDevice.cpp b/Source/Engine/Graphics/GPUDevice.cpp
index 51827397a..6a77fe858 100644
--- a/Source/Engine/Graphics/GPUDevice.cpp
+++ b/Source/Engine/Graphics/GPUDevice.cpp
@@ -184,8 +184,9 @@ GPUResource::GPUResource(const SpawnParams& params)
GPUResource::~GPUResource()
{
-#if !BUILD_RELEASE
- ASSERT(_memoryUsage == 0);
+#if !BUILD_RELEASE && GPU_ENABLE_RESOURCE_NAMING
+ if (_memoryUsage != 0)
+ LOG(Error, "{0} '{1}' has not been disposed before destruction", ScriptingObject::ToString(), _name);
#endif
}
@@ -203,7 +204,12 @@ uint64 GPUResource::GetMemoryUsage() const
String GPUResource::GetName() const
{
- return String::Empty;
+ return _name;
+}
+
+void GPUResource::SetName(const StringView& name)
+{
+ _name = name;
}
#endif
@@ -231,10 +237,10 @@ void GPUResource::OnReleaseGPU()
String GPUResource::ToString() const
{
#if GPU_ENABLE_RESOURCE_NAMING
- return GetName();
-#else
- return TEXT("GPU Resource");
+ if (_name.HasChars())
+ return _name;
#endif
+ return ScriptingObject::ToString();
}
void GPUResource::OnDeleteObject()
diff --git a/Source/Engine/Graphics/GPUResource.h b/Source/Engine/Graphics/GPUResource.h
index 19388999d..9b4a94cd1 100644
--- a/Source/Engine/Graphics/GPUResource.h
+++ b/Source/Engine/Graphics/GPUResource.h
@@ -31,6 +31,9 @@ public:
protected:
uint64 _memoryUsage = 0;
+#if GPU_ENABLE_RESOURCE_NAMING
+ String _name;
+#endif
public:
NON_COPYABLE(GPUResource);
@@ -77,12 +80,15 @@ public:
API_PROPERTY() uint64 GetMemoryUsage() const;
#if GPU_ENABLE_RESOURCE_NAMING
-
///
/// Gets the resource name.
///
- virtual String GetName() const;
+ API_PROPERTY() String GetName() const;
+ ///
+ /// Sets the resource name.
+ ///
+ API_PROPERTY() void SetName(const StringView& name);
#endif
///
@@ -119,11 +125,6 @@ class GPUResourceBase : public BaseType
protected:
DeviceType* _device;
-private:
-#if GPU_ENABLE_RESOURCE_NAMING
- String _name;
-#endif
-
public:
///
/// Initializes a new instance of the class.
@@ -132,10 +133,10 @@ public:
/// The resource name.
GPUResourceBase(DeviceType* device, const StringView& name) noexcept
: _device(device)
-#if GPU_ENABLE_RESOURCE_NAMING
- , _name(name.Get(), name.Length())
-#endif
{
+#if GPU_ENABLE_RESOURCE_NAMING
+ GPUResource::_name = name;
+#endif
device->Resources.Add(this);
}
@@ -159,12 +160,6 @@ public:
public:
// [GPUResource]
-#if GPU_ENABLE_RESOURCE_NAMING
- String GetName() const override
- {
- return _name;
- }
-#endif
void OnDeviceDispose() override
{
GPUResource::OnDeviceDispose();
diff --git a/Source/Engine/Graphics/GPUSwapChain.cpp b/Source/Engine/Graphics/GPUSwapChain.cpp
index 1409590e3..8dc7f0eee 100644
--- a/Source/Engine/Graphics/GPUSwapChain.cpp
+++ b/Source/Engine/Graphics/GPUSwapChain.cpp
@@ -42,7 +42,7 @@ Task* GPUSwapChain::DownloadDataAsync(TextureData& result)
return nullptr;
}
- auto texture = GPUDevice::Instance->CreateTexture(String::Empty);
+ auto texture = GPUDevice::Instance->CreateTexture();
if (texture->Init(GPUTextureDescription::New2D(GetWidth(), GetHeight(), GetFormat(), GPUTextureFlags::None, 1).ToStagingReadback()))
{
LOG(Warning, "Failed to create staging texture for the window swapchain backuffer download.");
@@ -84,3 +84,17 @@ void GPUSwapChain::Present(bool vsync)
// Count amount of present calls
_presentCount++;
}
+
+String GPUSwapChain::ToString() const
+{
+#if GPU_ENABLE_RESOURCE_NAMING
+ return String::Format(TEXT("SwapChain {0}x{1}, {2}"), GetWidth(), GetHeight(), GetName());
+#else
+ return TEXT("SwapChain");
+#endif
+}
+
+GPUResource::ResourceType GPUSwapChain::GetResourceType() const
+{
+ return ResourceType::Texture;
+}
diff --git a/Source/Engine/Graphics/GPUSwapChain.h b/Source/Engine/Graphics/GPUSwapChain.h
index 59dc760eb..97777cd6e 100644
--- a/Source/Engine/Graphics/GPUSwapChain.h
+++ b/Source/Engine/Graphics/GPUSwapChain.h
@@ -159,14 +159,6 @@ public:
public:
// [GPUResource]
- ResourceType GetResourceType() const final override
- {
- return ResourceType::Texture;
- }
-#if GPU_ENABLE_RESOURCE_NAMING
- String GetName() const override
- {
- return String::Format(TEXT("RenderOutput {0}x{1}"), GetWidth(), GetHeight());
- }
-#endif
+ String ToString() const override;
+ ResourceType GetResourceType() const final override;
};
diff --git a/Source/Engine/Graphics/Textures/GPUTexture.cpp b/Source/Engine/Graphics/Textures/GPUTexture.cpp
index c8c4d3a34..4cbe4ae60 100644
--- a/Source/Engine/Graphics/Textures/GPUTexture.cpp
+++ b/Source/Engine/Graphics/Textures/GPUTexture.cpp
@@ -211,12 +211,12 @@ uint32 GetHash(const GPUTextureDescription& key)
GPUTexture* GPUTexture::Spawn(const SpawnParams& params)
{
- return GPUDevice::Instance->CreateTexture(String::Empty);
+ return GPUDevice::Instance->CreateTexture();
}
GPUTexture* GPUTexture::New()
{
- return GPUDevice::Instance->CreateTexture(String::Empty);
+ return GPUDevice::Instance->CreateTexture();
}
GPUTexture::GPUTexture()
diff --git a/Source/Engine/Graphics/Textures/StreamingTexture.cpp b/Source/Engine/Graphics/Textures/StreamingTexture.cpp
index 8d78be57b..7fde015df 100644
--- a/Source/Engine/Graphics/Textures/StreamingTexture.cpp
+++ b/Source/Engine/Graphics/Textures/StreamingTexture.cpp
@@ -267,7 +267,7 @@ Task* StreamingTexture::UpdateAllocation(int32 residency)
#if GPU_ENABLE_RESOURCE_NAMING
texture = GPUDevice::Instance->CreateTexture(_texture->GetName());
#else
- texture = GPUDevice::Instance->CreateTexture(String::Empty);
+ texture = GPUDevice::Instance->CreateTexture();
#endif
}
diff --git a/Source/Engine/GraphicsDevice/DirectX/RenderToolsDX.h b/Source/Engine/GraphicsDevice/DirectX/RenderToolsDX.h
index 0dfcef1ff..e12ff45a3 100644
--- a/Source/Engine/GraphicsDevice/DirectX/RenderToolsDX.h
+++ b/Source/Engine/GraphicsDevice/DirectX/RenderToolsDX.h
@@ -213,18 +213,19 @@ namespace RenderToolsDX
{
HRESULT reason = S_OK;
const RendererType rendererType = GPUDevice::Instance ? GPUDevice::Instance->GetRendererType() : RendererType::Unknown;
+ void* nativePtr = GPUDevice::Instance ? GPUDevice::Instance->GetNativePtr() : nullptr;
#if GRAPHICS_API_DIRECTX12
- if (rendererType == RendererType::DirectX12)
+ if (rendererType == RendererType::DirectX12 && nativePtr)
{
- reason = ((ID3D12Device*)GPUDevice::Instance->GetNativePtr())->GetDeviceRemovedReason();
+ reason = ((ID3D12Device*)nativePtr)->GetDeviceRemovedReason();
}
#endif
#if GRAPHICS_API_DIRECTX11
- if (rendererType == RendererType::DirectX11 ||
+ if ((rendererType == RendererType::DirectX11 ||
rendererType == RendererType::DirectX10_1 ||
- rendererType == RendererType::DirectX10)
+ rendererType == RendererType::DirectX10) && nativePtr)
{
- reason = ((ID3D11Device*)GPUDevice::Instance->GetNativePtr())->GetDeviceRemovedReason();
+ reason = ((ID3D11Device*)nativePtr)->GetDeviceRemovedReason();
}
#endif
const Char* reasonStr = nullptr;