From 38249c362d4a7130e45dad35f6fd0d123900eabe Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 29 Jul 2021 12:39:21 +0200 Subject: [PATCH] Optimize memory allocations in Vulkan backend --- .../GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp | 59 +++---------------- .../GraphicsDevice/Vulkan/GPUDeviceVulkan.h | 19 ++---- .../GraphicsDevice/Vulkan/QueueVulkan.cpp | 2 +- 3 files changed, 12 insertions(+), 68 deletions(-) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp index 27c2b4dc8..5cc1440d4 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp @@ -882,22 +882,6 @@ void HelperResourcesVulkan::Dispose() } } -StagingManagerVulkan::PendingItems* StagingManagerVulkan::PendingItemsPerCmdBuffer::FindOrAdd(uint64 fence) -{ - for (int32 i = 0; i < Items.Count(); i++) - { - if (Items[i].FenceCounter == fence) - { - return &Items[i]; - } - } - - const auto item = &Items.AddOne(); - item->FenceCounter = fence; - item->Resources.Clear(); - return item; -} - StagingManagerVulkan::StagingManagerVulkan(GPUDeviceVulkan* device) : _device(device) { @@ -951,9 +935,10 @@ void StagingManagerVulkan::ReleaseBuffer(CmdBufferVulkan* cmdBuffer, GPUBuffer*& if (cmdBuffer) { // Return to pending pool (need to wait until command buffer will be executed and buffer will be reusable) - auto items = FindOrAdd(cmdBuffer); - auto item = items->FindOrAdd(cmdBuffer->GetFenceSignaledCounter()); - item->Resources.Add(buffer); + auto& item = _pendingBuffers.AddOne(); + item.Buffer = buffer; + item.CmdBuffer = cmdBuffer; + item.FenceCounter = cmdBuffer->GetFenceSignaledCounter(); } else { @@ -973,24 +958,10 @@ void StagingManagerVulkan::ProcessPendingFree() for (int32 i = _pendingBuffers.Count() - 1; i >= 0; i--) { auto& e = _pendingBuffers[i]; - - for (int32 fenceIndex = e.Items.Count() - 1; fenceIndex >= 0; fenceIndex--) - { - auto& items = e.Items[fenceIndex]; - if (items.FenceCounter < e.CmdBuffer->GetFenceSignaledCounter()) - { - for (auto buffer : items.Resources) - { - // Return to pool - _freeBuffers.Add({ buffer, Engine::FrameCount }); - } - - e.Items.RemoveAt(fenceIndex); - } - } - - if (e.Items.IsEmpty()) + if (e.FenceCounter < e.CmdBuffer->GetFenceSignaledCounter()) { + // Return to pool + _freeBuffers.Add({ e.Buffer, Engine::FrameCount }); _pendingBuffers.RemoveAt(i); } } @@ -1039,22 +1010,6 @@ void StagingManagerVulkan::Dispose() _pendingBuffers.Resize(0); } -StagingManagerVulkan::PendingItemsPerCmdBuffer* StagingManagerVulkan::FindOrAdd(CmdBufferVulkan* cmdBuffer) -{ - for (int32 i = 0; i < _pendingBuffers.Count(); i++) - { - if (_pendingBuffers[i].CmdBuffer == cmdBuffer) - { - return &_pendingBuffers[i]; - } - } - - const auto item = &_pendingBuffers.AddOne(); - item->CmdBuffer = cmdBuffer; - item->Items.Clear(); - return item; -} - GPUDeviceVulkan::GPUDeviceVulkan(ShaderProfile shaderProfile, GPUAdapterVulkan* adapter) : GPUDevice(RendererType::Vulkan, shaderProfile) , _renderPasses(512) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.h b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.h index 32f64491e..ea0d4edff 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.h +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.h @@ -413,18 +413,11 @@ class StagingManagerVulkan { private: - struct PendingItems - { - uint64 FenceCounter; - Array Resources; - }; - - struct PendingItemsPerCmdBuffer + struct PendingEntry { + GPUBuffer* Buffer; CmdBufferVulkan* CmdBuffer; - Array Items; - - inline PendingItems* FindOrAdd(uint64 fence); + uint64 FenceCounter; }; struct FreeEntry @@ -437,7 +430,7 @@ private: CriticalSection _locker; Array _allBuffers; Array _freeBuffers; - Array _pendingBuffers; + Array _pendingBuffers; #if !BUILD_RELEASE uint64 _allBuffersTotalSize = 0; uint64 _allBuffersPeekSize = 0; @@ -452,10 +445,6 @@ public: void ReleaseBuffer(CmdBufferVulkan* cmdBuffer, GPUBuffer*& buffer); void ProcessPendingFree(); void Dispose(); - -private: - - PendingItemsPerCmdBuffer* FindOrAdd(CmdBufferVulkan* cmdBuffer); }; /// diff --git a/Source/Engine/GraphicsDevice/Vulkan/QueueVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/QueueVulkan.cpp index aef60c55f..9673f9adf 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/QueueVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/QueueVulkan.cpp @@ -35,7 +35,7 @@ void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores, submitInfo.signalSemaphoreCount = numSignalSemaphores; submitInfo.pSignalSemaphores = signalSemaphores; - Array waitSemaphores; + Array> waitSemaphores; if (cmdBuffer->_waitSemaphores.HasItems()) { waitSemaphores.EnsureCapacity((uint32)cmdBuffer->_waitSemaphores.Count());