@@ -211,22 +211,18 @@ Renderer::~Renderer()
211
211
Director::getInstance ()->getEventDispatcher ()->removeEventListener (_cacheTextureListener);
212
212
#endif
213
213
214
- CC_SAFE_RELEASE (_vertexBuffer);
215
- CC_SAFE_RELEASE (_indexBuffer);
216
214
CC_SAFE_RELEASE (_commandBuffer);
217
215
}
218
216
219
217
void Renderer::init ()
220
218
{
221
- auto device = backend::Device::getInstance ();
222
-
223
- _vertexBuffer = device->newBuffer (Renderer::VBO_SIZE * sizeof (_verts[0 ]), backend::BufferType::VERTEX, backend::BufferUsage::READ);
224
- _vertexBuffer->updateData (_verts, Renderer::VBO_SIZE * sizeof (_verts[0 ]));
225
-
226
- _indexBuffer = device->newBuffer (Renderer::INDEX_VBO_SIZE * sizeof (_indices[0 ]), backend::BufferType::INDEX, backend::BufferUsage::READ);
227
- _indexBuffer->updateData (_indices, Renderer::INDEX_VBO_SIZE * sizeof (_indices[0 ]));
219
+ _triangleCommandBufferManager.init ();
228
220
221
+ auto device = backend::Device::getInstance ();
229
222
_commandBuffer = device->newCommandBuffer ();
223
+
224
+ _vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
225
+ _indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
230
226
}
231
227
232
228
void Renderer::addCommand (RenderCommand* command)
@@ -290,7 +286,11 @@ void Renderer::processRenderCommand(RenderCommand* command)
290
286
CCASSERT (cmd->getIndexCount ()>= 0 && cmd->getIndexCount () < INDEX_VBO_SIZE, " VBO for index is not big enough, please break the data down or use customized render command" );
291
287
drawBatchedTriangles ();
292
288
293
- // TODO: should create a new buffer for it.
289
+ _triangleCommandBufferManager.prepareNextBuffer ();
290
+ _queuedIndexCount = _queuedVertexCount = _queuedTotalIndexCount = _queuedTotalVertexCount = 0 ;
291
+
292
+ _vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
293
+ _indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
294
294
}
295
295
296
296
// queue it
@@ -428,6 +428,9 @@ void Renderer::endFrame()
428
428
_clearCommandManager.pushBackCommand (comand);
429
429
_cachedClearCommands.clear ();
430
430
431
+ _triangleCommandBufferManager.putbackAllBuffers ();
432
+ _vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
433
+ _indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
431
434
_queuedTotalIndexCount = 0 ;
432
435
_queuedTotalVertexCount = 0 ;
433
436
}
@@ -611,15 +614,15 @@ void Renderer::drawBatchedTriangles()
611
614
int prevMaterialID = -1 ;
612
615
bool firstCommand = true ;
613
616
614
- unsigned int filledVertexCount = 0 ;
615
- unsigned int filledIndexCount = 0 ;
617
+ _filledVertex = 0 ;
618
+ _filledIndex = 0 ;
616
619
617
620
for (const auto & cmd : _queuedTriangleCommands)
618
621
{
619
622
auto currentMaterialID = cmd->getMaterialID ();
620
623
const bool batchable = !cmd->isSkipBatching ();
621
624
622
- fillVerticesAndIndices (cmd, vertexBufferFillOffset, filledVertexCount, filledIndexCount );
625
+ fillVerticesAndIndices (cmd, vertexBufferFillOffset, _filledVertex, _filledIndex );
623
626
624
627
// in the same batch ?
625
628
if (batchable && (prevMaterialID == currentMaterialID || firstCommand))
@@ -658,8 +661,8 @@ void Renderer::drawBatchedTriangles()
658
661
}
659
662
batchesTotal++;
660
663
661
- _vertexBuffer->updateSubData (_verts, vertexBufferFillOffset * sizeof (_verts[0 ]), filledVertexCount * sizeof (_verts[0 ]));
662
- _indexBuffer->updateSubData (_indices, indexBufferFillOffset * sizeof (_indices[0 ]), filledIndexCount * sizeof (_indices[0 ]));
664
+ _vertexBuffer->updateSubData (_verts, vertexBufferFillOffset * sizeof (_verts[0 ]), _filledVertex * sizeof (_verts[0 ]));
665
+ _indexBuffer->updateSubData (_indices, indexBufferFillOffset * sizeof (_indices[0 ]), _filledIndex * sizeof (_indices[0 ]));
663
666
664
667
/* ************* 2: Draw *************/
665
668
for (int i = 0 ; i < batchesTotal; ++i)
@@ -988,4 +991,73 @@ void Renderer::setScissorRect(float x, float y, float width, float height)
988
991
_scissorState.rect .height = height;
989
992
}
990
993
994
+ // TriangleCommandBufferManager
995
+ Renderer::TriangleCommandBufferManager::~TriangleCommandBufferManager ()
996
+ {
997
+ for (auto & vertexBuffer : _vertexBufferPool)
998
+ vertexBuffer->release ();
999
+
1000
+ for (auto & indexBuffer : _indexBufferPool)
1001
+ indexBuffer->release ();
1002
+ }
1003
+
1004
+ void Renderer::TriangleCommandBufferManager::init ()
1005
+ {
1006
+ prepareNextBuffer ();
1007
+ }
1008
+
1009
+ void Renderer::TriangleCommandBufferManager::putbackAllBuffers ()
1010
+ {
1011
+ _currentBufferIndex = 0 ;
1012
+ }
1013
+
1014
+ void Renderer::TriangleCommandBufferManager::prepareNextBuffer ()
1015
+ {
1016
+ if (_currentBufferIndex < (int )_vertexBufferPool.size () - 1 )
1017
+ {
1018
+ ++_currentBufferIndex;
1019
+ return ;
1020
+ }
1021
+
1022
+ auto device = backend::Device::getInstance ();
1023
+
1024
+ auto tmpData = malloc (Renderer::VBO_SIZE * sizeof (_verts[0 ]));
1025
+ if (!tmpData)
1026
+ return ;
1027
+
1028
+ auto vertexBuffer = device->newBuffer (Renderer::VBO_SIZE * sizeof (_verts[0 ]), backend::BufferType::VERTEX, backend::BufferUsage::READ);
1029
+ if (!vertexBuffer)
1030
+ {
1031
+ free (tmpData);
1032
+ return ;
1033
+ }
1034
+ vertexBuffer->updateData (tmpData, Renderer::VBO_SIZE * sizeof (_verts[0 ]));
1035
+
1036
+ auto indexBuffer = device->newBuffer (Renderer::INDEX_VBO_SIZE * sizeof (_indices[0 ]), backend::BufferType::INDEX, backend::BufferUsage::READ);
1037
+ if (! indexBuffer)
1038
+ {
1039
+ free (tmpData);
1040
+ vertexBuffer->release ();
1041
+ return ;
1042
+ }
1043
+ indexBuffer->updateData (tmpData, Renderer::INDEX_VBO_SIZE * sizeof (_indices[0 ]));
1044
+
1045
+ free (tmpData);
1046
+
1047
+ _vertexBufferPool.push_back (vertexBuffer);
1048
+ _indexBufferPool.push_back (indexBuffer);
1049
+
1050
+ ++_currentBufferIndex;
1051
+ }
1052
+
1053
+ backend::Buffer* Renderer::TriangleCommandBufferManager::getVertexBuffer () const
1054
+ {
1055
+ return _vertexBufferPool[_currentBufferIndex];
1056
+ }
1057
+
1058
+ backend::Buffer* Renderer::TriangleCommandBufferManager::getIndexBuffer () const
1059
+ {
1060
+ return _indexBufferPool[_currentBufferIndex];
1061
+ }
1062
+
991
1063
NS_CC_END
0 commit comments