mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-04 05:51:19 +12:00
optimize index buffers
This commit is contained in:
parent
0cb83d4668
commit
be8a560496
5 changed files with 120 additions and 27 deletions
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue