diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp index a3820f7b..82e029dc 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp @@ -154,9 +154,13 @@ namespace MobileGL { } m_uboScratch.resize(m_metadata.uboSize, 0); - m_uniformTypes.resize(uniformOffsets.size()); - for (const auto& [name, type] : m_metadata.plainUniformMemberTypes) { - m_uniformTypes[m_uniforms[name]] = MG_Util::ConvertSpvcTypeToGLEnum(type); + auto& types = m_metadata.plainUniformMemberTypes; + assert(types.size() == m_uniformOffsets.size()); + m_uniformTypes.resize(m_uniformOffsets.size()); + for (const auto& [name, type] : types) { + auto gltype = MG_Util::ConvertSpvcTypeToGLEnum(type); + auto location = m_uniforms[name]; + m_uniformTypes[location] = gltype; } } } // namespace GLState diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index 904ba101..e520ba87 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -112,7 +112,6 @@ TEST_F(ProgramTest, CompileAndLink) { printf("Linking program...\n"); LinkProgram(program); printf("Program linked...\n"); - return; EXPECT_EQ(GetUniformLocation(program, "ProjMat"), 0); EXPECT_EQ(GetUniformLocation(program, "Gray"), 1); diff --git a/MobileGL/MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.cpp b/MobileGL/MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.cpp index 6dd99555..0c6d04b9 100644 --- a/MobileGL/MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.cpp +++ b/MobileGL/MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.cpp @@ -20,26 +20,26 @@ namespace MobileGL { if (matCol > 1) { switch (baseType) { case GL_FLOAT: + if (vecSize == 4 && matCol == 4) return GL_FLOAT_MAT4; + if (vecSize == 3 && matCol == 3) return GL_FLOAT_MAT3; if (vecSize == 2 && matCol == 2) return GL_FLOAT_MAT2; if (vecSize == 2 && matCol == 3) return GL_FLOAT_MAT3x2; if (vecSize == 2 && matCol == 4) return GL_FLOAT_MAT4x2; if (vecSize == 3 && matCol == 2) return GL_FLOAT_MAT2x3; - if (vecSize == 3 && matCol == 3) return GL_FLOAT_MAT3; if (vecSize == 3 && matCol == 4) return GL_FLOAT_MAT4x3; if (vecSize == 4 && matCol == 2) return GL_FLOAT_MAT2x4; if (vecSize == 4 && matCol == 3) return GL_FLOAT_MAT3x4; - if (vecSize == 4 && matCol == 4) return GL_FLOAT_MAT4; break; case GL_DOUBLE: + if (vecSize == 4 && matCol == 4) return GL_DOUBLE_MAT4; + if (vecSize == 3 && matCol == 3) return GL_DOUBLE_MAT3; if (vecSize == 2 && matCol == 2) return GL_DOUBLE_MAT2; if (vecSize == 2 && matCol == 3) return GL_DOUBLE_MAT3x2; if (vecSize == 2 && matCol == 4) return GL_DOUBLE_MAT4x2; if (vecSize == 3 && matCol == 2) return GL_DOUBLE_MAT2x3; - if (vecSize == 3 && matCol == 3) return GL_DOUBLE_MAT3; if (vecSize == 3 && matCol == 4) return GL_DOUBLE_MAT4x3; if (vecSize == 4 && matCol == 2) return GL_DOUBLE_MAT2x4; if (vecSize == 4 && matCol == 3) return GL_DOUBLE_MAT3x4; - if (vecSize == 4 && matCol == 4) return GL_DOUBLE_MAT4; break; default: return GL_FALSE; @@ -50,17 +50,17 @@ namespace MobileGL { switch (baseType) { case GL_BOOL: switch (vecSize) { - case 2: return GL_BOOL_VEC2; - case 3: return GL_BOOL_VEC3; case 4: return GL_BOOL_VEC4; + case 3: return GL_BOOL_VEC3; + case 2: return GL_BOOL_VEC2; } case GL_FLOAT: return GL_FLOAT_VEC2 + (vecSize - 2); // GL_FLOAT_VEC* is contiguous case GL_DOUBLE: switch (vecSize) { - case 2: return GL_DOUBLE_VEC2; - case 3: return GL_DOUBLE_VEC3; - case 4: return GL_DOUBLE_VEC4; + case 4: return GL_DOUBLE_VEC4; + case 3: return GL_DOUBLE_VEC3; + case 2: return GL_DOUBLE_VEC2; } break; case GL_INT: