Skip to content

Commit 281b71d

Browse files
author
minggo
authored
Renderer refactor (cocos2d#165)
* use one vertes/index buffer with opengl * fix error on windows
1 parent 1af518a commit 281b71d

File tree

2 files changed

+72
-34
lines changed

2 files changed

+72
-34
lines changed

cocos/renderer/CCRenderer.cpp

+68-32
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,13 @@ Renderer::~Renderer()
216216

217217
void Renderer::init()
218218
{
219+
// Should invoke _triangleCommandBufferManager.init() first.
219220
_triangleCommandBufferManager.init();
221+
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer();
222+
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer();
220223

221224
auto device = backend::Device::getInstance();
222225
_commandBuffer = device->newCommandBuffer();
223-
224-
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer();
225-
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer();
226226
}
227227

228228
void Renderer::addCommand(RenderCommand* command)
@@ -286,19 +286,24 @@ void Renderer::processRenderCommand(RenderCommand* command)
286286
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");
287287
drawBatchedTriangles();
288288

289+
_queuedTotalIndexCount = _queuedTotalVertexCount = 0;
290+
#ifdef CC_USE_METAL
291+
_queuedIndexCount = _queuedVertexCount = 0;
289292
_triangleCommandBufferManager.prepareNextBuffer();
290-
_queuedIndexCount = _queuedVertexCount = _queuedTotalIndexCount = _queuedTotalVertexCount = 0;
291-
292293
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer();
293294
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer();
295+
#endif
294296
}
295297

296298
// queue it
297299
_queuedTriangleCommands.push_back(cmd);
300+
#ifdef CC_USE_METAL
298301
_queuedIndexCount += cmd->getIndexCount();
299302
_queuedVertexCount += cmd->getVertexCount();
303+
#endif
300304
_queuedTotalVertexCount += cmd->getVertexCount();
301305
_queuedTotalIndexCount += cmd->getIndexCount();
306+
302307
}
303308
break;
304309
case RenderCommand::Type::MESH_COMMAND:
@@ -428,9 +433,11 @@ void Renderer::endFrame()
428433
_clearCommandManager.pushBackCommand(comand);
429434
_cachedClearCommands.clear();
430435

436+
#ifdef CC_USE_METAL
431437
_triangleCommandBufferManager.putbackAllBuffers();
432438
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer();
433439
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer();
440+
#endif
434441
_queuedTotalIndexCount = 0;
435442
_queuedTotalVertexCount = 0;
436443
}
@@ -572,28 +579,28 @@ void Renderer::setViewPort(int x, int y, unsigned int w, unsigned int h)
572579
_viewport.h = h;
573580
}
574581

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)
576583
{
577584
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);
579586

580587
// fill vertex, and convert them to world coordinates
581588
const Mat4& modelView = cmd->getModelView();
582589
for (size_t i=0; i < vertexCount; ++i)
583590
{
584-
modelView.transformPoint(&(_verts[i + filledVertexCount].vertices));
591+
modelView.transformPoint(&(_verts[i + _filledVertex].vertices));
585592
}
586593

587594
// fill index
588595
const unsigned short* indices = cmd->getIndices();
589596
size_t indexCount = cmd->getIndexCount();
590597
for (size_t i = 0; i < indexCount; ++i)
591598
{
592-
_indices[filledIndexCount + i] = vertexBufferOffset + filledVertexCount + indices[i];
599+
_indices[_filledIndex + i] = vertexBufferOffset + _filledVertex + indices[i];
593600
}
594601

595-
filledVertexCount += vertexCount;
596-
filledIndexCount += indexCount;
602+
_filledVertex += vertexCount;
603+
_filledIndex += indexCount;
597604
}
598605

599606
void Renderer::drawBatchedTriangles()
@@ -602,9 +609,13 @@ void Renderer::drawBatchedTriangles()
602609
return;
603610

604611
/************** 1: Setup up vertices/indices *************/
605-
612+
#ifdef CC_USE_METAL
606613
unsigned int vertexBufferFillOffset = _queuedTotalVertexCount - _queuedVertexCount;
607614
unsigned int indexBufferFillOffset = _queuedTotalIndexCount - _queuedIndexCount;
615+
#else
616+
unsigned int vertexBufferFillOffset = 0;
617+
unsigned int indexBufferFillOffset = 0;
618+
#endif
608619

609620
_triBatchesToDraw[0].offset = indexBufferFillOffset;
610621
_triBatchesToDraw[0].indicesToDraw = 0;
@@ -622,7 +633,7 @@ void Renderer::drawBatchedTriangles()
622633
auto currentMaterialID = cmd->getMaterialID();
623634
const bool batchable = !cmd->isSkipBatching();
624635

625-
fillVerticesAndIndices(cmd, vertexBufferFillOffset, _filledVertex, _filledIndex);
636+
fillVerticesAndIndices(cmd, vertexBufferFillOffset);
626637

627638
// in the same batch ?
628639
if (batchable && (prevMaterialID == currentMaterialID || firstCommand))
@@ -660,9 +671,13 @@ void Renderer::drawBatchedTriangles()
660671
firstCommand = false;
661672
}
662673
batchesTotal++;
663-
674+
#ifdef CC_USE_METAL
664675
_vertexBuffer->updateSubData(_verts, vertexBufferFillOffset * sizeof(_verts[0]), _filledVertex * sizeof(_verts[0]));
665676
_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
666681

667682
/************** 2: Draw *************/
668683
for (int i = 0; i < batchesTotal; ++i)
@@ -684,8 +699,11 @@ void Renderer::drawBatchedTriangles()
684699

685700
/************** 3: Cleanup *************/
686701
_queuedTriangleCommands.clear();
702+
703+
#ifdef CC_USE_METAL
687704
_queuedIndexCount = 0;
688705
_queuedVertexCount = 0;
706+
#endif
689707
}
690708

691709
void Renderer::drawCustomCommand(RenderCommand *command)
@@ -1003,7 +1021,7 @@ Renderer::TriangleCommandBufferManager::~TriangleCommandBufferManager()
10031021

10041022
void Renderer::TriangleCommandBufferManager::init()
10051023
{
1006-
prepareNextBuffer();
1024+
createBuffer();
10071025
}
10081026

10091027
void Renderer::TriangleCommandBufferManager::putbackAllBuffers()
@@ -1019,45 +1037,63 @@ void Renderer::TriangleCommandBufferManager::prepareNextBuffer()
10191037
return;
10201038
}
10211039

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+
{
10221056
auto device = backend::Device::getInstance();
10231057

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));
10251072
if (!tmpData)
10261073
return;
10271074

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);
10291076
if (!vertexBuffer)
10301077
{
10311078
free(tmpData);
10321079
return;
10331080
}
1034-
vertexBuffer->updateData(tmpData, Renderer::VBO_SIZE * sizeof(_verts[0]));
1081+
vertexBuffer->updateData(tmpData, Renderer::VBO_SIZE * sizeof(V3F_C4B_T2F));
10351082

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);
10371084
if (! indexBuffer)
10381085
{
10391086
free(tmpData);
10401087
vertexBuffer->release();
10411088
return;
10421089
}
1043-
indexBuffer->updateData(tmpData, Renderer::INDEX_VBO_SIZE * sizeof(_indices[0]));
1090+
indexBuffer->updateData(tmpData, Renderer::INDEX_VBO_SIZE * sizeof(unsigned short));
10441091

10451092
free(tmpData);
1093+
#endif
10461094

10471095
_vertexBufferPool.push_back(vertexBuffer);
10481096
_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];
10611097
}
10621098

10631099
NS_CC_END

cocos/renderer/CCRenderer.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,9 @@ class CC_DLL Renderer
251251
backend::Buffer* getIndexBuffer() const;
252252

253253
private:
254-
int _currentBufferIndex = -1;
254+
void createBuffer();
255+
256+
int _currentBufferIndex = 0;
255257
std::vector<backend::Buffer*> _vertexBufferPool;
256258
std::vector<backend::Buffer*> _indexBufferPool;
257259
};
@@ -273,7 +275,7 @@ class CC_DLL Renderer
273275
void visitRenderQueue(RenderQueue& queue);
274276
void doVisitRenderQueue(const std::vector<RenderCommand*>&);
275277

276-
void fillVerticesAndIndices(const TrianglesCommand* cmd, unsigned int vertexBufferOffset, unsigned int& filledVertexCount, unsigned int& filledIndexCount);
278+
void fillVerticesAndIndices(const TrianglesCommand* cmd, unsigned int vertexBufferOffset);
277279
void beginRenderPass(RenderCommand*);
278280

279281
void setRenderPipeline(const PipelineDescriptor&, const backend::RenderPassDescriptor&);

0 commit comments

Comments
 (0)