diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp index d90f40e9..646ec7c7 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp @@ -67,7 +67,12 @@ namespace MobileGL { root->traverse(&traverser); auto& symbols = traverser.GetCollectedSymbols(); for (const auto& symbol : symbols) { - m_uniforms[symbol->getName().c_str()] = symbol->getQualifier().layoutLocation; + auto layoutLoc = symbol->getQualifier().layoutLocation; + if (layoutLoc >= m_uniforms.size()) { + m_uniforms.reserve(std::bit_ceil(layoutLoc)); + m_uniforms.resize(layoutLoc + 1); + } + m_uniforms[layoutLoc] = symbol->getName().c_str(); } return true; diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h index 60a0285d..70a598b5 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h @@ -73,7 +73,7 @@ namespace MobileGL { const ShaderStage m_stage; String m_source; SharedPtr m_shader; - UnorderedMap m_uniforms; + Vector m_uniforms; String m_infoLog; Bool m_deleteStatus = false; diff --git a/MobileGL/MG_Test/Program/ProgramUtilTest.cpp b/MobileGL/MG_Test/Program/ProgramUtilTest.cpp index 58f650fb..6701e5f7 100644 --- a/MobileGL/MG_Test/Program/ProgramUtilTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramUtilTest.cpp @@ -199,7 +199,7 @@ TEST_F(ProgramUtilTest, CompileVertexShaderWithLocation) { ASSERT_NE(res.error().errc, 0); FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log; } - UnorderedMap uniforms; + Vector uniforms; auto pShader = res.value(); auto root = pShader->getIntermediate()->getTreeRoot(); @@ -207,12 +207,17 @@ TEST_F(ProgramUtilTest, CompileVertexShaderWithLocation) { root->traverse(&traverser); auto& symbols = traverser.GetCollectedSymbols(); for (const auto& symbol : symbols) { - uniforms[symbol->getName().c_str()] = symbol->getQualifier().layoutLocation; + auto layoutLoc = symbol->getQualifier().layoutLocation; + if (layoutLoc >= uniforms.size()) { + uniforms.reserve(std::bit_ceil(layoutLoc)); + uniforms.resize(layoutLoc + 1); + } + uniforms[layoutLoc] = symbol->getName().c_str(); } - EXPECT_EQ(uniforms["ProjMat"], 1); - EXPECT_EQ(uniforms["InSize"], 20); - EXPECT_EQ(uniforms["OutSize"], 4095); + EXPECT_EQ(uniforms[1], "ProjMat"); + EXPECT_EQ(uniforms[20], "InSize"); + EXPECT_EQ(uniforms[4095], "OutSize"); } TEST_F(ProgramUtilTest, CompileAndLinkProgram) {