writer/spirv: Handle terminators in BlockStatements Fixed: tint:922 Change-Id: Ib3815ada8bcf2d4c1f8c86d4178cd088ba071c6c Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56280 Auto-Submit: Ben Clayton <bclayton@google.com> Commit-Queue: Ben Clayton <bclayton@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc index 826a26b..e3f65cd 100644 --- a/src/writer/spirv/builder.cc +++ b/src/writer/spirv/builder.cc
@@ -89,11 +89,17 @@ } auto* last = stmts->last(); - return last->Is<ast::BreakStatement>() || - last->Is<ast::ContinueStatement>() || - last->Is<ast::DiscardStatement>() || - last->Is<ast::ReturnStatement>() || - last->Is<ast::FallthroughStatement>(); + if (last->Is<ast::BreakStatement>() || last->Is<ast::ContinueStatement>() || + last->Is<ast::DiscardStatement>() || last->Is<ast::ReturnStatement>() || + last->Is<ast::FallthroughStatement>()) { + return true; + } + + if (auto* block = last->As<ast::BlockStatement>()) { + return LastIsTerminator(block); + } + + return false; } /// Returns the matrix type that is `type` or that is wrapped by
diff --git a/src/writer/spirv/builder_if_test.cc b/src/writer/spirv/builder_if_test.cc index 193c11a..1206347 100644 --- a/src/writer/spirv/builder_if_test.cc +++ b/src/writer/spirv/builder_if_test.cc
@@ -501,6 +501,38 @@ )"); } +TEST_F(BuilderTest, If_WithNestedBlockReturnValue) { + // if (true) { + // { + // { + // { + // return false; + // } + // } + // } + // } + // return true; + auto* if_body = Block(Block(Block(Block(Return(false))))); + auto* expr = If(Expr(true), if_body); + Func("test", {}, ty.bool_(), {expr, Return(true)}, {}); + spirv::Builder& b = Build(); + + b.push_function(Function{}); + + EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error(); + EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool +%2 = OpConstantTrue %1 +%5 = OpConstantFalse %1 +)"); + EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()), + R"(OpSelectionMerge %3 None +OpBranchConditional %2 %4 %3 +%4 = OpLabel +OpReturnValue %5 +%3 = OpLabel +)"); +} + TEST_F(BuilderTest, If_WithLoad_Bug327) { // var a : bool; // if (a) {
diff --git a/test/bug/tint/922.wgsl b/test/bug/tint/922.wgsl new file mode 100644 index 0000000..52bc8e3 --- /dev/null +++ b/test/bug/tint/922.wgsl
@@ -0,0 +1,301 @@ +struct Mat4x4_ { + mx: vec4<f32>; + my: vec4<f32>; + mz: vec4<f32>; + mw: vec4<f32>; +}; + +struct Mat4x3_ { + mx: vec4<f32>; + my: vec4<f32>; + mz: vec4<f32>; +}; + +struct Mat4x2_ { + mx: vec4<f32>; + my: vec4<f32>; +}; + +[[block]] +struct ub_SceneParams { + u_Projection: Mat4x4_; +}; + +[[block]] +struct ub_MaterialParams { + u_TexMtx: [[stride(32)]] array<Mat4x2_,1>; + u_Misc0_: vec4<f32>; +}; + +[[block]] +struct ub_PacketParams { + u_PosMtx: [[stride(48)]] array<Mat4x3_,32>; +}; + +struct VertexOutput { + [[location(0)]] v_Color: vec4<f32>; + [[location(1)]] v_TexCoord: vec2<f32>; + [[builtin(position)]] member: vec4<f32>; +}; + +[[group(0), binding(0)]] +var<uniform> global: ub_SceneParams; +[[group(0), binding(1)]] +var<uniform> global1: ub_MaterialParams; +[[group(0), binding(2)]] +var<uniform> global2: ub_PacketParams; +var<private> a_Position1: vec3<f32>; +var<private> a_UV1: vec2<f32>; +var<private> a_Color1: vec4<f32>; +var<private> a_Normal1: vec3<f32>; +var<private> a_PosMtxIdx1: f32; +var<private> v_Color: vec4<f32>; +var<private> v_TexCoord: vec2<f32>; +var<private> gl_Position: vec4<f32>; + +fn Mat4x3GetCol0_(m: Mat4x3_) -> vec3<f32> { + var m1: Mat4x3_; + + m1 = m; + let _e2: Mat4x3_ = m1; + let _e5: Mat4x3_ = m1; + let _e8: Mat4x3_ = m1; + return vec3<f32>(_e2.mx.x, _e5.my.x, _e8.mz.x); +} + +fn Mat4x3GetCol1_(m2: Mat4x3_) -> vec3<f32> { + var m3: Mat4x3_; + + m3 = m2; + let _e2: Mat4x3_ = m3; + let _e5: Mat4x3_ = m3; + let _e8: Mat4x3_ = m3; + return vec3<f32>(_e2.mx.y, _e5.my.y, _e8.mz.y); +} + +fn Mat4x3GetCol2_(m4: Mat4x3_) -> vec3<f32> { + var m5: Mat4x3_; + + m5 = m4; + let _e2: Mat4x3_ = m5; + let _e5: Mat4x3_ = m5; + let _e8: Mat4x3_ = m5; + return vec3<f32>(_e2.mx.z, _e5.my.z, _e8.mz.z); +} + +fn Mat4x3GetCol3_(m6: Mat4x3_) -> vec3<f32> { + var m7: Mat4x3_; + + m7 = m6; + let _e2: Mat4x3_ = m7; + let _e5: Mat4x3_ = m7; + let _e8: Mat4x3_ = m7; + return vec3<f32>(_e2.mx.w, _e5.my.w, _e8.mz.w); +} + +fn Mul(m8: Mat4x4_, v: vec4<f32>) -> vec4<f32> { + var m9: Mat4x4_; + var v1: vec4<f32>; + + m9 = m8; + v1 = v; + let _e4: Mat4x4_ = m9; + let _e6: vec4<f32> = v1; + let _e8: Mat4x4_ = m9; + let _e10: vec4<f32> = v1; + let _e12: Mat4x4_ = m9; + let _e14: vec4<f32> = v1; + let _e16: Mat4x4_ = m9; + let _e18: vec4<f32> = v1; + return vec4<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14), dot(_e16.mw, _e18)); +} + +fn Mul1(m10: Mat4x3_, v2: vec4<f32>) -> vec3<f32> { + var m11: Mat4x3_; + var v3: vec4<f32>; + + m11 = m10; + v3 = v2; + let _e4: Mat4x3_ = m11; + let _e6: vec4<f32> = v3; + let _e8: Mat4x3_ = m11; + let _e10: vec4<f32> = v3; + let _e12: Mat4x3_ = m11; + let _e14: vec4<f32> = v3; + return vec3<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14)); +} + +fn Mul2(m12: Mat4x2_, v4: vec4<f32>) -> vec2<f32> { + var m13: Mat4x2_; + var v5: vec4<f32>; + + m13 = m12; + v5 = v4; + let _e4: Mat4x2_ = m13; + let _e6: vec4<f32> = v5; + let _e8: Mat4x2_ = m13; + let _e10: vec4<f32> = v5; + return vec2<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10)); +} + +fn Mul3(v6: vec3<f32>, m14: Mat4x3_) -> vec4<f32> { + var v7: vec3<f32>; + var m15: Mat4x3_; + + v7 = v6; + m15 = m14; + let _e5: Mat4x3_ = m15; + let _e6: vec3<f32> = Mat4x3GetCol0_(_e5); + let _e7: vec3<f32> = v7; + let _e10: Mat4x3_ = m15; + let _e11: vec3<f32> = Mat4x3GetCol1_(_e10); + let _e12: vec3<f32> = v7; + let _e15: Mat4x3_ = m15; + let _e16: vec3<f32> = Mat4x3GetCol2_(_e15); + let _e17: vec3<f32> = v7; + let _e20: Mat4x3_ = m15; + let _e21: vec3<f32> = Mat4x3GetCol3_(_e20); + let _e22: vec3<f32> = v7; + return vec4<f32>(dot(_e6, _e7), dot(_e11, _e12), dot(_e16, _e17), dot(_e21, _e22)); +} + +fn _Mat4x4_(n: f32) -> Mat4x4_ { + var n1: f32; + var o: Mat4x4_; + + n1 = n; + let _e4: f32 = n1; + o.mx = vec4<f32>(_e4, 0.0, 0.0, 0.0); + let _e11: f32 = n1; + o.my = vec4<f32>(0.0, _e11, 0.0, 0.0); + let _e18: f32 = n1; + o.mz = vec4<f32>(0.0, 0.0, _e18, 0.0); + let _e25: f32 = n1; + o.mw = vec4<f32>(0.0, 0.0, 0.0, _e25); + let _e27: Mat4x4_ = o; + return _e27; +} + +fn _Mat4x4_1(m16: Mat4x3_) -> Mat4x4_ { + var m17: Mat4x3_; + var o1: Mat4x4_; + + m17 = m16; + let _e4: Mat4x4_ = _Mat4x4_(1.0); + o1 = _e4; + let _e7: Mat4x3_ = m17; + o1.mx = _e7.mx; + let _e10: Mat4x3_ = m17; + o1.my = _e10.my; + let _e13: Mat4x3_ = m17; + o1.mz = _e13.mz; + let _e15: Mat4x4_ = o1; + return _e15; +} + +fn _Mat4x4_2(m18: Mat4x2_) -> Mat4x4_ { + var m19: Mat4x2_; + var o2: Mat4x4_; + + m19 = m18; + let _e4: Mat4x4_ = _Mat4x4_(1.0); + o2 = _e4; + let _e7: Mat4x2_ = m19; + o2.mx = _e7.mx; + let _e10: Mat4x2_ = m19; + o2.my = _e10.my; + let _e12: Mat4x4_ = o2; + return _e12; +} + +fn _Mat4x3_(n2: f32) -> Mat4x3_ { + var n3: f32; + var o3: Mat4x3_; + + n3 = n2; + let _e4: f32 = n3; + o3.mx = vec4<f32>(_e4, 0.0, 0.0, 0.0); + let _e11: f32 = n3; + o3.my = vec4<f32>(0.0, _e11, 0.0, 0.0); + let _e18: f32 = n3; + o3.mz = vec4<f32>(0.0, 0.0, _e18, 0.0); + let _e21: Mat4x3_ = o3; + return _e21; +} + +fn _Mat4x3_1(m20: Mat4x4_) -> Mat4x3_ { + var m21: Mat4x4_; + var o4: Mat4x3_; + + m21 = m20; + let _e4: Mat4x4_ = m21; + o4.mx = _e4.mx; + let _e7: Mat4x4_ = m21; + o4.my = _e7.my; + let _e10: Mat4x4_ = m21; + o4.mz = _e10.mz; + let _e12: Mat4x3_ = o4; + return _e12; +} + +fn main1() { + var t_PosMtx: Mat4x3_; + var t_TexSpaceCoord: vec2<f32>; + + let _e15: f32 = a_PosMtxIdx1; + let _e18: Mat4x3_ = global2.u_PosMtx[i32(_e15)]; + t_PosMtx = _e18; + let _e23: Mat4x3_ = t_PosMtx; + let _e24: Mat4x4_ = _Mat4x4_1(_e23); + let _e25: vec3<f32> = a_Position1; + let _e29: Mat4x3_ = t_PosMtx; + let _e30: Mat4x4_ = _Mat4x4_1(_e29); + let _e31: vec3<f32> = a_Position1; + let _e34: vec4<f32> = Mul(_e30, vec4<f32>(_e31, 1.0)); + let _e35: Mat4x4_ = global.u_Projection; + let _e37: Mat4x3_ = t_PosMtx; + let _e38: Mat4x4_ = _Mat4x4_1(_e37); + let _e39: vec3<f32> = a_Position1; + let _e43: Mat4x3_ = t_PosMtx; + let _e44: Mat4x4_ = _Mat4x4_1(_e43); + let _e45: vec3<f32> = a_Position1; + let _e48: vec4<f32> = Mul(_e44, vec4<f32>(_e45, 1.0)); + let _e49: vec4<f32> = Mul(_e35, _e48); + gl_Position = _e49; + let _e50: vec4<f32> = a_Color1; + v_Color = _e50; + let _e52: vec4<f32> = global1.u_Misc0_; + if ((_e52.x == 2.0)) { + { + let _e59: vec3<f32> = a_Normal1; + let _e64: Mat4x2_ = global1.u_TexMtx[0]; + let _e65: vec3<f32> = a_Normal1; + let _e68: vec2<f32> = Mul2(_e64, vec4<f32>(_e65, 1.0)); + v_TexCoord = _e68.xy; + return; + } + } else { + { + let _e73: vec2<f32> = a_UV1; + let _e79: Mat4x2_ = global1.u_TexMtx[0]; + let _e80: vec2<f32> = a_UV1; + let _e84: vec2<f32> = Mul2(_e79, vec4<f32>(_e80, 1.0, 1.0)); + v_TexCoord = _e84.xy; + return; + } + } +} + +[[stage(vertex)]] +fn main([[location(0)]] a_Position: vec3<f32>, [[location(1)]] a_UV: vec2<f32>, [[location(2)]] a_Color: vec4<f32>, [[location(3)]] a_Normal: vec3<f32>, [[location(4)]] a_PosMtxIdx: f32) -> VertexOutput { + a_Position1 = a_Position; + a_UV1 = a_UV; + a_Color1 = a_Color; + a_Normal1 = a_Normal; + a_PosMtxIdx1 = a_PosMtxIdx; + main1(); + let _e11: vec4<f32> = v_Color; + let _e13: vec2<f32> = v_TexCoord; + let _e15: vec4<f32> = gl_Position; + return VertexOutput(_e11, _e13, _e15); +} \ No newline at end of file
diff --git a/test/bug/tint/922.wgsl.expected.hlsl b/test/bug/tint/922.wgsl.expected.hlsl new file mode 100644 index 0000000..7dc7d67 --- /dev/null +++ b/test/bug/tint/922.wgsl.expected.hlsl
@@ -0,0 +1,316 @@ +struct Mat4x4_ { + float4 mx; + float4 my; + float4 mz; + float4 mw; +}; +struct Mat4x3_ { + float4 mx; + float4 my; + float4 mz; +}; +struct Mat4x2_ { + float4 mx; + float4 my; +}; + +Mat4x4_ tint_symbol_7(uint4 buffer[4], uint offset) { + const int scalar_offset = ((offset + 0u)) / 4; + const int scalar_offset_1 = ((offset + 16u)) / 4; + const int scalar_offset_2 = ((offset + 32u)) / 4; + const int scalar_offset_3 = ((offset + 48u)) / 4; + const Mat4x4_ tint_symbol_10 = {asfloat(buffer[scalar_offset / 4]), asfloat(buffer[scalar_offset_1 / 4]), asfloat(buffer[scalar_offset_2 / 4]), asfloat(buffer[scalar_offset_3 / 4])}; + return tint_symbol_10; +} + +Mat4x2_ tint_symbol_9(uint4 buffer[3], uint offset) { + const int scalar_offset_4 = ((offset + 0u)) / 4; + const int scalar_offset_5 = ((offset + 16u)) / 4; + const Mat4x2_ tint_symbol_11 = {asfloat(buffer[scalar_offset_4 / 4]), asfloat(buffer[scalar_offset_5 / 4])}; + return tint_symbol_11; +} + +Mat4x3_ tint_symbol_5(uint4 buffer[96], uint offset) { + const int scalar_offset_6 = ((offset + 0u)) / 4; + const int scalar_offset_7 = ((offset + 16u)) / 4; + const int scalar_offset_8 = ((offset + 32u)) / 4; + const Mat4x3_ tint_symbol_12 = {asfloat(buffer[scalar_offset_6 / 4]), asfloat(buffer[scalar_offset_7 / 4]), asfloat(buffer[scalar_offset_8 / 4])}; + return tint_symbol_12; +} + +struct VertexOutput { + float4 v_Color; + float2 v_TexCoord; + float4 member; +}; + +cbuffer cbuffer_global : register(b0, space0) { + uint4 global[4]; +}; +cbuffer cbuffer_global1 : register(b1, space0) { + uint4 global1[3]; +}; +cbuffer cbuffer_global2 : register(b2, space0) { + uint4 global2[96]; +}; +static float3 a_Position1 = float3(0.0f, 0.0f, 0.0f); +static float2 a_UV1 = float2(0.0f, 0.0f); +static float4 a_Color1 = float4(0.0f, 0.0f, 0.0f, 0.0f); +static float3 a_Normal1 = float3(0.0f, 0.0f, 0.0f); +static float a_PosMtxIdx1 = 0.0f; +static float4 v_Color = float4(0.0f, 0.0f, 0.0f, 0.0f); +static float2 v_TexCoord = float2(0.0f, 0.0f); +static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f); + +float3 Mat4x3GetCol0_(Mat4x3_ m) { + Mat4x3_ m1 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m1 = m; + const Mat4x3_ _e2 = m1; + const Mat4x3_ _e5 = m1; + const Mat4x3_ _e8 = m1; + return float3(_e2.mx.x, _e5.my.x, _e8.mz.x); +} + +float3 Mat4x3GetCol1_(Mat4x3_ m2) { + Mat4x3_ m3 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m3 = m2; + const Mat4x3_ _e2 = m3; + const Mat4x3_ _e5 = m3; + const Mat4x3_ _e8 = m3; + return float3(_e2.mx.y, _e5.my.y, _e8.mz.y); +} + +float3 Mat4x3GetCol2_(Mat4x3_ m4) { + Mat4x3_ m5 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m5 = m4; + const Mat4x3_ _e2 = m5; + const Mat4x3_ _e5 = m5; + const Mat4x3_ _e8 = m5; + return float3(_e2.mx.z, _e5.my.z, _e8.mz.z); +} + +float3 Mat4x3GetCol3_(Mat4x3_ m6) { + Mat4x3_ m7 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m7 = m6; + const Mat4x3_ _e2 = m7; + const Mat4x3_ _e5 = m7; + const Mat4x3_ _e8 = m7; + return float3(_e2.mx.w, _e5.my.w, _e8.mz.w); +} + +float4 Mul(Mat4x4_ m8, float4 v) { + Mat4x4_ m9 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f); + m9 = m8; + v1 = v; + const Mat4x4_ _e4 = m9; + const float4 _e6 = v1; + const Mat4x4_ _e8 = m9; + const float4 _e10 = v1; + const Mat4x4_ _e12 = m9; + const float4 _e14 = v1; + const Mat4x4_ _e16 = m9; + const float4 _e18 = v1; + return float4(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14), dot(_e16.mw, _e18)); +} + +float3 Mul1(Mat4x3_ m10, float4 v2) { + Mat4x3_ m11 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + float4 v3 = float4(0.0f, 0.0f, 0.0f, 0.0f); + m11 = m10; + v3 = v2; + const Mat4x3_ _e4 = m11; + const float4 _e6 = v3; + const Mat4x3_ _e8 = m11; + const float4 _e10 = v3; + const Mat4x3_ _e12 = m11; + const float4 _e14 = v3; + return float3(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14)); +} + +float2 Mul2(Mat4x2_ m12, float4 v4) { + Mat4x2_ m13 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + float4 v5 = float4(0.0f, 0.0f, 0.0f, 0.0f); + m13 = m12; + v5 = v4; + const Mat4x2_ _e4 = m13; + const float4 _e6 = v5; + const Mat4x2_ _e8 = m13; + const float4 _e10 = v5; + return float2(dot(_e4.mx, _e6), dot(_e8.my, _e10)); +} + +float4 Mul3(float3 v6, Mat4x3_ m14) { + float3 v7 = float3(0.0f, 0.0f, 0.0f); + Mat4x3_ m15 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + v7 = v6; + m15 = m14; + const Mat4x3_ _e5 = m15; + const float3 _e6 = Mat4x3GetCol0_(_e5); + const float3 _e7 = v7; + const Mat4x3_ _e10 = m15; + const float3 _e11 = Mat4x3GetCol1_(_e10); + const float3 _e12 = v7; + const Mat4x3_ _e15 = m15; + const float3 _e16 = Mat4x3GetCol2_(_e15); + const float3 _e17 = v7; + const Mat4x3_ _e20 = m15; + const float3 _e21 = Mat4x3GetCol3_(_e20); + const float3 _e22 = v7; + return float4(dot(_e6, _e7), dot(_e11, _e12), dot(_e16, _e17), dot(_e21, _e22)); +} + +Mat4x4_ _Mat4x4_(float n) { + float n1 = 0.0f; + Mat4x4_ o = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + n1 = n; + const float _e4 = n1; + o.mx = float4(_e4, 0.0f, 0.0f, 0.0f); + const float _e11 = n1; + o.my = float4(0.0f, _e11, 0.0f, 0.0f); + const float _e18 = n1; + o.mz = float4(0.0f, 0.0f, _e18, 0.0f); + const float _e25 = n1; + o.mw = float4(0.0f, 0.0f, 0.0f, _e25); + const Mat4x4_ _e27 = o; + return _e27; +} + +Mat4x4_ _Mat4x4_1(Mat4x3_ m16) { + Mat4x3_ m17 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + Mat4x4_ o1 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m17 = m16; + const Mat4x4_ _e4 = _Mat4x4_(1.0f); + o1 = _e4; + const Mat4x3_ _e7 = m17; + o1.mx = _e7.mx; + const Mat4x3_ _e10 = m17; + o1.my = _e10.my; + const Mat4x3_ _e13 = m17; + o1.mz = _e13.mz; + const Mat4x4_ _e15 = o1; + return _e15; +} + +Mat4x4_ _Mat4x4_2(Mat4x2_ m18) { + Mat4x2_ m19 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + Mat4x4_ o2 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m19 = m18; + const Mat4x4_ _e4 = _Mat4x4_(1.0f); + o2 = _e4; + const Mat4x2_ _e7 = m19; + o2.mx = _e7.mx; + const Mat4x2_ _e10 = m19; + o2.my = _e10.my; + const Mat4x4_ _e12 = o2; + return _e12; +} + +Mat4x3_ _Mat4x3_(float n2) { + float n3 = 0.0f; + Mat4x3_ o3 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + n3 = n2; + const float _e4 = n3; + o3.mx = float4(_e4, 0.0f, 0.0f, 0.0f); + const float _e11 = n3; + o3.my = float4(0.0f, _e11, 0.0f, 0.0f); + const float _e18 = n3; + o3.mz = float4(0.0f, 0.0f, _e18, 0.0f); + const Mat4x3_ _e21 = o3; + return _e21; +} + +Mat4x3_ _Mat4x3_1(Mat4x4_ m20) { + Mat4x4_ m21 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + Mat4x3_ o4 = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + m21 = m20; + const Mat4x4_ _e4 = m21; + o4.mx = _e4.mx; + const Mat4x4_ _e7 = m21; + o4.my = _e7.my; + const Mat4x4_ _e10 = m21; + o4.mz = _e10.mz; + const Mat4x3_ _e12 = o4; + return _e12; +} + +void main1() { + Mat4x3_ t_PosMtx = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}; + float2 t_TexSpaceCoord = float2(0.0f, 0.0f); + const float _e15 = a_PosMtxIdx1; + const Mat4x3_ _e18 = tint_symbol_5(global2, (48u * uint(int(_e15)))); + t_PosMtx = _e18; + const Mat4x3_ _e23 = t_PosMtx; + const Mat4x4_ _e24 = _Mat4x4_1(_e23); + const float3 _e25 = a_Position1; + const Mat4x3_ _e29 = t_PosMtx; + const Mat4x4_ _e30 = _Mat4x4_1(_e29); + const float3 _e31 = a_Position1; + const float4 _e34 = Mul(_e30, float4(_e31, 1.0f)); + const Mat4x4_ _e35 = tint_symbol_7(global, 0u); + const Mat4x3_ _e37 = t_PosMtx; + const Mat4x4_ _e38 = _Mat4x4_1(_e37); + const float3 _e39 = a_Position1; + const Mat4x3_ _e43 = t_PosMtx; + const Mat4x4_ _e44 = _Mat4x4_1(_e43); + const float3 _e45 = a_Position1; + const float4 _e48 = Mul(_e44, float4(_e45, 1.0f)); + const float4 _e49 = Mul(_e35, _e48); + gl_Position = _e49; + const float4 _e50 = a_Color1; + v_Color = _e50; + const int scalar_offset_9 = (32u) / 4; + const float4 _e52 = asfloat(global1[scalar_offset_9 / 4]); + if ((_e52.x == 2.0f)) { + { + const float3 _e59 = a_Normal1; + const Mat4x2_ _e64 = tint_symbol_9(global1, (32u * uint(0))); + const float3 _e65 = a_Normal1; + const float2 _e68 = Mul2(_e64, float4(_e65, 1.0f)); + v_TexCoord = _e68.xy; + return; + } + } else { + { + const float2 _e73 = a_UV1; + const Mat4x2_ _e79 = tint_symbol_9(global1, (32u * uint(0))); + const float2 _e80 = a_UV1; + const float2 _e84 = Mul2(_e79, float4(_e80, 1.0f, 1.0f)); + v_TexCoord = _e84.xy; + return; + } + } +} + +struct tint_symbol_1 { + float3 a_Position : TEXCOORD0; + float2 a_UV : TEXCOORD1; + float4 a_Color : TEXCOORD2; + float3 a_Normal : TEXCOORD3; + float a_PosMtxIdx : TEXCOORD4; +}; +struct tint_symbol_2 { + float4 v_Color : TEXCOORD0; + float2 v_TexCoord : TEXCOORD1; + float4 member : SV_Position; +}; + +tint_symbol_2 main(tint_symbol_1 tint_symbol) { + const float3 a_Position = tint_symbol.a_Position; + const float2 a_UV = tint_symbol.a_UV; + const float4 a_Color = tint_symbol.a_Color; + const float3 a_Normal = tint_symbol.a_Normal; + const float a_PosMtxIdx = tint_symbol.a_PosMtxIdx; + a_Position1 = a_Position; + a_UV1 = a_UV; + a_Color1 = a_Color; + a_Normal1 = a_Normal; + a_PosMtxIdx1 = a_PosMtxIdx; + main1(); + const float4 _e11 = v_Color; + const float2 _e13 = v_TexCoord; + const float4 _e15 = gl_Position; + const VertexOutput tint_symbol_3 = {_e11, _e13, _e15}; + const tint_symbol_2 tint_symbol_13 = {tint_symbol_3.v_Color, tint_symbol_3.v_TexCoord, tint_symbol_3.member}; + return tint_symbol_13; +}
diff --git a/test/bug/tint/922.wgsl.expected.msl b/test/bug/tint/922.wgsl.expected.msl new file mode 100644 index 0000000..8479d65 --- /dev/null +++ b/test/bug/tint/922.wgsl.expected.msl
@@ -0,0 +1,299 @@ +#include <metal_stdlib> + +using namespace metal; +struct Mat4x4_ { + /* 0x0000 */ packed_float4 mx; + /* 0x0010 */ packed_float4 my; + /* 0x0020 */ packed_float4 mz; + /* 0x0030 */ packed_float4 mw; +}; +struct Mat4x3_ { + /* 0x0000 */ packed_float4 mx; + /* 0x0010 */ packed_float4 my; + /* 0x0020 */ packed_float4 mz; +}; +struct Mat4x2_ { + /* 0x0000 */ packed_float4 mx; + /* 0x0010 */ packed_float4 my; +}; +struct ub_SceneParams { + /* 0x0000 */ Mat4x4_ u_Projection; +}; +struct tint_array_wrapper { + /* 0x0000 */ Mat4x2_ arr[1]; +}; +struct ub_MaterialParams { + /* 0x0000 */ tint_array_wrapper u_TexMtx; + /* 0x0020 */ packed_float4 u_Misc0_; +}; +struct tint_array_wrapper_1 { + /* 0x0000 */ Mat4x3_ arr[32]; +}; +struct ub_PacketParams { + /* 0x0000 */ tint_array_wrapper_1 u_PosMtx; +}; +struct VertexOutput { + float4 v_Color; + float2 v_TexCoord; + float4 member; +}; +struct tint_symbol_2 { + float3 a_Position [[attribute(0)]]; + float2 a_UV [[attribute(1)]]; + float4 a_Color [[attribute(2)]]; + float3 a_Normal [[attribute(3)]]; + float a_PosMtxIdx [[attribute(4)]]; +}; +struct tint_symbol_3 { + float4 v_Color [[user(locn0)]]; + float2 v_TexCoord [[user(locn1)]]; + float4 member [[position]]; +}; + +float3 Mat4x3GetCol0_(Mat4x3_ m) { + Mat4x3_ m1 = {}; + m1 = m; + Mat4x3_ const _e2 = m1; + Mat4x3_ const _e5 = m1; + Mat4x3_ const _e8 = m1; + return float3(_e2.mx.x, _e5.my.x, _e8.mz.x); +} + +float3 Mat4x3GetCol1_(Mat4x3_ m2) { + Mat4x3_ m3 = {}; + m3 = m2; + Mat4x3_ const _e2 = m3; + Mat4x3_ const _e5 = m3; + Mat4x3_ const _e8 = m3; + return float3(_e2.mx.y, _e5.my.y, _e8.mz.y); +} + +float3 Mat4x3GetCol2_(Mat4x3_ m4) { + Mat4x3_ m5 = {}; + m5 = m4; + Mat4x3_ const _e2 = m5; + Mat4x3_ const _e5 = m5; + Mat4x3_ const _e8 = m5; + return float3(_e2.mx.z, _e5.my.z, _e8.mz.z); +} + +float3 Mat4x3GetCol3_(Mat4x3_ m6) { + Mat4x3_ m7 = {}; + m7 = m6; + Mat4x3_ const _e2 = m7; + Mat4x3_ const _e5 = m7; + Mat4x3_ const _e8 = m7; + return float3(_e2.mx.w, _e5.my.w, _e8.mz.w); +} + +float4 Mul(Mat4x4_ m8, float4 v) { + Mat4x4_ m9 = {}; + float4 v1 = 0.0f; + m9 = m8; + v1 = v; + Mat4x4_ const _e4 = m9; + float4 const _e6 = v1; + Mat4x4_ const _e8 = m9; + float4 const _e10 = v1; + Mat4x4_ const _e12 = m9; + float4 const _e14 = v1; + Mat4x4_ const _e16 = m9; + float4 const _e18 = v1; + return float4(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14), dot(_e16.mw, _e18)); +} + +float3 Mul1(Mat4x3_ m10, float4 v2) { + Mat4x3_ m11 = {}; + float4 v3 = 0.0f; + m11 = m10; + v3 = v2; + Mat4x3_ const _e4 = m11; + float4 const _e6 = v3; + Mat4x3_ const _e8 = m11; + float4 const _e10 = v3; + Mat4x3_ const _e12 = m11; + float4 const _e14 = v3; + return float3(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14)); +} + +float2 Mul2(Mat4x2_ m12, float4 v4) { + Mat4x2_ m13 = {}; + float4 v5 = 0.0f; + m13 = m12; + v5 = v4; + Mat4x2_ const _e4 = m13; + float4 const _e6 = v5; + Mat4x2_ const _e8 = m13; + float4 const _e10 = v5; + return float2(dot(_e4.mx, _e6), dot(_e8.my, _e10)); +} + +float4 Mul3(float3 v6, Mat4x3_ m14) { + float3 v7 = 0.0f; + Mat4x3_ m15 = {}; + v7 = v6; + m15 = m14; + Mat4x3_ const _e5 = m15; + float3 const _e6 = Mat4x3GetCol0_(_e5); + float3 const _e7 = v7; + Mat4x3_ const _e10 = m15; + float3 const _e11 = Mat4x3GetCol1_(_e10); + float3 const _e12 = v7; + Mat4x3_ const _e15 = m15; + float3 const _e16 = Mat4x3GetCol2_(_e15); + float3 const _e17 = v7; + Mat4x3_ const _e20 = m15; + float3 const _e21 = Mat4x3GetCol3_(_e20); + float3 const _e22 = v7; + return float4(dot(_e6, _e7), dot(_e11, _e12), dot(_e16, _e17), dot(_e21, _e22)); +} + +Mat4x4_ _Mat4x4_(float n) { + float n1 = 0.0f; + Mat4x4_ o = {}; + n1 = n; + float const _e4 = n1; + o.mx = float4(_e4, 0.0f, 0.0f, 0.0f); + float const _e11 = n1; + o.my = float4(0.0f, _e11, 0.0f, 0.0f); + float const _e18 = n1; + o.mz = float4(0.0f, 0.0f, _e18, 0.0f); + float const _e25 = n1; + o.mw = float4(0.0f, 0.0f, 0.0f, _e25); + Mat4x4_ const _e27 = o; + return _e27; +} + +Mat4x4_ _Mat4x4_1(Mat4x3_ m16) { + Mat4x3_ m17 = {}; + Mat4x4_ o1 = {}; + m17 = m16; + Mat4x4_ const _e4 = _Mat4x4_(1.0f); + o1 = _e4; + Mat4x3_ const _e7 = m17; + o1.mx = _e7.mx; + Mat4x3_ const _e10 = m17; + o1.my = _e10.my; + Mat4x3_ const _e13 = m17; + o1.mz = _e13.mz; + Mat4x4_ const _e15 = o1; + return _e15; +} + +Mat4x4_ _Mat4x4_2(Mat4x2_ m18) { + Mat4x2_ m19 = {}; + Mat4x4_ o2 = {}; + m19 = m18; + Mat4x4_ const _e4 = _Mat4x4_(1.0f); + o2 = _e4; + Mat4x2_ const _e7 = m19; + o2.mx = _e7.mx; + Mat4x2_ const _e10 = m19; + o2.my = _e10.my; + Mat4x4_ const _e12 = o2; + return _e12; +} + +Mat4x3_ _Mat4x3_(float n2) { + float n3 = 0.0f; + Mat4x3_ o3 = {}; + n3 = n2; + float const _e4 = n3; + o3.mx = float4(_e4, 0.0f, 0.0f, 0.0f); + float const _e11 = n3; + o3.my = float4(0.0f, _e11, 0.0f, 0.0f); + float const _e18 = n3; + o3.mz = float4(0.0f, 0.0f, _e18, 0.0f); + Mat4x3_ const _e21 = o3; + return _e21; +} + +Mat4x3_ _Mat4x3_1(Mat4x4_ m20) { + Mat4x4_ m21 = {}; + Mat4x3_ o4 = {}; + m21 = m20; + Mat4x4_ const _e4 = m21; + o4.mx = _e4.mx; + Mat4x4_ const _e7 = m21; + o4.my = _e7.my; + Mat4x4_ const _e10 = m21; + o4.mz = _e10.mz; + Mat4x3_ const _e12 = o4; + return _e12; +} + +void main1(constant ub_PacketParams& global2, constant ub_SceneParams& global, constant ub_MaterialParams& global1, thread float* const tint_symbol_6, thread float3* const tint_symbol_7, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread float3* const tint_symbol_11, thread float2* const tint_symbol_12, thread float2* const tint_symbol_13) { + Mat4x3_ t_PosMtx = {}; + float2 t_TexSpaceCoord = 0.0f; + float const _e15 = *(tint_symbol_6); + Mat4x3_ const _e18 = global2.u_PosMtx.arr[int(_e15)]; + t_PosMtx = _e18; + Mat4x3_ const _e23 = t_PosMtx; + Mat4x4_ const _e24 = _Mat4x4_1(_e23); + float3 const _e25 = *(tint_symbol_7); + Mat4x3_ const _e29 = t_PosMtx; + Mat4x4_ const _e30 = _Mat4x4_1(_e29); + float3 const _e31 = *(tint_symbol_7); + float4 const _e34 = Mul(_e30, float4(_e31, 1.0f)); + Mat4x4_ const _e35 = global.u_Projection; + Mat4x3_ const _e37 = t_PosMtx; + Mat4x4_ const _e38 = _Mat4x4_1(_e37); + float3 const _e39 = *(tint_symbol_7); + Mat4x3_ const _e43 = t_PosMtx; + Mat4x4_ const _e44 = _Mat4x4_1(_e43); + float3 const _e45 = *(tint_symbol_7); + float4 const _e48 = Mul(_e44, float4(_e45, 1.0f)); + float4 const _e49 = Mul(_e35, _e48); + *(tint_symbol_8) = _e49; + float4 const _e50 = *(tint_symbol_9); + *(tint_symbol_10) = _e50; + float4 const _e52 = global1.u_Misc0_; + if ((_e52.x == 2.0f)) { + { + float3 const _e59 = *(tint_symbol_11); + Mat4x2_ const _e64 = global1.u_TexMtx.arr[0]; + float3 const _e65 = *(tint_symbol_11); + float2 const _e68 = Mul2(_e64, float4(_e65, 1.0f)); + *(tint_symbol_12) = _e68.xy; + return; + } + } else { + { + float2 const _e73 = *(tint_symbol_13); + Mat4x2_ const _e79 = global1.u_TexMtx.arr[0]; + float2 const _e80 = *(tint_symbol_13); + float2 const _e84 = Mul2(_e79, float4(_e80, 1.0f, 1.0f)); + *(tint_symbol_12) = _e84.xy; + return; + } + } +} + +vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant ub_PacketParams& global2 [[buffer(2)]], constant ub_SceneParams& global [[buffer(0)]], constant ub_MaterialParams& global1 [[buffer(1)]]) { + thread float3 tint_symbol_14 = 0.0f; + thread float2 tint_symbol_15 = 0.0f; + thread float4 tint_symbol_16 = 0.0f; + thread float3 tint_symbol_17 = 0.0f; + thread float tint_symbol_18 = 0.0f; + thread float4 tint_symbol_19 = 0.0f; + thread float4 tint_symbol_20 = 0.0f; + thread float2 tint_symbol_21 = 0.0f; + float3 const a_Position = tint_symbol_1.a_Position; + float2 const a_UV = tint_symbol_1.a_UV; + float4 const a_Color = tint_symbol_1.a_Color; + float3 const a_Normal = tint_symbol_1.a_Normal; + float const a_PosMtxIdx = tint_symbol_1.a_PosMtxIdx; + tint_symbol_14 = a_Position; + tint_symbol_15 = a_UV; + tint_symbol_16 = a_Color; + tint_symbol_17 = a_Normal; + tint_symbol_18 = a_PosMtxIdx; + main1(global2, global, global1, &(tint_symbol_18), &(tint_symbol_14), &(tint_symbol_19), &(tint_symbol_16), &(tint_symbol_20), &(tint_symbol_17), &(tint_symbol_21), &(tint_symbol_15)); + float4 const _e11 = tint_symbol_20; + float2 const _e13 = tint_symbol_21; + float4 const _e15 = tint_symbol_19; + VertexOutput const tint_symbol_4 = {.v_Color=_e11, .v_TexCoord=_e13, .member=_e15}; + tint_symbol_3 const tint_symbol_5 = {.v_Color=tint_symbol_4.v_Color, .v_TexCoord=tint_symbol_4.v_TexCoord, .member=tint_symbol_4.member}; + return tint_symbol_5; +} +
diff --git a/test/bug/tint/922.wgsl.expected.spvasm b/test/bug/tint/922.wgsl.expected.spvasm new file mode 100644 index 0000000..1f01f8a --- /dev/null +++ b/test/bug/tint/922.wgsl.expected.spvasm
@@ -0,0 +1,614 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 383 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_4 %tint_symbol_6 %tint_symbol_7 %tint_symbol_8 + OpName %tint_pointsize "tint_pointsize" + OpName %ub_SceneParams "ub_SceneParams" + OpMemberName %ub_SceneParams 0 "u_Projection" + OpName %Mat4x4_ "Mat4x4_" + OpMemberName %Mat4x4_ 0 "mx" + OpMemberName %Mat4x4_ 1 "my" + OpMemberName %Mat4x4_ 2 "mz" + OpMemberName %Mat4x4_ 3 "mw" + OpName %global "global" + OpName %ub_MaterialParams "ub_MaterialParams" + OpMemberName %ub_MaterialParams 0 "u_TexMtx" + OpName %Mat4x2_ "Mat4x2_" + OpMemberName %Mat4x2_ 0 "mx" + OpMemberName %Mat4x2_ 1 "my" + OpMemberName %ub_MaterialParams 1 "u_Misc0_" + OpName %global1 "global1" + OpName %ub_PacketParams "ub_PacketParams" + OpMemberName %ub_PacketParams 0 "u_PosMtx" + OpName %Mat4x3_ "Mat4x3_" + OpMemberName %Mat4x3_ 0 "mx" + OpMemberName %Mat4x3_ 1 "my" + OpMemberName %Mat4x3_ 2 "mz" + OpName %global2 "global2" + OpName %a_Position1 "a_Position1" + OpName %a_UV1 "a_UV1" + OpName %a_Color1 "a_Color1" + OpName %a_Normal1 "a_Normal1" + OpName %a_PosMtxIdx1 "a_PosMtxIdx1" + OpName %v_Color "v_Color" + OpName %v_TexCoord "v_TexCoord" + OpName %gl_Position "gl_Position" + OpName %tint_symbol "tint_symbol" + OpName %tint_symbol_1 "tint_symbol_1" + OpName %tint_symbol_2 "tint_symbol_2" + OpName %tint_symbol_3 "tint_symbol_3" + OpName %tint_symbol_4 "tint_symbol_4" + OpName %tint_symbol_6 "tint_symbol_6" + OpName %tint_symbol_7 "tint_symbol_7" + OpName %tint_symbol_8 "tint_symbol_8" + OpName %Mat4x3GetCol0_ "Mat4x3GetCol0_" + OpName %m "m" + OpName %m1 "m1" + OpName %Mat4x3GetCol1_ "Mat4x3GetCol1_" + OpName %m2 "m2" + OpName %m3 "m3" + OpName %Mat4x3GetCol2_ "Mat4x3GetCol2_" + OpName %m4 "m4" + OpName %m5 "m5" + OpName %Mat4x3GetCol3_ "Mat4x3GetCol3_" + OpName %m6 "m6" + OpName %m7 "m7" + OpName %Mul "Mul" + OpName %m8 "m8" + OpName %v "v" + OpName %m9 "m9" + OpName %v1 "v1" + OpName %Mul1 "Mul1" + OpName %m10 "m10" + OpName %v2 "v2" + OpName %m11 "m11" + OpName %v3 "v3" + OpName %Mul2 "Mul2" + OpName %m12 "m12" + OpName %v4 "v4" + OpName %m13 "m13" + OpName %v5 "v5" + OpName %Mul3 "Mul3" + OpName %v6 "v6" + OpName %m14 "m14" + OpName %v7 "v7" + OpName %m15 "m15" + OpName %_Mat4x4_ "_Mat4x4_" + OpName %n "n" + OpName %n1 "n1" + OpName %o "o" + OpName %_Mat4x4_1 "_Mat4x4_1" + OpName %m16 "m16" + OpName %m17 "m17" + OpName %o1 "o1" + OpName %_Mat4x4_2 "_Mat4x4_2" + OpName %m18 "m18" + OpName %m19 "m19" + OpName %o2 "o2" + OpName %_Mat4x3_ "_Mat4x3_" + OpName %n2 "n2" + OpName %n3 "n3" + OpName %o3 "o3" + OpName %_Mat4x3_1 "_Mat4x3_1" + OpName %m20 "m20" + OpName %m21 "m21" + OpName %o4 "o4" + OpName %main1 "main1" + OpName %t_PosMtx "t_PosMtx" + OpName %t_TexSpaceCoord "t_TexSpaceCoord" + OpName %VertexOutput "VertexOutput" + OpMemberName %VertexOutput 0 "v_Color" + OpMemberName %VertexOutput 1 "v_TexCoord" + OpMemberName %VertexOutput 2 "member" + OpName %tint_symbol_9 "tint_symbol_9" + OpName %tint_symbol_5 "tint_symbol_5" + OpName %main "main" + OpDecorate %tint_pointsize BuiltIn PointSize + OpDecorate %ub_SceneParams Block + OpMemberDecorate %ub_SceneParams 0 Offset 0 + OpMemberDecorate %Mat4x4_ 0 Offset 0 + OpMemberDecorate %Mat4x4_ 1 Offset 16 + OpMemberDecorate %Mat4x4_ 2 Offset 32 + OpMemberDecorate %Mat4x4_ 3 Offset 48 + OpDecorate %global NonWritable + OpDecorate %global DescriptorSet 0 + OpDecorate %global Binding 0 + OpDecorate %ub_MaterialParams Block + OpMemberDecorate %ub_MaterialParams 0 Offset 0 + OpMemberDecorate %Mat4x2_ 0 Offset 0 + OpMemberDecorate %Mat4x2_ 1 Offset 16 + OpDecorate %_arr_Mat4x2__uint_1 ArrayStride 32 + OpMemberDecorate %ub_MaterialParams 1 Offset 32 + OpDecorate %global1 NonWritable + OpDecorate %global1 DescriptorSet 0 + OpDecorate %global1 Binding 1 + OpDecorate %ub_PacketParams Block + OpMemberDecorate %ub_PacketParams 0 Offset 0 + OpMemberDecorate %Mat4x3_ 0 Offset 0 + OpMemberDecorate %Mat4x3_ 1 Offset 16 + OpMemberDecorate %Mat4x3_ 2 Offset 32 + OpDecorate %_arr_Mat4x3__uint_32 ArrayStride 48 + OpDecorate %global2 NonWritable + OpDecorate %global2 DescriptorSet 0 + OpDecorate %global2 Binding 2 + OpDecorate %tint_symbol Location 0 + OpDecorate %tint_symbol_1 Location 1 + OpDecorate %tint_symbol_2 Location 2 + OpDecorate %tint_symbol_3 Location 3 + OpDecorate %tint_symbol_4 Location 4 + OpDecorate %tint_symbol_6 Location 0 + OpDecorate %tint_symbol_7 Location 1 + OpDecorate %tint_symbol_8 BuiltIn Position + OpMemberDecorate %VertexOutput 0 Offset 0 + OpMemberDecorate %VertexOutput 1 Offset 16 + OpMemberDecorate %VertexOutput 2 Offset 32 + %float = OpTypeFloat 32 +%_ptr_Output_float = OpTypePointer Output %float + %4 = OpConstantNull %float +%tint_pointsize = OpVariable %_ptr_Output_float Output %4 + %v4float = OpTypeVector %float 4 + %Mat4x4_ = OpTypeStruct %v4float %v4float %v4float %v4float +%ub_SceneParams = OpTypeStruct %Mat4x4_ +%_ptr_Uniform_ub_SceneParams = OpTypePointer Uniform %ub_SceneParams + %global = OpVariable %_ptr_Uniform_ub_SceneParams Uniform + %Mat4x2_ = OpTypeStruct %v4float %v4float + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 +%_arr_Mat4x2__uint_1 = OpTypeArray %Mat4x2_ %uint_1 +%ub_MaterialParams = OpTypeStruct %_arr_Mat4x2__uint_1 %v4float +%_ptr_Uniform_ub_MaterialParams = OpTypePointer Uniform %ub_MaterialParams + %global1 = OpVariable %_ptr_Uniform_ub_MaterialParams Uniform + %Mat4x3_ = OpTypeStruct %v4float %v4float %v4float + %uint_32 = OpConstant %uint 32 +%_arr_Mat4x3__uint_32 = OpTypeArray %Mat4x3_ %uint_32 +%ub_PacketParams = OpTypeStruct %_arr_Mat4x3__uint_32 +%_ptr_Uniform_ub_PacketParams = OpTypePointer Uniform %ub_PacketParams + %global2 = OpVariable %_ptr_Uniform_ub_PacketParams Uniform + %v3float = OpTypeVector %float 3 +%_ptr_Private_v3float = OpTypePointer Private %v3float + %26 = OpConstantNull %v3float +%a_Position1 = OpVariable %_ptr_Private_v3float Private %26 + %v2float = OpTypeVector %float 2 +%_ptr_Private_v2float = OpTypePointer Private %v2float + %30 = OpConstantNull %v2float + %a_UV1 = OpVariable %_ptr_Private_v2float Private %30 +%_ptr_Private_v4float = OpTypePointer Private %v4float + %33 = OpConstantNull %v4float + %a_Color1 = OpVariable %_ptr_Private_v4float Private %33 + %a_Normal1 = OpVariable %_ptr_Private_v3float Private %26 +%_ptr_Private_float = OpTypePointer Private %float +%a_PosMtxIdx1 = OpVariable %_ptr_Private_float Private %4 + %v_Color = OpVariable %_ptr_Private_v4float Private %33 + %v_TexCoord = OpVariable %_ptr_Private_v2float Private %30 +%gl_Position = OpVariable %_ptr_Private_v4float Private %33 +%_ptr_Input_v3float = OpTypePointer Input %v3float +%tint_symbol = OpVariable %_ptr_Input_v3float Input +%_ptr_Input_v2float = OpTypePointer Input %v2float +%tint_symbol_1 = OpVariable %_ptr_Input_v2float Input +%_ptr_Input_v4float = OpTypePointer Input %v4float +%tint_symbol_2 = OpVariable %_ptr_Input_v4float Input +%tint_symbol_3 = OpVariable %_ptr_Input_v3float Input +%_ptr_Input_float = OpTypePointer Input %float +%tint_symbol_4 = OpVariable %_ptr_Input_float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%tint_symbol_6 = OpVariable %_ptr_Output_v4float Output %33 +%_ptr_Output_v2float = OpTypePointer Output %v2float +%tint_symbol_7 = OpVariable %_ptr_Output_v2float Output %30 +%tint_symbol_8 = OpVariable %_ptr_Output_v4float Output %33 + %54 = OpTypeFunction %v3float %Mat4x3_ +%_ptr_Function_Mat4x3_ = OpTypePointer Function %Mat4x3_ + %60 = OpConstantNull %Mat4x3_ + %113 = OpTypeFunction %v4float %Mat4x4_ %v4float +%_ptr_Function_Mat4x4_ = OpTypePointer Function %Mat4x4_ + %120 = OpConstantNull %Mat4x4_ +%_ptr_Function_v4float = OpTypePointer Function %v4float + %140 = OpTypeFunction %v3float %Mat4x3_ %v4float + %160 = OpTypeFunction %v2float %Mat4x2_ %v4float +%_ptr_Function_Mat4x2_ = OpTypePointer Function %Mat4x2_ + %167 = OpConstantNull %Mat4x2_ + %178 = OpTypeFunction %v4float %v3float %Mat4x3_ +%_ptr_Function_v3float = OpTypePointer Function %v3float + %203 = OpTypeFunction %Mat4x4_ %float +%_ptr_Function_float = OpTypePointer Function %float + %uint_0 = OpConstant %uint 0 + %float_0 = OpConstant %float 0 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %227 = OpTypeFunction %Mat4x4_ %Mat4x3_ + %float_1 = OpConstant %float 1 + %245 = OpTypeFunction %Mat4x4_ %Mat4x2_ + %259 = OpTypeFunction %Mat4x3_ %float + %275 = OpTypeFunction %Mat4x3_ %Mat4x4_ + %void = OpTypeVoid + %291 = OpTypeFunction %void +%_ptr_Function_v2float = OpTypePointer Function %v2float + %int = OpTypeInt 32 1 +%_ptr_Uniform_Mat4x3_ = OpTypePointer Uniform %Mat4x3_ +%_ptr_Uniform_Mat4x4_ = OpTypePointer Uniform %Mat4x4_ +%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float + %float_2 = OpConstant %float 2 + %bool = OpTypeBool + %int_0 = OpConstant %int 0 +%_ptr_Uniform_Mat4x2_ = OpTypePointer Uniform %Mat4x2_ +%VertexOutput = OpTypeStruct %v4float %v2float %v4float + %362 = OpTypeFunction %void %VertexOutput +%Mat4x3GetCol0_ = OpFunction %v3float None %54 + %m = OpFunctionParameter %Mat4x3_ + %57 = OpLabel + %m1 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %m1 %m + %61 = OpLoad %Mat4x3_ %m1 + %62 = OpLoad %Mat4x3_ %m1 + %63 = OpLoad %Mat4x3_ %m1 + %64 = OpCompositeExtract %v4float %61 0 + %65 = OpCompositeExtract %float %64 0 + %66 = OpCompositeExtract %v4float %62 1 + %67 = OpCompositeExtract %float %66 0 + %68 = OpCompositeExtract %v4float %63 2 + %69 = OpCompositeExtract %float %68 0 + %70 = OpCompositeConstruct %v3float %65 %67 %69 + OpReturnValue %70 + OpFunctionEnd +%Mat4x3GetCol1_ = OpFunction %v3float None %54 + %m2 = OpFunctionParameter %Mat4x3_ + %73 = OpLabel + %m3 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %m3 %m2 + %75 = OpLoad %Mat4x3_ %m3 + %76 = OpLoad %Mat4x3_ %m3 + %77 = OpLoad %Mat4x3_ %m3 + %78 = OpCompositeExtract %v4float %75 0 + %79 = OpCompositeExtract %float %78 1 + %80 = OpCompositeExtract %v4float %76 1 + %81 = OpCompositeExtract %float %80 1 + %82 = OpCompositeExtract %v4float %77 2 + %83 = OpCompositeExtract %float %82 1 + %84 = OpCompositeConstruct %v3float %79 %81 %83 + OpReturnValue %84 + OpFunctionEnd +%Mat4x3GetCol2_ = OpFunction %v3float None %54 + %m4 = OpFunctionParameter %Mat4x3_ + %87 = OpLabel + %m5 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %m5 %m4 + %89 = OpLoad %Mat4x3_ %m5 + %90 = OpLoad %Mat4x3_ %m5 + %91 = OpLoad %Mat4x3_ %m5 + %92 = OpCompositeExtract %v4float %89 0 + %93 = OpCompositeExtract %float %92 2 + %94 = OpCompositeExtract %v4float %90 1 + %95 = OpCompositeExtract %float %94 2 + %96 = OpCompositeExtract %v4float %91 2 + %97 = OpCompositeExtract %float %96 2 + %98 = OpCompositeConstruct %v3float %93 %95 %97 + OpReturnValue %98 + OpFunctionEnd +%Mat4x3GetCol3_ = OpFunction %v3float None %54 + %m6 = OpFunctionParameter %Mat4x3_ + %101 = OpLabel + %m7 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %m7 %m6 + %103 = OpLoad %Mat4x3_ %m7 + %104 = OpLoad %Mat4x3_ %m7 + %105 = OpLoad %Mat4x3_ %m7 + %106 = OpCompositeExtract %v4float %103 0 + %107 = OpCompositeExtract %float %106 3 + %108 = OpCompositeExtract %v4float %104 1 + %109 = OpCompositeExtract %float %108 3 + %110 = OpCompositeExtract %v4float %105 2 + %111 = OpCompositeExtract %float %110 3 + %112 = OpCompositeConstruct %v3float %107 %109 %111 + OpReturnValue %112 + OpFunctionEnd + %Mul = OpFunction %v4float None %113 + %m8 = OpFunctionParameter %Mat4x4_ + %v = OpFunctionParameter %v4float + %117 = OpLabel + %m9 = OpVariable %_ptr_Function_Mat4x4_ Function %120 + %v1 = OpVariable %_ptr_Function_v4float Function %33 + OpStore %m9 %m8 + OpStore %v1 %v + %123 = OpLoad %Mat4x4_ %m9 + %124 = OpLoad %v4float %v1 + %125 = OpLoad %Mat4x4_ %m9 + %126 = OpLoad %v4float %v1 + %127 = OpLoad %Mat4x4_ %m9 + %128 = OpLoad %v4float %v1 + %129 = OpLoad %Mat4x4_ %m9 + %130 = OpLoad %v4float %v1 + %132 = OpCompositeExtract %v4float %123 0 + %131 = OpDot %float %132 %124 + %134 = OpCompositeExtract %v4float %125 1 + %133 = OpDot %float %134 %126 + %136 = OpCompositeExtract %v4float %127 2 + %135 = OpDot %float %136 %128 + %138 = OpCompositeExtract %v4float %129 3 + %137 = OpDot %float %138 %130 + %139 = OpCompositeConstruct %v4float %131 %133 %135 %137 + OpReturnValue %139 + OpFunctionEnd + %Mul1 = OpFunction %v3float None %140 + %m10 = OpFunctionParameter %Mat4x3_ + %v2 = OpFunctionParameter %v4float + %144 = OpLabel + %m11 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + %v3 = OpVariable %_ptr_Function_v4float Function %33 + OpStore %m11 %m10 + OpStore %v3 %v2 + %147 = OpLoad %Mat4x3_ %m11 + %148 = OpLoad %v4float %v3 + %149 = OpLoad %Mat4x3_ %m11 + %150 = OpLoad %v4float %v3 + %151 = OpLoad %Mat4x3_ %m11 + %152 = OpLoad %v4float %v3 + %154 = OpCompositeExtract %v4float %147 0 + %153 = OpDot %float %154 %148 + %156 = OpCompositeExtract %v4float %149 1 + %155 = OpDot %float %156 %150 + %158 = OpCompositeExtract %v4float %151 2 + %157 = OpDot %float %158 %152 + %159 = OpCompositeConstruct %v3float %153 %155 %157 + OpReturnValue %159 + OpFunctionEnd + %Mul2 = OpFunction %v2float None %160 + %m12 = OpFunctionParameter %Mat4x2_ + %v4 = OpFunctionParameter %v4float + %164 = OpLabel + %m13 = OpVariable %_ptr_Function_Mat4x2_ Function %167 + %v5 = OpVariable %_ptr_Function_v4float Function %33 + OpStore %m13 %m12 + OpStore %v5 %v4 + %169 = OpLoad %Mat4x2_ %m13 + %170 = OpLoad %v4float %v5 + %171 = OpLoad %Mat4x2_ %m13 + %172 = OpLoad %v4float %v5 + %174 = OpCompositeExtract %v4float %169 0 + %173 = OpDot %float %174 %170 + %176 = OpCompositeExtract %v4float %171 1 + %175 = OpDot %float %176 %172 + %177 = OpCompositeConstruct %v2float %173 %175 + OpReturnValue %177 + OpFunctionEnd + %Mul3 = OpFunction %v4float None %178 + %v6 = OpFunctionParameter %v3float + %m14 = OpFunctionParameter %Mat4x3_ + %182 = OpLabel + %v7 = OpVariable %_ptr_Function_v3float Function %26 + %m15 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %v7 %v6 + OpStore %m15 %m14 + %186 = OpLoad %Mat4x3_ %m15 + %187 = OpFunctionCall %v3float %Mat4x3GetCol0_ %186 + %188 = OpLoad %v3float %v7 + %189 = OpLoad %Mat4x3_ %m15 + %190 = OpFunctionCall %v3float %Mat4x3GetCol1_ %189 + %191 = OpLoad %v3float %v7 + %192 = OpLoad %Mat4x3_ %m15 + %193 = OpFunctionCall %v3float %Mat4x3GetCol2_ %192 + %194 = OpLoad %v3float %v7 + %195 = OpLoad %Mat4x3_ %m15 + %196 = OpFunctionCall %v3float %Mat4x3GetCol3_ %195 + %197 = OpLoad %v3float %v7 + %198 = OpDot %float %187 %188 + %199 = OpDot %float %190 %191 + %200 = OpDot %float %193 %194 + %201 = OpDot %float %196 %197 + %202 = OpCompositeConstruct %v4float %198 %199 %200 %201 + OpReturnValue %202 + OpFunctionEnd + %_Mat4x4_ = OpFunction %Mat4x4_ None %203 + %n = OpFunctionParameter %float + %206 = OpLabel + %n1 = OpVariable %_ptr_Function_float Function %4 + %o = OpVariable %_ptr_Function_Mat4x4_ Function %120 + OpStore %n1 %n + %210 = OpLoad %float %n1 + %212 = OpAccessChain %_ptr_Function_v4float %o %uint_0 + %214 = OpCompositeConstruct %v4float %210 %float_0 %float_0 %float_0 + OpStore %212 %214 + %215 = OpLoad %float %n1 + %216 = OpAccessChain %_ptr_Function_v4float %o %uint_1 + %217 = OpCompositeConstruct %v4float %float_0 %215 %float_0 %float_0 + OpStore %216 %217 + %218 = OpLoad %float %n1 + %220 = OpAccessChain %_ptr_Function_v4float %o %uint_2 + %221 = OpCompositeConstruct %v4float %float_0 %float_0 %218 %float_0 + OpStore %220 %221 + %222 = OpLoad %float %n1 + %224 = OpAccessChain %_ptr_Function_v4float %o %uint_3 + %225 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %222 + OpStore %224 %225 + %226 = OpLoad %Mat4x4_ %o + OpReturnValue %226 + OpFunctionEnd + %_Mat4x4_1 = OpFunction %Mat4x4_ None %227 + %m16 = OpFunctionParameter %Mat4x3_ + %230 = OpLabel + %m17 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + %o1 = OpVariable %_ptr_Function_Mat4x4_ Function %120 + OpStore %m17 %m16 + %233 = OpFunctionCall %Mat4x4_ %_Mat4x4_ %float_1 + OpStore %o1 %233 + %235 = OpLoad %Mat4x3_ %m17 + %236 = OpAccessChain %_ptr_Function_v4float %o1 %uint_0 + %237 = OpCompositeExtract %v4float %235 0 + OpStore %236 %237 + %238 = OpLoad %Mat4x3_ %m17 + %239 = OpAccessChain %_ptr_Function_v4float %o1 %uint_1 + %240 = OpCompositeExtract %v4float %238 1 + OpStore %239 %240 + %241 = OpLoad %Mat4x3_ %m17 + %242 = OpAccessChain %_ptr_Function_v4float %o1 %uint_2 + %243 = OpCompositeExtract %v4float %241 2 + OpStore %242 %243 + %244 = OpLoad %Mat4x4_ %o1 + OpReturnValue %244 + OpFunctionEnd + %_Mat4x4_2 = OpFunction %Mat4x4_ None %245 + %m18 = OpFunctionParameter %Mat4x2_ + %248 = OpLabel + %m19 = OpVariable %_ptr_Function_Mat4x2_ Function %167 + %o2 = OpVariable %_ptr_Function_Mat4x4_ Function %120 + OpStore %m19 %m18 + %251 = OpFunctionCall %Mat4x4_ %_Mat4x4_ %float_1 + OpStore %o2 %251 + %252 = OpLoad %Mat4x2_ %m19 + %253 = OpAccessChain %_ptr_Function_v4float %o2 %uint_0 + %254 = OpCompositeExtract %v4float %252 0 + OpStore %253 %254 + %255 = OpLoad %Mat4x2_ %m19 + %256 = OpAccessChain %_ptr_Function_v4float %o2 %uint_1 + %257 = OpCompositeExtract %v4float %255 1 + OpStore %256 %257 + %258 = OpLoad %Mat4x4_ %o2 + OpReturnValue %258 + OpFunctionEnd + %_Mat4x3_ = OpFunction %Mat4x3_ None %259 + %n2 = OpFunctionParameter %float + %262 = OpLabel + %n3 = OpVariable %_ptr_Function_float Function %4 + %o3 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %n3 %n2 + %265 = OpLoad %float %n3 + %266 = OpAccessChain %_ptr_Function_v4float %o3 %uint_0 + %267 = OpCompositeConstruct %v4float %265 %float_0 %float_0 %float_0 + OpStore %266 %267 + %268 = OpLoad %float %n3 + %269 = OpAccessChain %_ptr_Function_v4float %o3 %uint_1 + %270 = OpCompositeConstruct %v4float %float_0 %268 %float_0 %float_0 + OpStore %269 %270 + %271 = OpLoad %float %n3 + %272 = OpAccessChain %_ptr_Function_v4float %o3 %uint_2 + %273 = OpCompositeConstruct %v4float %float_0 %float_0 %271 %float_0 + OpStore %272 %273 + %274 = OpLoad %Mat4x3_ %o3 + OpReturnValue %274 + OpFunctionEnd + %_Mat4x3_1 = OpFunction %Mat4x3_ None %275 + %m20 = OpFunctionParameter %Mat4x4_ + %278 = OpLabel + %m21 = OpVariable %_ptr_Function_Mat4x4_ Function %120 + %o4 = OpVariable %_ptr_Function_Mat4x3_ Function %60 + OpStore %m21 %m20 + %281 = OpLoad %Mat4x4_ %m21 + %282 = OpAccessChain %_ptr_Function_v4float %o4 %uint_0 + %283 = OpCompositeExtract %v4float %281 0 + OpStore %282 %283 + %284 = OpLoad %Mat4x4_ %m21 + %285 = OpAccessChain %_ptr_Function_v4float %o4 %uint_1 + %286 = OpCompositeExtract %v4float %284 1 + OpStore %285 %286 + %287 = OpLoad %Mat4x4_ %m21 + %288 = OpAccessChain %_ptr_Function_v4float %o4 %uint_2 + %289 = OpCompositeExtract %v4float %287 2 + OpStore %288 %289 + %290 = OpLoad %Mat4x3_ %o4 + OpReturnValue %290 + OpFunctionEnd + %main1 = OpFunction %void None %291 + %294 = OpLabel + %t_PosMtx = OpVariable %_ptr_Function_Mat4x3_ Function %60 +%t_TexSpaceCoord = OpVariable %_ptr_Function_v2float Function %30 + %298 = OpLoad %float %a_PosMtxIdx1 + %299 = OpConvertFToS %int %298 + %302 = OpAccessChain %_ptr_Uniform_Mat4x3_ %global2 %uint_0 %299 + %303 = OpLoad %Mat4x3_ %302 + OpStore %t_PosMtx %303 + %304 = OpLoad %Mat4x3_ %t_PosMtx + %305 = OpFunctionCall %Mat4x4_ %_Mat4x4_1 %304 + %306 = OpLoad %v3float %a_Position1 + %307 = OpLoad %Mat4x3_ %t_PosMtx + %308 = OpFunctionCall %Mat4x4_ %_Mat4x4_1 %307 + %309 = OpLoad %v3float %a_Position1 + %311 = OpCompositeExtract %float %309 0 + %312 = OpCompositeExtract %float %309 1 + %313 = OpCompositeExtract %float %309 2 + %314 = OpCompositeConstruct %v4float %311 %312 %313 %float_1 + %310 = OpFunctionCall %v4float %Mul %308 %314 + %316 = OpAccessChain %_ptr_Uniform_Mat4x4_ %global %uint_0 + %317 = OpLoad %Mat4x4_ %316 + %318 = OpLoad %Mat4x3_ %t_PosMtx + %319 = OpFunctionCall %Mat4x4_ %_Mat4x4_1 %318 + %320 = OpLoad %v3float %a_Position1 + %321 = OpLoad %Mat4x3_ %t_PosMtx + %322 = OpFunctionCall %Mat4x4_ %_Mat4x4_1 %321 + %323 = OpLoad %v3float %a_Position1 + %325 = OpCompositeExtract %float %323 0 + %326 = OpCompositeExtract %float %323 1 + %327 = OpCompositeExtract %float %323 2 + %328 = OpCompositeConstruct %v4float %325 %326 %327 %float_1 + %324 = OpFunctionCall %v4float %Mul %322 %328 + %329 = OpFunctionCall %v4float %Mul %317 %324 + OpStore %gl_Position %329 + %330 = OpLoad %v4float %a_Color1 + OpStore %v_Color %330 + %332 = OpAccessChain %_ptr_Uniform_v4float %global1 %uint_1 + %333 = OpLoad %v4float %332 + %334 = OpCompositeExtract %float %333 0 + %336 = OpFOrdEqual %bool %334 %float_2 + OpSelectionMerge %338 None + OpBranchConditional %336 %339 %340 + %339 = OpLabel + %341 = OpLoad %v3float %a_Normal1 + %344 = OpAccessChain %_ptr_Uniform_Mat4x2_ %global1 %uint_0 %int_0 + %345 = OpLoad %Mat4x2_ %344 + %346 = OpLoad %v3float %a_Normal1 + %348 = OpCompositeExtract %float %346 0 + %349 = OpCompositeExtract %float %346 1 + %350 = OpCompositeExtract %float %346 2 + %351 = OpCompositeConstruct %v4float %348 %349 %350 %float_1 + %347 = OpFunctionCall %v2float %Mul2 %345 %351 + %352 = OpVectorShuffle %v2float %347 %347 0 1 + OpStore %v_TexCoord %352 + OpReturn + %340 = OpLabel + %353 = OpLoad %v2float %a_UV1 + %354 = OpAccessChain %_ptr_Uniform_Mat4x2_ %global1 %uint_0 %int_0 + %355 = OpLoad %Mat4x2_ %354 + %356 = OpLoad %v2float %a_UV1 + %358 = OpCompositeExtract %float %356 0 + %359 = OpCompositeExtract %float %356 1 + %360 = OpCompositeConstruct %v4float %358 %359 %float_1 %float_1 + %357 = OpFunctionCall %v2float %Mul2 %355 %360 + %361 = OpVectorShuffle %v2float %357 %357 0 1 + OpStore %v_TexCoord %361 + OpReturn + %338 = OpLabel + OpReturn + OpFunctionEnd +%tint_symbol_9 = OpFunction %void None %362 +%tint_symbol_5 = OpFunctionParameter %VertexOutput + %366 = OpLabel + %367 = OpCompositeExtract %v4float %tint_symbol_5 0 + OpStore %tint_symbol_6 %367 + %368 = OpCompositeExtract %v2float %tint_symbol_5 1 + OpStore %tint_symbol_7 %368 + %369 = OpCompositeExtract %v4float %tint_symbol_5 2 + OpStore %tint_symbol_8 %369 + OpReturn + OpFunctionEnd + %main = OpFunction %void None %291 + %371 = OpLabel + OpStore %tint_pointsize %float_1 + %372 = OpLoad %v3float %tint_symbol + OpStore %a_Position1 %372 + %373 = OpLoad %v2float %tint_symbol_1 + OpStore %a_UV1 %373 + %374 = OpLoad %v4float %tint_symbol_2 + OpStore %a_Color1 %374 + %375 = OpLoad %v3float %tint_symbol_3 + OpStore %a_Normal1 %375 + %376 = OpLoad %float %tint_symbol_4 + OpStore %a_PosMtxIdx1 %376 + %377 = OpFunctionCall %void %main1 + %378 = OpLoad %v4float %v_Color + %379 = OpLoad %v2float %v_TexCoord + %380 = OpLoad %v4float %gl_Position + %382 = OpCompositeConstruct %VertexOutput %378 %379 %380 + %381 = OpFunctionCall %void %tint_symbol_9 %382 + OpReturn + OpFunctionEnd
diff --git a/test/bug/tint/922.wgsl.expected.wgsl b/test/bug/tint/922.wgsl.expected.wgsl new file mode 100644 index 0000000..c9178c1 --- /dev/null +++ b/test/bug/tint/922.wgsl.expected.wgsl
@@ -0,0 +1,297 @@ +struct Mat4x4_ { + mx : vec4<f32>; + my : vec4<f32>; + mz : vec4<f32>; + mw : vec4<f32>; +}; + +struct Mat4x3_ { + mx : vec4<f32>; + my : vec4<f32>; + mz : vec4<f32>; +}; + +struct Mat4x2_ { + mx : vec4<f32>; + my : vec4<f32>; +}; + +[[block]] +struct ub_SceneParams { + u_Projection : Mat4x4_; +}; + +[[block]] +struct ub_MaterialParams { + u_TexMtx : [[stride(32)]] array<Mat4x2_, 1>; + u_Misc0_ : vec4<f32>; +}; + +[[block]] +struct ub_PacketParams { + u_PosMtx : [[stride(48)]] array<Mat4x3_, 32>; +}; + +struct VertexOutput { + [[location(0)]] + v_Color : vec4<f32>; + [[location(1)]] + v_TexCoord : vec2<f32>; + [[builtin(position)]] + member : vec4<f32>; +}; + +[[group(0), binding(0)]] var<uniform> global : ub_SceneParams; + +[[group(0), binding(1)]] var<uniform> global1 : ub_MaterialParams; + +[[group(0), binding(2)]] var<uniform> global2 : ub_PacketParams; + +var<private> a_Position1 : vec3<f32>; + +var<private> a_UV1 : vec2<f32>; + +var<private> a_Color1 : vec4<f32>; + +var<private> a_Normal1 : vec3<f32>; + +var<private> a_PosMtxIdx1 : f32; + +var<private> v_Color : vec4<f32>; + +var<private> v_TexCoord : vec2<f32>; + +var<private> gl_Position : vec4<f32>; + +fn Mat4x3GetCol0_(m : Mat4x3_) -> vec3<f32> { + var m1 : Mat4x3_; + m1 = m; + let _e2 : Mat4x3_ = m1; + let _e5 : Mat4x3_ = m1; + let _e8 : Mat4x3_ = m1; + return vec3<f32>(_e2.mx.x, _e5.my.x, _e8.mz.x); +} + +fn Mat4x3GetCol1_(m2 : Mat4x3_) -> vec3<f32> { + var m3 : Mat4x3_; + m3 = m2; + let _e2 : Mat4x3_ = m3; + let _e5 : Mat4x3_ = m3; + let _e8 : Mat4x3_ = m3; + return vec3<f32>(_e2.mx.y, _e5.my.y, _e8.mz.y); +} + +fn Mat4x3GetCol2_(m4 : Mat4x3_) -> vec3<f32> { + var m5 : Mat4x3_; + m5 = m4; + let _e2 : Mat4x3_ = m5; + let _e5 : Mat4x3_ = m5; + let _e8 : Mat4x3_ = m5; + return vec3<f32>(_e2.mx.z, _e5.my.z, _e8.mz.z); +} + +fn Mat4x3GetCol3_(m6 : Mat4x3_) -> vec3<f32> { + var m7 : Mat4x3_; + m7 = m6; + let _e2 : Mat4x3_ = m7; + let _e5 : Mat4x3_ = m7; + let _e8 : Mat4x3_ = m7; + return vec3<f32>(_e2.mx.w, _e5.my.w, _e8.mz.w); +} + +fn Mul(m8 : Mat4x4_, v : vec4<f32>) -> vec4<f32> { + var m9 : Mat4x4_; + var v1 : vec4<f32>; + m9 = m8; + v1 = v; + let _e4 : Mat4x4_ = m9; + let _e6 : vec4<f32> = v1; + let _e8 : Mat4x4_ = m9; + let _e10 : vec4<f32> = v1; + let _e12 : Mat4x4_ = m9; + let _e14 : vec4<f32> = v1; + let _e16 : Mat4x4_ = m9; + let _e18 : vec4<f32> = v1; + return vec4<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14), dot(_e16.mw, _e18)); +} + +fn Mul1(m10 : Mat4x3_, v2 : vec4<f32>) -> vec3<f32> { + var m11 : Mat4x3_; + var v3 : vec4<f32>; + m11 = m10; + v3 = v2; + let _e4 : Mat4x3_ = m11; + let _e6 : vec4<f32> = v3; + let _e8 : Mat4x3_ = m11; + let _e10 : vec4<f32> = v3; + let _e12 : Mat4x3_ = m11; + let _e14 : vec4<f32> = v3; + return vec3<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14)); +} + +fn Mul2(m12 : Mat4x2_, v4 : vec4<f32>) -> vec2<f32> { + var m13 : Mat4x2_; + var v5 : vec4<f32>; + m13 = m12; + v5 = v4; + let _e4 : Mat4x2_ = m13; + let _e6 : vec4<f32> = v5; + let _e8 : Mat4x2_ = m13; + let _e10 : vec4<f32> = v5; + return vec2<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10)); +} + +fn Mul3(v6 : vec3<f32>, m14 : Mat4x3_) -> vec4<f32> { + var v7 : vec3<f32>; + var m15 : Mat4x3_; + v7 = v6; + m15 = m14; + let _e5 : Mat4x3_ = m15; + let _e6 : vec3<f32> = Mat4x3GetCol0_(_e5); + let _e7 : vec3<f32> = v7; + let _e10 : Mat4x3_ = m15; + let _e11 : vec3<f32> = Mat4x3GetCol1_(_e10); + let _e12 : vec3<f32> = v7; + let _e15 : Mat4x3_ = m15; + let _e16 : vec3<f32> = Mat4x3GetCol2_(_e15); + let _e17 : vec3<f32> = v7; + let _e20 : Mat4x3_ = m15; + let _e21 : vec3<f32> = Mat4x3GetCol3_(_e20); + let _e22 : vec3<f32> = v7; + return vec4<f32>(dot(_e6, _e7), dot(_e11, _e12), dot(_e16, _e17), dot(_e21, _e22)); +} + +fn _Mat4x4_(n : f32) -> Mat4x4_ { + var n1 : f32; + var o : Mat4x4_; + n1 = n; + let _e4 : f32 = n1; + o.mx = vec4<f32>(_e4, 0.0, 0.0, 0.0); + let _e11 : f32 = n1; + o.my = vec4<f32>(0.0, _e11, 0.0, 0.0); + let _e18 : f32 = n1; + o.mz = vec4<f32>(0.0, 0.0, _e18, 0.0); + let _e25 : f32 = n1; + o.mw = vec4<f32>(0.0, 0.0, 0.0, _e25); + let _e27 : Mat4x4_ = o; + return _e27; +} + +fn _Mat4x4_1(m16 : Mat4x3_) -> Mat4x4_ { + var m17 : Mat4x3_; + var o1 : Mat4x4_; + m17 = m16; + let _e4 : Mat4x4_ = _Mat4x4_(1.0); + o1 = _e4; + let _e7 : Mat4x3_ = m17; + o1.mx = _e7.mx; + let _e10 : Mat4x3_ = m17; + o1.my = _e10.my; + let _e13 : Mat4x3_ = m17; + o1.mz = _e13.mz; + let _e15 : Mat4x4_ = o1; + return _e15; +} + +fn _Mat4x4_2(m18 : Mat4x2_) -> Mat4x4_ { + var m19 : Mat4x2_; + var o2 : Mat4x4_; + m19 = m18; + let _e4 : Mat4x4_ = _Mat4x4_(1.0); + o2 = _e4; + let _e7 : Mat4x2_ = m19; + o2.mx = _e7.mx; + let _e10 : Mat4x2_ = m19; + o2.my = _e10.my; + let _e12 : Mat4x4_ = o2; + return _e12; +} + +fn _Mat4x3_(n2 : f32) -> Mat4x3_ { + var n3 : f32; + var o3 : Mat4x3_; + n3 = n2; + let _e4 : f32 = n3; + o3.mx = vec4<f32>(_e4, 0.0, 0.0, 0.0); + let _e11 : f32 = n3; + o3.my = vec4<f32>(0.0, _e11, 0.0, 0.0); + let _e18 : f32 = n3; + o3.mz = vec4<f32>(0.0, 0.0, _e18, 0.0); + let _e21 : Mat4x3_ = o3; + return _e21; +} + +fn _Mat4x3_1(m20 : Mat4x4_) -> Mat4x3_ { + var m21 : Mat4x4_; + var o4 : Mat4x3_; + m21 = m20; + let _e4 : Mat4x4_ = m21; + o4.mx = _e4.mx; + let _e7 : Mat4x4_ = m21; + o4.my = _e7.my; + let _e10 : Mat4x4_ = m21; + o4.mz = _e10.mz; + let _e12 : Mat4x3_ = o4; + return _e12; +} + +fn main1() { + var t_PosMtx : Mat4x3_; + var t_TexSpaceCoord : vec2<f32>; + let _e15 : f32 = a_PosMtxIdx1; + let _e18 : Mat4x3_ = global2.u_PosMtx[i32(_e15)]; + t_PosMtx = _e18; + let _e23 : Mat4x3_ = t_PosMtx; + let _e24 : Mat4x4_ = _Mat4x4_1(_e23); + let _e25 : vec3<f32> = a_Position1; + let _e29 : Mat4x3_ = t_PosMtx; + let _e30 : Mat4x4_ = _Mat4x4_1(_e29); + let _e31 : vec3<f32> = a_Position1; + let _e34 : vec4<f32> = Mul(_e30, vec4<f32>(_e31, 1.0)); + let _e35 : Mat4x4_ = global.u_Projection; + let _e37 : Mat4x3_ = t_PosMtx; + let _e38 : Mat4x4_ = _Mat4x4_1(_e37); + let _e39 : vec3<f32> = a_Position1; + let _e43 : Mat4x3_ = t_PosMtx; + let _e44 : Mat4x4_ = _Mat4x4_1(_e43); + let _e45 : vec3<f32> = a_Position1; + let _e48 : vec4<f32> = Mul(_e44, vec4<f32>(_e45, 1.0)); + let _e49 : vec4<f32> = Mul(_e35, _e48); + gl_Position = _e49; + let _e50 : vec4<f32> = a_Color1; + v_Color = _e50; + let _e52 : vec4<f32> = global1.u_Misc0_; + if ((_e52.x == 2.0)) { + { + let _e59 : vec3<f32> = a_Normal1; + let _e64 : Mat4x2_ = global1.u_TexMtx[0]; + let _e65 : vec3<f32> = a_Normal1; + let _e68 : vec2<f32> = Mul2(_e64, vec4<f32>(_e65, 1.0)); + v_TexCoord = _e68.xy; + return; + } + } else { + { + let _e73 : vec2<f32> = a_UV1; + let _e79 : Mat4x2_ = global1.u_TexMtx[0]; + let _e80 : vec2<f32> = a_UV1; + let _e84 : vec2<f32> = Mul2(_e79, vec4<f32>(_e80, 1.0, 1.0)); + v_TexCoord = _e84.xy; + return; + } + } +} + +[[stage(vertex)]] +fn main([[location(0)]] a_Position : vec3<f32>, [[location(1)]] a_UV : vec2<f32>, [[location(2)]] a_Color : vec4<f32>, [[location(3)]] a_Normal : vec3<f32>, [[location(4)]] a_PosMtxIdx : f32) -> VertexOutput { + a_Position1 = a_Position; + a_UV1 = a_UV; + a_Color1 = a_Color; + a_Normal1 = a_Normal; + a_PosMtxIdx1 = a_PosMtxIdx; + main1(); + let _e11 : vec4<f32> = v_Color; + let _e13 : vec2<f32> = v_TexCoord; + let _e15 : vec4<f32> = gl_Position; + return VertexOutput(_e11, _e13, _e15); +}