tint validator: make sure pixel_local vars are of type struct
Bug: 409600528
Change-Id: I4481deb80808b2c35d7ccded083be04d5fc553ce
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/236154
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index be87e9b..3fc6e2f 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -2567,6 +2567,15 @@
}
}
}
+
+ if (mv->AddressSpace() == core::AddressSpace::kPixelLocal) {
+ if (var->Block() == mod_.root_block) {
+ if (!mv->StoreType()->Is<core::type::Struct>()) {
+ AddError(var) << "pixel_local var must be of type struct";
+ return;
+ }
+ }
+ }
}
Result<SuccessType, std::string> Validator::ValidateBindingPoint(
diff --git a/src/tint/lang/core/ir/validator_value_test.cc b/src/tint/lang/core/ir/validator_value_test.cc
index 24bb2ac..11edd5a 100644
--- a/src/tint/lang/core/ir/validator_value_test.cc
+++ b/src/tint/lang/core/ir/validator_value_test.cc
@@ -842,4 +842,14 @@
)")) << res.Failure();
}
+TEST_F(IR_ValidatorTest, PointerToNonStructPixelLocal) {
+ auto* var = b.Var("var", ty.ptr<core::AddressSpace::kPixelLocal>(ty.i32()));
+ mod.root_block->Append(var);
+
+ auto res = ir::Validate(mod);
+ ASSERT_NE(res, Success);
+ EXPECT_THAT(res.Failure().reason, testing::HasSubstr("pixel_local var must be of type struct"))
+ << res.Failure();
+}
+
} // namespace tint::core::ir