writer/msl: Fix zero-valued matrix constructors Fixed: tint:813 Change-Id: Ia22f4264de89da76ab0a10cf52f267fcb1e2dbd4 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51440 Auto-Submit: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ben Clayton <bclayton@chromium.org> Reviewed-by: Ben Clayton <bclayton@chromium.org>
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc index ee976d0..f2928a9 100644 --- a/src/writer/msl/generator_impl.cc +++ b/src/writer/msl/generator_impl.cc
@@ -935,7 +935,14 @@ } else if (auto* vec = type->As<sem::Vector>()) { return EmitZeroValue(vec->type()); } else if (auto* mat = type->As<sem::Matrix>()) { - return EmitZeroValue(mat->type()); + if (!EmitType(mat, "")) { + return false; + } + out_ << "("; + if (!EmitZeroValue(mat->type())) { + return false; + } + out_ << ")"; } else if (auto* arr = type->As<sem::Array>()) { out_ << "{"; if (!EmitZeroValue(arr->ElemType())) {
diff --git a/src/writer/msl/generator_impl_constructor_test.cc b/src/writer/msl/generator_impl_constructor_test.cc index 18a4988..aa76ded 100644 --- a/src/writer/msl/generator_impl_constructor_test.cc +++ b/src/writer/msl/generator_impl_constructor_test.cc
@@ -131,6 +131,15 @@ "float2x3(float3(1.0f, 2.0f, 3.0f), float3(3.0f, 4.0f, 5.0f))")); } +TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Mat_Empty) { + WrapInFunction(mat4x4<f32>()); + + GeneratorImpl& gen = Build(); + + ASSERT_TRUE(gen.Generate()) << gen.error(); + EXPECT_THAT(gen.result(), HasSubstr("float4x4(0.0f)")); +} + TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Array) { WrapInFunction( Construct(ty.array(ty.vec3<f32>(), 3), vec3<f32>(1.0f, 2.0f, 3.0f),
diff --git a/src/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/writer/msl/generator_impl_variable_decl_statement_test.cc index 548a705..3ff3388 100644 --- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc +++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -107,7 +107,7 @@ gen.increment_indent(); ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error(); - EXPECT_EQ(gen.result(), " float3x2 a = 0.0f;\n"); + EXPECT_EQ(gen.result(), " float3x2 a = float3x2(0.0f);\n"); } // TODO(crbug.com/tint/726): module-scope private and workgroup variables not
diff --git a/test/access/var/matrix.wgsl.expected.msl b/test/access/var/matrix.wgsl.expected.msl index c577ac1..95fd2d6 100644 --- a/test/access/var/matrix.wgsl.expected.msl +++ b/test/access/var/matrix.wgsl.expected.msl
@@ -2,7 +2,7 @@ using namespace metal; kernel void tint_symbol() { - float3x3 m = 0.0f; + float3x3 m = float3x3(0.0f); float3 const v = m[1]; float const f = v[1]; return;