Browse Source

GL: only unbind instance buffer if it changed (#2463)

pezcode 4 năm trước cách đây
mục cha
commit
900afe7644
1 tập tin đã thay đổi với 17 bổ sung58 xóa
  1. 17 58
      src/renderer_gl.cpp

+ 17 - 58
src/renderer_gl.cpp

@@ -7822,9 +7822,6 @@ namespace bgfx { namespace gl
 					}
 					}
 
 
 					{
 					{
-						bool diffStreamHandles = false;
-						bool diffIndexBuffer = false;
-
 						for (uint32_t idx = 0, streamMask = draw.m_streamMask
 						for (uint32_t idx = 0, streamMask = draw.m_streamMask
 							; 0 != streamMask
 							; 0 != streamMask
 							; streamMask >>= 1, idx += 1
 							; streamMask >>= 1, idx += 1
@@ -7836,8 +7833,14 @@ namespace bgfx { namespace gl
 
 
 							if (currentState.m_stream[idx].m_handle.idx != draw.m_stream[idx].m_handle.idx)
 							if (currentState.m_stream[idx].m_handle.idx != draw.m_stream[idx].m_handle.idx)
 							{
 							{
-								diffStreamHandles = true;
-								break;
+								currentState.m_stream[idx].m_handle = draw.m_stream[idx].m_handle;
+								bindAttribs = true;
+							}
+
+							if (currentState.m_stream[idx].m_startVertex != draw.m_stream[idx].m_startVertex)
+							{
+								currentState.m_stream[idx].m_startVertex = draw.m_stream[idx].m_startVertex;
+								bindAttribs = true;
 							}
 							}
 						}
 						}
 
 
@@ -7845,25 +7848,12 @@ namespace bgfx { namespace gl
 						||  currentState.m_streamMask             != draw.m_streamMask
 						||  currentState.m_streamMask             != draw.m_streamMask
 						||  currentState.m_instanceDataBuffer.idx != draw.m_instanceDataBuffer.idx
 						||  currentState.m_instanceDataBuffer.idx != draw.m_instanceDataBuffer.idx
 						||  currentState.m_instanceDataOffset     != draw.m_instanceDataOffset
 						||  currentState.m_instanceDataOffset     != draw.m_instanceDataOffset
-						||  currentState.m_instanceDataStride     != draw.m_instanceDataStride
-						||  diffStreamHandles)
+						||  currentState.m_instanceDataStride     != draw.m_instanceDataStride)
 						{
 						{
-							currentState.m_streamMask             = draw.m_streamMask;
-							currentState.m_instanceDataBuffer.idx = draw.m_instanceDataBuffer.idx;
-							currentState.m_instanceDataOffset     = draw.m_instanceDataOffset;
-							currentState.m_instanceDataStride     = draw.m_instanceDataStride;
-
-							for (uint32_t idx = 0, streamMask = draw.m_streamMask
-								; 0 != streamMask
-								; streamMask >>= 1, idx += 1
-								)
-							{
-								const uint32_t ntz = bx::uint32_cnttz(streamMask);
-								streamMask >>= ntz;
-								idx         += ntz;
-
-								currentState.m_stream[idx].m_handle = draw.m_stream[idx].m_handle;
-							}
+							currentState.m_streamMask         = draw.m_streamMask;
+							currentState.m_instanceDataBuffer = draw.m_instanceDataBuffer;
+							currentState.m_instanceDataOffset = draw.m_instanceDataOffset;
+							currentState.m_instanceDataStride = draw.m_instanceDataStride;
 
 
 							bindAttribs = true;
 							bindAttribs = true;
 						}
 						}
@@ -7872,51 +7862,30 @@ namespace bgfx { namespace gl
 						{
 						{
 							currentState.m_indexBuffer = draw.m_indexBuffer;
 							currentState.m_indexBuffer = draw.m_indexBuffer;
 
 
-							uint16_t handle = draw.m_indexBuffer.idx;
-							if (kInvalidHandle != handle)
+							if (isValid(draw.m_indexBuffer) )
 							{
 							{
-								IndexBufferGL& ib = m_indexBuffers[handle];
+								IndexBufferGL& ib = m_indexBuffers[draw.m_indexBuffer.idx];
 								GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib.m_id) );
 								GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib.m_id) );
 							}
 							}
 							else
 							else
 							{
 							{
 								GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
 								GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
 							}
 							}
-
-							diffIndexBuffer = true;
 						}
 						}
 
 
 						if (currentState.m_startIndex != draw.m_startIndex)
 						if (currentState.m_startIndex != draw.m_startIndex)
 						{
 						{
 							currentState.m_startIndex = draw.m_startIndex;
 							currentState.m_startIndex = draw.m_startIndex;
-							diffIndexBuffer = true;
 						}
 						}
 
 
 						if (0 != currentState.m_streamMask)
 						if (0 != currentState.m_streamMask)
 						{
 						{
-							bool diffStartVertex = false;
-							for (uint32_t idx = 0, streamMask = draw.m_streamMask
-								; 0 != streamMask
-								; streamMask >>= 1, idx += 1
-								)
-							{
-								const uint32_t ntz = bx::uint32_cnttz(streamMask);
-								streamMask >>= ntz;
-								idx         += ntz;
-
-								if (currentState.m_stream[idx].m_startVertex != draw.m_stream[idx].m_startVertex)
-								{
-									diffStartVertex = true;
-									break;
-								}
-							}
-
-							if (bindAttribs || diffStartVertex)
+							if (bindAttribs)
 							{
 							{
 								if (isValid(boundProgram) )
 								if (isValid(boundProgram) )
 								{
 								{
 									m_program[boundProgram.idx].unbindAttributes();
 									m_program[boundProgram.idx].unbindAttributes();
-									boundProgram = BGFX_INVALID_HANDLE;
+									m_program[boundProgram.idx].unbindInstanceData();
 								}
 								}
 
 
 								boundProgram = currentProgram;
 								boundProgram = currentProgram;
@@ -7934,8 +7903,6 @@ namespace bgfx { namespace gl
 										streamMask >>= ntz;
 										streamMask >>= ntz;
 										idx         += ntz;
 										idx         += ntz;
 
 
-										currentState.m_stream[idx].m_startVertex = draw.m_stream[idx].m_startVertex;
-
 										const VertexBufferGL& vb = m_vertexBuffers[draw.m_stream[idx].m_handle.idx];
 										const VertexBufferGL& vb = m_vertexBuffers[draw.m_stream[idx].m_handle.idx];
 										const uint16_t decl = isValid(draw.m_stream[idx].m_layoutHandle)
 										const uint16_t decl = isValid(draw.m_stream[idx].m_layoutHandle)
 											? draw.m_stream[idx].m_layoutHandle.idx
 											? draw.m_stream[idx].m_layoutHandle.idx
@@ -7946,10 +7913,7 @@ namespace bgfx { namespace gl
 								}
 								}
 
 
 								program.bindAttributesEnd();
 								program.bindAttributesEnd();
-							}
 
 
-							if (bindAttribs || diffStartVertex || diffIndexBuffer)
-							{
 								if (isValid(draw.m_instanceDataBuffer) )
 								if (isValid(draw.m_instanceDataBuffer) )
 								{
 								{
 									GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffers[draw.m_instanceDataBuffer.idx].m_id) );
 									GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffers[draw.m_instanceDataBuffer.idx].m_id) );
@@ -8103,11 +8067,6 @@ namespace bgfx { namespace gl
 							m_occlusionQuery.end();
 							m_occlusionQuery.end();
 						}
 						}
 
 
-						if (isValid(draw.m_instanceDataBuffer) )
-						{
-							program.unbindInstanceData();
-						}
-
 						statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
 						statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
 						statsNumPrimsRendered[primIndex]  += numPrimsRendered;
 						statsNumPrimsRendered[primIndex]  += numPrimsRendered;
 						statsNumInstances[primIndex]      += numInstances;
 						statsNumInstances[primIndex]      += numInstances;