Browse Source

metal/vulkan: fix uniform numbers and vectors in arrays of structs.

Sasha Szpakowski 1 year ago
parent
commit
2eb8198dba
2 changed files with 4 additions and 2 deletions
  1. 2 1
      src/modules/graphics/metal/Shader.mm
  2. 2 1
      src/modules/graphics/vulkan/Shader.cpp

+ 2 - 1
src/modules/graphics/metal/Shader.mm

@@ -290,10 +290,11 @@ void Shader::buildLocalUniforms(const spirv_cross::CompilerMSL &msl, const spirv
 			case SPIRType::Struct:
 			case SPIRType::Struct:
 				if (membertype.op == spv::OpTypeArray)
 				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++)
 					for (uint32 i = 0; i < membertype.array[0]; i++)
 					{
 					{
 						std::string structname = name + "[" + std::to_string(i) + "].";
 						std::string structname = name + "[" + std::to_string(i) + "].";
-						buildLocalUniforms(msl, membertype, offset, structname);
+						buildLocalUniforms(msl, membertype, offset + i * arraystride, structname);
 					}
 					}
 				}
 				}
 				else
 				else

+ 2 - 1
src/modules/graphics/vulkan/Shader.cpp

@@ -447,10 +447,11 @@ void Shader::buildLocalUniforms(spirv_cross::Compiler &comp, const spirv_cross::
 		case SPIRType::Struct:
 		case SPIRType::Struct:
 			if (memberType.op == spv::OpTypeArray)
 			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++)
 				for (uint32 i = 0; i < memberType.array[0]; i++)
 				{
 				{
 					std::string structname = name + "[" + std::to_string(i) + "].";
 					std::string structname = name + "[" + std::to_string(i) + "].";
-					buildLocalUniforms(comp, memberType, offset, structname);
+					buildLocalUniforms(comp, memberType, offset + i * arraystride, structname);
 				}
 				}
 			}
 			}
 			else
 			else