optimize index buffers

This commit is contained in:
Samuliak 2024-07-30 19:27:52 +02:00
parent 0cb83d4668
commit be8a560496
5 changed files with 120 additions and 27 deletions

View file

@ -4,6 +4,8 @@
#include "Cafe/HW/Latte/ISA/LatteReg.h"
//const uint32 bufferAllocatorIndexShift = 24;
struct MetalBufferAllocation
{
void* data;
@ -11,16 +13,69 @@ struct MetalBufferAllocation
size_t bufferOffset;
};
class MetalMemoryManager
struct MetalBufferRange
{
uint32 bufferIndex;
size_t offset;
size_t size;
};
class MetalBufferAllocator
{
public:
MetalMemoryManager(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer} {}
MetalBufferAllocator(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer} {}
void ResetTemporaryBuffers()
{
m_freeBufferRanges.clear();
// Register the free ranges
for (uint32 i = 0; i < m_buffers.size(); i++)
{
m_freeBufferRanges.push_back({i, 0, m_buffers[i]->length()});
}
}
MTL::Buffer* GetBuffer(uint32 bufferIndex)
{
return m_buffers[bufferIndex];
}
MetalBufferAllocation GetBufferAllocation(size_t size);
private:
class MetalRenderer* m_mtlr;
std::vector<MTL::Buffer*> m_buffers;
std::vector<MetalBufferRange> m_freeBufferRanges;
};
class MetalMemoryManager
{
public:
MetalMemoryManager(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer}, m_bufferAllocator(metalRenderer) {}
void ResetTemporaryBuffers()
{
m_bufferAllocator/*s[m_bufferAllocatorIndex]*/.ResetTemporaryBuffers();
//m_bufferAllocatorIndex = (m_bufferAllocatorIndex + 1) % 2;
}
MTL::Buffer* GetBuffer(uint32 bufferIndex)
{
//uint32 bufferAllocatorIndex = (bufferIndex >> bufferAllocatorIndexShift);
return m_bufferAllocator/*s[bufferAllocatorIndex]*/.GetBuffer(bufferIndex);
}
MetalBufferAllocation GetBufferAllocation(size_t size)
{
auto allocation = m_bufferAllocator/*s[m_bufferAllocatorIndex]*/.GetBufferAllocation(size);
//allocation.bufferIndex |= (m_bufferAllocatorIndex << bufferAllocatorIndexShift);
return allocation;
}
MTL::Buffer* GetBufferCache()
{
return m_bufferCache;
@ -28,8 +83,6 @@ public:
void* GetTextureUploadBuffer(size_t size);
MetalBufferAllocation GetBufferAllocation(size_t size);
// Buffer cache
void InitBufferCache(size_t size);
void UploadToBufferCache(const void* data, size_t offset, size_t size);
@ -39,6 +92,9 @@ private:
class MetalRenderer* m_mtlr;
std::vector<uint8> m_textureUploadBuffer;
std::vector<MTL::Buffer*> m_buffers;
MetalBufferAllocator m_bufferAllocator;//s[2];
//uint8 m_bufferAllocatorIndex = 0;
MTL::Buffer* m_bufferCache = nullptr;
};