OpenGL: Implement UploadPool
This commit is contained in:
parent
eba0571f03
commit
6073d8f592
|
|
@ -35,10 +35,12 @@ namespace Nz
|
|||
private:
|
||||
struct Block
|
||||
{
|
||||
//< TODO
|
||||
UInt64 freeOffset;
|
||||
std::vector<UInt8> memory;
|
||||
UInt64 freeOffset = 0;
|
||||
};
|
||||
|
||||
std::vector<Block> m_blocks;
|
||||
std::vector<Allocation> m_allocations;
|
||||
UInt64 m_blockSize;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,23 +11,56 @@ namespace Nz
|
|||
{
|
||||
auto OpenGLUploadPool::Allocate(UInt64 size) -> Allocation&
|
||||
{
|
||||
/*const auto& deviceProperties = m_device.GetPhysicalDeviceInfo().properties;
|
||||
UInt64 preferredAlignement = deviceProperties.limits.optimalBufferCopyOffsetAlignment;*/
|
||||
|
||||
return Allocate(size, 0); //< FIXME
|
||||
return Allocate(size, 1); //< Alignment doesn't matter
|
||||
}
|
||||
|
||||
auto OpenGLUploadPool::Allocate(UInt64 size, UInt64 alignment) -> Allocation&
|
||||
auto OpenGLUploadPool::Allocate(UInt64 size, UInt64 /*alignment*/) -> Allocation&
|
||||
{
|
||||
assert(size <= m_blockSize);
|
||||
|
||||
static Allocation dummy;
|
||||
return dummy;
|
||||
// Try to minimize lost space
|
||||
struct
|
||||
{
|
||||
Block* block = nullptr;
|
||||
UInt64 offset = 0;
|
||||
} bestBlock;
|
||||
|
||||
for (Block& block : m_blocks)
|
||||
{
|
||||
UInt64 alignedOffset = block.freeOffset;
|
||||
if (block.freeOffset + size > m_blockSize)
|
||||
continue; //< Not enough space
|
||||
|
||||
if (!bestBlock.block)
|
||||
{
|
||||
bestBlock.block = █
|
||||
bestBlock.offset = block.freeOffset;
|
||||
break; //< Since we have no alignment constraint, the first block is good
|
||||
}
|
||||
}
|
||||
|
||||
// No block found, allocate a new one
|
||||
if (!bestBlock.block)
|
||||
{
|
||||
Block newBlock;
|
||||
newBlock.memory.resize(m_blockSize);
|
||||
|
||||
bestBlock.block = &m_blocks.emplace_back(std::move(newBlock));
|
||||
bestBlock.offset = 0;
|
||||
}
|
||||
|
||||
Allocation& allocationData = m_allocations.emplace_back();
|
||||
allocationData.mappedPtr = static_cast<UInt8*>(bestBlock.block->memory.data()) + bestBlock.offset;
|
||||
allocationData.size = size;
|
||||
|
||||
return allocationData;
|
||||
}
|
||||
|
||||
void OpenGLUploadPool::Reset()
|
||||
{
|
||||
/*for (Block& block : m_blocks)
|
||||
block.freeOffset = 0;*/
|
||||
for (Block& block : m_blocks)
|
||||
block.freeOffset = 0;
|
||||
|
||||
m_allocations.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue