@@ -216,13 +216,13 @@ Renderer::~Renderer()
216
216
217
217
void Renderer::init ()
218
218
{
219
+ // Should invoke _triangleCommandBufferManager.init() first.
219
220
_triangleCommandBufferManager.init ();
221
+ _vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
222
+ _indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
220
223
221
224
auto device = backend::Device::getInstance ();
222
225
_commandBuffer = device->newCommandBuffer ();
223
-
224
- _vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
225
- _indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
226
226
}
227
227
228
228
void Renderer::addCommand (RenderCommand* command)
@@ -286,19 +286,24 @@ void Renderer::processRenderCommand(RenderCommand* command)
286
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" );
287
287
drawBatchedTriangles ();
288
288
289
+ _queuedTotalIndexCount = _queuedTotalVertexCount = 0 ;
290
+ #ifdef CC_USE_METAL
291
+ _queuedIndexCount = _queuedVertexCount = 0 ;
289
292
_triangleCommandBufferManager.prepareNextBuffer ();
290
- _queuedIndexCount = _queuedVertexCount = _queuedTotalIndexCount = _queuedTotalVertexCount = 0 ;
291
-
292
293
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
293
294
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
295
+ #endif
294
296
}
295
297
296
298
// queue it
297
299
_queuedTriangleCommands.push_back (cmd);
300
+ #ifdef CC_USE_METAL
298
301
_queuedIndexCount += cmd->getIndexCount ();
299
302
_queuedVertexCount += cmd->getVertexCount ();
303
+ #endif
300
304
_queuedTotalVertexCount += cmd->getVertexCount ();
301
305
_queuedTotalIndexCount += cmd->getIndexCount ();
306
+
302
307
}
303
308
break ;
304
309
case RenderCommand::Type::MESH_COMMAND:
@@ -428,9 +433,11 @@ void Renderer::endFrame()
428
433
_clearCommandManager.pushBackCommand (comand);
429
434
_cachedClearCommands.clear ();
430
435
436
+ #ifdef CC_USE_METAL
431
437
_triangleCommandBufferManager.putbackAllBuffers ();
432
438
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer ();
433
439
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer ();
440
+ #endif
434
441
_queuedTotalIndexCount = 0 ;
435
442
_queuedTotalVertexCount = 0 ;
436
443
}
@@ -572,28 +579,28 @@ void Renderer::setViewPort(int x, int y, unsigned int w, unsigned int h)
572
579
_viewport.h = h;
573
580
}
574
581
575
- void Renderer::fillVerticesAndIndices (const TrianglesCommand* cmd, unsigned int vertexBufferOffset, unsigned int & filledVertexCount, unsigned int & filledIndexCount )
582
+ void Renderer::fillVerticesAndIndices (const TrianglesCommand* cmd, unsigned int vertexBufferOffset)
576
583
{
577
584
size_t vertexCount = cmd->getVertexCount ();
578
- memcpy (&_verts[filledVertexCount ], cmd->getVertices (), sizeof (V3F_C4B_T2F) * vertexCount);
585
+ memcpy (&_verts[_filledVertex ], cmd->getVertices (), sizeof (V3F_C4B_T2F) * vertexCount);
579
586
580
587
// fill vertex, and convert them to world coordinates
581
588
const Mat4& modelView = cmd->getModelView ();
582
589
for (size_t i=0 ; i < vertexCount; ++i)
583
590
{
584
- modelView.transformPoint (&(_verts[i + filledVertexCount ].vertices ));
591
+ modelView.transformPoint (&(_verts[i + _filledVertex ].vertices ));
585
592
}
586
593
587
594
// fill index
588
595
const unsigned short * indices = cmd->getIndices ();
589
596
size_t indexCount = cmd->getIndexCount ();
590
597
for (size_t i = 0 ; i < indexCount; ++i)
591
598
{
592
- _indices[filledIndexCount + i] = vertexBufferOffset + filledVertexCount + indices[i];
599
+ _indices[_filledIndex + i] = vertexBufferOffset + _filledVertex + indices[i];
593
600
}
594
601
595
- filledVertexCount += vertexCount;
596
- filledIndexCount += indexCount;
602
+ _filledVertex += vertexCount;
603
+ _filledIndex += indexCount;
597
604
}
598
605
599
606
void Renderer::drawBatchedTriangles ()
@@ -602,9 +609,13 @@ void Renderer::drawBatchedTriangles()
602
609
return ;
603
610
604
611
/* ************* 1: Setup up vertices/indices *************/
605
-
612
+ # ifdef CC_USE_METAL
606
613
unsigned int vertexBufferFillOffset = _queuedTotalVertexCount - _queuedVertexCount;
607
614
unsigned int indexBufferFillOffset = _queuedTotalIndexCount - _queuedIndexCount;
615
+ #else
616
+ unsigned int vertexBufferFillOffset = 0 ;
617
+ unsigned int indexBufferFillOffset = 0 ;
618
+ #endif
608
619
609
620
_triBatchesToDraw[0 ].offset = indexBufferFillOffset;
610
621
_triBatchesToDraw[0 ].indicesToDraw = 0 ;
@@ -622,7 +633,7 @@ void Renderer::drawBatchedTriangles()
622
633
auto currentMaterialID = cmd->getMaterialID ();
623
634
const bool batchable = !cmd->isSkipBatching ();
624
635
625
- fillVerticesAndIndices (cmd, vertexBufferFillOffset, _filledVertex, _filledIndex );
636
+ fillVerticesAndIndices (cmd, vertexBufferFillOffset);
626
637
627
638
// in the same batch ?
628
639
if (batchable && (prevMaterialID == currentMaterialID || firstCommand))
@@ -660,9 +671,13 @@ void Renderer::drawBatchedTriangles()
660
671
firstCommand = false ;
661
672
}
662
673
batchesTotal++;
663
-
674
+ # ifdef CC_USE_METAL
664
675
_vertexBuffer->updateSubData (_verts, vertexBufferFillOffset * sizeof (_verts[0 ]), _filledVertex * sizeof (_verts[0 ]));
665
676
_indexBuffer->updateSubData (_indices, indexBufferFillOffset * sizeof (_indices[0 ]), _filledIndex * sizeof (_indices[0 ]));
677
+ #else
678
+ _vertexBuffer->updateData (_verts, _filledVertex * sizeof (_verts[0 ]));
679
+ _indexBuffer->updateData (_indices, _filledIndex * sizeof (_indices[0 ]));
680
+ #endif
666
681
667
682
/* ************* 2: Draw *************/
668
683
for (int i = 0 ; i < batchesTotal; ++i)
@@ -684,8 +699,11 @@ void Renderer::drawBatchedTriangles()
684
699
685
700
/* ************* 3: Cleanup *************/
686
701
_queuedTriangleCommands.clear ();
702
+
703
+ #ifdef CC_USE_METAL
687
704
_queuedIndexCount = 0 ;
688
705
_queuedVertexCount = 0 ;
706
+ #endif
689
707
}
690
708
691
709
void Renderer::drawCustomCommand (RenderCommand *command)
@@ -1003,7 +1021,7 @@ Renderer::TriangleCommandBufferManager::~TriangleCommandBufferManager()
1003
1021
1004
1022
void Renderer::TriangleCommandBufferManager::init ()
1005
1023
{
1006
- prepareNextBuffer ();
1024
+ createBuffer ();
1007
1025
}
1008
1026
1009
1027
void Renderer::TriangleCommandBufferManager::putbackAllBuffers ()
@@ -1019,45 +1037,63 @@ void Renderer::TriangleCommandBufferManager::prepareNextBuffer()
1019
1037
return ;
1020
1038
}
1021
1039
1040
+ createBuffer ();
1041
+ ++_currentBufferIndex;
1042
+ }
1043
+
1044
+ backend::Buffer* Renderer::TriangleCommandBufferManager::getVertexBuffer () const
1045
+ {
1046
+ return _vertexBufferPool[_currentBufferIndex];
1047
+ }
1048
+
1049
+ backend::Buffer* Renderer::TriangleCommandBufferManager::getIndexBuffer () const
1050
+ {
1051
+ return _indexBufferPool[_currentBufferIndex];
1052
+ }
1053
+
1054
+ void Renderer::TriangleCommandBufferManager::createBuffer ()
1055
+ {
1022
1056
auto device = backend::Device::getInstance ();
1023
1057
1024
- auto tmpData = malloc (Renderer::VBO_SIZE * sizeof (_verts[0 ]));
1058
+ #ifdef CC_USE_METAL
1059
+ // Metal doesn't need to update buffer to make sure it has the correct size.
1060
+ auto vertexBuffer = device->newBuffer (Renderer::VBO_SIZE * sizeof (_verts[0 ]), backend::BufferType::VERTEX, backend::BufferUsage::DYNAMIC);
1061
+ if (!vertexBuffer)
1062
+ return ;
1063
+
1064
+ auto indexBuffer = device->newBuffer (Renderer::INDEX_VBO_SIZE * sizeof (_indices[0 ]), backend::BufferType::INDEX, backend::BufferUsage::DYNAMIC);
1065
+ if (!indexBuffer)
1066
+ {
1067
+ vertexBuffer->release ();
1068
+ return ;
1069
+ }
1070
+ #else
1071
+ auto tmpData = malloc (Renderer::VBO_SIZE * sizeof (V3F_C4B_T2F));
1025
1072
if (!tmpData)
1026
1073
return ;
1027
1074
1028
- auto vertexBuffer = device->newBuffer (Renderer::VBO_SIZE * sizeof (_verts[ 0 ] ), backend::BufferType::VERTEX, backend::BufferUsage::DYNAMIC);
1075
+ auto vertexBuffer = device->newBuffer (Renderer::VBO_SIZE * sizeof (V3F_C4B_T2F ), backend::BufferType::VERTEX, backend::BufferUsage::DYNAMIC);
1029
1076
if (!vertexBuffer)
1030
1077
{
1031
1078
free (tmpData);
1032
1079
return ;
1033
1080
}
1034
- vertexBuffer->updateData (tmpData, Renderer::VBO_SIZE * sizeof (_verts[ 0 ] ));
1081
+ vertexBuffer->updateData (tmpData, Renderer::VBO_SIZE * sizeof (V3F_C4B_T2F ));
1035
1082
1036
- auto indexBuffer = device->newBuffer (Renderer::INDEX_VBO_SIZE * sizeof (_indices[ 0 ] ), backend::BufferType::INDEX, backend::BufferUsage::DYNAMIC);
1083
+ auto indexBuffer = device->newBuffer (Renderer::INDEX_VBO_SIZE * sizeof (unsigned short ), backend::BufferType::INDEX, backend::BufferUsage::DYNAMIC);
1037
1084
if (! indexBuffer)
1038
1085
{
1039
1086
free (tmpData);
1040
1087
vertexBuffer->release ();
1041
1088
return ;
1042
1089
}
1043
- indexBuffer->updateData (tmpData, Renderer::INDEX_VBO_SIZE * sizeof (_indices[ 0 ] ));
1090
+ indexBuffer->updateData (tmpData, Renderer::INDEX_VBO_SIZE * sizeof (unsigned short ));
1044
1091
1045
1092
free (tmpData);
1093
+ #endif
1046
1094
1047
1095
_vertexBufferPool.push_back (vertexBuffer);
1048
1096
_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
1097
}
1062
1098
1063
1099
NS_CC_END
0 commit comments