Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 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/intrinsic_table.h" |
| 16 | |
| 17 | #include "gmock/gmock.h" |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 18 | #include "src/program_builder.h" |
Ben Clayton | 2aa6855 | 2021-10-12 21:57:47 +0000 | [diff] [blame] | 19 | #include "src/sem/atomic_type.h" |
Ben Clayton | fd35aa8 | 2021-07-26 22:19:48 +0000 | [diff] [blame] | 20 | #include "src/sem/depth_multisampled_texture_type.h" |
Antonio Maiorano | aea9c68 | 2021-04-19 22:54:43 +0000 | [diff] [blame] | 21 | #include "src/sem/depth_texture_type.h" |
Brandon Jones | 145f865 | 2021-04-22 22:47:03 +0000 | [diff] [blame] | 22 | #include "src/sem/external_texture_type.h" |
Antonio Maiorano | aea9c68 | 2021-04-19 22:54:43 +0000 | [diff] [blame] | 23 | #include "src/sem/multisampled_texture_type.h" |
Ben Clayton | 9b54a2e | 2021-05-18 10:28:48 +0000 | [diff] [blame] | 24 | #include "src/sem/reference_type.h" |
Antonio Maiorano | aea9c68 | 2021-04-19 22:54:43 +0000 | [diff] [blame] | 25 | #include "src/sem/sampled_texture_type.h" |
| 26 | #include "src/sem/storage_texture_type.h" |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 27 | |
| 28 | namespace tint { |
| 29 | namespace { |
| 30 | |
| 31 | using ::testing::ElementsAre; |
| 32 | using ::testing::HasSubstr; |
| 33 | |
Antonio Maiorano | 5cd71b8 | 2021-04-16 19:07:51 +0000 | [diff] [blame] | 34 | using IntrinsicType = sem::IntrinsicType; |
| 35 | using Parameter = sem::Parameter; |
Ben Clayton | 1934f59 | 2021-06-01 10:00:10 +0000 | [diff] [blame] | 36 | using ParameterUsage = sem::ParameterUsage; |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 37 | |
| 38 | class IntrinsicTableTest : public testing::Test, public ProgramBuilder { |
| 39 | public: |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 40 | std::unique_ptr<IntrinsicTable> table = IntrinsicTable::Create(*this); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 41 | }; |
| 42 | |
| 43 | TEST_F(IntrinsicTableTest, MatchF32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 44 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 45 | auto* result = table->Lookup(IntrinsicType::kCos, {f32}, Source{}); |
| 46 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 47 | ASSERT_EQ(Diagnostics().str(), ""); |
| 48 | EXPECT_THAT(result->Type(), IntrinsicType::kCos); |
| 49 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 50 | ASSERT_THAT(result->Parameters().size(), 1); |
| 51 | EXPECT_EQ(result->Parameters()[0]->Type(), f32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 52 | } |
| 53 | |
| 54 | TEST_F(IntrinsicTableTest, MismatchF32) { |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 55 | auto* i32 = create<sem::I32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 56 | auto* result = table->Lookup(IntrinsicType::kCos, {i32}, Source{}); |
| 57 | ASSERT_EQ(result, nullptr); |
| 58 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 59 | } |
| 60 | |
| 61 | TEST_F(IntrinsicTableTest, MatchU32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 62 | auto* f32 = create<sem::F32>(); |
Ben Clayton | 58dec17 | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 63 | auto* u32 = create<sem::U32>(); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 64 | auto* vec2_f32 = create<sem::Vector>(f32, 2); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 65 | auto* result = |
| 66 | table->Lookup(IntrinsicType::kUnpack2x16float, {u32}, Source{}); |
| 67 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 68 | ASSERT_EQ(Diagnostics().str(), ""); |
| 69 | EXPECT_THAT(result->Type(), IntrinsicType::kUnpack2x16float); |
| 70 | EXPECT_THAT(result->ReturnType(), vec2_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 71 | ASSERT_EQ(result->Parameters().size(), 1u); |
| 72 | EXPECT_EQ(result->Parameters()[0]->Type(), u32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 73 | } |
| 74 | |
| 75 | TEST_F(IntrinsicTableTest, MismatchU32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 76 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 77 | auto* result = |
| 78 | table->Lookup(IntrinsicType::kUnpack2x16float, {f32}, Source{}); |
| 79 | ASSERT_EQ(result, nullptr); |
| 80 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 81 | } |
| 82 | |
| 83 | TEST_F(IntrinsicTableTest, MatchI32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 84 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 85 | auto* i32 = create<sem::I32>(); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 86 | auto* vec4_f32 = create<sem::Vector>(f32, 4); |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 87 | auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 88 | auto* result = |
| 89 | table->Lookup(IntrinsicType::kTextureLoad, {tex, i32, i32}, Source{}); |
| 90 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 91 | ASSERT_EQ(Diagnostics().str(), ""); |
| 92 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad); |
| 93 | EXPECT_THAT(result->ReturnType(), vec4_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 94 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 95 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 96 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 97 | EXPECT_EQ(result->Parameters()[1]->Type(), i32); |
| 98 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
| 99 | EXPECT_EQ(result->Parameters()[2]->Type(), i32); |
| 100 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kLevel); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | TEST_F(IntrinsicTableTest, MismatchI32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 104 | auto* f32 = create<sem::F32>(); |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 105 | auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 106 | auto* result = |
| 107 | table->Lookup(IntrinsicType::kTextureLoad, {tex, f32}, Source{}); |
| 108 | ASSERT_EQ(result, nullptr); |
| 109 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | TEST_F(IntrinsicTableTest, MatchIU32AsI32) { |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 113 | auto* i32 = create<sem::I32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 114 | auto* result = table->Lookup(IntrinsicType::kCountOneBits, {i32}, Source{}); |
| 115 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 116 | ASSERT_EQ(Diagnostics().str(), ""); |
| 117 | EXPECT_THAT(result->Type(), IntrinsicType::kCountOneBits); |
| 118 | EXPECT_THAT(result->ReturnType(), i32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 119 | ASSERT_EQ(result->Parameters().size(), 1u); |
| 120 | EXPECT_EQ(result->Parameters()[0]->Type(), i32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 121 | } |
| 122 | |
| 123 | TEST_F(IntrinsicTableTest, MatchIU32AsU32) { |
Ben Clayton | 58dec17 | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 124 | auto* u32 = create<sem::U32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 125 | auto* result = table->Lookup(IntrinsicType::kCountOneBits, {u32}, Source{}); |
| 126 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 127 | ASSERT_EQ(Diagnostics().str(), ""); |
| 128 | EXPECT_THAT(result->Type(), IntrinsicType::kCountOneBits); |
| 129 | EXPECT_THAT(result->ReturnType(), u32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 130 | ASSERT_EQ(result->Parameters().size(), 1u); |
| 131 | EXPECT_EQ(result->Parameters()[0]->Type(), u32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | TEST_F(IntrinsicTableTest, MismatchIU32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 135 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 136 | auto* result = table->Lookup(IntrinsicType::kCountOneBits, {f32}, Source{}); |
| 137 | ASSERT_EQ(result, nullptr); |
| 138 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 139 | } |
| 140 | |
| 141 | TEST_F(IntrinsicTableTest, MatchFIU32AsI32) { |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 142 | auto* i32 = create<sem::I32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 143 | auto* result = |
| 144 | table->Lookup(IntrinsicType::kClamp, {i32, i32, i32}, Source{}); |
| 145 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 146 | ASSERT_EQ(Diagnostics().str(), ""); |
| 147 | EXPECT_THAT(result->Type(), IntrinsicType::kClamp); |
| 148 | EXPECT_THAT(result->ReturnType(), i32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 149 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 150 | EXPECT_EQ(result->Parameters()[0]->Type(), i32); |
| 151 | EXPECT_EQ(result->Parameters()[1]->Type(), i32); |
| 152 | EXPECT_EQ(result->Parameters()[2]->Type(), i32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 153 | } |
| 154 | |
| 155 | TEST_F(IntrinsicTableTest, MatchFIU32AsU32) { |
Ben Clayton | 58dec17 | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 156 | auto* u32 = create<sem::U32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 157 | auto* result = |
| 158 | table->Lookup(IntrinsicType::kClamp, {u32, u32, u32}, Source{}); |
| 159 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 160 | ASSERT_EQ(Diagnostics().str(), ""); |
| 161 | EXPECT_THAT(result->Type(), IntrinsicType::kClamp); |
| 162 | EXPECT_THAT(result->ReturnType(), u32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 163 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 164 | EXPECT_EQ(result->Parameters()[0]->Type(), u32); |
| 165 | EXPECT_EQ(result->Parameters()[1]->Type(), u32); |
| 166 | EXPECT_EQ(result->Parameters()[2]->Type(), u32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 167 | } |
| 168 | |
| 169 | TEST_F(IntrinsicTableTest, MatchFIU32AsF32) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 170 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 171 | auto* result = |
| 172 | table->Lookup(IntrinsicType::kClamp, {f32, f32, f32}, Source{}); |
| 173 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 174 | ASSERT_EQ(Diagnostics().str(), ""); |
| 175 | EXPECT_THAT(result->Type(), IntrinsicType::kClamp); |
| 176 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 177 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 178 | EXPECT_EQ(result->Parameters()[0]->Type(), f32); |
| 179 | EXPECT_EQ(result->Parameters()[1]->Type(), f32); |
| 180 | EXPECT_EQ(result->Parameters()[2]->Type(), f32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 181 | } |
| 182 | |
| 183 | TEST_F(IntrinsicTableTest, MismatchFIU32) { |
Ben Clayton | c03d3bd | 2021-05-20 14:22:28 +0000 | [diff] [blame] | 184 | auto* bool_ = create<sem::Bool>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 185 | auto* result = |
| 186 | table->Lookup(IntrinsicType::kClamp, {bool_, bool_, bool_}, Source{}); |
| 187 | ASSERT_EQ(result, nullptr); |
| 188 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 189 | } |
| 190 | |
| 191 | TEST_F(IntrinsicTableTest, MatchBool) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 192 | auto* f32 = create<sem::F32>(); |
Ben Clayton | c03d3bd | 2021-05-20 14:22:28 +0000 | [diff] [blame] | 193 | auto* bool_ = create<sem::Bool>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 194 | auto* result = |
| 195 | table->Lookup(IntrinsicType::kSelect, {f32, f32, bool_}, Source{}); |
| 196 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 197 | ASSERT_EQ(Diagnostics().str(), ""); |
| 198 | EXPECT_THAT(result->Type(), IntrinsicType::kSelect); |
| 199 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 200 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 201 | EXPECT_EQ(result->Parameters()[0]->Type(), f32); |
| 202 | EXPECT_EQ(result->Parameters()[1]->Type(), f32); |
| 203 | EXPECT_EQ(result->Parameters()[2]->Type(), bool_); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 204 | } |
| 205 | |
| 206 | TEST_F(IntrinsicTableTest, MismatchBool) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 207 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 208 | auto* result = |
| 209 | table->Lookup(IntrinsicType::kSelect, {f32, f32, f32}, Source{}); |
| 210 | ASSERT_EQ(result, nullptr); |
| 211 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 212 | } |
| 213 | |
| 214 | TEST_F(IntrinsicTableTest, MatchPointer) { |
Ben Clayton | 2aa6855 | 2021-10-12 21:57:47 +0000 | [diff] [blame] | 215 | auto* i32 = create<sem::I32>(); |
| 216 | auto* atomicI32 = create<sem::Atomic>(i32); |
| 217 | auto* ptr = create<sem::Pointer>(atomicI32, ast::StorageClass::kWorkgroup, |
Ben Clayton | 1858854 | 2021-06-04 22:17:37 +0000 | [diff] [blame] | 218 | ast::Access::kReadWrite); |
Ben Clayton | 2aa6855 | 2021-10-12 21:57:47 +0000 | [diff] [blame] | 219 | auto* result = table->Lookup(IntrinsicType::kAtomicLoad, {ptr}, Source{}); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 220 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 221 | ASSERT_EQ(Diagnostics().str(), ""); |
Ben Clayton | 2aa6855 | 2021-10-12 21:57:47 +0000 | [diff] [blame] | 222 | EXPECT_THAT(result->Type(), IntrinsicType::kAtomicLoad); |
| 223 | EXPECT_THAT(result->ReturnType(), i32); |
| 224 | ASSERT_EQ(result->Parameters().size(), 1u); |
| 225 | EXPECT_EQ(result->Parameters()[0]->Type(), ptr); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 226 | } |
| 227 | |
| 228 | TEST_F(IntrinsicTableTest, MismatchPointer) { |
Ben Clayton | 2aa6855 | 2021-10-12 21:57:47 +0000 | [diff] [blame] | 229 | auto* i32 = create<sem::I32>(); |
| 230 | auto* atomicI32 = create<sem::Atomic>(i32); |
| 231 | auto* result = |
| 232 | table->Lookup(IntrinsicType::kAtomicLoad, {atomicI32}, Source{}); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 233 | ASSERT_EQ(result, nullptr); |
| 234 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 235 | } |
| 236 | |
| 237 | TEST_F(IntrinsicTableTest, MatchArray) { |
Antonio Maiorano | 68a6dd0 | 2021-07-20 18:28:31 +0000 | [diff] [blame] | 238 | auto* arr = create<sem::Array>(create<sem::U32>(), 0, 4, 4, 4, 4); |
Ben Clayton | 0949304 | 2021-06-18 22:44:31 +0000 | [diff] [blame] | 239 | auto* arr_ptr = create<sem::Pointer>(arr, ast::StorageClass::kStorage, |
| 240 | ast::Access::kReadWrite); |
| 241 | auto* result = |
| 242 | table->Lookup(IntrinsicType::kArrayLength, {arr_ptr}, Source{}); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 243 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 244 | ASSERT_EQ(Diagnostics().str(), ""); |
| 245 | EXPECT_THAT(result->Type(), IntrinsicType::kArrayLength); |
| 246 | EXPECT_TRUE(result->ReturnType()->Is<sem::U32>()); |
| 247 | ASSERT_EQ(result->Parameters().size(), 1u); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 248 | auto* param_type = result->Parameters()[0]->Type(); |
Ben Clayton | 0949304 | 2021-06-18 22:44:31 +0000 | [diff] [blame] | 249 | ASSERT_TRUE(param_type->Is<sem::Pointer>()); |
| 250 | EXPECT_TRUE(param_type->As<sem::Pointer>()->StoreType()->Is<sem::Array>()); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 251 | } |
| 252 | |
| 253 | TEST_F(IntrinsicTableTest, MismatchArray) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 254 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 255 | auto* result = table->Lookup(IntrinsicType::kArrayLength, {f32}, Source{}); |
| 256 | ASSERT_EQ(result, nullptr); |
| 257 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 258 | } |
| 259 | |
| 260 | TEST_F(IntrinsicTableTest, MatchSampler) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 261 | auto* f32 = create<sem::F32>(); |
| 262 | auto* vec2_f32 = create<sem::Vector>(f32, 2); |
| 263 | auto* vec4_f32 = create<sem::Vector>(f32, 4); |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 264 | auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32); |
Ben Clayton | b966265 | 2021-05-20 14:54:28 +0000 | [diff] [blame] | 265 | auto* sampler = create<sem::Sampler>(ast::SamplerKind::kSampler); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 266 | auto* result = table->Lookup(IntrinsicType::kTextureSample, |
| 267 | {tex, sampler, vec2_f32}, Source{}); |
| 268 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 269 | ASSERT_EQ(Diagnostics().str(), ""); |
| 270 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureSample); |
| 271 | EXPECT_THAT(result->ReturnType(), vec4_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 272 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 273 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 274 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 275 | EXPECT_EQ(result->Parameters()[1]->Type(), sampler); |
| 276 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kSampler); |
| 277 | EXPECT_EQ(result->Parameters()[2]->Type(), vec2_f32); |
| 278 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kCoords); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 279 | } |
| 280 | |
| 281 | TEST_F(IntrinsicTableTest, MismatchSampler) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 282 | auto* f32 = create<sem::F32>(); |
| 283 | auto* vec2_f32 = create<sem::Vector>(f32, 2); |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 284 | auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 285 | auto* result = table->Lookup(IntrinsicType::kTextureSample, |
| 286 | {tex, f32, vec2_f32}, Source{}); |
| 287 | ASSERT_EQ(result, nullptr); |
| 288 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 289 | } |
| 290 | |
| 291 | TEST_F(IntrinsicTableTest, MatchSampledTexture) { |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 292 | auto* i32 = create<sem::I32>(); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 293 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 294 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 295 | auto* vec4_f32 = create<sem::Vector>(f32, 4); |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 296 | auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 297 | auto* result = table->Lookup(IntrinsicType::kTextureLoad, |
| 298 | {tex, vec2_i32, i32}, Source{}); |
| 299 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 300 | ASSERT_EQ(Diagnostics().str(), ""); |
| 301 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad); |
| 302 | EXPECT_THAT(result->ReturnType(), vec4_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 303 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 304 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 305 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 306 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32); |
| 307 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
| 308 | EXPECT_EQ(result->Parameters()[2]->Type(), i32); |
| 309 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kLevel); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 310 | } |
| 311 | |
| 312 | TEST_F(IntrinsicTableTest, MatchMultisampledTexture) { |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 313 | auto* i32 = create<sem::I32>(); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 314 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 315 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 316 | auto* vec4_f32 = create<sem::Vector>(f32, 4); |
| 317 | auto* tex = create<sem::MultisampledTexture>(ast::TextureDimension::k2d, f32); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 318 | auto* result = table->Lookup(IntrinsicType::kTextureLoad, |
| 319 | {tex, vec2_i32, i32}, Source{}); |
| 320 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 321 | ASSERT_EQ(Diagnostics().str(), ""); |
| 322 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad); |
| 323 | EXPECT_THAT(result->ReturnType(), vec4_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 324 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 325 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 326 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 327 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32); |
| 328 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
| 329 | EXPECT_EQ(result->Parameters()[2]->Type(), i32); |
| 330 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kSampleIndex); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 331 | } |
| 332 | |
| 333 | TEST_F(IntrinsicTableTest, MatchDepthTexture) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 334 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 335 | auto* i32 = create<sem::I32>(); |
| 336 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 337 | auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 338 | auto* result = table->Lookup(IntrinsicType::kTextureLoad, |
| 339 | {tex, vec2_i32, i32}, Source{}); |
| 340 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 341 | ASSERT_EQ(Diagnostics().str(), ""); |
| 342 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad); |
| 343 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 344 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 345 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 346 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 347 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32); |
| 348 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
| 349 | EXPECT_EQ(result->Parameters()[2]->Type(), i32); |
| 350 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kLevel); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 351 | } |
| 352 | |
Ben Clayton | fd35aa8 | 2021-07-26 22:19:48 +0000 | [diff] [blame] | 353 | TEST_F(IntrinsicTableTest, MatchDepthMultisampledTexture) { |
| 354 | auto* f32 = create<sem::F32>(); |
| 355 | auto* i32 = create<sem::I32>(); |
| 356 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
| 357 | auto* tex = create<sem::DepthMultisampledTexture>(ast::TextureDimension::k2d); |
| 358 | auto* result = table->Lookup(IntrinsicType::kTextureLoad, |
| 359 | {tex, vec2_i32, i32}, Source{}); |
| 360 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 361 | ASSERT_EQ(Diagnostics().str(), ""); |
| 362 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad); |
| 363 | EXPECT_THAT(result->ReturnType(), f32); |
| 364 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 365 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 366 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 367 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32); |
| 368 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
| 369 | EXPECT_EQ(result->Parameters()[2]->Type(), i32); |
| 370 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kSampleIndex); |
| 371 | } |
| 372 | |
Brandon Jones | 145f865 | 2021-04-22 22:47:03 +0000 | [diff] [blame] | 373 | TEST_F(IntrinsicTableTest, MatchExternalTexture) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 374 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 375 | auto* i32 = create<sem::I32>(); |
| 376 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 377 | auto* vec4_f32 = create<sem::Vector>(f32, 4); |
Brandon Jones | 145f865 | 2021-04-22 22:47:03 +0000 | [diff] [blame] | 378 | auto* tex = create<sem::ExternalTexture>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 379 | auto* result = |
| 380 | table->Lookup(IntrinsicType::kTextureLoad, {tex, vec2_i32}, Source{}); |
| 381 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 382 | ASSERT_EQ(Diagnostics().str(), ""); |
| 383 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad); |
| 384 | EXPECT_THAT(result->ReturnType(), vec4_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 385 | ASSERT_EQ(result->Parameters().size(), 2u); |
| 386 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 387 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 388 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32); |
| 389 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
Brandon Jones | 145f865 | 2021-04-22 22:47:03 +0000 | [diff] [blame] | 390 | } |
| 391 | |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 392 | TEST_F(IntrinsicTableTest, MatchWOStorageTexture) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 393 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 394 | auto* i32 = create<sem::I32>(); |
| 395 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 396 | auto* vec4_f32 = create<sem::Vector>(f32, 4); |
Antonio Maiorano | dc4e6c1 | 2021-05-14 17:51:13 +0000 | [diff] [blame] | 397 | auto* subtype = |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 398 | sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types()); |
Ben Clayton | 646f4a9 | 2021-05-31 19:40:30 +0000 | [diff] [blame] | 399 | auto* tex = create<sem::StorageTexture>(ast::TextureDimension::k2d, |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 400 | ast::ImageFormat::kR32Float, |
Ben Clayton | 93e8f52 | 2021-06-04 20:41:47 +0000 | [diff] [blame] | 401 | ast::Access::kWrite, subtype); |
Antonio Maiorano | dc4e6c1 | 2021-05-14 17:51:13 +0000 | [diff] [blame] | 402 | |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 403 | auto* result = table->Lookup(IntrinsicType::kTextureStore, |
| 404 | {tex, vec2_i32, vec4_f32}, Source{}); |
| 405 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 406 | ASSERT_EQ(Diagnostics().str(), ""); |
| 407 | EXPECT_THAT(result->Type(), IntrinsicType::kTextureStore); |
| 408 | EXPECT_TRUE(result->ReturnType()->Is<sem::Void>()); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 409 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 410 | EXPECT_EQ(result->Parameters()[0]->Type(), tex); |
| 411 | EXPECT_EQ(result->Parameters()[0]->Usage(), ParameterUsage::kTexture); |
| 412 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_i32); |
| 413 | EXPECT_EQ(result->Parameters()[1]->Usage(), ParameterUsage::kCoords); |
| 414 | EXPECT_EQ(result->Parameters()[2]->Type(), vec4_f32); |
| 415 | EXPECT_EQ(result->Parameters()[2]->Usage(), ParameterUsage::kValue); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 416 | } |
| 417 | |
| 418 | TEST_F(IntrinsicTableTest, MismatchTexture) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 419 | auto* f32 = create<sem::F32>(); |
Ben Clayton | cf421bb | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 420 | auto* i32 = create<sem::I32>(); |
| 421 | auto* vec2_i32 = create<sem::Vector>(i32, 2); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 422 | auto* result = |
| 423 | table->Lookup(IntrinsicType::kTextureLoad, {f32, vec2_i32}, Source{}); |
| 424 | ASSERT_EQ(result, nullptr); |
| 425 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 426 | } |
| 427 | |
Ben Clayton | 9b54a2e | 2021-05-18 10:28:48 +0000 | [diff] [blame] | 428 | TEST_F(IntrinsicTableTest, ImplicitLoadOnReference) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 429 | auto* f32 = create<sem::F32>(); |
Ben Clayton | 1858854 | 2021-06-04 22:17:37 +0000 | [diff] [blame] | 430 | auto* result = |
| 431 | table->Lookup(IntrinsicType::kCos, |
| 432 | {create<sem::Reference>(f32, ast::StorageClass::kFunction, |
| 433 | ast::Access::kReadWrite)}, |
| 434 | Source{}); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 435 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 436 | ASSERT_EQ(Diagnostics().str(), ""); |
| 437 | EXPECT_THAT(result->Type(), IntrinsicType::kCos); |
| 438 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 439 | ASSERT_EQ(result->Parameters().size(), 1u); |
| 440 | EXPECT_EQ(result->Parameters()[0]->Type(), f32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 441 | } |
| 442 | |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 443 | TEST_F(IntrinsicTableTest, MatchOpenType) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 444 | auto* f32 = create<sem::F32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 445 | auto* result = |
| 446 | table->Lookup(IntrinsicType::kClamp, {f32, f32, f32}, Source{}); |
| 447 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 448 | ASSERT_EQ(Diagnostics().str(), ""); |
| 449 | EXPECT_THAT(result->Type(), IntrinsicType::kClamp); |
| 450 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 451 | EXPECT_EQ(result->Parameters()[0]->Type(), f32); |
| 452 | EXPECT_EQ(result->Parameters()[1]->Type(), f32); |
| 453 | EXPECT_EQ(result->Parameters()[2]->Type(), f32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 454 | } |
| 455 | |
| 456 | TEST_F(IntrinsicTableTest, MismatchOpenType) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 457 | auto* f32 = create<sem::F32>(); |
Ben Clayton | 58dec17 | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 458 | auto* u32 = create<sem::U32>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 459 | auto* result = |
| 460 | table->Lookup(IntrinsicType::kClamp, {f32, u32, f32}, Source{}); |
| 461 | ASSERT_EQ(result, nullptr); |
| 462 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 463 | } |
| 464 | |
| 465 | TEST_F(IntrinsicTableTest, MatchOpenSizeVector) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 466 | auto* f32 = create<sem::F32>(); |
| 467 | auto* vec2_f32 = create<sem::Vector>(f32, 2); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 468 | auto* result = table->Lookup(IntrinsicType::kClamp, |
| 469 | {vec2_f32, vec2_f32, vec2_f32}, Source{}); |
| 470 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 471 | ASSERT_EQ(Diagnostics().str(), ""); |
| 472 | EXPECT_THAT(result->Type(), IntrinsicType::kClamp); |
| 473 | EXPECT_THAT(result->ReturnType(), vec2_f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 474 | ASSERT_EQ(result->Parameters().size(), 3u); |
| 475 | EXPECT_EQ(result->Parameters()[0]->Type(), vec2_f32); |
| 476 | EXPECT_EQ(result->Parameters()[1]->Type(), vec2_f32); |
| 477 | EXPECT_EQ(result->Parameters()[2]->Type(), vec2_f32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 478 | } |
| 479 | |
| 480 | TEST_F(IntrinsicTableTest, MismatchOpenSizeVector) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 481 | auto* f32 = create<sem::F32>(); |
Ben Clayton | 58dec17 | 2021-05-19 17:47:11 +0000 | [diff] [blame] | 482 | auto* u32 = create<sem::U32>(); |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 483 | auto* vec2_f32 = create<sem::Vector>(f32, 2); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 484 | auto* result = |
| 485 | table->Lookup(IntrinsicType::kClamp, {vec2_f32, u32, vec2_f32}, Source{}); |
| 486 | ASSERT_EQ(result, nullptr); |
| 487 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 488 | } |
| 489 | |
| 490 | TEST_F(IntrinsicTableTest, MatchOpenSizeMatrix) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 491 | auto* f32 = create<sem::F32>(); |
| 492 | auto* vec3_f32 = create<sem::Vector>(f32, 3); |
| 493 | auto* mat3_f32 = create<sem::Matrix>(vec3_f32, 3); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 494 | auto* result = |
| 495 | table->Lookup(IntrinsicType::kDeterminant, {mat3_f32}, Source{}); |
| 496 | ASSERT_NE(result, nullptr) << Diagnostics().str(); |
| 497 | ASSERT_EQ(Diagnostics().str(), ""); |
| 498 | EXPECT_THAT(result->Type(), IntrinsicType::kDeterminant); |
| 499 | EXPECT_THAT(result->ReturnType(), f32); |
Ben Clayton | 0f2d95d | 2021-07-22 13:24:59 +0000 | [diff] [blame] | 500 | ASSERT_EQ(result->Parameters().size(), 1u); |
| 501 | EXPECT_EQ(result->Parameters()[0]->Type(), mat3_f32); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 502 | } |
| 503 | |
| 504 | TEST_F(IntrinsicTableTest, MismatchOpenSizeMatrix) { |
Ben Clayton | 512d60c | 2021-05-19 19:51:22 +0000 | [diff] [blame] | 505 | auto* f32 = create<sem::F32>(); |
| 506 | auto* vec2_f32 = create<sem::Vector>(f32, 2); |
| 507 | auto* mat3x2_f32 = create<sem::Matrix>(vec2_f32, 3); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 508 | auto* result = |
| 509 | table->Lookup(IntrinsicType::kDeterminant, {mat3x2_f32}, Source{}); |
| 510 | ASSERT_EQ(result, nullptr); |
| 511 | ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call")); |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 512 | } |
| 513 | |
| 514 | TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) { |
| 515 | // None of the arguments match, so expect the overloads with 2 parameters to |
| 516 | // come first |
Ben Clayton | c03d3bd | 2021-05-20 14:22:28 +0000 | [diff] [blame] | 517 | auto* bool_ = create<sem::Bool>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 518 | table->Lookup(IntrinsicType::kTextureDimensions, {bool_, bool_}, Source{}); |
| 519 | ASSERT_EQ(Diagnostics().str(), |
Ben Clayton | 6b4924f | 2021-02-17 20:13:34 +0000 | [diff] [blame] | 520 | R"(error: no matching call to textureDimensions(bool, bool) |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 521 | |
Ben Clayton | fd35aa8 | 2021-07-26 22:19:48 +0000 | [diff] [blame] | 522 | 27 candidate functions: |
Ben Clayton | 9e0b3cc | 2021-07-15 16:14:34 +0000 | [diff] [blame] | 523 | textureDimensions(texture: texture_1d<T>, level: i32) -> i32 where: T is f32, i32 or u32 |
Ben Clayton | 57d6bd2 | 2021-06-03 08:32:44 +0000 | [diff] [blame] | 524 | textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
| 525 | textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
| 526 | textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32 |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 527 | textureDimensions(texture: texture_cube<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
| 528 | textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 529 | textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32> |
| 530 | textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32> |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 531 | textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32> |
| 532 | textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32> |
Ben Clayton | 57d6bd2 | 2021-06-03 08:32:44 +0000 | [diff] [blame] | 533 | textureDimensions(texture: texture_1d<T>) -> i32 where: T is f32, i32 or u32 |
| 534 | textureDimensions(texture: texture_2d<T>) -> vec2<i32> where: T is f32, i32 or u32 |
| 535 | textureDimensions(texture: texture_2d_array<T>) -> vec2<i32> where: T is f32, i32 or u32 |
| 536 | textureDimensions(texture: texture_3d<T>) -> vec3<i32> where: T is f32, i32 or u32 |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 537 | textureDimensions(texture: texture_cube<T>) -> vec2<i32> where: T is f32, i32 or u32 |
| 538 | textureDimensions(texture: texture_cube_array<T>) -> vec2<i32> where: T is f32, i32 or u32 |
Ben Clayton | 57d6bd2 | 2021-06-03 08:32:44 +0000 | [diff] [blame] | 539 | textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32 |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 540 | textureDimensions(texture: texture_depth_2d) -> vec2<i32> |
| 541 | textureDimensions(texture: texture_depth_2d_array) -> vec2<i32> |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 542 | textureDimensions(texture: texture_depth_cube) -> vec2<i32> |
| 543 | textureDimensions(texture: texture_depth_cube_array) -> vec2<i32> |
Ben Clayton | fd35aa8 | 2021-07-26 22:19:48 +0000 | [diff] [blame] | 544 | textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32> |
Ben Clayton | f3f2d0a | 2021-10-14 10:10:45 +0000 | [diff] [blame] | 545 | textureDimensions(texture: texture_storage_1d<F, A>) -> i32 where: A is write |
| 546 | textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32> where: A is write |
| 547 | textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32> where: A is write |
| 548 | textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32> where: A is write |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 549 | textureDimensions(texture: texture_external) -> vec2<i32> |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 550 | )"); |
| 551 | } |
| 552 | |
| 553 | TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) { |
Ben Clayton | 55ecfc4 | 2021-05-20 14:42:28 +0000 | [diff] [blame] | 554 | auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d); |
Ben Clayton | c03d3bd | 2021-05-20 14:22:28 +0000 | [diff] [blame] | 555 | auto* bool_ = create<sem::Bool>(); |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 556 | table->Lookup(IntrinsicType::kTextureDimensions, {tex, bool_}, Source{}); |
Ben Clayton | 6b4924f | 2021-02-17 20:13:34 +0000 | [diff] [blame] | 557 | ASSERT_EQ( |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 558 | Diagnostics().str(), |
Ben Clayton | 6b4924f | 2021-02-17 20:13:34 +0000 | [diff] [blame] | 559 | R"(error: no matching call to textureDimensions(texture_depth_2d, bool) |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 560 | |
Ben Clayton | fd35aa8 | 2021-07-26 22:19:48 +0000 | [diff] [blame] | 561 | 27 candidate functions: |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 562 | textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32> |
| 563 | textureDimensions(texture: texture_depth_2d) -> vec2<i32> |
Ben Clayton | 9e0b3cc | 2021-07-15 16:14:34 +0000 | [diff] [blame] | 564 | textureDimensions(texture: texture_1d<T>, level: i32) -> i32 where: T is f32, i32 or u32 |
Ben Clayton | 57d6bd2 | 2021-06-03 08:32:44 +0000 | [diff] [blame] | 565 | textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
| 566 | textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
| 567 | textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32 |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 568 | textureDimensions(texture: texture_cube<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
| 569 | textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32 |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 570 | textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32> |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 571 | textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32> |
| 572 | textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32> |
Ben Clayton | 57d6bd2 | 2021-06-03 08:32:44 +0000 | [diff] [blame] | 573 | textureDimensions(texture: texture_1d<T>) -> i32 where: T is f32, i32 or u32 |
| 574 | textureDimensions(texture: texture_2d<T>) -> vec2<i32> where: T is f32, i32 or u32 |
| 575 | textureDimensions(texture: texture_2d_array<T>) -> vec2<i32> where: T is f32, i32 or u32 |
| 576 | textureDimensions(texture: texture_3d<T>) -> vec3<i32> where: T is f32, i32 or u32 |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 577 | textureDimensions(texture: texture_cube<T>) -> vec2<i32> where: T is f32, i32 or u32 |
| 578 | textureDimensions(texture: texture_cube_array<T>) -> vec2<i32> where: T is f32, i32 or u32 |
Ben Clayton | 57d6bd2 | 2021-06-03 08:32:44 +0000 | [diff] [blame] | 579 | textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32 |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 580 | textureDimensions(texture: texture_depth_2d_array) -> vec2<i32> |
Ben Clayton | b96ed7b | 2021-06-21 16:44:26 +0000 | [diff] [blame] | 581 | textureDimensions(texture: texture_depth_cube) -> vec2<i32> |
| 582 | textureDimensions(texture: texture_depth_cube_array) -> vec2<i32> |
Ben Clayton | fd35aa8 | 2021-07-26 22:19:48 +0000 | [diff] [blame] | 583 | textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32> |
Ben Clayton | f3f2d0a | 2021-10-14 10:10:45 +0000 | [diff] [blame] | 584 | textureDimensions(texture: texture_storage_1d<F, A>) -> i32 where: A is write |
| 585 | textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32> where: A is write |
| 586 | textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32> where: A is write |
| 587 | textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32> where: A is write |
Ben Clayton | b29a59d | 2021-06-01 19:06:31 +0000 | [diff] [blame] | 588 | textureDimensions(texture: texture_external) -> vec2<i32> |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 589 | )"); |
| 590 | } |
| 591 | |
Ben Clayton | b478f97 | 2021-07-15 20:34:21 +0000 | [diff] [blame] | 592 | TEST_F(IntrinsicTableTest, SameOverloadReturnsSameIntrinsicPointer) { |
| 593 | auto* f32 = create<sem::F32>(); |
| 594 | auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2); |
| 595 | auto* bool_ = create<sem::Bool>(); |
| 596 | auto* a = table->Lookup(IntrinsicType::kSelect, {f32, f32, bool_}, Source{}); |
| 597 | ASSERT_NE(a, nullptr) << Diagnostics().str(); |
| 598 | |
| 599 | auto* b = table->Lookup(IntrinsicType::kSelect, {f32, f32, bool_}, Source{}); |
| 600 | ASSERT_NE(b, nullptr) << Diagnostics().str(); |
| 601 | ASSERT_EQ(Diagnostics().str(), ""); |
| 602 | |
| 603 | auto* c = table->Lookup(IntrinsicType::kSelect, {vec2_f32, vec2_f32, bool_}, |
| 604 | Source{}); |
| 605 | ASSERT_NE(c, nullptr) << Diagnostics().str(); |
| 606 | ASSERT_EQ(Diagnostics().str(), ""); |
| 607 | |
| 608 | EXPECT_EQ(a, b); |
| 609 | EXPECT_NE(a, c); |
| 610 | EXPECT_NE(b, c); |
| 611 | } |
| 612 | |
Ben Clayton | faca02d | 2021-02-10 21:34:25 +0000 | [diff] [blame] | 613 | } // namespace |
| 614 | } // namespace tint |