From bbfe06c443349afd12665c2d0285d004498bc909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 14 May 2021 01:56:32 +0200 Subject: [PATCH] Renderer: Fix UploadPool allocations references --- .../Nazara/OpenGLRenderer/OpenGLUploadPool.hpp | 10 ++++++++-- .../Nazara/OpenGLRenderer/OpenGLUploadPool.inl | 3 ++- .../Nazara/VulkanRenderer/VulkanUploadPool.hpp | 7 ++++++- .../Nazara/VulkanRenderer/VulkanUploadPool.inl | 3 ++- src/Nazara/OpenGLRenderer/OpenGLUploadPool.cpp | 17 +++++++++++++++-- src/Nazara/VulkanRenderer/VulkanUploadPool.cpp | 17 +++++++++++++++-- 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/include/Nazara/OpenGLRenderer/OpenGLUploadPool.hpp b/include/Nazara/OpenGLRenderer/OpenGLUploadPool.hpp index cd7a71db3..5fed9397d 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLUploadPool.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLUploadPool.hpp @@ -11,7 +11,8 @@ #include #include #include -#include +#include +#include #include namespace Nz @@ -33,14 +34,19 @@ namespace Nz OpenGLUploadPool& operator=(OpenGLUploadPool&&) = delete; private: + static constexpr std::size_t AllocationPerBlock = 2048; + + using AllocationBlock = std::array; + struct Block { std::vector memory; UInt64 freeOffset = 0; }; + std::size_t m_nextAllocationIndex; + std::vector> m_allocationBlocks; std::vector m_blocks; - std::vector m_allocations; UInt64 m_blockSize; }; } diff --git a/include/Nazara/OpenGLRenderer/OpenGLUploadPool.inl b/include/Nazara/OpenGLRenderer/OpenGLUploadPool.inl index afb35ba5f..2eb508b5b 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLUploadPool.inl +++ b/include/Nazara/OpenGLRenderer/OpenGLUploadPool.inl @@ -8,7 +8,8 @@ namespace Nz { inline OpenGLUploadPool::OpenGLUploadPool(UInt64 blockSize) : - m_blockSize(blockSize) + m_blockSize(blockSize), + m_nextAllocationIndex(0) { } } diff --git a/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp b/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp index ede6eb297..490f81084 100644 --- a/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp +++ b/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp @@ -40,6 +40,10 @@ namespace Nz VulkanUploadPool& operator=(VulkanUploadPool&&) = delete; private: + static constexpr std::size_t AllocationPerBlock = 2048; + + using AllocationBlock = std::array; + struct Block { Vk::DeviceMemory blockMemory; @@ -49,8 +53,9 @@ namespace Nz UInt64 m_blockSize; Vk::Device& m_device; + std::size_t m_nextAllocationIndex; + std::vector> m_allocationBlocks; std::vector m_blocks; - std::vector m_allocations; }; } diff --git a/include/Nazara/VulkanRenderer/VulkanUploadPool.inl b/include/Nazara/VulkanRenderer/VulkanUploadPool.inl index 0245b5513..6aa3d88aa 100644 --- a/include/Nazara/VulkanRenderer/VulkanUploadPool.inl +++ b/include/Nazara/VulkanRenderer/VulkanUploadPool.inl @@ -9,7 +9,8 @@ namespace Nz { inline VulkanUploadPool::VulkanUploadPool(Vk::Device& device, UInt64 blockSize) : m_blockSize(blockSize), - m_device(device) + m_device(device), + m_nextAllocationIndex(0) { } } diff --git a/src/Nazara/OpenGLRenderer/OpenGLUploadPool.cpp b/src/Nazara/OpenGLRenderer/OpenGLUploadPool.cpp index 6387f4ca5..92427f7d8 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLUploadPool.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLUploadPool.cpp @@ -48,11 +48,24 @@ namespace Nz bestBlock.offset = 0; } - Allocation& allocationData = m_allocations.emplace_back(); + // Now find the proper allocation buffer + std::size_t allocationBlockIndex = m_nextAllocationIndex / AllocationPerBlock; + std::size_t allocationIndex = m_nextAllocationIndex % AllocationPerBlock; + + if (allocationBlockIndex >= m_allocationBlocks.size()) + { + assert(allocationBlockIndex == m_allocationBlocks.size()); + m_allocationBlocks.emplace_back(std::make_unique()); + } + + auto& allocationBlock = *m_allocationBlocks[allocationBlockIndex]; + + Allocation& allocationData = allocationBlock[allocationIndex]; allocationData.mappedPtr = static_cast(bestBlock.block->memory.data()) + bestBlock.offset; allocationData.size = size; bestBlock.block->freeOffset += size; + m_nextAllocationIndex++; return allocationData; } @@ -62,6 +75,6 @@ namespace Nz for (Block& block : m_blocks) block.freeOffset = 0; - m_allocations.clear(); + m_nextAllocationIndex = 0; } } diff --git a/src/Nazara/VulkanRenderer/VulkanUploadPool.cpp b/src/Nazara/VulkanRenderer/VulkanUploadPool.cpp index 3949104f4..3da028846 100644 --- a/src/Nazara/VulkanRenderer/VulkanUploadPool.cpp +++ b/src/Nazara/VulkanRenderer/VulkanUploadPool.cpp @@ -68,13 +68,26 @@ namespace Nz bestBlock.lostSpace = 0; } - VulkanAllocation& allocationData = m_allocations.emplace_back(); + // Now find the proper allocation buffer + std::size_t allocationBlockIndex = m_nextAllocationIndex / AllocationPerBlock; + std::size_t allocationIndex = m_nextAllocationIndex % AllocationPerBlock; + + if (allocationBlockIndex >= m_allocationBlocks.size()) + { + assert(allocationBlockIndex == m_allocationBlocks.size()); + m_allocationBlocks.emplace_back(std::make_unique()); + } + + auto& allocationBlock = *m_allocationBlocks[allocationBlockIndex]; + + VulkanAllocation& allocationData = allocationBlock[allocationIndex]; allocationData.buffer = bestBlock.block->buffer; allocationData.mappedPtr = static_cast(bestBlock.block->blockMemory.GetMappedPointer()) + bestBlock.alignedOffset; allocationData.offset = bestBlock.alignedOffset; allocationData.size = size; bestBlock.block->freeOffset += size; + m_nextAllocationIndex++; return allocationData; } @@ -84,6 +97,6 @@ namespace Nz for (Block& block : m_blocks) block.freeOffset = 0; - m_allocations.clear(); + m_nextAllocationIndex = 0; } }