mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-17 03:53:35 +00:00
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>
72 lines
1.6 KiB
C++
72 lines
1.6 KiB
C++
// Copyright 2020 The Tint Authors. //
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "src/scope_stack.h"
|
|
|
|
#include "gtest/gtest.h"
|
|
#include "src/program_builder.h"
|
|
|
|
namespace tint {
|
|
namespace {
|
|
|
|
class ScopeStackTest : public ProgramBuilder, public testing::Test {};
|
|
|
|
TEST_F(ScopeStackTest, Get) {
|
|
ScopeStack<uint32_t> s;
|
|
Symbol a(1, ID());
|
|
Symbol b(3, ID());
|
|
s.Push();
|
|
s.Set(a, 5u);
|
|
s.Set(b, 10u);
|
|
|
|
EXPECT_EQ(s.Get(a), 5u);
|
|
EXPECT_EQ(s.Get(b), 10u);
|
|
|
|
s.Push();
|
|
|
|
s.Set(a, 15u);
|
|
EXPECT_EQ(s.Get(a), 15u);
|
|
EXPECT_EQ(s.Get(b), 10u);
|
|
|
|
s.Pop();
|
|
EXPECT_EQ(s.Get(a), 5u);
|
|
EXPECT_EQ(s.Get(b), 10u);
|
|
}
|
|
|
|
TEST_F(ScopeStackTest, Get_MissingSymbol) {
|
|
ScopeStack<uint32_t> s;
|
|
Symbol sym(1, ID());
|
|
EXPECT_EQ(s.Get(sym), 0u);
|
|
}
|
|
|
|
TEST_F(ScopeStackTest, Set) {
|
|
ScopeStack<uint32_t> s;
|
|
Symbol a(1, ID());
|
|
Symbol b(2, ID());
|
|
|
|
EXPECT_EQ(s.Set(a, 5u), 0u);
|
|
EXPECT_EQ(s.Get(a), 5u);
|
|
|
|
EXPECT_EQ(s.Set(b, 10u), 0u);
|
|
EXPECT_EQ(s.Get(b), 10u);
|
|
|
|
EXPECT_EQ(s.Set(a, 20u), 5u);
|
|
EXPECT_EQ(s.Get(a), 20u);
|
|
|
|
EXPECT_EQ(s.Set(b, 25u), 10u);
|
|
EXPECT_EQ(s.Get(b), 25u);
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace tint
|