Optimize memory allocations in Vulkan backend
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user