Skip to content

Commit 41fa2bc

Browse files
committed
fill error that triangle vertex/index number bigger than buffer
1 parent 14e8757 commit 41fa2bc

File tree

2 files changed

+107
-23
lines changed

2 files changed

+107
-23
lines changed

cocos/renderer/CCRenderer.cpp

+87-15
Original file line numberDiff line numberDiff line change
@@ -211,22 +211,18 @@ Renderer::~Renderer()
211211
Director::getInstance()->getEventDispatcher()->removeEventListener(_cacheTextureListener);
212212
#endif
213213

214-
CC_SAFE_RELEASE(_vertexBuffer);
215-
CC_SAFE_RELEASE(_indexBuffer);
216214
CC_SAFE_RELEASE(_commandBuffer);
217215
}
218216

219217
void Renderer::init()
220218
{
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();
228220

221+
auto device = backend::Device::getInstance();
229222
_commandBuffer = device->newCommandBuffer();
223+
224+
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer();
225+
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer();
230226
}
231227

232228
void Renderer::addCommand(RenderCommand* command)
@@ -290,7 +286,11 @@ void Renderer::processRenderCommand(RenderCommand* command)
290286
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");
291287
drawBatchedTriangles();
292288

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();
294294
}
295295

296296
// queue it
@@ -428,6 +428,9 @@ void Renderer::endFrame()
428428
_clearCommandManager.pushBackCommand(comand);
429429
_cachedClearCommands.clear();
430430

431+
_triangleCommandBufferManager.putbackAllBuffers();
432+
_vertexBuffer = _triangleCommandBufferManager.getVertexBuffer();
433+
_indexBuffer = _triangleCommandBufferManager.getIndexBuffer();
431434
_queuedTotalIndexCount = 0;
432435
_queuedTotalVertexCount = 0;
433436
}
@@ -611,15 +614,15 @@ void Renderer::drawBatchedTriangles()
611614
int prevMaterialID = -1;
612615
bool firstCommand = true;
613616

614-
unsigned int filledVertexCount = 0;
615-
unsigned int filledIndexCount = 0;
617+
_filledVertex = 0;
618+
_filledIndex = 0;
616619

617620
for(const auto& cmd : _queuedTriangleCommands)
618621
{
619622
auto currentMaterialID = cmd->getMaterialID();
620623
const bool batchable = !cmd->isSkipBatching();
621624

622-
fillVerticesAndIndices(cmd, vertexBufferFillOffset, filledVertexCount, filledIndexCount);
625+
fillVerticesAndIndices(cmd, vertexBufferFillOffset, _filledVertex, _filledIndex);
623626

624627
// in the same batch ?
625628
if (batchable && (prevMaterialID == currentMaterialID || firstCommand))
@@ -658,8 +661,8 @@ void Renderer::drawBatchedTriangles()
658661
}
659662
batchesTotal++;
660663

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]));
663666

664667
/************** 2: Draw *************/
665668
for (int i = 0; i < batchesTotal; ++i)
@@ -988,4 +991,73 @@ void Renderer::setScissorRect(float x, float y, float width, float height)
988991
_scissorState.rect.height = height;
989992
}
990993

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+
9911063
NS_CC_END

cocos/renderer/CCRenderer.h

+20-8
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,6 @@ class RenderQueue
101101
std::vector<RenderCommand*>& getSubQueue(QUEUE_GROUP group) { return _commands[group]; }
102102
/**Get the number of render commands contained in a subqueue.*/
103103
ssize_t getSubQueueSize(QUEUE_GROUP group) const { return _commands[group].size(); }
104-
105-
/**Save the current DepthState, CullState, DepthWriteState render state.*/
106-
// void saveRenderState();
107-
// /**Restore the saved DepthState, CullState, DepthWriteState render state.*/
108-
// void restoreRenderState();
109104

110105
protected:
111106
/**The commands in the render queue.*/
@@ -244,6 +239,23 @@ class CC_DLL Renderer
244239
void setScissorRect(float x, float y, float width, float height);
245240

246241
protected:
242+
class TriangleCommandBufferManager
243+
{
244+
public:
245+
~TriangleCommandBufferManager();
246+
247+
void init();
248+
void putbackAllBuffers();
249+
void prepareNextBuffer();
250+
backend::Buffer* getVertexBuffer() const;
251+
backend::Buffer* getIndexBuffer() const;
252+
253+
private:
254+
int _currentBufferIndex = -1;
255+
std::vector<backend::Buffer*> _vertexBufferPool;
256+
std::vector<backend::Buffer*> _indexBufferPool;
257+
};
258+
247259
void drawBatchedTriangles();
248260
void drawCustomCommand(RenderCommand* command);
249261

@@ -281,6 +293,7 @@ class CC_DLL Renderer
281293
unsigned short _indices[INDEX_VBO_SIZE];
282294
backend::Buffer* _vertexBuffer = nullptr;
283295
backend::Buffer* _indexBuffer = nullptr;
296+
TriangleCommandBufferManager _triangleCommandBufferManager;
284297

285298
backend::CommandBuffer* _commandBuffer = nullptr;
286299
backend::RenderPassDescriptor _renderPassDescriptor;
@@ -301,13 +314,12 @@ class CC_DLL Renderer
301314
// the TriBatches
302315
TriBatchToDraw* _triBatchesToDraw = nullptr;
303316

304-
// unsigned int _filledVertex = 0;
305-
// unsigned int _filledIndex = 0;
306-
307317
unsigned int _queuedTotalVertexCount = 0;
308318
unsigned int _queuedTotalIndexCount = 0;
309319
unsigned int _queuedVertexCount = 0;
310320
unsigned int _queuedIndexCount = 0;
321+
unsigned int _filledIndex = 0;
322+
unsigned int _filledVertex = 0;
311323

312324
// stats
313325
unsigned int _drawnBatches = 0;

0 commit comments

Comments
 (0)