2021-02-10 21:34:25 +00:00
|
|
|
// Copyright 2021 The Tint Authors.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
#include "src/intrinsic_table.h"
|
|
|
|
|
|
|
|
#include "gmock/gmock.h"
|
|
|
|
#include "src/program_builder.h"
|
2021-04-19 22:54:43 +00:00
|
|
|
#include "src/sem/depth_texture_type.h"
|
2021-04-22 22:47:03 +00:00
|
|
|
#include "src/sem/external_texture_type.h"
|
2021-04-19 22:54:43 +00:00
|
|
|
#include "src/sem/multisampled_texture_type.h"
|
2021-05-18 10:28:48 +00:00
|
|
|
#include "src/sem/reference_type.h"
|
2021-04-19 22:54:43 +00:00
|
|
|
#include "src/sem/sampled_texture_type.h"
|
|
|
|
#include "src/sem/storage_texture_type.h"
|
2021-02-10 21:34:25 +00:00
|
|
|
|
|
|
|
namespace tint {
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
using ::testing::ElementsAre;
|
|
|
|
using ::testing::HasSubstr;
|
|
|
|
|
2021-04-16 19:07:51 +00:00
|
|
|
using IntrinsicType = sem::IntrinsicType;
|
|
|
|
using Parameter = sem::Parameter;
|
2021-06-01 10:00:10 +00:00
|
|
|
using ParameterUsage = sem::ParameterUsage;
|
2021-02-10 21:34:25 +00:00
|
|
|
|
|
|
|
class IntrinsicTableTest : public testing::Test, public ProgramBuilder {
|
|
|
|
public:
|
2021-06-01 19:06:31 +00:00
|
|
|
std::unique_ptr<IntrinsicTable> table = IntrinsicTable::Create(*this);
|
2021-02-10 21:34:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchF32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kCos, {f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kCos);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(), ElementsAre(Parameter{f32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchF32) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kCos, {i32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchU32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* u32 = create<sem::U32>();
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec2_f32 = create<sem::Vector>(f32, 2);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kUnpack2x16float, {u32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kUnpack2x16float);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec2_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(), ElementsAre(Parameter{u32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchU32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kUnpack2x16float, {f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchI32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kTextureLoad, {tex, i32, i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec4_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{i32, ParameterUsage::kCoords},
|
|
|
|
Parameter{i32, ParameterUsage::kLevel}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchI32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, f32);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kTextureLoad, {tex, f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchIU32AsI32) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kCountOneBits, {i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kCountOneBits);
|
|
|
|
EXPECT_THAT(result->ReturnType(), i32);
|
|
|
|
EXPECT_THAT(result->Parameters(), ElementsAre(Parameter{i32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchIU32AsU32) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* u32 = create<sem::U32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kCountOneBits, {u32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kCountOneBits);
|
|
|
|
EXPECT_THAT(result->ReturnType(), u32);
|
|
|
|
EXPECT_THAT(result->Parameters(), ElementsAre(Parameter{u32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchIU32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kCountOneBits, {f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchFIU32AsI32) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {i32, i32, i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kClamp);
|
|
|
|
EXPECT_THAT(result->ReturnType(), i32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-19 17:47:11 +00:00
|
|
|
ElementsAre(Parameter{i32}, Parameter{i32}, Parameter{i32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchFIU32AsU32) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* u32 = create<sem::U32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {u32, u32, u32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kClamp);
|
|
|
|
EXPECT_THAT(result->ReturnType(), u32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-19 17:47:11 +00:00
|
|
|
ElementsAre(Parameter{u32}, Parameter{u32}, Parameter{u32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchFIU32AsF32) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {f32, f32, f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kClamp);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-19 19:51:22 +00:00
|
|
|
ElementsAre(Parameter{f32}, Parameter{f32}, Parameter{f32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchFIU32) {
|
2021-05-20 14:22:28 +00:00
|
|
|
auto* bool_ = create<sem::Bool>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {bool_, bool_, bool_}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchBool) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-20 14:22:28 +00:00
|
|
|
auto* bool_ = create<sem::Bool>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kSelect, {f32, f32, bool_}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kSelect);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-20 14:22:28 +00:00
|
|
|
ElementsAre(Parameter{f32}, Parameter{f32}, Parameter{bool_}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchBool) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kSelect, {f32, f32, f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchPointer) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-04 22:17:37 +00:00
|
|
|
auto* ptr = create<sem::Pointer>(f32, ast::StorageClass::kFunction,
|
|
|
|
ast::Access::kReadWrite);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kModf, {f32, ptr}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kModf);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-19 19:51:22 +00:00
|
|
|
ElementsAre(Parameter{f32}, Parameter{ptr}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchPointer) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kModf, {f32, f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchArray) {
|
2021-07-20 18:28:31 +00:00
|
|
|
auto* arr = create<sem::Array>(create<sem::U32>(), 0, 4, 4, 4, 4);
|
2021-06-18 22:44:31 +00:00
|
|
|
auto* arr_ptr = create<sem::Pointer>(arr, ast::StorageClass::kStorage,
|
|
|
|
ast::Access::kReadWrite);
|
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kArrayLength, {arr_ptr}, Source{});
|
2021-06-01 19:06:31 +00:00
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kArrayLength);
|
|
|
|
EXPECT_TRUE(result->ReturnType()->Is<sem::U32>());
|
|
|
|
ASSERT_EQ(result->Parameters().size(), 1u);
|
2021-06-18 22:44:31 +00:00
|
|
|
auto* param_type = result->Parameters()[0].type;
|
|
|
|
ASSERT_TRUE(param_type->Is<sem::Pointer>());
|
|
|
|
EXPECT_TRUE(param_type->As<sem::Pointer>()->StoreType()->Is<sem::Array>());
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchArray) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kArrayLength, {f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchSampler) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
|
|
|
auto* vec2_f32 = create<sem::Vector>(f32, 2);
|
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
|
2021-05-20 14:54:28 +00:00
|
|
|
auto* sampler = create<sem::Sampler>(ast::SamplerKind::kSampler);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kTextureSample,
|
|
|
|
{tex, sampler, vec2_f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureSample);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec4_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{sampler, ParameterUsage::kSampler},
|
|
|
|
Parameter{vec2_f32, ParameterUsage::kCoords}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchSampler) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
|
|
|
auto* vec2_f32 = create<sem::Vector>(f32, 2);
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kTextureSample,
|
|
|
|
{tex, f32, vec2_f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchSampledTexture) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, f32);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kTextureLoad,
|
|
|
|
{tex, vec2_i32, i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec4_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{vec2_i32, ParameterUsage::kCoords},
|
|
|
|
Parameter{i32, ParameterUsage::kLevel}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchMultisampledTexture) {
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
|
|
|
auto* tex = create<sem::MultisampledTexture>(ast::TextureDimension::k2d, f32);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kTextureLoad,
|
|
|
|
{tex, vec2_i32, i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec4_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{vec2_i32, ParameterUsage::kCoords},
|
|
|
|
Parameter{i32, ParameterUsage::kSampleIndex}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchDepthTexture) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kTextureLoad,
|
|
|
|
{tex, vec2_i32, i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{vec2_i32, ParameterUsage::kCoords},
|
|
|
|
Parameter{i32, ParameterUsage::kLevel}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
2021-04-22 22:47:03 +00:00
|
|
|
TEST_F(IntrinsicTableTest, MatchExternalTexture) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
2021-04-22 22:47:03 +00:00
|
|
|
auto* tex = create<sem::ExternalTexture>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kTextureLoad, {tex, vec2_i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec4_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{vec2_i32, ParameterUsage::kCoords}));
|
2021-04-22 22:47:03 +00:00
|
|
|
}
|
|
|
|
|
2021-02-10 21:34:25 +00:00
|
|
|
TEST_F(IntrinsicTableTest, MatchROStorageTexture) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
2021-05-14 17:51:13 +00:00
|
|
|
auto* subtype =
|
2021-06-01 19:06:31 +00:00
|
|
|
sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
|
2021-05-31 19:40:30 +00:00
|
|
|
auto* tex = create<sem::StorageTexture>(ast::TextureDimension::k2d,
|
2021-06-01 19:06:31 +00:00
|
|
|
ast::ImageFormat::kR32Float,
|
2021-06-04 20:41:47 +00:00
|
|
|
ast::Access::kRead, subtype);
|
2021-05-14 17:51:13 +00:00
|
|
|
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kTextureLoad, {tex, vec2_i32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureLoad);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec4_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{vec2_i32, ParameterUsage::kCoords}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchWOStorageTexture) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec4_f32 = create<sem::Vector>(f32, 4);
|
2021-05-14 17:51:13 +00:00
|
|
|
auto* subtype =
|
2021-06-01 19:06:31 +00:00
|
|
|
sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
|
2021-05-31 19:40:30 +00:00
|
|
|
auto* tex = create<sem::StorageTexture>(ast::TextureDimension::k2d,
|
2021-06-01 19:06:31 +00:00
|
|
|
ast::ImageFormat::kR32Float,
|
2021-06-04 20:41:47 +00:00
|
|
|
ast::Access::kWrite, subtype);
|
2021-05-14 17:51:13 +00:00
|
|
|
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kTextureStore,
|
|
|
|
{tex, vec2_i32, vec4_f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kTextureStore);
|
|
|
|
EXPECT_TRUE(result->ReturnType()->Is<sem::Void>());
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-06-01 10:00:10 +00:00
|
|
|
ElementsAre(Parameter{tex, ParameterUsage::kTexture},
|
|
|
|
Parameter{vec2_i32, ParameterUsage::kCoords},
|
|
|
|
Parameter{vec4_f32, ParameterUsage::kValue}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchTexture) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* i32 = create<sem::I32>();
|
|
|
|
auto* vec2_i32 = create<sem::Vector>(i32, 2);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kTextureLoad, {f32, vec2_i32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
2021-05-18 10:28:48 +00:00
|
|
|
TEST_F(IntrinsicTableTest, ImplicitLoadOnReference) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-04 22:17:37 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kCos,
|
|
|
|
{create<sem::Reference>(f32, ast::StorageClass::kFunction,
|
|
|
|
ast::Access::kReadWrite)},
|
|
|
|
Source{});
|
2021-06-01 19:06:31 +00:00
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kCos);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(), ElementsAre(Parameter{f32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchOpenType) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {f32, f32, f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kClamp);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-19 19:51:22 +00:00
|
|
|
ElementsAre(Parameter{f32}, Parameter{f32}, Parameter{f32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchOpenType) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* u32 = create<sem::U32>();
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {f32, u32, f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchOpenSizeVector) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
|
|
|
auto* vec2_f32 = create<sem::Vector>(f32, 2);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result = table->Lookup(IntrinsicType::kClamp,
|
|
|
|
{vec2_f32, vec2_f32, vec2_f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kClamp);
|
|
|
|
EXPECT_THAT(result->ReturnType(), vec2_f32);
|
|
|
|
EXPECT_THAT(result->Parameters(),
|
2021-05-19 19:51:22 +00:00
|
|
|
ElementsAre(Parameter{vec2_f32}, Parameter{vec2_f32},
|
|
|
|
Parameter{vec2_f32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchOpenSizeVector) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
2021-05-19 17:47:11 +00:00
|
|
|
auto* u32 = create<sem::U32>();
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* vec2_f32 = create<sem::Vector>(f32, 2);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kClamp, {vec2_f32, u32, vec2_f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MatchOpenSizeMatrix) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
|
|
|
auto* vec3_f32 = create<sem::Vector>(f32, 3);
|
|
|
|
auto* mat3_f32 = create<sem::Matrix>(vec3_f32, 3);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kDeterminant, {mat3_f32}, Source{});
|
|
|
|
ASSERT_NE(result, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
EXPECT_THAT(result->Type(), IntrinsicType::kDeterminant);
|
|
|
|
EXPECT_THAT(result->ReturnType(), f32);
|
|
|
|
EXPECT_THAT(result->Parameters(), ElementsAre(Parameter{mat3_f32}));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, MismatchOpenSizeMatrix) {
|
2021-05-19 19:51:22 +00:00
|
|
|
auto* f32 = create<sem::F32>();
|
|
|
|
auto* vec2_f32 = create<sem::Vector>(f32, 2);
|
|
|
|
auto* mat3x2_f32 = create<sem::Matrix>(vec2_f32, 3);
|
2021-06-01 19:06:31 +00:00
|
|
|
auto* result =
|
|
|
|
table->Lookup(IntrinsicType::kDeterminant, {mat3x2_f32}, Source{});
|
|
|
|
ASSERT_EQ(result, nullptr);
|
|
|
|
ASSERT_THAT(Diagnostics().str(), HasSubstr("no matching call"));
|
2021-02-10 21:34:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) {
|
|
|
|
// None of the arguments match, so expect the overloads with 2 parameters to
|
|
|
|
// come first
|
2021-05-20 14:22:28 +00:00
|
|
|
auto* bool_ = create<sem::Bool>();
|
2021-06-01 19:06:31 +00:00
|
|
|
table->Lookup(IntrinsicType::kTextureDimensions, {bool_, bool_}, Source{});
|
|
|
|
ASSERT_EQ(Diagnostics().str(),
|
2021-02-17 20:13:34 +00:00
|
|
|
R"(error: no matching call to textureDimensions(bool, bool)
|
2021-02-10 21:34:25 +00:00
|
|
|
|
2021-07-15 16:14:34 +00:00
|
|
|
26 candidate functions:
|
|
|
|
textureDimensions(texture: texture_1d<T>, level: i32) -> i32 where: T is f32, i32 or u32
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_cube<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_1d<T>) -> i32 where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_2d_array<T>) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_3d<T>) -> vec3<i32> where: T is f32, i32 or u32
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_cube<T>) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_cube_array<T>) -> vec2<i32> where: T is f32, i32 or u32
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_depth_2d) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_depth_cube) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_storage_1d<F, A>) -> i32 where: A is read or write
|
|
|
|
textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32> where: A is read or write
|
|
|
|
textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32> where: A is read or write
|
|
|
|
textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32> where: A is read or write
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_external) -> vec2<i32>
|
2021-02-10 21:34:25 +00:00
|
|
|
)");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
|
2021-05-20 14:42:28 +00:00
|
|
|
auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
|
2021-05-20 14:22:28 +00:00
|
|
|
auto* bool_ = create<sem::Bool>();
|
2021-06-01 19:06:31 +00:00
|
|
|
table->Lookup(IntrinsicType::kTextureDimensions, {tex, bool_}, Source{});
|
2021-02-17 20:13:34 +00:00
|
|
|
ASSERT_EQ(
|
2021-06-01 19:06:31 +00:00
|
|
|
Diagnostics().str(),
|
2021-02-17 20:13:34 +00:00
|
|
|
R"(error: no matching call to textureDimensions(texture_depth_2d, bool)
|
2021-02-10 21:34:25 +00:00
|
|
|
|
2021-07-15 16:14:34 +00:00
|
|
|
26 candidate functions:
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_2d) -> vec2<i32>
|
2021-07-15 16:14:34 +00:00
|
|
|
textureDimensions(texture: texture_1d<T>, level: i32) -> i32 where: T is f32, i32 or u32
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_cube<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_1d<T>) -> i32 where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_2d_array<T>) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_3d<T>) -> vec3<i32> where: T is f32, i32 or u32
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_cube<T>) -> vec2<i32> where: T is f32, i32 or u32
|
|
|
|
textureDimensions(texture: texture_cube_array<T>) -> vec2<i32> where: T is f32, i32 or u32
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
|
2021-06-21 16:44:26 +00:00
|
|
|
textureDimensions(texture: texture_depth_cube) -> vec2<i32>
|
|
|
|
textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
|
2021-06-03 08:32:44 +00:00
|
|
|
textureDimensions(texture: texture_storage_1d<F, A>) -> i32 where: A is read or write
|
|
|
|
textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32> where: A is read or write
|
|
|
|
textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32> where: A is read or write
|
|
|
|
textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32> where: A is read or write
|
2021-06-01 19:06:31 +00:00
|
|
|
textureDimensions(texture: texture_external) -> vec2<i32>
|
2021-02-10 21:34:25 +00:00
|
|
|
)");
|
|
|
|
}
|
|
|
|
|
2021-07-15 20:34:21 +00:00
|
|
|
TEST_F(IntrinsicTableTest, SameOverloadReturnsSameIntrinsicPointer) {
|
|
|
|
auto* f32 = create<sem::F32>();
|
|
|
|
auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2);
|
|
|
|
auto* bool_ = create<sem::Bool>();
|
|
|
|
auto* a = table->Lookup(IntrinsicType::kSelect, {f32, f32, bool_}, Source{});
|
|
|
|
ASSERT_NE(a, nullptr) << Diagnostics().str();
|
|
|
|
|
|
|
|
auto* b = table->Lookup(IntrinsicType::kSelect, {f32, f32, bool_}, Source{});
|
|
|
|
ASSERT_NE(b, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
|
|
|
|
auto* c = table->Lookup(IntrinsicType::kSelect, {vec2_f32, vec2_f32, bool_},
|
|
|
|
Source{});
|
|
|
|
ASSERT_NE(c, nullptr) << Diagnostics().str();
|
|
|
|
ASSERT_EQ(Diagnostics().str(), "");
|
|
|
|
|
|
|
|
EXPECT_EQ(a, b);
|
|
|
|
EXPECT_NE(a, c);
|
|
|
|
EXPECT_NE(b, c);
|
|
|
|
}
|
|
|
|
|
2021-02-10 21:34:25 +00:00
|
|
|
} // namespace
|
|
|
|
} // namespace tint
|