[ir] Add scalar type helpers to type::Manager
Creating scalar types is extremely common when using builders. Bug: tint:1718 Change-Id: I2c2f0f521af1384bd8dee344ddfa525583535911 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/132284 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: James Price <jrprice@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
028726497a
commit
23c0451377
|
@ -27,7 +27,7 @@ TEST_F(IR_InstructionTest, CreateAnd) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.And(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.And(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kAnd);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kAnd);
|
||||||
|
@ -48,7 +48,7 @@ TEST_F(IR_InstructionTest, CreateOr) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Or(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Or(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kOr);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kOr);
|
||||||
|
@ -68,7 +68,7 @@ TEST_F(IR_InstructionTest, CreateXor) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Xor(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Xor(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kXor);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kXor);
|
||||||
|
@ -88,7 +88,7 @@ TEST_F(IR_InstructionTest, CreateEqual) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Equal(b.ir.types.Get<type::Bool>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Equal(b.ir.types.bool_(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kEqual);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kEqual);
|
||||||
|
@ -108,7 +108,7 @@ TEST_F(IR_InstructionTest, CreateNotEqual) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.NotEqual(b.ir.types.Get<type::Bool>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.NotEqual(b.ir.types.bool_(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kNotEqual);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kNotEqual);
|
||||||
|
@ -128,7 +128,7 @@ TEST_F(IR_InstructionTest, CreateLessThan) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.LessThan(b.ir.types.Get<type::Bool>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.LessThan(b.ir.types.bool_(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kLessThan);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kLessThan);
|
||||||
|
@ -148,8 +148,7 @@ TEST_F(IR_InstructionTest, CreateGreaterThan) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst =
|
const auto* inst = b.GreaterThan(b.ir.types.bool_(), b.Constant(4_i), b.Constant(2_i));
|
||||||
b.GreaterThan(b.ir.types.Get<type::Bool>(), b.Constant(4_i), b.Constant(2_i));
|
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kGreaterThan);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kGreaterThan);
|
||||||
|
@ -169,8 +168,7 @@ TEST_F(IR_InstructionTest, CreateLessThanEqual) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst =
|
const auto* inst = b.LessThanEqual(b.ir.types.bool_(), b.Constant(4_i), b.Constant(2_i));
|
||||||
b.LessThanEqual(b.ir.types.Get<type::Bool>(), b.Constant(4_i), b.Constant(2_i));
|
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kLessThanEqual);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kLessThanEqual);
|
||||||
|
@ -190,8 +188,7 @@ TEST_F(IR_InstructionTest, CreateGreaterThanEqual) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst =
|
const auto* inst = b.GreaterThanEqual(b.ir.types.bool_(), b.Constant(4_i), b.Constant(2_i));
|
||||||
b.GreaterThanEqual(b.ir.types.Get<type::Bool>(), b.Constant(4_i), b.Constant(2_i));
|
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kGreaterThanEqual);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kGreaterThanEqual);
|
||||||
|
@ -210,7 +207,7 @@ TEST_F(IR_InstructionTest, CreateGreaterThanEqual) {
|
||||||
TEST_F(IR_InstructionTest, CreateNot) {
|
TEST_F(IR_InstructionTest, CreateNot) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
const auto* inst = b.Not(b.ir.types.Get<type::Bool>(), b.Constant(true));
|
const auto* inst = b.Not(b.ir.types.bool_(), b.Constant(true));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kEqual);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kEqual);
|
||||||
|
@ -230,7 +227,7 @@ TEST_F(IR_InstructionTest, CreateShiftLeft) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.ShiftLeft(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.ShiftLeft(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kShiftLeft);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kShiftLeft);
|
||||||
|
@ -250,7 +247,7 @@ TEST_F(IR_InstructionTest, CreateShiftRight) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.ShiftRight(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.ShiftRight(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kShiftRight);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kShiftRight);
|
||||||
|
@ -270,7 +267,7 @@ TEST_F(IR_InstructionTest, CreateAdd) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Add(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Add(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kAdd);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kAdd);
|
||||||
|
@ -290,7 +287,7 @@ TEST_F(IR_InstructionTest, CreateSubtract) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Subtract(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Subtract(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kSubtract);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kSubtract);
|
||||||
|
@ -310,7 +307,7 @@ TEST_F(IR_InstructionTest, CreateMultiply) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Multiply(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Multiply(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kMultiply);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kMultiply);
|
||||||
|
@ -330,7 +327,7 @@ TEST_F(IR_InstructionTest, CreateDivide) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Divide(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Divide(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kDivide);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kDivide);
|
||||||
|
@ -350,7 +347,7 @@ TEST_F(IR_InstructionTest, CreateModulo) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
const auto* inst = b.Modulo(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.Modulo(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Binary>());
|
ASSERT_TRUE(inst->Is<Binary>());
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kModulo);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kModulo);
|
||||||
|
@ -369,7 +366,7 @@ TEST_F(IR_InstructionTest, CreateModulo) {
|
||||||
TEST_F(IR_InstructionTest, Binary_Usage) {
|
TEST_F(IR_InstructionTest, Binary_Usage) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
const auto* inst = b.And(b.ir.types.Get<type::I32>(), b.Constant(4_i), b.Constant(2_i));
|
const auto* inst = b.And(b.ir.types.i32(), b.Constant(4_i), b.Constant(2_i));
|
||||||
|
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kAnd);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kAnd);
|
||||||
|
|
||||||
|
@ -386,7 +383,7 @@ TEST_F(IR_InstructionTest, Binary_Usage_DuplicateValue) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
auto val = b.Constant(4_i);
|
auto val = b.Constant(4_i);
|
||||||
const auto* inst = b.And(b.ir.types.Get<type::I32>(), val, val);
|
const auto* inst = b.And(b.ir.types.i32(), val, val);
|
||||||
|
|
||||||
EXPECT_EQ(inst->Kind(), Binary::Kind::kAnd);
|
EXPECT_EQ(inst->Kind(), Binary::Kind::kAnd);
|
||||||
ASSERT_EQ(inst->LHS(), inst->RHS());
|
ASSERT_EQ(inst->LHS(), inst->RHS());
|
||||||
|
|
|
@ -27,7 +27,7 @@ using IR_InstructionTest = TestHelper;
|
||||||
TEST_F(IR_InstructionTest, Bitcast) {
|
TEST_F(IR_InstructionTest, Bitcast) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
const auto* inst = b.Bitcast(b.ir.types.Get<type::I32>(), b.Constant(4_i));
|
const auto* inst = b.Bitcast(b.ir.types.i32(), b.Constant(4_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<ir::Bitcast>());
|
ASSERT_TRUE(inst->Is<ir::Bitcast>());
|
||||||
ASSERT_NE(inst->Type(), nullptr);
|
ASSERT_NE(inst->Type(), nullptr);
|
||||||
|
@ -43,7 +43,7 @@ TEST_F(IR_InstructionTest, Bitcast) {
|
||||||
TEST_F(IR_InstructionTest, Bitcast_Usage) {
|
TEST_F(IR_InstructionTest, Bitcast_Usage) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
const auto* inst = b.Bitcast(b.ir.types.Get<type::I32>(), b.Constant(4_i));
|
const auto* inst = b.Bitcast(b.ir.types.i32(), b.Constant(4_i));
|
||||||
|
|
||||||
const auto args = inst->Args();
|
const auto args = inst->Args();
|
||||||
ASSERT_EQ(args.Length(), 1u);
|
ASSERT_EQ(args.Length(), 1u);
|
||||||
|
|
|
@ -46,14 +46,14 @@ FunctionTerminator* Builder::CreateFunctionTerminator() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Function* Builder::CreateFunction(std::string_view name,
|
Function* Builder::CreateFunction(std::string_view name,
|
||||||
type::Type* return_type,
|
const type::Type* return_type,
|
||||||
Function::PipelineStage stage,
|
Function::PipelineStage stage,
|
||||||
std::optional<std::array<uint32_t, 3>> wg_size) {
|
std::optional<std::array<uint32_t, 3>> wg_size) {
|
||||||
return CreateFunction(ir.symbols.Register(name), return_type, stage, wg_size);
|
return CreateFunction(ir.symbols.Register(name), return_type, stage, wg_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
Function* Builder::CreateFunction(Symbol name,
|
Function* Builder::CreateFunction(Symbol name,
|
||||||
type::Type* return_type,
|
const type::Type* return_type,
|
||||||
Function::PipelineStage stage,
|
Function::PipelineStage stage,
|
||||||
std::optional<std::array<uint32_t, 3>> wg_size) {
|
std::optional<std::array<uint32_t, 3>> wg_size) {
|
||||||
TINT_ASSERT(IR, return_type);
|
TINT_ASSERT(IR, return_type);
|
||||||
|
|
|
@ -76,7 +76,7 @@ class Builder {
|
||||||
/// @param wg_size the workgroup_size
|
/// @param wg_size the workgroup_size
|
||||||
/// @returns the flow node
|
/// @returns the flow node
|
||||||
Function* CreateFunction(std::string_view name,
|
Function* CreateFunction(std::string_view name,
|
||||||
type::Type* return_type,
|
const type::Type* return_type,
|
||||||
Function::PipelineStage stage = Function::PipelineStage::kUndefined,
|
Function::PipelineStage stage = Function::PipelineStage::kUndefined,
|
||||||
std::optional<std::array<uint32_t, 3>> wg_size = {});
|
std::optional<std::array<uint32_t, 3>> wg_size = {});
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ class Builder {
|
||||||
/// @param wg_size the workgroup_size
|
/// @param wg_size the workgroup_size
|
||||||
/// @returns the flow node
|
/// @returns the flow node
|
||||||
Function* CreateFunction(Symbol name,
|
Function* CreateFunction(Symbol name,
|
||||||
type::Type* return_type,
|
const type::Type* return_type,
|
||||||
Function::PipelineStage stage = Function::PipelineStage::kUndefined,
|
Function::PipelineStage stage = Function::PipelineStage::kUndefined,
|
||||||
std::optional<std::array<uint32_t, 3>> wg_size = {});
|
std::optional<std::array<uint32_t, 3>> wg_size = {});
|
||||||
|
|
||||||
|
@ -124,35 +124,35 @@ class Builder {
|
||||||
/// @returns the constant value
|
/// @returns the constant value
|
||||||
const constant::Value* Bool(bool v) {
|
const constant::Value* Bool(bool v) {
|
||||||
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
||||||
return Constant(create<constant::Scalar<bool>>(ir.types.Get<type::Bool>(), v))->Value();
|
return Constant(create<constant::Scalar<bool>>(ir.types.bool_(), v))->Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the constant value
|
/// @returns the constant value
|
||||||
const constant::Value* U32(uint32_t v) {
|
const constant::Value* U32(uint32_t v) {
|
||||||
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
||||||
return Constant(create<constant::Scalar<u32>>(ir.types.Get<type::U32>(), u32(v)))->Value();
|
return Constant(create<constant::Scalar<u32>>(ir.types.u32(), u32(v)))->Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the constant value
|
/// @returns the constant value
|
||||||
const constant::Value* I32(int32_t v) {
|
const constant::Value* I32(int32_t v) {
|
||||||
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
||||||
return Constant(create<constant::Scalar<i32>>(ir.types.Get<type::I32>(), i32(v)))->Value();
|
return Constant(create<constant::Scalar<i32>>(ir.types.i32(), i32(v)))->Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the constant value
|
/// @returns the constant value
|
||||||
const constant::Value* F16(float v) {
|
const constant::Value* F16(float v) {
|
||||||
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
||||||
return Constant(create<constant::Scalar<f16>>(ir.types.Get<type::F16>(), f16(v)))->Value();
|
return Constant(create<constant::Scalar<f16>>(ir.types.f16(), f16(v)))->Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the constant value
|
/// @returns the constant value
|
||||||
const constant::Value* F32(float v) {
|
const constant::Value* F32(float v) {
|
||||||
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
// TODO(dsinclair): Replace when constant::Value is uniqed by the arena.
|
||||||
return Constant(create<constant::Scalar<f32>>(ir.types.Get<type::F32>(), f32(v)))->Value();
|
return Constant(create<constant::Scalar<f32>>(ir.types.f32(), f32(v)))->Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new ir::Constant
|
/// Creates a new ir::Constant
|
||||||
|
@ -166,35 +166,35 @@ class Builder {
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the new constant
|
/// @returns the new constant
|
||||||
ir::Constant* Constant(i32 v) {
|
ir::Constant* Constant(i32 v) {
|
||||||
return Constant(create<constant::Scalar<i32>>(ir.types.Get<type::I32>(), v));
|
return Constant(create<constant::Scalar<i32>>(ir.types.i32(), v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a ir::Constant for a u32 Scalar
|
/// Creates a ir::Constant for a u32 Scalar
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the new constant
|
/// @returns the new constant
|
||||||
ir::Constant* Constant(u32 v) {
|
ir::Constant* Constant(u32 v) {
|
||||||
return Constant(create<constant::Scalar<u32>>(ir.types.Get<type::U32>(), v));
|
return Constant(create<constant::Scalar<u32>>(ir.types.u32(), v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a ir::Constant for a f32 Scalar
|
/// Creates a ir::Constant for a f32 Scalar
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the new constant
|
/// @returns the new constant
|
||||||
ir::Constant* Constant(f32 v) {
|
ir::Constant* Constant(f32 v) {
|
||||||
return Constant(create<constant::Scalar<f32>>(ir.types.Get<type::F32>(), v));
|
return Constant(create<constant::Scalar<f32>>(ir.types.f32(), v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a ir::Constant for a f16 Scalar
|
/// Creates a ir::Constant for a f16 Scalar
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the new constant
|
/// @returns the new constant
|
||||||
ir::Constant* Constant(f16 v) {
|
ir::Constant* Constant(f16 v) {
|
||||||
return Constant(create<constant::Scalar<f16>>(ir.types.Get<type::F16>(), v));
|
return Constant(create<constant::Scalar<f16>>(ir.types.f16(), v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a ir::Constant for a bool Scalar
|
/// Creates a ir::Constant for a bool Scalar
|
||||||
/// @param v the value
|
/// @param v the value
|
||||||
/// @returns the new constant
|
/// @returns the new constant
|
||||||
ir::Constant* Constant(bool v) {
|
ir::Constant* Constant(bool v) {
|
||||||
return Constant(create<constant::Scalar<bool>>(ir.types.Get<type::Bool>(), v));
|
return Constant(create<constant::Scalar<bool>>(ir.types.bool_(), v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates an op for `lhs kind rhs`
|
/// Creates an op for `lhs kind rhs`
|
||||||
|
|
|
@ -964,7 +964,7 @@ class Impl {
|
||||||
auto* if_inst = builder_.CreateIf(lhs.Get());
|
auto* if_inst = builder_.CreateIf(lhs.Get());
|
||||||
current_flow_block_->Instructions().Push(if_inst);
|
current_flow_block_->Instructions().Push(if_inst);
|
||||||
|
|
||||||
auto* result = builder_.BlockParam(builder_.ir.types.Get<type::Bool>());
|
auto* result = builder_.BlockParam(builder_.ir.types.bool_());
|
||||||
if_inst->Merge()->SetParams(utils::Vector{result});
|
if_inst->Merge()->SetParams(utils::Vector{result});
|
||||||
|
|
||||||
utils::Result<Value*> rhs;
|
utils::Result<Value*> rhs;
|
||||||
|
|
|
@ -19,7 +19,7 @@ TINT_INSTANTIATE_TYPEINFO(tint::ir::Function);
|
||||||
namespace tint::ir {
|
namespace tint::ir {
|
||||||
|
|
||||||
Function::Function(Symbol name,
|
Function::Function(Symbol name,
|
||||||
type::Type* rt,
|
const type::Type* rt,
|
||||||
PipelineStage stage,
|
PipelineStage stage,
|
||||||
std::optional<std::array<uint32_t, 3>> wg_size)
|
std::optional<std::array<uint32_t, 3>> wg_size)
|
||||||
: Base(), name_(name), return_type_(rt), pipeline_stage_(stage), workgroup_size_(wg_size) {}
|
: Base(), name_(name), return_type_(rt), pipeline_stage_(stage), workgroup_size_(wg_size) {}
|
||||||
|
|
|
@ -69,7 +69,7 @@ class Function : public utils::Castable<Function, FlowNode> {
|
||||||
/// @param stage the function stage
|
/// @param stage the function stage
|
||||||
/// @param wg_size the workgroup_size
|
/// @param wg_size the workgroup_size
|
||||||
Function(Symbol n,
|
Function(Symbol n,
|
||||||
type::Type* rt,
|
const type::Type* rt,
|
||||||
PipelineStage stage = PipelineStage::kUndefined,
|
PipelineStage stage = PipelineStage::kUndefined,
|
||||||
std::optional<std::array<uint32_t, 3>> wg_size = {});
|
std::optional<std::array<uint32_t, 3>> wg_size = {});
|
||||||
~Function() override;
|
~Function() override;
|
||||||
|
|
|
@ -27,7 +27,7 @@ TEST_F(IR_InstructionTest, CreateLoad) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
auto* store_type = b.ir.types.Get<type::I32>();
|
auto* store_type = b.ir.types.i32();
|
||||||
auto* var = b.Declare(b.ir.types.Get<type::Pointer>(
|
auto* var = b.Declare(b.ir.types.Get<type::Pointer>(
|
||||||
store_type, builtin::AddressSpace::kFunction, builtin::Access::kReadWrite));
|
store_type, builtin::AddressSpace::kFunction, builtin::Access::kReadWrite));
|
||||||
const auto* inst = b.Load(var);
|
const auto* inst = b.Load(var);
|
||||||
|
@ -45,7 +45,7 @@ TEST_F(IR_InstructionTest, Load_Usage) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
|
|
||||||
auto* store_type = b.ir.types.Get<type::I32>();
|
auto* store_type = b.ir.types.i32();
|
||||||
auto* var = b.Declare(b.ir.types.Get<type::Pointer>(
|
auto* var = b.Declare(b.ir.types.Get<type::Pointer>(
|
||||||
store_type, builtin::AddressSpace::kFunction, builtin::Access::kReadWrite));
|
store_type, builtin::AddressSpace::kFunction, builtin::Access::kReadWrite));
|
||||||
const auto* inst = b.Load(var);
|
const auto* inst = b.Load(var);
|
||||||
|
|
|
@ -25,20 +25,20 @@ using IR_ModuleTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(IR_ModuleTest, NameOfUnnamed) {
|
TEST_F(IR_ModuleTest, NameOfUnnamed) {
|
||||||
Module mod;
|
Module mod;
|
||||||
auto* v = mod.values.Create<ir::Var>(mod.types.Get<type::I32>());
|
auto* v = mod.values.Create<ir::Var>(mod.types.i32());
|
||||||
EXPECT_FALSE(mod.NameOf(v).IsValid());
|
EXPECT_FALSE(mod.NameOf(v).IsValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(IR_ModuleTest, SetName) {
|
TEST_F(IR_ModuleTest, SetName) {
|
||||||
Module mod;
|
Module mod;
|
||||||
auto* v = mod.values.Create<ir::Var>(mod.types.Get<type::I32>());
|
auto* v = mod.values.Create<ir::Var>(mod.types.i32());
|
||||||
EXPECT_EQ(mod.SetName(v, "a").Name(), "a");
|
EXPECT_EQ(mod.SetName(v, "a").Name(), "a");
|
||||||
EXPECT_EQ(mod.NameOf(v).Name(), "a");
|
EXPECT_EQ(mod.NameOf(v).Name(), "a");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(IR_ModuleTest, SetNameRename) {
|
TEST_F(IR_ModuleTest, SetNameRename) {
|
||||||
Module mod;
|
Module mod;
|
||||||
auto* v = mod.values.Create<ir::Var>(mod.types.Get<type::I32>());
|
auto* v = mod.values.Create<ir::Var>(mod.types.i32());
|
||||||
EXPECT_EQ(mod.SetName(v, "a").Name(), "a");
|
EXPECT_EQ(mod.SetName(v, "a").Name(), "a");
|
||||||
EXPECT_EQ(mod.SetName(v, "b").Name(), "b");
|
EXPECT_EQ(mod.SetName(v, "b").Name(), "b");
|
||||||
EXPECT_EQ(mod.NameOf(v).Name(), "b");
|
EXPECT_EQ(mod.NameOf(v).Name(), "b");
|
||||||
|
@ -46,9 +46,9 @@ TEST_F(IR_ModuleTest, SetNameRename) {
|
||||||
|
|
||||||
TEST_F(IR_ModuleTest, SetNameCollision) {
|
TEST_F(IR_ModuleTest, SetNameCollision) {
|
||||||
Module mod;
|
Module mod;
|
||||||
auto* a = mod.values.Create<ir::Var>(mod.types.Get<type::I32>());
|
auto* a = mod.values.Create<ir::Var>(mod.types.i32());
|
||||||
auto* b = mod.values.Create<ir::Var>(mod.types.Get<type::I32>());
|
auto* b = mod.values.Create<ir::Var>(mod.types.i32());
|
||||||
auto* c = mod.values.Create<ir::Var>(mod.types.Get<type::I32>());
|
auto* c = mod.values.Create<ir::Var>(mod.types.i32());
|
||||||
EXPECT_EQ(mod.SetName(a, "x").Name(), "x");
|
EXPECT_EQ(mod.SetName(a, "x").Name(), "x");
|
||||||
EXPECT_EQ(mod.SetName(b, "x_1").Name(), "x_1");
|
EXPECT_EQ(mod.SetName(b, "x_1").Name(), "x_1");
|
||||||
EXPECT_EQ(mod.SetName(c, "x").Name(), "x_2");
|
EXPECT_EQ(mod.SetName(c, "x").Name(), "x_2");
|
||||||
|
|
|
@ -35,8 +35,7 @@ void AddEmptyEntryPoint::Run(ir::Module* ir, const DataMap&, DataMap&) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
ir::Builder builder(*ir);
|
ir::Builder builder(*ir);
|
||||||
auto* ep =
|
auto* ep = builder.CreateFunction(ir->symbols.New("unused_entry_point"), ir->types.void_(),
|
||||||
builder.CreateFunction(ir->symbols.New("unused_entry_point"), ir->types.Get<type::Void>(),
|
|
||||||
Function::PipelineStage::kCompute, std::array{1u, 1u, 1u});
|
Function::PipelineStage::kCompute, std::array{1u, 1u, 1u});
|
||||||
ep->StartTarget()->SetInstructions(utils::Vector{builder.Branch(ep->EndTarget())});
|
ep->StartTarget()->SetInstructions(utils::Vector{builder.Branch(ep->EndTarget())});
|
||||||
ir->functions.Push(ep);
|
ir->functions.Push(ep);
|
||||||
|
|
|
@ -39,8 +39,7 @@ TEST_F(IR_AddEmptyEntryPointTest, EmptyModule) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(IR_AddEmptyEntryPointTest, ExistingEntryPoint) {
|
TEST_F(IR_AddEmptyEntryPointTest, ExistingEntryPoint) {
|
||||||
auto* ep =
|
auto* ep = b.CreateFunction("main", mod.types.void_(), Function::PipelineStage::kFragment);
|
||||||
b.CreateFunction("main", mod.types.Get<type::Void>(), Function::PipelineStage::kFragment);
|
|
||||||
ep->StartTarget()->SetInstructions(utils::Vector{b.Branch(ep->EndTarget())});
|
ep->StartTarget()->SetInstructions(utils::Vector{b.Branch(ep->EndTarget())});
|
||||||
mod.functions.Push(ep);
|
mod.functions.Push(ep);
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ using IR_InstructionTest = TestHelper;
|
||||||
TEST_F(IR_InstructionTest, CreateComplement) {
|
TEST_F(IR_InstructionTest, CreateComplement) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
auto* inst = b.Complement(b.ir.types.Get<type::I32>(), b.Constant(4_i));
|
auto* inst = b.Complement(b.ir.types.i32(), b.Constant(4_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Unary>());
|
ASSERT_TRUE(inst->Is<Unary>());
|
||||||
EXPECT_EQ(inst->Kind(), Unary::Kind::kComplement);
|
EXPECT_EQ(inst->Kind(), Unary::Kind::kComplement);
|
||||||
|
@ -40,7 +40,7 @@ TEST_F(IR_InstructionTest, CreateComplement) {
|
||||||
TEST_F(IR_InstructionTest, CreateNegation) {
|
TEST_F(IR_InstructionTest, CreateNegation) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
auto* inst = b.Negation(b.ir.types.Get<type::I32>(), b.Constant(4_i));
|
auto* inst = b.Negation(b.ir.types.i32(), b.Constant(4_i));
|
||||||
|
|
||||||
ASSERT_TRUE(inst->Is<Unary>());
|
ASSERT_TRUE(inst->Is<Unary>());
|
||||||
EXPECT_EQ(inst->Kind(), Unary::Kind::kNegation);
|
EXPECT_EQ(inst->Kind(), Unary::Kind::kNegation);
|
||||||
|
@ -54,7 +54,7 @@ TEST_F(IR_InstructionTest, CreateNegation) {
|
||||||
TEST_F(IR_InstructionTest, Unary_Usage) {
|
TEST_F(IR_InstructionTest, Unary_Usage) {
|
||||||
Module mod;
|
Module mod;
|
||||||
Builder b{mod};
|
Builder b{mod};
|
||||||
auto* inst = b.Negation(b.ir.types.Get<type::I32>(), b.Constant(4_i));
|
auto* inst = b.Negation(b.ir.types.i32(), b.Constant(4_i));
|
||||||
|
|
||||||
EXPECT_EQ(inst->Kind(), Unary::Kind::kNegation);
|
EXPECT_EQ(inst->Kind(), Unary::Kind::kNegation);
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,14 @@
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include "src/tint/type/bool.h"
|
||||||
|
#include "src/tint/type/f16.h"
|
||||||
|
#include "src/tint/type/f32.h"
|
||||||
|
#include "src/tint/type/i32.h"
|
||||||
#include "src/tint/type/type.h"
|
#include "src/tint/type/type.h"
|
||||||
|
#include "src/tint/type/u32.h"
|
||||||
#include "src/tint/type/vector.h"
|
#include "src/tint/type/vector.h"
|
||||||
|
#include "src/tint/type/void.h"
|
||||||
#include "src/tint/utils/hash.h"
|
#include "src/tint/utils/hash.h"
|
||||||
#include "src/tint/utils/unique_allocator.h"
|
#include "src/tint/utils/unique_allocator.h"
|
||||||
|
|
||||||
|
@ -85,22 +91,42 @@ class Manager final {
|
||||||
return types_.Find<TYPE>(std::forward<ARGS>(args)...);
|
return types_.Find<TYPE>(std::forward<ARGS>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @returns a void type
|
||||||
|
const type::Type* void_() { return Get<type::Void>(); }
|
||||||
|
|
||||||
|
/// @returns a bool type
|
||||||
|
const type::Type* bool_() { return Get<type::Bool>(); }
|
||||||
|
|
||||||
|
/// @returns an i32 type
|
||||||
|
const type::Type* i32() { return Get<type::I32>(); }
|
||||||
|
|
||||||
|
/// @returns a u32 type
|
||||||
|
const type::Type* u32() { return Get<type::U32>(); }
|
||||||
|
|
||||||
|
/// @returns an f32 type
|
||||||
|
const type::Type* f32() { return Get<type::F32>(); }
|
||||||
|
|
||||||
|
/// @returns an f16 type
|
||||||
|
const type::Type* f16() { return Get<type::F16>(); }
|
||||||
|
|
||||||
/// @param inner the inner type
|
/// @param inner the inner type
|
||||||
/// @param size the vector size
|
/// @param size the vector size
|
||||||
/// @returns the vector type
|
/// @returns the vector type
|
||||||
type::Type* vec(type::Type* inner, uint32_t size) { return Get<type::Vector>(inner, size); }
|
const type::Type* vec(const type::Type* inner, uint32_t size) {
|
||||||
|
return Get<type::Vector>(inner, size);
|
||||||
|
}
|
||||||
|
|
||||||
/// @param inner the inner type
|
/// @param inner the inner type
|
||||||
/// @returns the vector type
|
/// @returns the vector type
|
||||||
type::Type* vec2(type::Type* inner) { return vec(inner, 2); }
|
const type::Type* vec2(const type::Type* inner) { return vec(inner, 2); }
|
||||||
|
|
||||||
/// @param inner the inner type
|
/// @param inner the inner type
|
||||||
/// @returns the vector type
|
/// @returns the vector type
|
||||||
type::Type* vec3(type::Type* inner) { return vec(inner, 3); }
|
const type::Type* vec3(const type::Type* inner) { return vec(inner, 3); }
|
||||||
|
|
||||||
/// @param inner the inner type
|
/// @param inner the inner type
|
||||||
/// @returns the vector type
|
/// @returns the vector type
|
||||||
type::Type* vec4(type::Type* inner) { return vec(inner, 4); }
|
const type::Type* vec4(const type::Type* inner) { return vec(inner, 4); }
|
||||||
|
|
||||||
/// @returns an iterator to the beginning of the types
|
/// @returns an iterator to the beginning of the types
|
||||||
TypeIterator begin() const { return types_.begin(); }
|
TypeIterator begin() const { return types_.begin(); }
|
||||||
|
|
|
@ -20,10 +20,9 @@ namespace tint::writer::spirv {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Add_I32) {
|
TEST_F(SpvGeneratorImplTest, Binary_Add_I32) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(utils::Vector{
|
||||||
utils::Vector{b.Add(mod.types.Get<type::I32>(), b.Constant(1_i), b.Constant(2_i)),
|
b.Add(mod.types.i32(), b.Constant(1_i), b.Constant(2_i)), b.Branch(func->EndTarget())});
|
||||||
b.Branch(func->EndTarget())});
|
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
||||||
|
@ -41,10 +40,9 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Add_U32) {
|
TEST_F(SpvGeneratorImplTest, Binary_Add_U32) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(utils::Vector{
|
||||||
utils::Vector{b.Add(mod.types.Get<type::U32>(), b.Constant(1_u), b.Constant(2_u)),
|
b.Add(mod.types.u32(), b.Constant(1_u), b.Constant(2_u)), b.Branch(func->EndTarget())});
|
||||||
b.Branch(func->EndTarget())});
|
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
||||||
|
@ -62,10 +60,9 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Add_F32) {
|
TEST_F(SpvGeneratorImplTest, Binary_Add_F32) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(utils::Vector{
|
||||||
utils::Vector{b.Add(mod.types.Get<type::F32>(), b.Constant(1_f), b.Constant(2_f)),
|
b.Add(mod.types.f32(), b.Constant(1_f), b.Constant(2_f)), b.Branch(func->EndTarget())});
|
||||||
b.Branch(func->EndTarget())});
|
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
||||||
|
@ -83,9 +80,9 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Sub_I32) {
|
TEST_F(SpvGeneratorImplTest, Binary_Sub_I32) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{b.Subtract(mod.types.Get<type::I32>(), b.Constant(1_i), b.Constant(2_i)),
|
utils::Vector{b.Subtract(mod.types.i32(), b.Constant(1_i), b.Constant(2_i)),
|
||||||
b.Branch(func->EndTarget())});
|
b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -104,9 +101,9 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Sub_U32) {
|
TEST_F(SpvGeneratorImplTest, Binary_Sub_U32) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{b.Subtract(mod.types.Get<type::U32>(), b.Constant(1_u), b.Constant(2_u)),
|
utils::Vector{b.Subtract(mod.types.u32(), b.Constant(1_u), b.Constant(2_u)),
|
||||||
b.Branch(func->EndTarget())});
|
b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -125,9 +122,9 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Sub_F32) {
|
TEST_F(SpvGeneratorImplTest, Binary_Sub_F32) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{b.Subtract(mod.types.Get<type::F32>(), b.Constant(1_f), b.Constant(2_f)),
|
utils::Vector{b.Subtract(mod.types.f32(), b.Constant(1_f), b.Constant(2_f)),
|
||||||
b.Branch(func->EndTarget())});
|
b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -146,14 +143,14 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Sub_Vec2i) {
|
TEST_F(SpvGeneratorImplTest, Binary_Sub_Vec2i) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
auto* lhs = b.create<constant::Composite>(mod.types.vec2(mod.types.Get<type::I32>()),
|
auto* lhs = b.create<constant::Composite>(mod.types.vec2(mod.types.i32()),
|
||||||
utils::Vector{b.I32(42), b.I32(-1)}, false, false);
|
utils::Vector{b.I32(42), b.I32(-1)}, false, false);
|
||||||
auto* rhs = b.create<constant::Composite>(mod.types.vec2(mod.types.Get<type::I32>()),
|
auto* rhs = b.create<constant::Composite>(mod.types.vec2(mod.types.i32()),
|
||||||
utils::Vector{b.I32(0), b.I32(-43)}, false, false);
|
utils::Vector{b.I32(0), b.I32(-43)}, false, false);
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{b.Subtract(mod.types.Get<type::Vector>(mod.types.Get<type::I32>(), 2u),
|
utils::Vector{b.Subtract(mod.types.Get<type::Vector>(mod.types.i32(), 2u), b.Constant(lhs),
|
||||||
b.Constant(lhs), b.Constant(rhs)),
|
b.Constant(rhs)),
|
||||||
b.Branch(func->EndTarget())});
|
b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -177,16 +174,16 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Sub_Vec4f) {
|
TEST_F(SpvGeneratorImplTest, Binary_Sub_Vec4f) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
auto* lhs = b.create<constant::Composite>(
|
auto* lhs = b.create<constant::Composite>(
|
||||||
mod.types.vec4(mod.types.Get<type::F32>()),
|
mod.types.vec4(mod.types.f32()), utils::Vector{b.F32(42), b.F32(-1), b.F32(0), b.F32(1.25)},
|
||||||
utils::Vector{b.F32(42), b.F32(-1), b.F32(0), b.F32(1.25)}, false, false);
|
false, false);
|
||||||
auto* rhs = b.create<constant::Composite>(
|
auto* rhs = b.create<constant::Composite>(
|
||||||
mod.types.vec4(mod.types.Get<type::F32>()),
|
mod.types.vec4(mod.types.f32()), utils::Vector{b.F32(0), b.F32(1.25), b.F32(-42), b.F32(1)},
|
||||||
utils::Vector{b.F32(0), b.F32(1.25), b.F32(-42), b.F32(1)}, false, false);
|
false, false);
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{b.Subtract(mod.types.Get<type::Vector>(mod.types.Get<type::F32>(), 4u),
|
utils::Vector{b.Subtract(mod.types.Get<type::Vector>(mod.types.f32(), 4u), b.Constant(lhs),
|
||||||
b.Constant(lhs), b.Constant(rhs)),
|
b.Constant(rhs)),
|
||||||
b.Branch(func->EndTarget())});
|
b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -212,10 +209,10 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Binary_Chain) {
|
TEST_F(SpvGeneratorImplTest, Binary_Chain) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
auto* a = b.Subtract(mod.types.Get<type::I32>(), b.Constant(1_i), b.Constant(2_i));
|
auto* a = b.Subtract(mod.types.i32(), b.Constant(1_i), b.Constant(2_i));
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{a, b.Add(mod.types.Get<type::I32>(), a, a), b.Branch(func->EndTarget())});
|
utils::Vector{a, b.Add(mod.types.i32(), a, a), b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo"
|
||||||
|
|
|
@ -64,7 +64,7 @@ TEST_F(SpvGeneratorImplTest, Constant_F16) {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Constant_Vec4Bool) {
|
TEST_F(SpvGeneratorImplTest, Constant_Vec4Bool) {
|
||||||
auto* v = b.create<constant::Composite>(
|
auto* v = b.create<constant::Composite>(
|
||||||
mod.types.vec4(mod.types.Get<type::Bool>()),
|
mod.types.vec4(mod.types.bool_()),
|
||||||
utils::Vector{b.Bool(true), b.Bool(false), b.Bool(false), b.Bool(true)}, false, true);
|
utils::Vector{b.Bool(true), b.Bool(false), b.Bool(false), b.Bool(true)}, false, true);
|
||||||
|
|
||||||
generator_.Constant(b.Constant(v));
|
generator_.Constant(b.Constant(v));
|
||||||
|
@ -77,7 +77,7 @@ TEST_F(SpvGeneratorImplTest, Constant_Vec4Bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Constant_Vec2i) {
|
TEST_F(SpvGeneratorImplTest, Constant_Vec2i) {
|
||||||
auto* v = b.create<constant::Composite>(mod.types.vec2(mod.types.Get<type::I32>()),
|
auto* v = b.create<constant::Composite>(mod.types.vec2(mod.types.i32()),
|
||||||
utils::Vector{b.I32(42), b.I32(-1)}, false, false);
|
utils::Vector{b.I32(42), b.I32(-1)}, false, false);
|
||||||
generator_.Constant(b.Constant(v));
|
generator_.Constant(b.Constant(v));
|
||||||
EXPECT_EQ(DumpTypes(), R"(%3 = OpTypeInt 32 1
|
EXPECT_EQ(DumpTypes(), R"(%3 = OpTypeInt 32 1
|
||||||
|
@ -89,7 +89,7 @@ TEST_F(SpvGeneratorImplTest, Constant_Vec2i) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Constant_Vec3u) {
|
TEST_F(SpvGeneratorImplTest, Constant_Vec3u) {
|
||||||
auto* v = b.create<constant::Composite>(mod.types.vec3(mod.types.Get<type::U32>()),
|
auto* v = b.create<constant::Composite>(mod.types.vec3(mod.types.u32()),
|
||||||
utils::Vector{b.U32(42), b.U32(0), b.U32(4000000000)},
|
utils::Vector{b.U32(42), b.U32(0), b.U32(4000000000)},
|
||||||
false, true);
|
false, true);
|
||||||
generator_.Constant(b.Constant(v));
|
generator_.Constant(b.Constant(v));
|
||||||
|
@ -104,8 +104,8 @@ TEST_F(SpvGeneratorImplTest, Constant_Vec3u) {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Constant_Vec4f) {
|
TEST_F(SpvGeneratorImplTest, Constant_Vec4f) {
|
||||||
auto* v = b.create<constant::Composite>(
|
auto* v = b.create<constant::Composite>(
|
||||||
mod.types.vec4(mod.types.Get<type::F32>()),
|
mod.types.vec4(mod.types.f32()), utils::Vector{b.F32(42), b.F32(0), b.F32(0.25), b.F32(-1)},
|
||||||
utils::Vector{b.F32(42), b.F32(0), b.F32(0.25), b.F32(-1)}, false, true);
|
false, true);
|
||||||
generator_.Constant(b.Constant(v));
|
generator_.Constant(b.Constant(v));
|
||||||
EXPECT_EQ(DumpTypes(), R"(%3 = OpTypeFloat 32
|
EXPECT_EQ(DumpTypes(), R"(%3 = OpTypeFloat 32
|
||||||
%2 = OpTypeVector %3 4
|
%2 = OpTypeVector %3 4
|
||||||
|
@ -118,7 +118,7 @@ TEST_F(SpvGeneratorImplTest, Constant_Vec4f) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Constant_Vec2h) {
|
TEST_F(SpvGeneratorImplTest, Constant_Vec2h) {
|
||||||
auto* v = b.create<constant::Composite>(mod.types.vec2(mod.types.Get<type::F16>()),
|
auto* v = b.create<constant::Composite>(mod.types.vec2(mod.types.f16()),
|
||||||
utils::Vector{b.F16(42), b.F16(0.25)}, false, false);
|
utils::Vector{b.F16(42), b.F16(0.25)}, false, false);
|
||||||
generator_.Constant(b.Constant(v));
|
generator_.Constant(b.Constant(v));
|
||||||
EXPECT_EQ(DumpTypes(), R"(%3 = OpTypeFloat 16
|
EXPECT_EQ(DumpTypes(), R"(%3 = OpTypeFloat 16
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace tint::writer::spirv {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Function_Empty) {
|
TEST_F(SpvGeneratorImplTest, Function_Empty) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -34,7 +34,7 @@ OpFunctionEnd
|
||||||
|
|
||||||
// Test that we do not emit the same function type more than once.
|
// Test that we do not emit the same function type more than once.
|
||||||
TEST_F(SpvGeneratorImplTest, Function_DeduplicateType) {
|
TEST_F(SpvGeneratorImplTest, Function_DeduplicateType) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -46,8 +46,8 @@ TEST_F(SpvGeneratorImplTest, Function_DeduplicateType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Compute) {
|
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Compute) {
|
||||||
auto* func = b.CreateFunction("main", mod.types.Get<type::Void>(),
|
auto* func = b.CreateFunction("main", mod.types.void_(), ir::Function::PipelineStage::kCompute,
|
||||||
ir::Function::PipelineStage::kCompute, {{32, 4, 1}});
|
{{32, 4, 1}});
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -64,8 +64,8 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Fragment) {
|
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Fragment) {
|
||||||
auto* func = b.CreateFunction("main", mod.types.Get<type::Void>(),
|
auto* func =
|
||||||
ir::Function::PipelineStage::kFragment);
|
b.CreateFunction("main", mod.types.void_(), ir::Function::PipelineStage::kFragment);
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -82,8 +82,7 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Vertex) {
|
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Vertex) {
|
||||||
auto* func =
|
auto* func = b.CreateFunction("main", mod.types.void_(), ir::Function::PipelineStage::kVertex);
|
||||||
b.CreateFunction("main", mod.types.Get<type::Void>(), ir::Function::PipelineStage::kVertex);
|
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -99,16 +98,15 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Multiple) {
|
TEST_F(SpvGeneratorImplTest, Function_EntryPoint_Multiple) {
|
||||||
auto* f1 = b.CreateFunction("main1", mod.types.Get<type::Void>(),
|
auto* f1 = b.CreateFunction("main1", mod.types.void_(), ir::Function::PipelineStage::kCompute,
|
||||||
ir::Function::PipelineStage::kCompute, {{32, 4, 1}});
|
{{32, 4, 1}});
|
||||||
f1->StartTarget()->SetInstructions(utils::Vector{b.Branch(f1->EndTarget())});
|
f1->StartTarget()->SetInstructions(utils::Vector{b.Branch(f1->EndTarget())});
|
||||||
|
|
||||||
auto* f2 = b.CreateFunction("main2", mod.types.Get<type::Void>(),
|
auto* f2 = b.CreateFunction("main2", mod.types.void_(), ir::Function::PipelineStage::kCompute,
|
||||||
ir::Function::PipelineStage::kCompute, {{8, 2, 16}});
|
{{8, 2, 16}});
|
||||||
f2->StartTarget()->SetInstructions(utils::Vector{b.Branch(f2->EndTarget())});
|
f2->StartTarget()->SetInstructions(utils::Vector{b.Branch(f2->EndTarget())});
|
||||||
|
|
||||||
auto* f3 = b.CreateFunction("main3", mod.types.Get<type::Void>(),
|
auto* f3 = b.CreateFunction("main3", mod.types.void_(), ir::Function::PipelineStage::kFragment);
|
||||||
ir::Function::PipelineStage::kFragment);
|
|
||||||
f3->StartTarget()->SetInstructions(utils::Vector{b.Branch(f3->EndTarget())});
|
f3->StartTarget()->SetInstructions(utils::Vector{b.Branch(f3->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(f1);
|
generator_.EmitFunction(f1);
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace tint::writer::spirv {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, If_TrueEmpty_FalseEmpty) {
|
TEST_F(SpvGeneratorImplTest, If_TrueEmpty_FalseEmpty) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* i = b.CreateIf(b.Constant(true));
|
auto* i = b.CreateIf(b.Constant(true));
|
||||||
i->True()->SetInstructions(utils::Vector{b.Branch(i->Merge())});
|
i->True()->SetInstructions(utils::Vector{b.Branch(i->Merge())});
|
||||||
|
@ -46,7 +46,7 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, If_FalseEmpty) {
|
TEST_F(SpvGeneratorImplTest, If_FalseEmpty) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* i = b.CreateIf(b.Constant(true));
|
auto* i = b.CreateIf(b.Constant(true));
|
||||||
i->False()->SetInstructions(utils::Vector{b.Branch(i->Merge())});
|
i->False()->SetInstructions(utils::Vector{b.Branch(i->Merge())});
|
||||||
|
@ -54,7 +54,7 @@ TEST_F(SpvGeneratorImplTest, If_FalseEmpty) {
|
||||||
|
|
||||||
auto* true_block = i->True();
|
auto* true_block = i->True();
|
||||||
true_block->SetInstructions(utils::Vector{
|
true_block->SetInstructions(utils::Vector{
|
||||||
b.Add(mod.types.Get<type::I32>(), b.Constant(1_i), b.Constant(1_i)), b.Branch(i->Merge())});
|
b.Add(mod.types.i32(), b.Constant(1_i), b.Constant(1_i)), b.Branch(i->Merge())});
|
||||||
|
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{i});
|
func->StartTarget()->SetInstructions(utils::Vector{i});
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, If_TrueEmpty) {
|
TEST_F(SpvGeneratorImplTest, If_TrueEmpty) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* i = b.CreateIf(b.Constant(true));
|
auto* i = b.CreateIf(b.Constant(true));
|
||||||
i->True()->SetInstructions(utils::Vector{b.Branch(i->Merge())});
|
i->True()->SetInstructions(utils::Vector{b.Branch(i->Merge())});
|
||||||
|
@ -88,7 +88,7 @@ TEST_F(SpvGeneratorImplTest, If_TrueEmpty) {
|
||||||
|
|
||||||
auto* false_block = i->False();
|
auto* false_block = i->False();
|
||||||
false_block->SetInstructions(utils::Vector{
|
false_block->SetInstructions(utils::Vector{
|
||||||
b.Add(mod.types.Get<type::I32>(), b.Constant(1_i), b.Constant(1_i)), b.Branch(i->Merge())});
|
b.Add(mod.types.i32(), b.Constant(1_i), b.Constant(1_i)), b.Branch(i->Merge())});
|
||||||
|
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{i});
|
func->StartTarget()->SetInstructions(utils::Vector{i});
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, If_BothBranchesReturn) {
|
TEST_F(SpvGeneratorImplTest, If_BothBranchesReturn) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* i = b.CreateIf(b.Constant(true));
|
auto* i = b.CreateIf(b.Constant(true));
|
||||||
i->True()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
i->True()->SetInstructions(utils::Vector{b.Branch(func->EndTarget())});
|
||||||
|
|
|
@ -25,43 +25,43 @@ namespace tint::writer::spirv {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Void) {
|
TEST_F(SpvGeneratorImplTest, Type_Void) {
|
||||||
auto id = generator_.Type(mod.types.Get<type::Void>());
|
auto id = generator_.Type(mod.types.void_());
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(), "%1 = OpTypeVoid\n");
|
EXPECT_EQ(DumpTypes(), "%1 = OpTypeVoid\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Bool) {
|
TEST_F(SpvGeneratorImplTest, Type_Bool) {
|
||||||
auto id = generator_.Type(mod.types.Get<type::Bool>());
|
auto id = generator_.Type(mod.types.bool_());
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(), "%1 = OpTypeBool\n");
|
EXPECT_EQ(DumpTypes(), "%1 = OpTypeBool\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_I32) {
|
TEST_F(SpvGeneratorImplTest, Type_I32) {
|
||||||
auto id = generator_.Type(mod.types.Get<type::I32>());
|
auto id = generator_.Type(mod.types.i32());
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(), "%1 = OpTypeInt 32 1\n");
|
EXPECT_EQ(DumpTypes(), "%1 = OpTypeInt 32 1\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_U32) {
|
TEST_F(SpvGeneratorImplTest, Type_U32) {
|
||||||
auto id = generator_.Type(mod.types.Get<type::U32>());
|
auto id = generator_.Type(mod.types.u32());
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(), "%1 = OpTypeInt 32 0\n");
|
EXPECT_EQ(DumpTypes(), "%1 = OpTypeInt 32 0\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_F32) {
|
TEST_F(SpvGeneratorImplTest, Type_F32) {
|
||||||
auto id = generator_.Type(mod.types.Get<type::F32>());
|
auto id = generator_.Type(mod.types.f32());
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(), "%1 = OpTypeFloat 32\n");
|
EXPECT_EQ(DumpTypes(), "%1 = OpTypeFloat 32\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_F16) {
|
TEST_F(SpvGeneratorImplTest, Type_F16) {
|
||||||
auto id = generator_.Type(mod.types.Get<type::F16>());
|
auto id = generator_.Type(mod.types.f16());
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(), "%1 = OpTypeFloat 16\n");
|
EXPECT_EQ(DumpTypes(), "%1 = OpTypeFloat 16\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Vec2i) {
|
TEST_F(SpvGeneratorImplTest, Type_Vec2i) {
|
||||||
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.Get<type::I32>(), 2u);
|
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.i32(), 2u);
|
||||||
auto id = generator_.Type(vec);
|
auto id = generator_.Type(vec);
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(),
|
EXPECT_EQ(DumpTypes(),
|
||||||
|
@ -70,7 +70,7 @@ TEST_F(SpvGeneratorImplTest, Type_Vec2i) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Vec3u) {
|
TEST_F(SpvGeneratorImplTest, Type_Vec3u) {
|
||||||
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.Get<type::U32>(), 3u);
|
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.u32(), 3u);
|
||||||
auto id = generator_.Type(vec);
|
auto id = generator_.Type(vec);
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(),
|
EXPECT_EQ(DumpTypes(),
|
||||||
|
@ -79,7 +79,7 @@ TEST_F(SpvGeneratorImplTest, Type_Vec3u) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Vec4f) {
|
TEST_F(SpvGeneratorImplTest, Type_Vec4f) {
|
||||||
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.Get<type::F32>(), 4u);
|
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.f32(), 4u);
|
||||||
auto id = generator_.Type(vec);
|
auto id = generator_.Type(vec);
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(),
|
EXPECT_EQ(DumpTypes(),
|
||||||
|
@ -88,7 +88,7 @@ TEST_F(SpvGeneratorImplTest, Type_Vec4f) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Vec4h) {
|
TEST_F(SpvGeneratorImplTest, Type_Vec4h) {
|
||||||
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.Get<type::F16>(), 2u);
|
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.f16(), 2u);
|
||||||
auto id = generator_.Type(vec);
|
auto id = generator_.Type(vec);
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(),
|
EXPECT_EQ(DumpTypes(),
|
||||||
|
@ -97,7 +97,7 @@ TEST_F(SpvGeneratorImplTest, Type_Vec4h) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Vec4Bool) {
|
TEST_F(SpvGeneratorImplTest, Type_Vec4Bool) {
|
||||||
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.Get<type::Bool>(), 4u);
|
auto* vec = b.ir.types.Get<type::Vector>(b.ir.types.bool_(), 4u);
|
||||||
auto id = generator_.Type(vec);
|
auto id = generator_.Type(vec);
|
||||||
EXPECT_EQ(id, 1u);
|
EXPECT_EQ(id, 1u);
|
||||||
EXPECT_EQ(DumpTypes(),
|
EXPECT_EQ(DumpTypes(),
|
||||||
|
@ -108,10 +108,10 @@ TEST_F(SpvGeneratorImplTest, Type_Vec4Bool) {
|
||||||
// Test that we can emit multiple types.
|
// Test that we can emit multiple types.
|
||||||
// Includes types with the same opcode but different parameters.
|
// Includes types with the same opcode but different parameters.
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Multiple) {
|
TEST_F(SpvGeneratorImplTest, Type_Multiple) {
|
||||||
EXPECT_EQ(generator_.Type(mod.types.Get<type::I32>()), 1u);
|
EXPECT_EQ(generator_.Type(mod.types.i32()), 1u);
|
||||||
EXPECT_EQ(generator_.Type(mod.types.Get<type::U32>()), 2u);
|
EXPECT_EQ(generator_.Type(mod.types.u32()), 2u);
|
||||||
EXPECT_EQ(generator_.Type(mod.types.Get<type::F32>()), 3u);
|
EXPECT_EQ(generator_.Type(mod.types.f32()), 3u);
|
||||||
EXPECT_EQ(generator_.Type(mod.types.Get<type::F16>()), 4u);
|
EXPECT_EQ(generator_.Type(mod.types.f16()), 4u);
|
||||||
EXPECT_EQ(DumpTypes(), R"(%1 = OpTypeInt 32 1
|
EXPECT_EQ(DumpTypes(), R"(%1 = OpTypeInt 32 1
|
||||||
%2 = OpTypeInt 32 0
|
%2 = OpTypeInt 32 0
|
||||||
%3 = OpTypeFloat 32
|
%3 = OpTypeFloat 32
|
||||||
|
@ -121,7 +121,7 @@ TEST_F(SpvGeneratorImplTest, Type_Multiple) {
|
||||||
|
|
||||||
// Test that we do not emit the same type more than once.
|
// Test that we do not emit the same type more than once.
|
||||||
TEST_F(SpvGeneratorImplTest, Type_Deduplicate) {
|
TEST_F(SpvGeneratorImplTest, Type_Deduplicate) {
|
||||||
auto* i32 = mod.types.Get<type::I32>();
|
auto* i32 = mod.types.i32();
|
||||||
EXPECT_EQ(generator_.Type(i32), 1u);
|
EXPECT_EQ(generator_.Type(i32), 1u);
|
||||||
EXPECT_EQ(generator_.Type(i32), 1u);
|
EXPECT_EQ(generator_.Type(i32), 1u);
|
||||||
EXPECT_EQ(generator_.Type(i32), 1u);
|
EXPECT_EQ(generator_.Type(i32), 1u);
|
||||||
|
|
|
@ -21,10 +21,10 @@ namespace tint::writer::spirv {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, FunctionVar_NoInit) {
|
TEST_F(SpvGeneratorImplTest, FunctionVar_NoInit) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* ty = mod.types.Get<type::Pointer>(
|
auto* ty = mod.types.Get<type::Pointer>(mod.types.i32(), builtin::AddressSpace::kFunction,
|
||||||
mod.types.Get<type::I32>(), builtin::AddressSpace::kFunction, builtin::Access::kReadWrite);
|
builtin::Access::kReadWrite);
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{b.Declare(ty), b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{b.Declare(ty), b.Branch(func->EndTarget())});
|
||||||
|
|
||||||
generator_.EmitFunction(func);
|
generator_.EmitFunction(func);
|
||||||
|
@ -42,10 +42,10 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, FunctionVar_WithInit) {
|
TEST_F(SpvGeneratorImplTest, FunctionVar_WithInit) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* ty = mod.types.Get<type::Pointer>(
|
auto* ty = mod.types.Get<type::Pointer>(mod.types.i32(), builtin::AddressSpace::kFunction,
|
||||||
mod.types.Get<type::I32>(), builtin::AddressSpace::kFunction, builtin::Access::kReadWrite);
|
builtin::Access::kReadWrite);
|
||||||
auto* v = b.Declare(ty);
|
auto* v = b.Declare(ty);
|
||||||
v->SetInitializer(b.Constant(42_i));
|
v->SetInitializer(b.Constant(42_i));
|
||||||
|
|
||||||
|
@ -68,10 +68,10 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, FunctionVar_Name) {
|
TEST_F(SpvGeneratorImplTest, FunctionVar_Name) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* ty = mod.types.Get<type::Pointer>(
|
auto* ty = mod.types.Get<type::Pointer>(mod.types.i32(), builtin::AddressSpace::kFunction,
|
||||||
mod.types.Get<type::I32>(), builtin::AddressSpace::kFunction, builtin::Access::kReadWrite);
|
builtin::Access::kReadWrite);
|
||||||
auto* v = b.Declare(ty);
|
auto* v = b.Declare(ty);
|
||||||
func->StartTarget()->SetInstructions(utils::Vector{v, b.Branch(func->EndTarget())});
|
func->StartTarget()->SetInstructions(utils::Vector{v, b.Branch(func->EndTarget())});
|
||||||
mod.SetName(v, "myvar");
|
mod.SetName(v, "myvar");
|
||||||
|
@ -92,10 +92,10 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, FunctionVar_DeclInsideBlock) {
|
TEST_F(SpvGeneratorImplTest, FunctionVar_DeclInsideBlock) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* ty = mod.types.Get<type::Pointer>(
|
auto* ty = mod.types.Get<type::Pointer>(mod.types.i32(), builtin::AddressSpace::kFunction,
|
||||||
mod.types.Get<type::I32>(), builtin::AddressSpace::kFunction, builtin::Access::kReadWrite);
|
builtin::Access::kReadWrite);
|
||||||
auto* v = b.Declare(ty);
|
auto* v = b.Declare(ty);
|
||||||
v->SetInitializer(b.Constant(42_i));
|
v->SetInitializer(b.Constant(42_i));
|
||||||
|
|
||||||
|
@ -132,9 +132,9 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, FunctionVar_Load) {
|
TEST_F(SpvGeneratorImplTest, FunctionVar_Load) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* store_ty = mod.types.Get<type::I32>();
|
auto* store_ty = mod.types.i32();
|
||||||
auto* ty = mod.types.Get<type::Pointer>(store_ty, builtin::AddressSpace::kFunction,
|
auto* ty = mod.types.Get<type::Pointer>(store_ty, builtin::AddressSpace::kFunction,
|
||||||
builtin::Access::kReadWrite);
|
builtin::Access::kReadWrite);
|
||||||
auto* v = b.Declare(ty);
|
auto* v = b.Declare(ty);
|
||||||
|
@ -156,10 +156,10 @@ OpFunctionEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpvGeneratorImplTest, FunctionVar_Store) {
|
TEST_F(SpvGeneratorImplTest, FunctionVar_Store) {
|
||||||
auto* func = b.CreateFunction("foo", mod.types.Get<type::Void>());
|
auto* func = b.CreateFunction("foo", mod.types.void_());
|
||||||
|
|
||||||
auto* ty = mod.types.Get<type::Pointer>(
|
auto* ty = mod.types.Get<type::Pointer>(mod.types.i32(), builtin::AddressSpace::kFunction,
|
||||||
mod.types.Get<type::I32>(), builtin::AddressSpace::kFunction, builtin::Access::kReadWrite);
|
builtin::Access::kReadWrite);
|
||||||
auto* v = b.Declare(ty);
|
auto* v = b.Declare(ty);
|
||||||
func->StartTarget()->SetInstructions(
|
func->StartTarget()->SetInstructions(
|
||||||
utils::Vector{v, b.Store(v, b.Constant(42_i)), b.Branch(func->EndTarget())});
|
utils::Vector{v, b.Store(v, b.Constant(42_i)), b.Branch(func->EndTarget())});
|
||||||
|
|
Loading…
Reference in New Issue