@@ -70,17 +70,6 @@ MetalBufferAllocation MetalBufferAllocator::GetBufferAllocation(size_t size, siz
70
70
71
71
MetalVertexBufferCache::~MetalVertexBufferCache ()
72
72
{
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
- }
84
73
}
85
74
86
75
MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded (MTL::Buffer* bufferCache, uint32 bufferIndex, size_t stride)
@@ -94,17 +83,12 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
94
83
return {bufferCache, vertexBufferRange.offset };
95
84
}
96
85
86
+ auto buffer = m_bufferAllocator->GetBuffer (restrideInfo.allocation .bufferIndex );
97
87
if (restrideInfo.memoryInvalidated || stride != restrideInfo.lastStride )
98
88
{
99
89
size_t newStride = Align (stride, 4 );
100
90
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 );
108
92
109
93
// uint8* oldPtr = (uint8*)bufferCache->contents() + vertexBufferRange.offset;
110
94
// uint8* newPtr = (uint8*)restrideInfo.buffer->contents();
@@ -120,8 +104,8 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
120
104
auto renderCommandEncoder = static_cast <MTL::RenderCommandEncoder*>(m_mtlr->GetCommandEncoder ());
121
105
122
106
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 };
125
109
renderCommandEncoder->setVertexBuffers (buffers, offsets, NS::Range (0 , 2 ));
126
110
127
111
struct
@@ -133,7 +117,8 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
133
117
134
118
renderCommandEncoder->drawPrimitives (MTL::PrimitiveTypePoint, NS::UInteger (0 ), vertexBufferRange.size / stride);
135
119
136
- MTL::Resource* barrierBuffers[] = {restrideInfo.buffer };
120
+ // TODO: restride in one call?
121
+ MTL::Resource* barrierBuffers[] = {buffer};
137
122
renderCommandEncoder->memoryBarrier (barrierBuffers, 1 , MTL::RenderStageVertex, MTL::RenderStageVertex);
138
123
}
139
124
else
@@ -146,7 +131,7 @@ MetalRestridedBufferRange MetalVertexBufferCache::RestrideBufferIfNeeded(MTL::Bu
146
131
restrideInfo.lastStride = newStride;
147
132
}
148
133
149
- return {restrideInfo. buffer , 0 };
134
+ return {buffer, restrideInfo. allocation . bufferOffset };
150
135
}
151
136
152
137
void MetalVertexBufferCache::MemoryRangeChanged (size_t offset, size_t size)
0 commit comments