Skip to content

Commit bba2bbc

Browse files
committed
use buffer allocator for restrided vertex buffers
1 parent 27925a4 commit bba2bbc

File tree

3 files changed

+18
-31
lines changed

3 files changed

+18
-31
lines changed

src/Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.cpp

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,6 @@ MetalBufferAllocation MetalBufferAllocator::GetBufferAllocation(size_t size, siz
7070

7171
MetalVertexBufferCache::~MetalVertexBufferCache()
7272
{
73-
for (uint32 i = 0; i < LATTE_MAX_VERTEX_BUFFERS; i++)
74-
{
75-
auto vertexBufferRange = m_bufferRanges[i];
76-
if (vertexBufferRange.offset != INVALID_OFFSET)
77-
{
78-
if (vertexBufferRange.restrideInfo->buffer)
79-
{
80-
vertexBufferRange.restrideInfo->buffer->release();
81-
}
82-
}
83-
}
8473
}
8574

8675
MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Buffer* bufferCache, uint32 bufferIndex, size_t stride)
@@ -94,17 +83,12 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
9483
return {bufferCache, vertexBufferRange.offset};
9584
}
9685

86+
auto buffer = m_bufferAllocator->GetBuffer(restrideInfo.allocation.bufferIndex);
9787
if (restrideInfo.memoryInvalidated || stride != restrideInfo.lastStride)
9888
{
9989
size_t newStride = Align(stride, 4);
10090
size_t newSize = vertexBufferRange.size / stride * newStride;
101-
if (!restrideInfo.buffer || newSize != restrideInfo.buffer->length())
102-
{
103-
if (restrideInfo.buffer)
104-
restrideInfo.buffer->release();
105-
// TODO: use one big buffer for all restrided buffers
106-
restrideInfo.buffer = m_mtlr->GetDevice()->newBuffer(newSize, MTL::StorageModeShared);
107-
}
91+
restrideInfo.allocation = m_bufferAllocator->GetBufferAllocation(newSize, 4);
10892

10993
//uint8* oldPtr = (uint8*)bufferCache->contents() + vertexBufferRange.offset;
11094
//uint8* newPtr = (uint8*)restrideInfo.buffer->contents();
@@ -120,8 +104,8 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
120104
auto renderCommandEncoder = static_cast<MTL::RenderCommandEncoder*>(m_mtlr->GetCommandEncoder());
121105

122106
renderCommandEncoder->setRenderPipelineState(m_restrideBufferPipeline->GetRenderPipelineState());
123-
MTL::Buffer* buffers[] = {bufferCache, restrideInfo.buffer};
124-
size_t offsets[] = {vertexBufferRange.offset, 0};
107+
MTL::Buffer* buffers[] = {bufferCache, buffer};
108+
size_t offsets[] = {vertexBufferRange.offset, restrideInfo.allocation.bufferOffset};
125109
renderCommandEncoder->setVertexBuffers(buffers, offsets, NS::Range(0, 2));
126110

127111
struct
@@ -133,7 +117,8 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
133117

134118
renderCommandEncoder->drawPrimitives(MTL::PrimitiveTypePoint, NS::UInteger(0), vertexBufferRange.size / stride);
135119

136-
MTL::Resource* barrierBuffers[] = {restrideInfo.buffer};
120+
// TODO: restride in one call?
121+
MTL::Resource* barrierBuffers[] = {buffer};
137122
renderCommandEncoder->memoryBarrier(barrierBuffers, 1, MTL::RenderStageVertex, MTL::RenderStageVertex);
138123
}
139124
else
@@ -146,7 +131,7 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
146131
restrideInfo.lastStride = newStride;
147132
}
148133

149-
return {restrideInfo.buffer, 0};
134+
return {buffer, restrideInfo.allocation.bufferOffset};
150135
}
151136

152137
void MetalVertexBufferCache::MemoryRangeChanged(size_t offset, size_t size)

src/Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ struct MetalBufferAllocation
1010
{
1111
void* data;
1212
uint32 bufferIndex;
13-
size_t bufferOffset;
13+
size_t bufferOffset = INVALID_OFFSET;
14+
15+
bool IsValid() const
16+
{
17+
return bufferOffset != INVALID_OFFSET;
18+
}
1419
};
1520

1621
struct MetalBufferRange
@@ -62,7 +67,7 @@ struct MetalRestrideInfo
6267
{
6368
bool memoryInvalidated = true;
6469
size_t lastStride = 0;
65-
MTL::Buffer* buffer = nullptr;
70+
MetalBufferAllocation allocation{};
6671
};
6772

6873
struct MetalVertexBufferRange
@@ -77,7 +82,7 @@ class MetalVertexBufferCache
7782
public:
7883
friend class MetalMemoryManager;
7984

80-
MetalVertexBufferCache(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer} {}
85+
MetalVertexBufferCache(class MetalRenderer* metalRenderer, MetalBufferAllocator* bufferAllocator) : m_mtlr{metalRenderer}, m_bufferAllocator{bufferAllocator} {}
8186
~MetalVertexBufferCache();
8287

8388
void SetRestrideBufferPipeline(class MetalHybridComputePipeline* restrideBufferPipeline)
@@ -93,17 +98,14 @@ class MetalVertexBufferCache
9398
void UntrackVertexBuffer(uint32 bufferIndex)
9499
{
95100
auto& range = m_bufferRanges[bufferIndex];
96-
if (range.restrideInfo->buffer)
97-
{
98-
range.restrideInfo->buffer->release();
99-
}
100101
range.offset = INVALID_OFFSET;
101102
}
102103

103104
MetalRestridedBufferRange RestrideBufferIfNeeded(MTL::Buffer* bufferCache, uint32 bufferIndex, size_t stride);
104105

105106
private:
106107
class MetalRenderer* m_mtlr;
108+
MetalBufferAllocator* m_bufferAllocator;
107109

108110
class MetalHybridComputePipeline* m_restrideBufferPipeline = nullptr;
109111

@@ -115,7 +117,7 @@ class MetalVertexBufferCache
115117
class MetalMemoryManager
116118
{
117119
public:
118-
MetalMemoryManager(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer}, m_bufferAllocator(metalRenderer), m_vertexBufferCache(metalRenderer) {}
120+
MetalMemoryManager(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer}, m_bufferAllocator(metalRenderer), m_vertexBufferCache(metalRenderer, &m_bufferAllocator) {}
119121
~MetalMemoryManager();
120122

121123
// Pipelines

src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ void MetalRenderer::draw_execute(uint32 baseVertex, uint32 baseInstance, uint32
795795
}
796796

797797
// Render pipeline state
798-
MTL::RenderPipelineState* renderPipelineState = m_pipelineCache->GetPipelineState(fetchShader, vertexShader, pixelShader, m_state.m_activeFBO, LatteGPUState.contextNew);
798+
MTL::RenderPipelineState* renderPipelineState = m_pipelineCache->GetPipelineState(fetchShader, vertexShader, pixelShader, m_state.m_lastUsedFBO, LatteGPUState.contextNew);
799799
renderCommandEncoder->setRenderPipelineState(renderPipelineState);
800800

801801
// Uniform buffers, textures and samplers

0 commit comments

Comments
 (0)