1 // Copyright 2021 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 "src/resolver/resolver.h"
16
17 #include "gmock/gmock.h"
18 #include "src/resolver/resolver_test_helper.h"
19 #include "src/sem/atomic_type.h"
20
21 namespace tint {
22 namespace resolver {
23 namespace {
24
25 using ResolverIsHostShareable = ResolverTest;
26
TEST_F(ResolverIsHostShareable,Void)27 TEST_F(ResolverIsHostShareable, Void) {
28 EXPECT_FALSE(r()->IsHostShareable(create<sem::Void>()));
29 }
30
TEST_F(ResolverIsHostShareable,Bool)31 TEST_F(ResolverIsHostShareable, Bool) {
32 EXPECT_FALSE(r()->IsHostShareable(create<sem::Bool>()));
33 }
34
TEST_F(ResolverIsHostShareable,NumericScalar)35 TEST_F(ResolverIsHostShareable, NumericScalar) {
36 EXPECT_TRUE(r()->IsHostShareable(create<sem::I32>()));
37 EXPECT_TRUE(r()->IsHostShareable(create<sem::U32>()));
38 EXPECT_TRUE(r()->IsHostShareable(create<sem::F32>()));
39 }
40
TEST_F(ResolverIsHostShareable,NumericVector)41 TEST_F(ResolverIsHostShareable, NumericVector) {
42 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::I32>(), 2)));
43 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::I32>(), 3)));
44 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::I32>(), 4)));
45 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::U32>(), 2)));
46 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::U32>(), 3)));
47 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::U32>(), 4)));
48 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F32>(), 2)));
49 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F32>(), 3)));
50 EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F32>(), 4)));
51 }
52
TEST_F(ResolverIsHostShareable,BoolVector)53 TEST_F(ResolverIsHostShareable, BoolVector) {
54 EXPECT_FALSE(
55 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 2)));
56 EXPECT_FALSE(
57 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 3)));
58 EXPECT_FALSE(
59 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 4)));
60 EXPECT_FALSE(
61 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 2)));
62 EXPECT_FALSE(
63 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 3)));
64 EXPECT_FALSE(
65 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 4)));
66 EXPECT_FALSE(
67 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 2)));
68 EXPECT_FALSE(
69 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 3)));
70 EXPECT_FALSE(
71 r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 4)));
72 }
73
TEST_F(ResolverIsHostShareable,Matrix)74 TEST_F(ResolverIsHostShareable, Matrix) {
75 auto* vec2 = create<sem::Vector>(create<sem::F32>(), 2);
76 auto* vec3 = create<sem::Vector>(create<sem::F32>(), 3);
77 auto* vec4 = create<sem::Vector>(create<sem::F32>(), 4);
78
79 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec2, 2)));
80 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec2, 3)));
81 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec2, 4)));
82 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec3, 2)));
83 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec3, 3)));
84 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec3, 4)));
85 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec4, 2)));
86 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec4, 3)));
87 EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec4, 4)));
88 }
89
TEST_F(ResolverIsHostShareable,Pointer)90 TEST_F(ResolverIsHostShareable, Pointer) {
91 auto* ptr = create<sem::Pointer>(
92 create<sem::I32>(), ast::StorageClass::kPrivate, ast::Access::kReadWrite);
93 EXPECT_FALSE(r()->IsHostShareable(ptr));
94 }
95
TEST_F(ResolverIsHostShareable,Atomic)96 TEST_F(ResolverIsHostShareable, Atomic) {
97 EXPECT_TRUE(r()->IsHostShareable(create<sem::Atomic>(create<sem::I32>())));
98 EXPECT_TRUE(r()->IsHostShareable(create<sem::Atomic>(create<sem::U32>())));
99 }
100
TEST_F(ResolverIsHostShareable,ArraySizedOfHostShareable)101 TEST_F(ResolverIsHostShareable, ArraySizedOfHostShareable) {
102 auto* arr = create<sem::Array>(create<sem::I32>(), 5, 4, 20, 4, 4);
103 EXPECT_TRUE(r()->IsHostShareable(arr));
104 }
105
TEST_F(ResolverIsHostShareable,ArrayUnsizedOfHostShareable)106 TEST_F(ResolverIsHostShareable, ArrayUnsizedOfHostShareable) {
107 auto* arr = create<sem::Array>(create<sem::I32>(), 0, 4, 4, 4, 4);
108 EXPECT_TRUE(r()->IsHostShareable(arr));
109 }
110
111 // Note: Structure tests covered in host_shareable_validation_test.cc
112
113 } // namespace
114 } // namespace resolver
115 } // namespace tint
116