[Fix] (MG_State/Program): does it still crash?

This commit is contained in:
2025-08-14 21:23:55 +08:00
parent 634fb4fa57
commit c1966c5f04
3 changed files with 16 additions and 13 deletions
@@ -154,9 +154,13 @@ namespace MobileGL {
} }
m_uboScratch.resize(m_metadata.uboSize, 0); m_uboScratch.resize(m_metadata.uboSize, 0);
m_uniformTypes.resize(uniformOffsets.size()); auto& types = m_metadata.plainUniformMemberTypes;
for (const auto& [name, type] : m_metadata.plainUniformMemberTypes) { assert(types.size() == m_uniformOffsets.size());
m_uniformTypes[m_uniforms[name]] = MG_Util::ConvertSpvcTypeToGLEnum(type); 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 } // namespace GLState
-1
View File
@@ -112,7 +112,6 @@ TEST_F(ProgramTest, CompileAndLink) {
printf("Linking program...\n"); printf("Linking program...\n");
LinkProgram(program); LinkProgram(program);
printf("Program linked...\n"); printf("Program linked...\n");
return;
EXPECT_EQ(GetUniformLocation(program, "ProjMat"), 0); EXPECT_EQ(GetUniformLocation(program, "ProjMat"), 0);
EXPECT_EQ(GetUniformLocation(program, "Gray"), 1); EXPECT_EQ(GetUniformLocation(program, "Gray"), 1);
@@ -20,26 +20,26 @@ namespace MobileGL {
if (matCol > 1) { if (matCol > 1) {
switch (baseType) { switch (baseType) {
case GL_FLOAT: 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 == 2) return GL_FLOAT_MAT2;
if (vecSize == 2 && matCol == 3) return GL_FLOAT_MAT3x2; if (vecSize == 2 && matCol == 3) return GL_FLOAT_MAT3x2;
if (vecSize == 2 && matCol == 4) return GL_FLOAT_MAT4x2; if (vecSize == 2 && matCol == 4) return GL_FLOAT_MAT4x2;
if (vecSize == 3 && matCol == 2) return GL_FLOAT_MAT2x3; 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 == 3 && matCol == 4) return GL_FLOAT_MAT4x3;
if (vecSize == 4 && matCol == 2) return GL_FLOAT_MAT2x4; if (vecSize == 4 && matCol == 2) return GL_FLOAT_MAT2x4;
if (vecSize == 4 && matCol == 3) return GL_FLOAT_MAT3x4; if (vecSize == 4 && matCol == 3) return GL_FLOAT_MAT3x4;
if (vecSize == 4 && matCol == 4) return GL_FLOAT_MAT4;
break; break;
case GL_DOUBLE: 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 == 2) return GL_DOUBLE_MAT2;
if (vecSize == 2 && matCol == 3) return GL_DOUBLE_MAT3x2; if (vecSize == 2 && matCol == 3) return GL_DOUBLE_MAT3x2;
if (vecSize == 2 && matCol == 4) return GL_DOUBLE_MAT4x2; if (vecSize == 2 && matCol == 4) return GL_DOUBLE_MAT4x2;
if (vecSize == 3 && matCol == 2) return GL_DOUBLE_MAT2x3; 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 == 3 && matCol == 4) return GL_DOUBLE_MAT4x3;
if (vecSize == 4 && matCol == 2) return GL_DOUBLE_MAT2x4; if (vecSize == 4 && matCol == 2) return GL_DOUBLE_MAT2x4;
if (vecSize == 4 && matCol == 3) return GL_DOUBLE_MAT3x4; if (vecSize == 4 && matCol == 3) return GL_DOUBLE_MAT3x4;
if (vecSize == 4 && matCol == 4) return GL_DOUBLE_MAT4;
break; break;
default: default:
return GL_FALSE; return GL_FALSE;
@@ -50,17 +50,17 @@ namespace MobileGL {
switch (baseType) { switch (baseType) {
case GL_BOOL: case GL_BOOL:
switch (vecSize) { switch (vecSize) {
case 2: return GL_BOOL_VEC2;
case 3: return GL_BOOL_VEC3;
case 4: return GL_BOOL_VEC4; case 4: return GL_BOOL_VEC4;
case 3: return GL_BOOL_VEC3;
case 2: return GL_BOOL_VEC2;
} }
case GL_FLOAT: case GL_FLOAT:
return GL_FLOAT_VEC2 + (vecSize - 2); // GL_FLOAT_VEC* is contiguous return GL_FLOAT_VEC2 + (vecSize - 2); // GL_FLOAT_VEC* is contiguous
case GL_DOUBLE: case GL_DOUBLE:
switch (vecSize) { switch (vecSize) {
case 2: return GL_DOUBLE_VEC2; case 4: return GL_DOUBLE_VEC4;
case 3: return GL_DOUBLE_VEC3; case 3: return GL_DOUBLE_VEC3;
case 4: return GL_DOUBLE_VEC4; case 2: return GL_DOUBLE_VEC2;
} }
break; break;
case GL_INT: case GL_INT: