Renderer: Fix UploadPool allocations references
This commit is contained in:
parent
aeac3282e4
commit
bbfe06c443
|
|
@ -11,7 +11,8 @@
|
|||
#include <Nazara/Core/MovablePtr.hpp>
|
||||
#include <Nazara/OpenGLRenderer/Config.hpp>
|
||||
#include <Nazara/Renderer/UploadPool.hpp>
|
||||
#include <optional>
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace Nz
|
||||
|
|
@ -33,14 +34,19 @@ namespace Nz
|
|||
OpenGLUploadPool& operator=(OpenGLUploadPool&&) = delete;
|
||||
|
||||
private:
|
||||
static constexpr std::size_t AllocationPerBlock = 2048;
|
||||
|
||||
using AllocationBlock = std::array<Allocation, AllocationPerBlock>;
|
||||
|
||||
struct Block
|
||||
{
|
||||
std::vector<UInt8> memory;
|
||||
UInt64 freeOffset = 0;
|
||||
};
|
||||
|
||||
std::size_t m_nextAllocationIndex;
|
||||
std::vector<std::unique_ptr<AllocationBlock>> m_allocationBlocks;
|
||||
std::vector<Block> m_blocks;
|
||||
std::vector<Allocation> m_allocations;
|
||||
UInt64 m_blockSize;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@
|
|||
namespace Nz
|
||||
{
|
||||
inline OpenGLUploadPool::OpenGLUploadPool(UInt64 blockSize) :
|
||||
m_blockSize(blockSize)
|
||||
m_blockSize(blockSize),
|
||||
m_nextAllocationIndex(0)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,6 +40,10 @@ namespace Nz
|
|||
VulkanUploadPool& operator=(VulkanUploadPool&&) = delete;
|
||||
|
||||
private:
|
||||
static constexpr std::size_t AllocationPerBlock = 2048;
|
||||
|
||||
using AllocationBlock = std::array<VulkanAllocation, AllocationPerBlock>;
|
||||
|
||||
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<std::unique_ptr<AllocationBlock>> m_allocationBlocks;
|
||||
std::vector<Block> m_blocks;
|
||||
std::vector<VulkanAllocation> m_allocations;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<AllocationBlock>());
|
||||
}
|
||||
|
||||
auto& allocationBlock = *m_allocationBlocks[allocationBlockIndex];
|
||||
|
||||
Allocation& allocationData = allocationBlock[allocationIndex];
|
||||
allocationData.mappedPtr = static_cast<UInt8*>(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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<AllocationBlock>());
|
||||
}
|
||||
|
||||
auto& allocationBlock = *m_allocationBlocks[allocationBlockIndex];
|
||||
|
||||
VulkanAllocation& allocationData = allocationBlock[allocationIndex];
|
||||
allocationData.buffer = bestBlock.block->buffer;
|
||||
allocationData.mappedPtr = static_cast<UInt8*>(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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue