blob: 855f95b015c77eedab0e07b362d586a984b652e9 [file] [log] [blame]
Ben Claytonfaca02d2021-02-10 21:34:25 +00001// 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 Claytonfaca02d2021-02-10 21:34:25 +000018#include "src/program_builder.h"
Ben Clayton2aa68552021-10-12 21:57:47 +000019#include "src/sem/atomic_type.h"
Ben Claytonfd35aa82021-07-26 22:19:48 +000020#include "src/sem/depth_multisampled_texture_type.h"
Antonio Maioranoaea9c682021-04-19 22:54:43 +000021#include "src/sem/depth_texture_type.h"
Brandon Jones145f8652021-04-22 22:47:03 +000022#include "src/sem/external_texture_type.h"
Antonio Maioranoaea9c682021-04-19 22:54:43 +000023#include "src/sem/multisampled_texture_type.h"
Ben Clayton9b54a2e2021-05-18 10:28:48 +000024#include "src/sem/reference_type.h"
Antonio Maioranoaea9c682021-04-19 22:54:43 +000025#include "src/sem/sampled_texture_type.h"
26#include "src/sem/storage_texture_type.h"
Ben Claytonfaca02d2021-02-10 21:34:25 +000027
28namespace tint {
29namespace {
30
31using ::testing::ElementsAre;
32using ::testing::HasSubstr;
33
Antonio Maiorano5cd71b82021-04-16 19:07:51 +000034using IntrinsicType = sem::IntrinsicType;
35using Parameter = sem::Parameter;
Ben Clayton1934f592021-06-01 10:00:10 +000036using ParameterUsage = sem::ParameterUsage;
Ben Claytonfaca02d2021-02-10 21:34:25 +000037
38class IntrinsicTableTest : public testing::Test, public ProgramBuilder {
39 public:
Ben Claytonb29a59d2021-06-01 19:06:31 +000040 std::unique_ptr<IntrinsicTable> table = IntrinsicTable::Create(*this);
Ben Claytonfaca02d2021-02-10 21:34:25 +000041};
42
43TEST_F(IntrinsicTableTest, MatchF32) {
Ben Clayton512d60c2021-05-19 19:51:22 +000044 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +000045 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 Clayton0f2d95d2021-07-22 13:24:59 +000050 ASSERT_THAT(result->Parameters().size(), 1);
51 EXPECT_EQ(result->Parameters()[0]->Type(), f32);
Ben Claytonfaca02d2021-02-10 21:34:25 +000052}
53
54TEST_F(IntrinsicTableTest, MismatchF32) {
Ben Claytoncf421bb2021-05-19 17:47:11 +000055 auto* i32 = create<sem::I32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +000056 auto* result = table->Lookup(IntrinsicType::kCos, {i32}, Source{});
57 ASSERT_EQ(result, nullptr);
58 ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
Ben Claytonfaca02d2021-02-10 21:34:25 +000059}
60
61TEST_F(IntrinsicTableTest, MatchU32) {
Ben Clayton512d60c2021-05-19 19:51:22 +000062 auto* f32 = create<sem::F32>();
Ben Clayton58dec172021-05-19 17:47:11 +000063 auto* u32 = create<sem::U32>();
Ben Clayton512d60c2021-05-19 19:51:22 +000064 auto* vec2_f32 = create<sem::Vector>(f32, 2);
Ben Claytonb29a59d2021-06-01 19:06:31 +000065 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 Clayton0f2d95d2021-07-22 13:24:59 +000071 ASSERT_EQ(result->Parameters().size(), 1u);
72 EXPECT_EQ(result->Parameters()[0]->Type(), u32);
Ben Claytonfaca02d2021-02-10 21:34:25 +000073}
74
75TEST_F(IntrinsicTableTest, MismatchU32) {
Ben Clayton512d60c2021-05-19 19:51:22 +000076 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +000077 auto* result =
78 table->Lookup(IntrinsicType::kUnpack2x16float, {f32}, Source{});
79 ASSERT_EQ(result, nullptr);
80 ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
Ben Claytonfaca02d2021-02-10 21:34:25 +000081}
82
83TEST_F(IntrinsicTableTest, MatchI32) {
Ben Clayton512d60c2021-05-19 19:51:22 +000084 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +000085 auto* i32 = create<sem::I32>();
Ben Clayton512d60c2021-05-19 19:51:22 +000086 auto* vec4_f32 = create<sem::Vector>(f32, 4);
Ben Clayton55ecfc42021-05-20 14:42:28 +000087 auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32);
Ben Claytonb29a59d2021-06-01 19:06:31 +000088 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 Clayton0f2d95d2021-07-22 13:24:59 +000094 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 Claytonfaca02d2021-02-10 21:34:25 +0000101}
102
103TEST_F(IntrinsicTableTest, MismatchI32) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000104 auto* f32 = create<sem::F32>();
Ben Clayton55ecfc42021-05-20 14:42:28 +0000105 auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000106 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 Claytonfaca02d2021-02-10 21:34:25 +0000110}
111
112TEST_F(IntrinsicTableTest, MatchIU32AsI32) {
Ben Claytoncf421bb2021-05-19 17:47:11 +0000113 auto* i32 = create<sem::I32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000114 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 Clayton0f2d95d2021-07-22 13:24:59 +0000119 ASSERT_EQ(result->Parameters().size(), 1u);
120 EXPECT_EQ(result->Parameters()[0]->Type(), i32);
Ben Claytonfaca02d2021-02-10 21:34:25 +0000121}
122
123TEST_F(IntrinsicTableTest, MatchIU32AsU32) {
Ben Clayton58dec172021-05-19 17:47:11 +0000124 auto* u32 = create<sem::U32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000125 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 Clayton0f2d95d2021-07-22 13:24:59 +0000130 ASSERT_EQ(result->Parameters().size(), 1u);
131 EXPECT_EQ(result->Parameters()[0]->Type(), u32);
Ben Claytonfaca02d2021-02-10 21:34:25 +0000132}
133
134TEST_F(IntrinsicTableTest, MismatchIU32) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000135 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000136 auto* result = table->Lookup(IntrinsicType::kCountOneBits, {f32}, Source{});
137 ASSERT_EQ(result, nullptr);
138 ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
Ben Claytonfaca02d2021-02-10 21:34:25 +0000139}
140
141TEST_F(IntrinsicTableTest, MatchFIU32AsI32) {
Ben Claytoncf421bb2021-05-19 17:47:11 +0000142 auto* i32 = create<sem::I32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000143 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 Clayton0f2d95d2021-07-22 13:24:59 +0000149 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 Claytonfaca02d2021-02-10 21:34:25 +0000153}
154
155TEST_F(IntrinsicTableTest, MatchFIU32AsU32) {
Ben Clayton58dec172021-05-19 17:47:11 +0000156 auto* u32 = create<sem::U32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000157 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 Clayton0f2d95d2021-07-22 13:24:59 +0000163 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 Claytonfaca02d2021-02-10 21:34:25 +0000167}
168
169TEST_F(IntrinsicTableTest, MatchFIU32AsF32) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000170 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000171 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 Clayton0f2d95d2021-07-22 13:24:59 +0000177 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 Claytonfaca02d2021-02-10 21:34:25 +0000181}
182
183TEST_F(IntrinsicTableTest, MismatchFIU32) {
Ben Claytonc03d3bd2021-05-20 14:22:28 +0000184 auto* bool_ = create<sem::Bool>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000185 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 Claytonfaca02d2021-02-10 21:34:25 +0000189}
190
191TEST_F(IntrinsicTableTest, MatchBool) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000192 auto* f32 = create<sem::F32>();
Ben Claytonc03d3bd2021-05-20 14:22:28 +0000193 auto* bool_ = create<sem::Bool>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000194 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 Clayton0f2d95d2021-07-22 13:24:59 +0000200 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 Claytonfaca02d2021-02-10 21:34:25 +0000204}
205
206TEST_F(IntrinsicTableTest, MismatchBool) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000207 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000208 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 Claytonfaca02d2021-02-10 21:34:25 +0000212}
213
214TEST_F(IntrinsicTableTest, MatchPointer) {
Ben Clayton2aa68552021-10-12 21:57:47 +0000215 auto* i32 = create<sem::I32>();
216 auto* atomicI32 = create<sem::Atomic>(i32);
217 auto* ptr = create<sem::Pointer>(atomicI32, ast::StorageClass::kWorkgroup,
Ben Clayton18588542021-06-04 22:17:37 +0000218 ast::Access::kReadWrite);
Ben Clayton2aa68552021-10-12 21:57:47 +0000219 auto* result = table->Lookup(IntrinsicType::kAtomicLoad, {ptr}, Source{});
Ben Claytonb29a59d2021-06-01 19:06:31 +0000220 ASSERT_NE(result, nullptr) << Diagnostics().str();
221 ASSERT_EQ(Diagnostics().str(), "");
Ben Clayton2aa68552021-10-12 21:57:47 +0000222 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 Claytonfaca02d2021-02-10 21:34:25 +0000226}
227
228TEST_F(IntrinsicTableTest, MismatchPointer) {
Ben Clayton2aa68552021-10-12 21:57:47 +0000229 auto* i32 = create<sem::I32>();
230 auto* atomicI32 = create<sem::Atomic>(i32);
231 auto* result =
232 table->Lookup(IntrinsicType::kAtomicLoad, {atomicI32}, Source{});
Ben Claytonb29a59d2021-06-01 19:06:31 +0000233 ASSERT_EQ(result, nullptr);
234 ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
Ben Claytonfaca02d2021-02-10 21:34:25 +0000235}
236
237TEST_F(IntrinsicTableTest, MatchArray) {
Antonio Maiorano68a6dd02021-07-20 18:28:31 +0000238 auto* arr = create<sem::Array>(create<sem::U32>(), 0, 4, 4, 4, 4);
Ben Clayton09493042021-06-18 22:44:31 +0000239 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 Claytonb29a59d2021-06-01 19:06:31 +0000243 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 Clayton0f2d95d2021-07-22 13:24:59 +0000248 auto* param_type = result->Parameters()[0]->Type();
Ben Clayton09493042021-06-18 22:44:31 +0000249 ASSERT_TRUE(param_type->Is<sem::Pointer>());
250 EXPECT_TRUE(param_type->As<sem::Pointer>()->StoreType()->Is<sem::Array>());
Ben Claytonfaca02d2021-02-10 21:34:25 +0000251}
252
253TEST_F(IntrinsicTableTest, MismatchArray) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000254 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000255 auto* result = table->Lookup(IntrinsicType::kArrayLength, {f32}, Source{});
256 ASSERT_EQ(result, nullptr);
257 ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
Ben Claytonfaca02d2021-02-10 21:34:25 +0000258}
259
260TEST_F(IntrinsicTableTest, MatchSampler) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000261 auto* f32 = create<sem::F32>();
262 auto* vec2_f32 = create<sem::Vector>(f32, 2);
263 auto* vec4_f32 = create<sem::Vector>(f32, 4);
Ben Clayton55ecfc42021-05-20 14:42:28 +0000264 auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
Ben Claytonb9662652021-05-20 14:54:28 +0000265 auto* sampler = create<sem::Sampler>(ast::SamplerKind::kSampler);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000266 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 Clayton0f2d95d2021-07-22 13:24:59 +0000272 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 Claytonfaca02d2021-02-10 21:34:25 +0000279}
280
281TEST_F(IntrinsicTableTest, MismatchSampler) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000282 auto* f32 = create<sem::F32>();
283 auto* vec2_f32 = create<sem::Vector>(f32, 2);
Ben Clayton55ecfc42021-05-20 14:42:28 +0000284 auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000285 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 Claytonfaca02d2021-02-10 21:34:25 +0000289}
290
291TEST_F(IntrinsicTableTest, MatchSampledTexture) {
Ben Claytoncf421bb2021-05-19 17:47:11 +0000292 auto* i32 = create<sem::I32>();
Ben Clayton512d60c2021-05-19 19:51:22 +0000293 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +0000294 auto* vec2_i32 = create<sem::Vector>(i32, 2);
Ben Clayton512d60c2021-05-19 19:51:22 +0000295 auto* vec4_f32 = create<sem::Vector>(f32, 4);
Ben Clayton55ecfc42021-05-20 14:42:28 +0000296 auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000297 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 Clayton0f2d95d2021-07-22 13:24:59 +0000303 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 Claytonfaca02d2021-02-10 21:34:25 +0000310}
311
312TEST_F(IntrinsicTableTest, MatchMultisampledTexture) {
Ben Claytoncf421bb2021-05-19 17:47:11 +0000313 auto* i32 = create<sem::I32>();
Ben Clayton512d60c2021-05-19 19:51:22 +0000314 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +0000315 auto* vec2_i32 = create<sem::Vector>(i32, 2);
Ben Clayton512d60c2021-05-19 19:51:22 +0000316 auto* vec4_f32 = create<sem::Vector>(f32, 4);
317 auto* tex = create<sem::MultisampledTexture>(ast::TextureDimension::k2d, f32);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000318 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 Clayton0f2d95d2021-07-22 13:24:59 +0000324 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 Claytonfaca02d2021-02-10 21:34:25 +0000331}
332
333TEST_F(IntrinsicTableTest, MatchDepthTexture) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000334 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +0000335 auto* i32 = create<sem::I32>();
336 auto* vec2_i32 = create<sem::Vector>(i32, 2);
Ben Clayton55ecfc42021-05-20 14:42:28 +0000337 auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000338 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 Clayton0f2d95d2021-07-22 13:24:59 +0000344 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 Claytonfaca02d2021-02-10 21:34:25 +0000351}
352
Ben Claytonfd35aa82021-07-26 22:19:48 +0000353TEST_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 Jones145f8652021-04-22 22:47:03 +0000373TEST_F(IntrinsicTableTest, MatchExternalTexture) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000374 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +0000375 auto* i32 = create<sem::I32>();
376 auto* vec2_i32 = create<sem::Vector>(i32, 2);
Ben Clayton512d60c2021-05-19 19:51:22 +0000377 auto* vec4_f32 = create<sem::Vector>(f32, 4);
Brandon Jones145f8652021-04-22 22:47:03 +0000378 auto* tex = create<sem::ExternalTexture>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000379 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 Clayton0f2d95d2021-07-22 13:24:59 +0000385 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 Jones145f8652021-04-22 22:47:03 +0000390}
391
Ben Claytonfaca02d2021-02-10 21:34:25 +0000392TEST_F(IntrinsicTableTest, MatchWOStorageTexture) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000393 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +0000394 auto* i32 = create<sem::I32>();
395 auto* vec2_i32 = create<sem::Vector>(i32, 2);
Ben Clayton512d60c2021-05-19 19:51:22 +0000396 auto* vec4_f32 = create<sem::Vector>(f32, 4);
Antonio Maioranodc4e6c12021-05-14 17:51:13 +0000397 auto* subtype =
Ben Claytonb29a59d2021-06-01 19:06:31 +0000398 sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
Ben Clayton646f4a92021-05-31 19:40:30 +0000399 auto* tex = create<sem::StorageTexture>(ast::TextureDimension::k2d,
Ben Claytonb29a59d2021-06-01 19:06:31 +0000400 ast::ImageFormat::kR32Float,
Ben Clayton93e8f522021-06-04 20:41:47 +0000401 ast::Access::kWrite, subtype);
Antonio Maioranodc4e6c12021-05-14 17:51:13 +0000402
Ben Claytonb29a59d2021-06-01 19:06:31 +0000403 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 Clayton0f2d95d2021-07-22 13:24:59 +0000409 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 Claytonfaca02d2021-02-10 21:34:25 +0000416}
417
418TEST_F(IntrinsicTableTest, MismatchTexture) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000419 auto* f32 = create<sem::F32>();
Ben Claytoncf421bb2021-05-19 17:47:11 +0000420 auto* i32 = create<sem::I32>();
421 auto* vec2_i32 = create<sem::Vector>(i32, 2);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000422 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 Claytonfaca02d2021-02-10 21:34:25 +0000426}
427
Ben Clayton9b54a2e2021-05-18 10:28:48 +0000428TEST_F(IntrinsicTableTest, ImplicitLoadOnReference) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000429 auto* f32 = create<sem::F32>();
Ben Clayton18588542021-06-04 22:17:37 +0000430 auto* result =
431 table->Lookup(IntrinsicType::kCos,
432 {create<sem::Reference>(f32, ast::StorageClass::kFunction,
433 ast::Access::kReadWrite)},
434 Source{});
Ben Claytonb29a59d2021-06-01 19:06:31 +0000435 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 Clayton0f2d95d2021-07-22 13:24:59 +0000439 ASSERT_EQ(result->Parameters().size(), 1u);
440 EXPECT_EQ(result->Parameters()[0]->Type(), f32);
Ben Claytonfaca02d2021-02-10 21:34:25 +0000441}
442
Ben Claytonfaca02d2021-02-10 21:34:25 +0000443TEST_F(IntrinsicTableTest, MatchOpenType) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000444 auto* f32 = create<sem::F32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000445 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 Clayton0f2d95d2021-07-22 13:24:59 +0000451 EXPECT_EQ(result->Parameters()[0]->Type(), f32);
452 EXPECT_EQ(result->Parameters()[1]->Type(), f32);
453 EXPECT_EQ(result->Parameters()[2]->Type(), f32);
Ben Claytonfaca02d2021-02-10 21:34:25 +0000454}
455
456TEST_F(IntrinsicTableTest, MismatchOpenType) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000457 auto* f32 = create<sem::F32>();
Ben Clayton58dec172021-05-19 17:47:11 +0000458 auto* u32 = create<sem::U32>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000459 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 Claytonfaca02d2021-02-10 21:34:25 +0000463}
464
465TEST_F(IntrinsicTableTest, MatchOpenSizeVector) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000466 auto* f32 = create<sem::F32>();
467 auto* vec2_f32 = create<sem::Vector>(f32, 2);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000468 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 Clayton0f2d95d2021-07-22 13:24:59 +0000474 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 Claytonfaca02d2021-02-10 21:34:25 +0000478}
479
480TEST_F(IntrinsicTableTest, MismatchOpenSizeVector) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000481 auto* f32 = create<sem::F32>();
Ben Clayton58dec172021-05-19 17:47:11 +0000482 auto* u32 = create<sem::U32>();
Ben Clayton512d60c2021-05-19 19:51:22 +0000483 auto* vec2_f32 = create<sem::Vector>(f32, 2);
Ben Claytonb29a59d2021-06-01 19:06:31 +0000484 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 Claytonfaca02d2021-02-10 21:34:25 +0000488}
489
490TEST_F(IntrinsicTableTest, MatchOpenSizeMatrix) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000491 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 Claytonb29a59d2021-06-01 19:06:31 +0000494 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 Clayton0f2d95d2021-07-22 13:24:59 +0000500 ASSERT_EQ(result->Parameters().size(), 1u);
501 EXPECT_EQ(result->Parameters()[0]->Type(), mat3_f32);
Ben Claytonfaca02d2021-02-10 21:34:25 +0000502}
503
504TEST_F(IntrinsicTableTest, MismatchOpenSizeMatrix) {
Ben Clayton512d60c2021-05-19 19:51:22 +0000505 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 Claytonb29a59d2021-06-01 19:06:31 +0000508 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 Claytonfaca02d2021-02-10 21:34:25 +0000512}
513
514TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) {
515 // None of the arguments match, so expect the overloads with 2 parameters to
516 // come first
Ben Claytonc03d3bd2021-05-20 14:22:28 +0000517 auto* bool_ = create<sem::Bool>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000518 table->Lookup(IntrinsicType::kTextureDimensions, {bool_, bool_}, Source{});
519 ASSERT_EQ(Diagnostics().str(),
Ben Clayton6b4924f2021-02-17 20:13:34 +0000520 R"(error: no matching call to textureDimensions(bool, bool)
Ben Claytonfaca02d2021-02-10 21:34:25 +0000521
Ben Claytonfd35aa82021-07-26 22:19:48 +000052227 candidate functions:
Ben Clayton9e0b3cc2021-07-15 16:14:34 +0000523 textureDimensions(texture: texture_1d<T>, level: i32) -> i32 where: T is f32, i32 or u32
Ben Clayton57d6bd22021-06-03 08:32:44 +0000524 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 Claytonb96ed7b2021-06-21 16:44:26 +0000527 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 Claytonb29a59d2021-06-01 19:06:31 +0000529 textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
530 textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
Ben Claytonb96ed7b2021-06-21 16:44:26 +0000531 textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
532 textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
Ben Clayton57d6bd22021-06-03 08:32:44 +0000533 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 Claytonb96ed7b2021-06-21 16:44:26 +0000537 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 Clayton57d6bd22021-06-03 08:32:44 +0000539 textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
Ben Claytonb29a59d2021-06-01 19:06:31 +0000540 textureDimensions(texture: texture_depth_2d) -> vec2<i32>
541 textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
Ben Claytonb96ed7b2021-06-21 16:44:26 +0000542 textureDimensions(texture: texture_depth_cube) -> vec2<i32>
543 textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
Ben Claytonfd35aa82021-07-26 22:19:48 +0000544 textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
Ben Claytonf3f2d0a2021-10-14 10:10:45 +0000545 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 Claytonb29a59d2021-06-01 19:06:31 +0000549 textureDimensions(texture: texture_external) -> vec2<i32>
Ben Claytonfaca02d2021-02-10 21:34:25 +0000550)");
551}
552
553TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
Ben Clayton55ecfc42021-05-20 14:42:28 +0000554 auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
Ben Claytonc03d3bd2021-05-20 14:22:28 +0000555 auto* bool_ = create<sem::Bool>();
Ben Claytonb29a59d2021-06-01 19:06:31 +0000556 table->Lookup(IntrinsicType::kTextureDimensions, {tex, bool_}, Source{});
Ben Clayton6b4924f2021-02-17 20:13:34 +0000557 ASSERT_EQ(
Ben Claytonb29a59d2021-06-01 19:06:31 +0000558 Diagnostics().str(),
Ben Clayton6b4924f2021-02-17 20:13:34 +0000559 R"(error: no matching call to textureDimensions(texture_depth_2d, bool)
Ben Claytonfaca02d2021-02-10 21:34:25 +0000560
Ben Claytonfd35aa82021-07-26 22:19:48 +000056127 candidate functions:
Ben Claytonb29a59d2021-06-01 19:06:31 +0000562 textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
563 textureDimensions(texture: texture_depth_2d) -> vec2<i32>
Ben Clayton9e0b3cc2021-07-15 16:14:34 +0000564 textureDimensions(texture: texture_1d<T>, level: i32) -> i32 where: T is f32, i32 or u32
Ben Clayton57d6bd22021-06-03 08:32:44 +0000565 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 Claytonb96ed7b2021-06-21 16:44:26 +0000568 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 Claytonb29a59d2021-06-01 19:06:31 +0000570 textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
Ben Claytonb96ed7b2021-06-21 16:44:26 +0000571 textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
572 textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
Ben Clayton57d6bd22021-06-03 08:32:44 +0000573 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 Claytonb96ed7b2021-06-21 16:44:26 +0000577 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 Clayton57d6bd22021-06-03 08:32:44 +0000579 textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
Ben Claytonb29a59d2021-06-01 19:06:31 +0000580 textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
Ben Claytonb96ed7b2021-06-21 16:44:26 +0000581 textureDimensions(texture: texture_depth_cube) -> vec2<i32>
582 textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
Ben Claytonfd35aa82021-07-26 22:19:48 +0000583 textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
Ben Claytonf3f2d0a2021-10-14 10:10:45 +0000584 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 Claytonb29a59d2021-06-01 19:06:31 +0000588 textureDimensions(texture: texture_external) -> vec2<i32>
Ben Claytonfaca02d2021-02-10 21:34:25 +0000589)");
590}
591
Ben Claytonb478f972021-07-15 20:34:21 +0000592TEST_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 Claytonfaca02d2021-02-10 21:34:25 +0000613} // namespace
614} // namespace tint