From 01f308dd58194bbe967ca77390b4c7d28c08ce34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Tue, 20 Sep 2022 20:48:48 -0700 Subject: [PATCH] GL: Fixed instace data offset when i_dataX is missing in shader. --- src/renderer_gl.cpp | 11 +++++++---- src/renderer_gl.h | 6 ++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5b6a24911..1b5021528 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -5360,13 +5360,16 @@ namespace bgfx { namespace gl m_usedCount = (uint8_t)used; used = 0; - for (uint32_t ii = 0; ii < BX_COUNTOF(s_instanceDataName); ++ii) + for (uint32_t ii = 0, baseVertex = 0; ii < BX_COUNTOF(s_instanceDataName); ++ii, baseVertex += 16) { GLint loc = glGetAttribLocation(m_id, s_instanceDataName[ii]); if (-1 != loc) { BX_TRACE("instance data %s: %d", s_instanceDataName[ii], loc); - m_instanceData[used++] = loc; + m_instanceData[used] = loc; + m_instanceOffset[used] = uint16_t(baseVertex); + + used++; } } BX_ASSERT(used < BX_COUNTOF(m_instanceData) @@ -5433,14 +5436,14 @@ namespace bgfx { namespace gl void ProgramGL::bindInstanceData(uint32_t _stride, uint32_t _baseVertex) const { - uint32_t baseVertex = _baseVertex; for (uint32_t ii = 0; -1 != m_instanceData[ii]; ++ii) { GLint loc = m_instanceData[ii]; lazyEnableVertexAttribArray(loc); + + const uint32_t baseVertex = _baseVertex + m_instanceOffset[ii]; GL_CHECK(glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, _stride, (void*)(uintptr_t)baseVertex) ); GL_CHECK(glVertexAttribDivisor(loc, 1) ); - baseVertex += 16; } } diff --git a/src/renderer_gl.h b/src/renderer_gl.h index 03c7daf55..e75e872e3 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -1505,8 +1505,10 @@ namespace bgfx { namespace gl uint8_t m_unboundUsedAttrib[Attrib::Count]; // For tracking unbound used attributes between begin()/end(). uint8_t m_usedCount; uint8_t m_used[Attrib::Count]; // Dense. - GLint m_attributes[Attrib::Count]; // Sparse. - GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT+1]; + GLint m_attributes[Attrib::Count]; // Sparse. + + GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT+1]; + uint16_t m_instanceOffset[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT]; GLint m_sampler[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; uint8_t m_numSamplers;