From 1dab45f4075e0d10c027d2709f4b274109a3beb2 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 22 Jun 2022 23:08:39 +0200 Subject: [PATCH] Add support for renaming GPU resources (development builds only) --- Source/Engine/Graphics/GPUDevice.cpp | 18 ++++++++----- Source/Engine/Graphics/GPUResource.h | 27 ++++++++----------- Source/Engine/Graphics/GPUSwapChain.cpp | 16 ++++++++++- Source/Engine/Graphics/GPUSwapChain.h | 12 ++------- .../Engine/Graphics/Textures/GPUTexture.cpp | 4 +-- .../Graphics/Textures/StreamingTexture.cpp | 2 +- .../GraphicsDevice/DirectX/RenderToolsDX.h | 11 ++++---- 7 files changed, 49 insertions(+), 41 deletions(-) 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;