mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-13 07:06:11 +00:00
resolver: Track global uses in function decorations
Fixed: tint:1320 Change-Id: Ib92c37d4de0641d11e508be4d8e05d641e808be9 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/70662 Reviewed-by: James Price <jrprice@google.com> Reviewed-by: David Neto <dneto@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
b05e185a36
commit
d1f0a14563
@@ -427,15 +427,26 @@ TEST_F(ResolverFunctionValidationTest, FunctionParamsConst) {
|
||||
TEST_F(ResolverFunctionValidationTest, WorkgroupSize_GoodType_ConstU32) {
|
||||
// let x = 4u;
|
||||
// let x = 8u;
|
||||
// [[stage(compute), workgroup_size(x, y, 16u]
|
||||
// [[stage(compute), workgroup_size(x, y, 16u)]]
|
||||
// fn main() {}
|
||||
GlobalConst("x", ty.u32(), Expr(4u));
|
||||
GlobalConst("y", ty.u32(), Expr(8u));
|
||||
Func("main", {}, ty.void_(), {},
|
||||
{Stage(ast::PipelineStage::kCompute),
|
||||
WorkgroupSize(Expr("x"), Expr("y"), Expr(16u))});
|
||||
auto* x = GlobalConst("x", ty.u32(), Expr(4u));
|
||||
auto* y = GlobalConst("y", ty.u32(), Expr(8u));
|
||||
auto* func = Func("main", {}, ty.void_(), {},
|
||||
{Stage(ast::PipelineStage::kCompute),
|
||||
WorkgroupSize(Expr("x"), Expr("y"), Expr(16u))});
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
|
||||
auto* sem_func = Sem().Get(func);
|
||||
auto* sem_x = Sem().Get<sem::GlobalVariable>(x);
|
||||
auto* sem_y = Sem().Get<sem::GlobalVariable>(y);
|
||||
|
||||
ASSERT_NE(sem_func, nullptr);
|
||||
ASSERT_NE(sem_x, nullptr);
|
||||
ASSERT_NE(sem_y, nullptr);
|
||||
|
||||
EXPECT_TRUE(sem_func->DirectlyReferencedGlobals().contains(sem_x));
|
||||
EXPECT_TRUE(sem_func->DirectlyReferencedGlobals().contains(sem_y));
|
||||
}
|
||||
|
||||
TEST_F(ResolverFunctionValidationTest, WorkgroupSize_GoodType_U32) {
|
||||
|
||||
@@ -634,21 +634,19 @@ sem::Function* Resolver::Function(const ast::Function* decl) {
|
||||
}
|
||||
}
|
||||
|
||||
sem::WorkgroupSize ws{};
|
||||
if (!WorkgroupSizeFor(decl, ws)) {
|
||||
auto* func = builder_->create<sem::Function>(decl, return_type, parameters);
|
||||
builder_->Sem().Add(decl, func);
|
||||
|
||||
TINT_SCOPED_ASSIGNMENT(current_function_, func);
|
||||
|
||||
if (!WorkgroupSize(decl)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto* func =
|
||||
builder_->create<sem::Function>(decl, return_type, parameters, ws);
|
||||
builder_->Sem().Add(decl, func);
|
||||
|
||||
if (decl->IsEntryPoint()) {
|
||||
entry_points_.emplace_back(func);
|
||||
}
|
||||
|
||||
TINT_SCOPED_ASSIGNMENT(current_function_, func);
|
||||
|
||||
if (decl->body) {
|
||||
Mark(decl->body);
|
||||
if (current_compound_statement_) {
|
||||
@@ -692,9 +690,9 @@ sem::Function* Resolver::Function(const ast::Function* decl) {
|
||||
return func;
|
||||
}
|
||||
|
||||
bool Resolver::WorkgroupSizeFor(const ast::Function* func,
|
||||
sem::WorkgroupSize& ws) {
|
||||
bool Resolver::WorkgroupSize(const ast::Function* func) {
|
||||
// Set work-group size defaults.
|
||||
sem::WorkgroupSize ws;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
ws[i].value = 1;
|
||||
ws[i].overridable_const = nullptr;
|
||||
@@ -790,6 +788,8 @@ bool Resolver::WorkgroupSizeFor(const ast::Function* func,
|
||||
ws[i].value = is_i32 ? static_cast<uint32_t>(value.Elements()[0].i32)
|
||||
: value.Elements()[0].u32;
|
||||
}
|
||||
|
||||
current_function_->SetWorkgroupSize(std::move(ws));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -282,8 +282,9 @@ class Resolver {
|
||||
bool IsValidationEnabled(const ast::DecorationList& decorations,
|
||||
ast::DisabledValidation validation) const;
|
||||
|
||||
/// Resolves the WorkgroupSize for the given function
|
||||
bool WorkgroupSizeFor(const ast::Function*, sem::WorkgroupSize& ws);
|
||||
/// Resolves the WorkgroupSize for the given function, assigning it to
|
||||
/// current_function_
|
||||
bool WorkgroupSize(const ast::Function*);
|
||||
|
||||
/// @returns the sem::Type for the ast::Type `ty`, building it if it
|
||||
/// hasn't been constructed already. If an error is raised, nullptr is
|
||||
|
||||
Reference in New Issue
Block a user