blob: b7d97d6d343d19df1502f7577b00634e0cf6ba2c [file] [log] [blame]
dan sinclair26c8a212020-07-20 22:13:00 +00001// Copyright 2020 The Tint Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include <memory>
16#include <string>
17#include <vector>
18
19#include "gtest/gtest.h"
20#include "src/ast/call_expression.h"
21#include "src/ast/float_literal.h"
22#include "src/ast/identifier_expression.h"
23#include "src/ast/module.h"
24#include "src/ast/scalar_constructor_expression.h"
25#include "src/ast/sint_literal.h"
26#include "src/ast/type/f32_type.h"
27#include "src/ast/type/i32_type.h"
28#include "src/ast/type/matrix_type.h"
29#include "src/ast/type/vector_type.h"
30#include "src/ast/type_constructor_expression.h"
dan sinclair26c8a212020-07-20 22:13:00 +000031#include "src/type_determiner.h"
32#include "src/writer/msl/generator_impl.h"
dan sinclair196e0972020-11-13 18:13:24 +000033#include "src/writer/msl/test_helper.h"
dan sinclair26c8a212020-07-20 22:13:00 +000034
35namespace tint {
36namespace writer {
37namespace msl {
38namespace {
39
dan sinclair196e0972020-11-13 18:13:24 +000040using MslGeneratorImplTest = TestHelper;
dan sinclair26c8a212020-07-20 22:13:00 +000041
42struct MslImportData {
43 const char* name;
44 const char* msl_name;
45};
46inline std::ostream& operator<<(std::ostream& out, MslImportData data) {
47 out << data.name;
48 return out;
49}
dan sinclair196e0972020-11-13 18:13:24 +000050using MslImportData_SingleParamTest = TestParamHelper<MslImportData>;
dan sinclair26c8a212020-07-20 22:13:00 +000051TEST_P(MslImportData_SingleParamTest, FloatScalar) {
52 auto param = GetParam();
dan sinclairb5839932020-12-16 21:38:40 +000053 auto* call = Call(param.name, 1.f);
dan sinclair26c8a212020-07-20 22:13:00 +000054
dan sinclairb4fee2f2020-09-22 19:42:13 +000055 // The call type determination will set the intrinsic data for the ident
dan sinclairb5839932020-12-16 21:38:40 +000056 ASSERT_TRUE(td.DetermineResultType(call)) << td.error();
dan sinclair26c8a212020-07-20 22:13:00 +000057
dan sinclairb5839932020-12-16 21:38:40 +000058 ASSERT_EQ(
59 gen.generate_builtin_name(call->func()->As<ast::IdentifierExpression>()),
60 std::string("metal::") + param.msl_name);
dan sinclair26c8a212020-07-20 22:13:00 +000061}
62INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
63 MslImportData_SingleParamTest,
dan sinclairb4fee2f2020-09-22 19:42:13 +000064 testing::Values(MslImportData{"abs", "fabs"},
65 MslImportData{"acos", "acos"},
dan sinclair26c8a212020-07-20 22:13:00 +000066 MslImportData{"asin", "asin"},
dan sinclair26c8a212020-07-20 22:13:00 +000067 MslImportData{"atan", "atan"},
dan sinclairb4fee2f2020-09-22 19:42:13 +000068 MslImportData{"ceil", "ceil"},
dan sinclair26c8a212020-07-20 22:13:00 +000069 MslImportData{"cos", "cos"},
70 MslImportData{"cosh", "cosh"},
dan sinclair26c8a212020-07-20 22:13:00 +000071 MslImportData{"exp", "exp"},
72 MslImportData{"exp2", "exp2"},
dan sinclair26c8a212020-07-20 22:13:00 +000073 MslImportData{"floor", "floor"},
74 MslImportData{"fract", "fract"},
dan sinclairb4fee2f2020-09-22 19:42:13 +000075 MslImportData{"inverseSqrt", "rsqrt"},
dan sinclair26c8a212020-07-20 22:13:00 +000076 MslImportData{"length", "length"},
77 MslImportData{"log", "log"},
78 MslImportData{"log2", "log2"},
dan sinclair26c8a212020-07-20 22:13:00 +000079 MslImportData{"round", "round"},
dan sinclairb4fee2f2020-09-22 19:42:13 +000080 MslImportData{"sign", "sign"},
dan sinclair26c8a212020-07-20 22:13:00 +000081 MslImportData{"sin", "sin"},
82 MslImportData{"sinh", "sinh"},
83 MslImportData{"sqrt", "sqrt"},
84 MslImportData{"tan", "tan"},
85 MslImportData{"tanh", "tanh"},
86 MslImportData{"trunc", "trunc"}));
87
88TEST_F(MslGeneratorImplTest, MslImportData_SingleParamTest_IntScalar) {
dan sinclairb5839932020-12-16 21:38:40 +000089 auto* expr = Call("abs", 1);
90 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
dan sinclair26c8a212020-07-20 22:13:00 +000091
dan sinclairb5839932020-12-16 21:38:40 +000092 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
dan sinclair196e0972020-11-13 18:13:24 +000093 EXPECT_EQ(gen.result(), R"(metal::abs(1))");
dan sinclair26c8a212020-07-20 22:13:00 +000094}
95
dan sinclair196e0972020-11-13 18:13:24 +000096using MslImportData_DualParamTest = TestParamHelper<MslImportData>;
dan sinclair26c8a212020-07-20 22:13:00 +000097TEST_P(MslImportData_DualParamTest, FloatScalar) {
98 auto param = GetParam();
dan sinclairb5839932020-12-16 21:38:40 +000099 auto* expr = Call(param.name, 1.0f, 2.0f);
dan sinclair26c8a212020-07-20 22:13:00 +0000100
dan sinclairb5839932020-12-16 21:38:40 +0000101 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
102 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
Ben Clayton2da833d2020-11-20 10:04:44 +0000103 EXPECT_EQ(gen.result(),
104 std::string("metal::") + param.msl_name + "(1.0f, 2.0f)");
dan sinclair26c8a212020-07-20 22:13:00 +0000105}
106INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
107 MslImportData_DualParamTest,
108 testing::Values(MslImportData{"atan2", "atan2"},
109 MslImportData{"distance", "distance"},
dan sinclairb4fee2f2020-09-22 19:42:13 +0000110 MslImportData{"max", "fmax"},
111 MslImportData{"min", "fmin"},
dan sinclair26c8a212020-07-20 22:13:00 +0000112 MslImportData{"pow", "pow"},
113 MslImportData{"reflect", "reflect"},
114 MslImportData{"step", "step"}));
115
dan sinclair196e0972020-11-13 18:13:24 +0000116using MslImportData_DualParam_VectorTest = TestParamHelper<MslImportData>;
dan sinclair26c8a212020-07-20 22:13:00 +0000117TEST_P(MslImportData_DualParam_VectorTest, FloatVector) {
118 auto param = GetParam();
119
Ben Clayton1637cbb2021-01-05 15:44:39 +0000120 auto* expr =
121 Call(param.name, vec3<f32>(1.f, 2.f, 3.f), vec3<f32>(4.f, 5.f, 6.f));
dan sinclairb5839932020-12-16 21:38:40 +0000122 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
123 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
dan sinclair196e0972020-11-13 18:13:24 +0000124 EXPECT_EQ(gen.result(), std::string("metal::") + param.msl_name +
Ben Clayton2da833d2020-11-20 10:04:44 +0000125 "(float3(1.0f, 2.0f, 3.0f), "
126 "float3(4.0f, 5.0f, 6.0f))");
dan sinclair26c8a212020-07-20 22:13:00 +0000127}
128INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
129 MslImportData_DualParam_VectorTest,
130 testing::Values(MslImportData{"cross", "cross"}));
131
dan sinclair196e0972020-11-13 18:13:24 +0000132using MslImportData_DualParam_Int_Test = TestParamHelper<MslImportData>;
dan sinclair26c8a212020-07-20 22:13:00 +0000133TEST_P(MslImportData_DualParam_Int_Test, IntScalar) {
134 auto param = GetParam();
135
dan sinclairb5839932020-12-16 21:38:40 +0000136 auto* expr = Call(param.name, 1, 2);
137 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
138 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
dan sinclair196e0972020-11-13 18:13:24 +0000139 EXPECT_EQ(gen.result(), std::string("metal::") + param.msl_name + "(1, 2)");
dan sinclair26c8a212020-07-20 22:13:00 +0000140}
141INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
142 MslImportData_DualParam_Int_Test,
dan sinclairb4fee2f2020-09-22 19:42:13 +0000143 testing::Values(MslImportData{"max", "max"},
144 MslImportData{"min", "min"}));
dan sinclair26c8a212020-07-20 22:13:00 +0000145
dan sinclair196e0972020-11-13 18:13:24 +0000146using MslImportData_TripleParamTest = TestParamHelper<MslImportData>;
dan sinclair26c8a212020-07-20 22:13:00 +0000147TEST_P(MslImportData_TripleParamTest, FloatScalar) {
148 auto param = GetParam();
149
dan sinclairb5839932020-12-16 21:38:40 +0000150 auto* expr = Call(param.name, 1.f, 2.f, 3.f);
151 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
152 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
Ben Clayton2da833d2020-11-20 10:04:44 +0000153 EXPECT_EQ(gen.result(),
154 std::string("metal::") + param.msl_name + "(1.0f, 2.0f, 3.0f)");
dan sinclair26c8a212020-07-20 22:13:00 +0000155}
156INSTANTIATE_TEST_SUITE_P(
157 MslGeneratorImplTest,
158 MslImportData_TripleParamTest,
dan sinclairb4fee2f2020-09-22 19:42:13 +0000159 testing::Values(MslImportData{"faceForward", "faceforward"},
dan sinclair26c8a212020-07-20 22:13:00 +0000160 MslImportData{"fma", "fma"},
dan sinclairb4fee2f2020-09-22 19:42:13 +0000161 MslImportData{"mix", "mix"},
162 MslImportData{"clamp", "clamp"},
163 MslImportData{"smoothStep", "smoothstep"}));
dan sinclair26c8a212020-07-20 22:13:00 +0000164
dan sinclair196e0972020-11-13 18:13:24 +0000165using MslImportData_TripleParam_Int_Test = TestParamHelper<MslImportData>;
dan sinclair26c8a212020-07-20 22:13:00 +0000166TEST_P(MslImportData_TripleParam_Int_Test, IntScalar) {
167 auto param = GetParam();
168
dan sinclairb5839932020-12-16 21:38:40 +0000169 auto* expr = Call(param.name, 1, 2, 3);
170 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
171 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
dan sinclair196e0972020-11-13 18:13:24 +0000172 EXPECT_EQ(gen.result(),
173 std::string("metal::") + param.msl_name + "(1, 2, 3)");
dan sinclair26c8a212020-07-20 22:13:00 +0000174}
175INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
176 MslImportData_TripleParam_Int_Test,
dan sinclairb4fee2f2020-09-22 19:42:13 +0000177 testing::Values(MslImportData{"clamp", "clamp"},
178 MslImportData{"clamp", "clamp"}));
dan sinclair26c8a212020-07-20 22:13:00 +0000179
180TEST_F(MslGeneratorImplTest, MslImportData_Determinant) {
Ben Clayton1637cbb2021-01-05 15:44:39 +0000181 auto* var = Var("var", ast::StorageClass::kFunction, ty.mat3x3<f32>());
dan sinclair5e5e36e2020-12-16 14:41:00 +0000182 mod->AddGlobalVariable(var);
dan sinclair26c8a212020-07-20 22:13:00 +0000183
dan sinclairb5839932020-12-16 21:38:40 +0000184 auto* expr = Call("determinant", "var");
185
dan sinclair26c8a212020-07-20 22:13:00 +0000186 // Register the global
187 ASSERT_TRUE(td.Determine()) << td.error();
dan sinclairb5839932020-12-16 21:38:40 +0000188 ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
189 ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
dan sinclair987376c2021-01-12 04:34:53 +0000190 EXPECT_EQ(gen.result(), std::string("metal::determinant(var)"));
dan sinclair26c8a212020-07-20 22:13:00 +0000191}
192
193} // namespace
194} // namespace msl
195} // namespace writer
196} // namespace tint