blob: f1f12cfb486f22809dc69e40830512b7fd01a597 [file] [log] [blame]
dan sinclair2a599012020-06-23 17:48:40 +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
dan sinclair5f812622020-09-22 14:53:03 +000015#include "src/ast/stage_decoration.h"
dan sinclair196e0972020-11-13 18:13:24 +000016#include "src/writer/msl/test_helper.h"
dan sinclair2a599012020-06-23 17:48:40 +000017
18namespace tint {
19namespace writer {
20namespace msl {
21namespace {
22
dan sinclair196e0972020-11-13 18:13:24 +000023using MslGeneratorImplTest = TestHelper;
dan sinclair2a599012020-06-23 17:48:40 +000024
dan sinclair2dbe9aa2020-09-21 15:16:20 +000025TEST_F(MslGeneratorImplTest, Generate) {
Ben Clayton42d1e092021-02-02 14:29:15 +000026 Func("my_func", ast::VariableList{}, ty.void_(), ast::StatementList{},
James Price95d40772021-03-11 17:39:32 +000027 ast::DecorationList{
Ben Clayton43073d82021-04-22 13:50:53 +000028 Stage(ast::PipelineStage::kCompute),
Ben Clayton42d1e092021-02-02 14:29:15 +000029 });
dan sinclair2a599012020-06-23 17:48:40 +000030
Ben Claytonf12054e2021-01-21 16:15:00 +000031 GeneratorImpl& gen = Build();
32
dan sinclair196e0972020-11-13 18:13:24 +000033 ASSERT_TRUE(gen.Generate()) << gen.error();
34 EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
dan sinclair2a599012020-06-23 17:48:40 +000035
dan sinclair2aaf7b52021-02-25 21:17:47 +000036using namespace metal;
dan sinclair987376c2021-01-12 04:34:53 +000037kernel void my_func() {
Ben Clayton7c598092021-01-13 16:34:51 +000038 return;
dan sinclair2a599012020-06-23 17:48:40 +000039}
dan sinclair2dbe9aa2020-09-21 15:16:20 +000040
dan sinclair2a599012020-06-23 17:48:40 +000041)");
42}
43
dan sinclair7caf6e52020-07-15 20:51:16 +000044struct MslBuiltinData {
45 ast::Builtin builtin;
46 const char* attribute_name;
47};
48inline std::ostream& operator<<(std::ostream& out, MslBuiltinData data) {
49 out << data.builtin;
50 return out;
51}
dan sinclair196e0972020-11-13 18:13:24 +000052using MslBuiltinConversionTest = TestParamHelper<MslBuiltinData>;
dan sinclair7caf6e52020-07-15 20:51:16 +000053TEST_P(MslBuiltinConversionTest, Emit) {
54 auto params = GetParam();
55
Ben Claytonf12054e2021-01-21 16:15:00 +000056 GeneratorImpl& gen = Build();
57
dan sinclair196e0972020-11-13 18:13:24 +000058 EXPECT_EQ(gen.builtin_to_attribute(params.builtin),
dan sinclair7caf6e52020-07-15 20:51:16 +000059 std::string(params.attribute_name));
60}
61INSTANTIATE_TEST_SUITE_P(
62 MslGeneratorImplTest,
63 MslBuiltinConversionTest,
64 testing::Values(MslBuiltinData{ast::Builtin::kPosition, "position"},
dan sinclaird7335fa2021-01-18 15:51:13 +000065 MslBuiltinData{ast::Builtin::kVertexIndex, "vertex_id"},
66 MslBuiltinData{ast::Builtin::kInstanceIndex, "instance_id"},
dan sinclair7caf6e52020-07-15 20:51:16 +000067 MslBuiltinData{ast::Builtin::kFrontFacing, "front_facing"},
68 MslBuiltinData{ast::Builtin::kFragCoord, "position"},
69 MslBuiltinData{ast::Builtin::kFragDepth, "depth(any)"},
dan sinclair7caf6e52020-07-15 20:51:16 +000070 MslBuiltinData{ast::Builtin::kLocalInvocationId,
71 "thread_position_in_threadgroup"},
dan sinclaird7335fa2021-01-18 15:51:13 +000072 MslBuiltinData{ast::Builtin::kLocalInvocationIndex,
dan sinclair7caf6e52020-07-15 20:51:16 +000073 "thread_index_in_threadgroup"},
74 MslBuiltinData{ast::Builtin::kGlobalInvocationId,
James Price2b5acac2021-02-09 19:13:25 +000075 "thread_position_in_grid"},
James Price395b4882021-04-16 19:57:34 +000076 MslBuiltinData{ast::Builtin::kWorkgroupId,
77 "threadgroup_position_in_grid"},
James Pricee7dab3c2021-02-16 18:21:41 +000078 MslBuiltinData{ast::Builtin::kSampleIndex, "sample_id"},
James Priceedd4d3c2021-04-14 16:44:38 +000079 MslBuiltinData{ast::Builtin::kSampleMask, "sample_mask"},
James Price2b5acac2021-02-09 19:13:25 +000080 MslBuiltinData{ast::Builtin::kSampleMaskIn, "sample_mask"},
81 MslBuiltinData{ast::Builtin::kSampleMaskOut,
82 "sample_mask"}));
dan sinclair7caf6e52020-07-15 20:51:16 +000083
dan sinclair2a599012020-06-23 17:48:40 +000084} // namespace
85} // namespace msl
86} // namespace writer
87} // namespace tint