tint: add const eval zero init tests for scalars, vectors, matrices, and

arrays

Bug: tint:1581
Change-Id: Ib0024ddccd5107337e6711c6fa56b0efd68dde96
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/115241
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
Antonio Maiorano 2022-12-21 21:15:03 +00:00
parent 994b70feb9
commit 0890ecabda
1 changed files with 80 additions and 0 deletions

View File

@ -136,6 +136,86 @@ TEST_F(ResolverConstEvalTest, Scalar_bool) {
EXPECT_EQ(sem->ConstantValue()->ValueAs<bool>(), true);
}
namespace ZeroInit {
struct Case {
builder::ast_type_func_ptr type;
};
template <typename T>
Case C() {
return Case{builder::DataType<T>::AST};
}
using ResolverConstEvalZeroInitTest = ResolverTestWithParam<Case>;
TEST_P(ResolverConstEvalZeroInitTest, Test) {
Enable(ast::Extension::kF16);
auto& param = GetParam();
auto* ty = param.type(*this);
auto* expr = Construct(ty);
auto* a = Const("a", expr);
WrapInFunction(a);
EXPECT_TRUE(r()->Resolve()) << r()->error();
auto* sem = Sem().Get(expr);
ASSERT_NE(sem, nullptr);
EXPECT_TRUE(sem->ConstantValue()->AllEqual());
EXPECT_TRUE(sem->ConstantValue()->AnyZero());
EXPECT_TRUE(sem->ConstantValue()->AllZero());
if (sem->Type()->is_scalar()) {
EXPECT_EQ(sem->ConstantValue()->Index(0), nullptr);
EXPECT_EQ(sem->ConstantValue()->ValueAs<f32>(), 0.0f);
} else if (auto* vec = sem->Type()->As<type::Vector>()) {
for (size_t i = 0; i < vec->Width(); ++i) {
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllEqual());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AnyZero());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllZero());
EXPECT_EQ(sem->ConstantValue()->Index(i)->ValueAs<f32>(), 0.0f);
}
} else if (auto* mat = sem->Type()->As<type::Matrix>()) {
for (size_t i = 0; i < mat->columns(); ++i) {
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllEqual());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AnyZero());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllZero());
for (size_t j = 0; j < mat->rows(); ++j) {
EXPECT_TRUE(sem->ConstantValue()->Index(i)->Index(j)->AllEqual());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->Index(j)->AnyZero());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->Index(j)->AllZero());
EXPECT_EQ(sem->ConstantValue()->Index(i)->Index(j)->ValueAs<f32>(), 0.0f);
}
}
} else if (auto* arr = sem->Type()->As<type::Array>()) {
for (size_t i = 0; i < *(arr->ConstantCount()); ++i) {
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllEqual());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AnyZero());
EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllZero());
EXPECT_EQ(sem->ConstantValue()->Index(i)->ValueAs<f32>(), 0.0f);
}
}
}
INSTANTIATE_TEST_SUITE_P(ZeroInit,
ResolverConstEvalZeroInitTest,
testing::ValuesIn({
C<u32>(),
C<i32>(),
C<f32>(),
C<f16>(),
C<bool>(),
C<builder::vec3<u32>>(),
C<builder::vec3<i32>>(),
C<builder::vec3<f32>>(),
C<builder::vec3<f16>>(),
C<builder::mat2x2<f32>>(),
C<builder::mat2x2<f16>>(),
C<builder::array<3, u32>>(),
C<builder::array<3, i32>>(),
C<builder::array<3, f32>>(),
C<builder::array<3, f16>>(),
C<builder::array<3, bool>>(),
}));
} // namespace ZeroInit
TEST_F(ResolverConstEvalTest, Vec3_ZeroInit_i32) {
auto* expr = vec3<i32>();
WrapInFunction(expr);