From f2c594569d37aac0bf729626ebffa0bed731dfd8 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Wed, 7 Dec 2022 15:32:23 +0100 Subject: [PATCH] Remove `GPUResourcesCollection` and use `GPUDevice` instead to simplify code --- Source/Engine/Graphics/GPUDevice.cpp | 89 ++++++++++++++- Source/Engine/Graphics/GPUDevice.h | 25 +++-- Source/Engine/Graphics/GPUResource.h | 4 +- .../Graphics/GPUResourcesCollection.cpp | 101 ------------------ .../Engine/Graphics/GPUResourcesCollection.h | 71 ------------ 5 files changed, 105 insertions(+), 185 deletions(-) delete mode 100644 Source/Engine/Graphics/GPUResourcesCollection.cpp delete mode 100644 Source/Engine/Graphics/GPUResourcesCollection.h diff --git a/Source/Engine/Graphics/GPUDevice.cpp b/Source/Engine/Graphics/GPUDevice.cpp index 133aed0bb..22b0c84fd 100644 --- a/Source/Engine/Graphics/GPUDevice.cpp +++ b/Source/Engine/Graphics/GPUDevice.cpp @@ -10,18 +10,19 @@ #include "Shaders/GPUShader.h" #include "Async/DefaultGPUTasksExecutor.h" #include "Async/GPUTasksManager.h" +#include "Engine/Core/Log.h" +#include "Engine/Core/Utilities.h" +#include "Engine/Core/Types/StringBuilder.h" #include "Engine/Content/Assets/Shader.h" #include "Engine/Content/Assets/Material.h" #include "Engine/Content/Content.h" #include "Engine/Content/SoftAssetReference.h" -#include "Engine/Core/Log.h" #include "Engine/Render2D/Render2D.h" #include "Engine/Engine/CommandLine.h" #include "Engine/Engine/Engine.h" #include "Engine/Engine/EngineService.h" #include "Engine/Profiler/Profiler.h" #include "Engine/Renderer/RenderList.h" -#include "Engine/Core/Utilities.h" GPUPipelineState* GPUPipelineState::Spawn(const SpawnParams& params) { @@ -280,6 +281,7 @@ GPUDevice::GPUDevice(RendererType type, ShaderProfile profile) , _shaderProfile(profile) , _featureLevel(RenderTools::GetFeatureLevel(profile)) , _res(New()) + , _resources(1024) , TotalGraphicsMemory(0) , QuadShader(nullptr) , CurrentTask(nullptr) @@ -367,8 +369,69 @@ bool GPUDevice::CanDraw() return true; } +void GPUDevice::AddResource(GPUResource* resource) +{ + Locker.Lock(); + ASSERT(resource && !_resources.Contains(resource)); + _resources.Add(resource); + Locker.Unlock(); +} + +void GPUDevice::RemoveResource(GPUResource* resource) +{ + Locker.Lock(); + ASSERT(resource && _resources.Contains(resource)); + _resources.Remove(resource); + Locker.Unlock(); +} + +void GPUDevice::DumpResourcesToLog() const +{ + StringBuilder output; + Locker.Lock(); + + output.AppendFormat(TEXT("GPU Resources dump. Count: {0}, total GPU memory used: {1}"), _resources.Count(), Utilities::BytesToText(GetMemoryUsage())); + output.AppendLine(); + output.AppendLine(); + + for (int32 typeIndex = 0; typeIndex < GPUResource::ResourceType_Count; typeIndex++) + { + const auto type = static_cast(typeIndex); + + output.AppendFormat(TEXT("Group: {0}s"), GPUResource::ToString(type)); + output.AppendLine(); + + int32 count = 0; + uint64 memUsage = 0; + for (int32 i = 0; i < _resources.Count(); i++) + { + const GPUResource* resource = _resources[i]; + if (resource->GetResourceType() == type) + { + count++; + memUsage += resource->GetMemoryUsage(); + auto str = resource->ToString(); + if (str.HasChars()) + { + output.Append(TEXT('\t')); + output.Append(str); + output.AppendLine(); + } + } + } + + output.AppendFormat(TEXT("Total count: {0}, memory usage: {1}"), count, Utilities::BytesToText(memUsage)); + output.AppendLine(); + output.AppendLine(); + } + + Locker.Unlock(); + LOG_STR(Info, output.ToStringView()); +} + void GPUDevice::preDispose() { + Locker.Lock(); RenderTargetPool::Flush(); // Release resources @@ -383,7 +446,12 @@ void GPUDevice::preDispose() // Release GPU resources memory and unlink from device // Note: after that no GPU resources should be used/created, only deleted - Resources.OnDeviceDispose(); + for (int32 i = _resources.Count() - 1; i >= 0 && i < _resources.Count(); i--) + { + _resources[i]->OnDeviceDispose(); + } + _resources.Clear(); + Locker.Unlock(); } void GPUDevice::DrawBegin() @@ -520,7 +588,20 @@ void GPUDevice::Dispose() uint64 GPUDevice::GetMemoryUsage() const { - return Resources.GetMemoryUsage(); + uint64 result = 0; + Locker.Lock(); + for (int32 i = 0; i < _resources.Count(); i++) + result += _resources[i]->GetMemoryUsage(); + Locker.Unlock(); + return result; +} + +Array GPUDevice::GetResources() const +{ + Locker.Lock(); + Array result = _resources; + Locker.Unlock(); + return result; } GPUTasksManager* GPUDevice::GetTasksManager() const diff --git a/Source/Engine/Graphics/GPUDevice.h b/Source/Engine/Graphics/GPUDevice.h index cae2e86dc..890770683 100644 --- a/Source/Engine/Graphics/GPUDevice.h +++ b/Source/Engine/Graphics/GPUDevice.h @@ -3,10 +3,11 @@ #pragma once #include "Engine/Platform/Platform.h" +#include "Engine/Platform/CriticalSection.h" #include "Engine/Core/Enums.h" #include "Engine/Core/NonCopyable.h" +#include "Engine/Core/Collections/Array.h" #include "Engine/Scripting/ScriptingObject.h" -#include "GPUResourcesCollection.h" #include "GPUAdapter.h" #include "GPULimits.h" #include "Enums.h" @@ -14,6 +15,7 @@ class ITextureOwner; class RenderTask; +class GPUResource; class GPUContext; class GPUShader; class GPUTimerQuery; @@ -84,6 +86,7 @@ protected: // Private resources (hidden with declaration) struct PrivateData; PrivateData* _res; + Array _resources; protected: /// @@ -105,12 +108,6 @@ public: /// CriticalSection Locker; - /// - /// The GPU resources collection. - /// - GPUResourcesCollection Resources; - -public: /// /// The total amount of graphics memory in bytes. /// @@ -220,6 +217,11 @@ public: /// API_PROPERTY() uint64 GetMemoryUsage() const; + /// + /// Gets the list with all active GPU resources. + /// + API_PROPERTY() Array GetResources() const; + /// /// Gets the GPU asynchronous work manager. /// @@ -299,6 +301,15 @@ public: /// virtual void WaitForGPU() = 0; +public: + void AddResource(GPUResource* resource); + void RemoveResource(GPUResource* resource); + + /// + /// Dumps all GPU resources information to the log. + /// + void DumpResourcesToLog() const; + protected: virtual void preDispose(); diff --git a/Source/Engine/Graphics/GPUResource.h b/Source/Engine/Graphics/GPUResource.h index 9b4a94cd1..e07b3e7bd 100644 --- a/Source/Engine/Graphics/GPUResource.h +++ b/Source/Engine/Graphics/GPUResource.h @@ -137,7 +137,7 @@ public: #if GPU_ENABLE_RESOURCE_NAMING GPUResource::_name = name; #endif - device->Resources.Add(this); + device->AddResource(this); } /// @@ -146,7 +146,7 @@ public: virtual ~GPUResourceBase() { if (_device) - _device->Resources.Remove(this); + _device->RemoveResource(this); } public: diff --git a/Source/Engine/Graphics/GPUResourcesCollection.cpp b/Source/Engine/Graphics/GPUResourcesCollection.cpp deleted file mode 100644 index 69263aa51..000000000 --- a/Source/Engine/Graphics/GPUResourcesCollection.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. - -#include "GPUResourcesCollection.h" -#include "GPUResource.h" -#include "Engine/Core/Log.h" -#include "Engine/Core/Types/StringBuilder.h" -#include "Engine/Core/Utilities.h" - -uint64 GPUResourcesCollection::GetMemoryUsage() const -{ - uint64 result = 0; - _locker.Lock(); - - for (int32 i = 0; i < _collection.Count(); i++) - result += _collection[i]->GetMemoryUsage(); - - _locker.Unlock(); - return result; -} - -void GPUResourcesCollection::OnDeviceDispose() -{ - _locker.Lock(); - - for (int32 i = _collection.Count() - 1; i >= 0 && i < _collection.Count(); i--) - { - _collection[i]->OnDeviceDispose(); - } - _collection.Clear(); - - _locker.Unlock(); -} - -void GPUResourcesCollection::DumpToLog() const -{ - StringBuilder sb; - DumpToLog(sb); - LOG_STR(Info, sb.ToString()); -} - -void GPUResourcesCollection::DumpToLog(StringBuilder& output) const -{ - _locker.Lock(); - - output.AppendFormat(TEXT("GPU Resources dump. Count: {0}, total GPU memory used: {1}"), _collection.Count(), Utilities::BytesToText(GetMemoryUsage())); - output.AppendLine(); - output.AppendLine(); - - for (int32 typeIndex = 0; typeIndex < GPUResource::ResourceType_Count; typeIndex++) - { - const auto type = static_cast(typeIndex); - - output.AppendFormat(TEXT("Group: {0}s"), GPUResource::ToString(type)); - output.AppendLine(); - - int32 count = 0; - uint64 memUsage = 0; - for (int32 i = 0; i < _collection.Count(); i++) - { - const auto resource = _collection[i]; - if (resource->GetResourceType() == type) - { - count++; - memUsage += resource->GetMemoryUsage(); - auto str = resource->ToString(); - if (str.HasChars()) - { - output.Append(TEXT('\t')); - output.Append(str); - output.AppendLine(); - } - } - } - - output.AppendFormat(TEXT("Total count: {0}, memory usage: {1}"), count, Utilities::BytesToText(memUsage)); - output.AppendLine(); - output.AppendLine(); - } - - _locker.Unlock(); -} - -void GPUResourcesCollection::Add(GPUResource* resource) -{ - _locker.Lock(); - - ASSERT(resource && _collection.Contains(resource) == false); - _collection.Add(resource); - - _locker.Unlock(); -} - -void GPUResourcesCollection::Remove(GPUResource* resource) -{ - _locker.Lock(); - - ASSERT(resource && _collection.Contains(resource) == true); - _collection.Remove(resource); - - _locker.Unlock(); -} diff --git a/Source/Engine/Graphics/GPUResourcesCollection.h b/Source/Engine/Graphics/GPUResourcesCollection.h deleted file mode 100644 index e285cbea3..000000000 --- a/Source/Engine/Graphics/GPUResourcesCollection.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. - -#pragma once - -#include "Engine/Core/Collections/Array.h" -#include "Engine/Platform/Platform.h" -#include "Engine/Platform/CriticalSection.h" - -class GPUResource; -class StringBuilder; - -/// -/// GPU Resources collection container -/// -class GPUResourcesCollection -{ -private: - CriticalSection _locker; - Array _collection; - -public: - /// - /// Initializes a new instance of the class. - /// - GPUResourcesCollection() - : _collection(1024) - { - } - - /// - /// Finalizes an instance of the class. - /// - ~GPUResourcesCollection() - { - } - -public: - /// - /// Gets the total memory usage (in bytes). - /// - /// GPU memory usage (in bytes). - uint64 GetMemoryUsage() const; - - /// - /// Called when device is being disposed. - /// - void OnDeviceDispose(); - - /// - /// Dumps all resources information to the log. - /// - void DumpToLog() const; - - /// - /// Dumps all resources information to the log. - /// - void DumpToLog(StringBuilder& output) const; - -public: - /// - /// Adds the specified resource to the collection. - /// - /// The resource. - void Add(GPUResource* resource); - - /// - /// Removes the specified resource from the collection. - /// - /// The resource. - void Remove(GPUResource* resource); -};