Optimize memory allocations in Vulkan backend

This commit is contained in:
Wojtek Figat
2021-07-29 12:39:21 +02:00
parent 5186cec942
commit 38249c362d
3 changed files with 12 additions and 68 deletions

View File

@@ -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)

View File

@@ -413,18 +413,11 @@ class StagingManagerVulkan
{
private:
struct PendingItems
{
uint64 FenceCounter;
Array<GPUBuffer*> Resources;
};
struct PendingItemsPerCmdBuffer
struct PendingEntry
{
GPUBuffer* Buffer;
CmdBufferVulkan* CmdBuffer;
Array<PendingItems> Items;
inline PendingItems* FindOrAdd(uint64 fence);
uint64 FenceCounter;
};
struct FreeEntry
@@ -437,7 +430,7 @@ private:
CriticalSection _locker;
Array<GPUBuffer*> _allBuffers;
Array<FreeEntry> _freeBuffers;
Array<PendingItemsPerCmdBuffer> _pendingBuffers;
Array<PendingEntry> _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);
};
/// <summary>

View File

@@ -35,7 +35,7 @@ void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores,
submitInfo.signalSemaphoreCount = numSignalSemaphores;
submitInfo.pSignalSemaphores = signalSemaphores;
Array<VkSemaphore> waitSemaphores;
Array<VkSemaphore, InlinedAllocation<8>> waitSemaphores;
if (cmdBuffer->_waitSemaphores.HasItems())
{
waitSemaphores.EnsureCapacity((uint32)cmdBuffer->_waitSemaphores.Count());