diff --git a/src/modules/graphics/metal/Shader.mm b/src/modules/graphics/metal/Shader.mm index 5963ec414..2e14ed731 100644 --- a/src/modules/graphics/metal/Shader.mm +++ b/src/modules/graphics/metal/Shader.mm @@ -290,10 +290,11 @@ static EShLanguage getGLSLangStage(ShaderStageType stage) case SPIRType::Struct: if (membertype.op == spv::OpTypeArray) { + size_t arraystride = comp.type_struct_member_array_stride(type, uindex); for (uint32 i = 0; i < membertype.array[0]; i++) { std::string structname = name + "[" + std::to_string(i) + "]."; - buildLocalUniforms(msl, membertype, offset, structname); + buildLocalUniforms(msl, membertype, offset + i * arraystride, structname); } } else diff --git a/src/modules/graphics/vulkan/Shader.cpp b/src/modules/graphics/vulkan/Shader.cpp index 815743fb3..f8c547392 100644 --- a/src/modules/graphics/vulkan/Shader.cpp +++ b/src/modules/graphics/vulkan/Shader.cpp @@ -447,10 +447,11 @@ void Shader::buildLocalUniforms(spirv_cross::Compiler &comp, const spirv_cross:: case SPIRType::Struct: if (memberType.op == spv::OpTypeArray) { + size_t arraystride = comp.type_struct_member_array_stride(type, uindex); for (uint32 i = 0; i < memberType.array[0]; i++) { std::string structname = name + "[" + std::to_string(i) + "]."; - buildLocalUniforms(comp, memberType, offset, structname); + buildLocalUniforms(comp, memberType, offset + i * arraystride, structname); } } else