resolver: Add dependency-graph analysis

Performs a module-scope (global) declaration dependency analysis, so
that out-of-order global declarations can be re-ordered into dependency
order for consumption by the resolver.

The WGSL working group are currently debating whether out-of-order
declarations should be included in WebGPU V1, so this implementation
currently errors if module-scope declarations are declared out-of-order,
and the resolver does not currently use this sorted global list.

The analysis does however provide significantly better error diagnostics
when cyclic dependencies are formed, and when globals are declared
out-of-order.

The DependencyGraph also correctly now detects symbol collisions between
functions and types (tint:1308).

With this change, validation is duplicated between the DependencyGraph
and the Resolver. The now-unreachable validation will be removed from
the Resolver with a followup change.

Fixed: tint:1308
Bug: tint:1266
Change-Id: I809c23a069a86cf429f5ec8ef3ad9a98246766ab
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/69381
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
Ben Clayton
2021-11-22 11:44:57 +00:00
committed by Tint LUCI CQ
parent c87dc10ce3
commit 4183051b54
20 changed files with 2007 additions and 253 deletions

View File

@@ -16,13 +16,13 @@
/// If set to 1 then the transform::Manager will dump the WGSL of the program
/// before and after each transform. Helpful for debugging bad output.
#define PRINT_PROGRAM_FOR_EACH_TRANSFORM 0
#define TINT_PRINT_PROGRAM_FOR_EACH_TRANSFORM 0
#if PRINT_PROGRAM_FOR_EACH_TRANSFORM
#define IF_PRINT_PROGRAM(x) x
#else // PRINT_PROGRAM_FOR_EACH_TRANSFORM
#define IF_PRINT_PROGRAM(x)
#endif // PRINT_PROGRAM_FOR_EACH_TRANSFORM
#if TINT_PRINT_PROGRAM_FOR_EACH_TRANSFORM
#define TINT_IF_PRINT_PROGRAM(x) x
#else // TINT_PRINT_PROGRAM_FOR_EACH_TRANSFORM
#define TINT_IF_PRINT_PROGRAM(x)
#endif // TINT_PRINT_PROGRAM_FOR_EACH_TRANSFORM
TINT_INSTANTIATE_TYPEINFO(tint::transform::Manager);
@@ -33,7 +33,7 @@ Manager::Manager() = default;
Manager::~Manager() = default;
Output Manager::Run(const Program* program, const DataMap& data) {
#if PRINT_PROGRAM_FOR_EACH_TRANSFORM
#if TINT_PRINT_PROGRAM_FOR_EACH_TRANSFORM
auto print_program = [&](const char* msg, const Transform* transform) {
auto wgsl = Program::printer(program);
std::cout << "---------------------------------------------------------"
@@ -52,19 +52,20 @@ Output Manager::Run(const Program* program, const DataMap& data) {
Output out;
if (!transforms_.empty()) {
for (const auto& transform : transforms_) {
IF_PRINT_PROGRAM(print_program("Input to", transform.get()));
TINT_IF_PRINT_PROGRAM(print_program("Input to", transform.get()));
auto res = transform->Run(program, data);
out.program = std::move(res.program);
out.data.Add(std::move(res.data));
program = &out.program;
if (!program->IsValid()) {
IF_PRINT_PROGRAM(print_program("Invalid output of", transform.get()));
TINT_IF_PRINT_PROGRAM(
print_program("Invalid output of", transform.get()));
return out;
}
if (transform == transforms_.back()) {
IF_PRINT_PROGRAM(print_program("Output of", transform.get()));
TINT_IF_PRINT_PROGRAM(print_program("Output of", transform.get()));
}
}
} else {