Hugo Amnov 7 лет назад
Родитель
Сommit
71a1d659dc
2 измененных файлов с 30 добавлено и 0 удалено
  1. 28 0
      src/renderer_gl.cpp
  2. 2 0
      src/renderer_gl.h

+ 28 - 0
src/renderer_gl.cpp

@@ -4515,6 +4515,19 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
 		}
 	}
 
+	void ProgramGL::unbindAttributes()
+	{
+		for(uint32_t ii = 0, iiEnd = m_usedCount; ii < iiEnd; ++ii)
+		{
+			if(Attrib::Count == m_unboundUsedAttrib[ii])
+			{
+				Attrib::Enum attr = Attrib::Enum(m_used[ii]);
+				GLint loc = m_attributes[attr];
+				GL_CHECK(glDisableVertexAttribArray(loc));
+			}
+		}
+	}
+
 	void ProgramGL::bindInstanceData(uint32_t _stride, uint32_t _baseVertex) const
 	{
 		uint32_t baseVertex = _baseVertex;
@@ -6310,6 +6323,7 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
 		viewState.reset(_render, hmdEnabled);
 
 		uint16_t programIdx = kInvalidHandle;
+		uint16_t boundProgramIdx = kInvalidHandle;
 		SortKey key;
 		uint16_t view = UINT16_MAX;
 		FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
@@ -7145,6 +7159,14 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
 
 							if (bindAttribs || diffStartVertex)
 							{
+								if(kInvalidHandle != boundProgramIdx)
+								{
+									ProgramGL& boundProgram = m_program[boundProgramIdx];
+									boundProgram.unbindAttributes();
+								}
+
+								boundProgramIdx = programIdx;
+
 								program.bindAttributesBegin();
 
 								if (UINT8_MAX != draw.m_streamMask)
@@ -7333,6 +7355,12 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
 				}
 			}
 
+			if(kInvalidHandle != boundProgramIdx)
+			{
+				ProgramGL& boundProgram = m_program[boundProgramIdx];
+				boundProgram.unbindAttributes();
+			}
+
 			submitBlit(bs, BGFX_CONFIG_MAX_VIEWS);
 
 			blitMsaaFbo();

+ 2 - 0
src/renderer_gl.h

@@ -1351,6 +1351,8 @@ namespace bgfx { namespace gl
 			}
 		}
 
+		void unbindAttributes();
+
 		GLuint m_id;
 
 		uint8_t m_unboundUsedAttrib[Attrib::Count]; // For tracking unbound used attributes between begin()/end().