diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index a1b8ba285..03df37f02 100644 --- a/src/renderer_gl.cpp +++ b/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(); diff --git a/src/renderer_gl.h b/src/renderer_gl.h index b99cc2b81..5d274c1c6 100644 --- a/src/renderer_gl.h +++ b/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().