mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-12 14:46:08 +00:00
reader/wgsl: Remove old shader IO syntax
Removing parsing support for the 'in' and 'out' storage classes is enough to prevent anyone from using the old syntax. The Input and Output storage classes will remain in the AST for now, as the SPIR-V reader still has codepaths that use them, and the SPIR-V writer currently still relies on them. Bug: tint:697 Change-Id: Ifef9eda8bcbf2f243b1e1d8d4fab25784cd3f80e Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/54841 Auto-Submit: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: James Price <jrprice@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
443c41de33
commit
90503dec9c
@@ -326,236 +326,6 @@ fn entry_c([[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]]
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, OLD_BasicModuleVertexIndex) {
|
||||
auto* src = R"(
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn test() -> u32 {
|
||||
return vert_idx;
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(test());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
first_vertex_index : u32;
|
||||
};
|
||||
|
||||
[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn test() -> u32 {
|
||||
return (vert_idx + tint_symbol_1.first_vertex_index);
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(test());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
DataMap config;
|
||||
config.Add<FirstIndexOffset::BindingPoint>(1, 2);
|
||||
auto got = Run<FirstIndexOffset>(src, std::move(config));
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 0u);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, OLD_BasicModuleInstanceIndex) {
|
||||
auto* src = R"(
|
||||
[[builtin(instance_index)]] var<in> inst_idx : u32;
|
||||
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn test() -> u32 {
|
||||
return inst_idx;
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(test());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
first_instance_index : u32;
|
||||
};
|
||||
|
||||
[[binding(1), group(7)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
|
||||
[[builtin(instance_index)]] var<in> inst_idx : u32;
|
||||
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn test() -> u32 {
|
||||
return (inst_idx + tint_symbol_1.first_instance_index);
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(test());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
DataMap config;
|
||||
config.Add<FirstIndexOffset::BindingPoint>(1, 7);
|
||||
auto got = Run<FirstIndexOffset>(src, std::move(config));
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, false);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 0u);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, OLD_BasicModuleBothIndex) {
|
||||
auto* src = R"(
|
||||
[[builtin(instance_index)]] var<in> instance_idx : u32;
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn test() -> u32 {
|
||||
return instance_idx + vert_idx;
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(test());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
first_vertex_index : u32;
|
||||
first_instance_index : u32;
|
||||
};
|
||||
|
||||
[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
|
||||
[[builtin(instance_index)]] var<in> instance_idx : u32;
|
||||
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn test() -> u32 {
|
||||
return ((instance_idx + tint_symbol_1.first_instance_index) + (vert_idx + tint_symbol_1.first_vertex_index));
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(test());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
DataMap config;
|
||||
config.Add<FirstIndexOffset::BindingPoint>(1, 2);
|
||||
auto got = Run<FirstIndexOffset>(src, std::move(config));
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, OLD_NestedCalls) {
|
||||
auto* src = R"(
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn func1() -> u32 {
|
||||
return vert_idx;
|
||||
}
|
||||
|
||||
fn func2() -> u32 {
|
||||
return func1();
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(func2());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
first_vertex_index : u32;
|
||||
};
|
||||
|
||||
[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
|
||||
[[builtin(position)]] var<out> pos : vec4<f32>;
|
||||
|
||||
fn func1() -> u32 {
|
||||
return (vert_idx + tint_symbol_1.first_vertex_index);
|
||||
}
|
||||
|
||||
fn func2() -> u32 {
|
||||
return func1();
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() {
|
||||
ignore(func2());
|
||||
pos = vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
DataMap config;
|
||||
config.Add<FirstIndexOffset::BindingPoint>(1, 2);
|
||||
auto got = Run<FirstIndexOffset>(src, std::move(config));
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 0u);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace transform
|
||||
} // namespace tint
|
||||
|
||||
@@ -42,29 +42,26 @@ TEST_F(RenamerTest, EmptyModule) {
|
||||
|
||||
TEST_F(RenamerTest, BasicModuleVertexIndex) {
|
||||
auto* src = R"(
|
||||
[[builtin(vertex_index)]] var<in> vert_idx : u32;
|
||||
|
||||
fn test() -> u32 {
|
||||
fn test(vert_idx : u32) -> u32 {
|
||||
return vert_idx;
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn entry() -> [[builtin(position)]] vec4<f32> {
|
||||
ignore(test());
|
||||
fn entry([[builtin(vertex_index)]] vert_idx : u32
|
||||
) -> [[builtin(position)]] vec4<f32> {
|
||||
ignore(test(vert_idx));
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[builtin(vertex_index)]] var<in> tint_symbol : u32;
|
||||
|
||||
fn tint_symbol_1() -> u32 {
|
||||
return tint_symbol;
|
||||
fn tint_symbol(tint_symbol_1 : u32) -> u32 {
|
||||
return tint_symbol_1;
|
||||
}
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn tint_symbol_2() -> [[builtin(position)]] vec4<f32> {
|
||||
ignore(tint_symbol_1());
|
||||
fn tint_symbol_2([[builtin(vertex_index)]] tint_symbol_1 : u32) -> [[builtin(position)]] vec4<f32> {
|
||||
ignore(tint_symbol(tint_symbol_1));
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
@@ -77,8 +74,8 @@ fn tint_symbol_2() -> [[builtin(position)]] vec4<f32> {
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
Renamer::Data::Remappings expected_remappings = {
|
||||
{"vert_idx", "tint_symbol"},
|
||||
{"test", "tint_symbol_1"},
|
||||
{"vert_idx", "tint_symbol_1"},
|
||||
{"test", "tint_symbol"},
|
||||
{"entry", "tint_symbol_2"},
|
||||
};
|
||||
EXPECT_THAT(data->remappings, ContainerEq(expected_remappings));
|
||||
|
||||
@@ -492,28 +492,29 @@ fn main() {
|
||||
|
||||
TEST_F(SpirvTest, HandleSampleMaskBuiltins_Basic) {
|
||||
auto* src = R"(
|
||||
[[builtin(sample_index)]] var<in> sample_index : u32;
|
||||
|
||||
[[builtin(sample_mask)]] var<in> mask_in : u32;
|
||||
|
||||
[[builtin(sample_mask)]] var<out> mask_out : u32;
|
||||
|
||||
[[stage(fragment)]]
|
||||
fn main() {
|
||||
mask_out = mask_in;
|
||||
fn main([[builtin(sample_index)]] sample_index : u32,
|
||||
[[builtin(sample_mask)]] mask_in : u32
|
||||
) -> [[builtin(sample_mask)]] u32 {
|
||||
return mask_in;
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[builtin(sample_index)]] var<in> sample_index : u32;
|
||||
[[builtin(sample_index)]] var<in> tint_symbol : u32;
|
||||
|
||||
[[builtin(sample_mask)]] var<in> mask_in : array<u32, 1>;
|
||||
[[builtin(sample_mask)]] var<in> tint_symbol_1 : array<u32, 1>;
|
||||
|
||||
[[builtin(sample_mask)]] var<out> mask_out : array<u32, 1>;
|
||||
[[builtin(sample_mask)]] var<out> tint_symbol_3 : array<u32, 1>;
|
||||
|
||||
fn tint_symbol_4(tint_symbol_2 : u32) {
|
||||
tint_symbol_3[0] = tint_symbol_2;
|
||||
}
|
||||
|
||||
[[stage(fragment)]]
|
||||
fn main() {
|
||||
mask_out[0] = mask_in[0];
|
||||
tint_symbol_4(tint_symbol_1[0]);
|
||||
return;
|
||||
}
|
||||
)";
|
||||
|
||||
@@ -524,40 +525,42 @@ fn main() {
|
||||
|
||||
TEST_F(SpirvTest, HandleSampleMaskBuiltins_FunctionArg) {
|
||||
auto* src = R"(
|
||||
[[builtin(sample_mask)]] var<in> mask_in : u32;
|
||||
|
||||
[[builtin(sample_mask)]] var<out> mask_out : u32;
|
||||
|
||||
fn filter(mask: u32) -> u32 {
|
||||
return (mask & 3u);
|
||||
}
|
||||
|
||||
fn set_mask(input : u32) {
|
||||
mask_out = input;
|
||||
fn set_mask(input : u32) -> u32 {
|
||||
return input;
|
||||
}
|
||||
|
||||
[[stage(fragment)]]
|
||||
fn main() {
|
||||
set_mask(filter(mask_in));
|
||||
fn main([[builtin(sample_mask)]] mask_in : u32
|
||||
) -> [[builtin(sample_mask)]] u32 {
|
||||
return set_mask(filter(mask_in));
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[builtin(sample_mask)]] var<in> mask_in : array<u32, 1>;
|
||||
|
||||
[[builtin(sample_mask)]] var<out> mask_out : array<u32, 1>;
|
||||
|
||||
fn filter(mask : u32) -> u32 {
|
||||
return (mask & 3u);
|
||||
}
|
||||
|
||||
fn set_mask(input : u32) {
|
||||
mask_out[0] = input;
|
||||
fn set_mask(input : u32) -> u32 {
|
||||
return input;
|
||||
}
|
||||
|
||||
[[builtin(sample_mask)]] var<in> tint_symbol : array<u32, 1>;
|
||||
|
||||
[[builtin(sample_mask)]] var<out> tint_symbol_2 : array<u32, 1>;
|
||||
|
||||
fn tint_symbol_3(tint_symbol_1 : u32) {
|
||||
tint_symbol_2[0] = tint_symbol_1;
|
||||
}
|
||||
|
||||
[[stage(fragment)]]
|
||||
fn main() {
|
||||
set_mask(filter(mask_in[0]));
|
||||
tint_symbol_3(set_mask(filter(tint_symbol[0])));
|
||||
return;
|
||||
}
|
||||
)";
|
||||
|
||||
|
||||
@@ -652,174 +652,6 @@ fn main([[builtin(vertex_index)]] tint_pulling_vertex_index_1 : u32) -> [[builti
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/697): Remove this.
|
||||
TEST_F(VertexPullingTest, OneAttributeDifferentOutputSet_Legacy) {
|
||||
auto* src = R"(
|
||||
[[location(0)]] var<in> var_a : f32;
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn main() -> [[builtin(position)]] vec4<f32> {
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index : u32;
|
||||
|
||||
[[block]]
|
||||
struct TintVertexData {
|
||||
tint_vertex_data : [[stride(4)]] array<u32>;
|
||||
};
|
||||
|
||||
[[binding(0), group(5)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
|
||||
|
||||
var<private> var_a : f32;
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn main() -> [[builtin(position)]] vec4<f32> {
|
||||
{
|
||||
var tint_pulling_pos : u32;
|
||||
tint_pulling_pos = ((tint_pulling_vertex_index * 4u) + 0u);
|
||||
var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
|
||||
}
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
VertexPulling::Config cfg;
|
||||
cfg.vertex_state = {
|
||||
{{4, InputStepMode::kVertex, {{VertexFormat::kF32, 0, 0}}}}};
|
||||
cfg.pulling_group = 5;
|
||||
cfg.entry_point_name = "main";
|
||||
|
||||
DataMap data;
|
||||
data.Add<VertexPulling::Config>(cfg);
|
||||
auto got = Run<VertexPulling>(src, data);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/697): Remove this.
|
||||
// We expect the transform to use an existing builtin variables if it finds them
|
||||
TEST_F(VertexPullingTest, ExistingVertexIndexAndInstanceIndex_Legacy) {
|
||||
auto* src = R"(
|
||||
[[location(0)]] var<in> var_a : f32;
|
||||
[[location(1)]] var<in> var_b : f32;
|
||||
[[builtin(vertex_index)]] var<in> custom_vertex_index : u32;
|
||||
[[builtin(instance_index)]] var<in> custom_instance_index : u32;
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn main() -> [[builtin(position)]] vec4<f32> {
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct TintVertexData {
|
||||
tint_vertex_data : [[stride(4)]] array<u32>;
|
||||
};
|
||||
|
||||
[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
|
||||
|
||||
[[binding(1), group(4)]] var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
|
||||
|
||||
var<private> var_a : f32;
|
||||
|
||||
var<private> var_b : f32;
|
||||
|
||||
[[builtin(vertex_index)]] var<in> custom_vertex_index : u32;
|
||||
|
||||
[[builtin(instance_index)]] var<in> custom_instance_index : u32;
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn main() -> [[builtin(position)]] vec4<f32> {
|
||||
{
|
||||
var tint_pulling_pos : u32;
|
||||
tint_pulling_pos = ((custom_vertex_index * 4u) + 0u);
|
||||
var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
|
||||
tint_pulling_pos = ((custom_instance_index * 4u) + 0u);
|
||||
var_b = bitcast<f32>(tint_pulling_vertex_buffer_1.tint_vertex_data[(tint_pulling_pos / 4u)]);
|
||||
}
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
VertexPulling::Config cfg;
|
||||
cfg.vertex_state = {{
|
||||
{
|
||||
4,
|
||||
InputStepMode::kVertex,
|
||||
{{VertexFormat::kF32, 0, 0}},
|
||||
},
|
||||
{
|
||||
4,
|
||||
InputStepMode::kInstance,
|
||||
{{VertexFormat::kF32, 0, 1}},
|
||||
},
|
||||
}};
|
||||
cfg.entry_point_name = "main";
|
||||
|
||||
DataMap data;
|
||||
data.Add<VertexPulling::Config>(cfg);
|
||||
auto got = Run<VertexPulling>(src, data);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/697): Remove this.
|
||||
TEST_F(VertexPullingTest, TwoAttributesSameBuffer_Legacy) {
|
||||
auto* src = R"(
|
||||
[[location(0)]] var<in> var_a : f32;
|
||||
[[location(1)]] var<in> var_b : vec4<f32>;
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn main() -> [[builtin(position)]] vec4<f32> {
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index : u32;
|
||||
|
||||
[[block]]
|
||||
struct TintVertexData {
|
||||
tint_vertex_data : [[stride(4)]] array<u32>;
|
||||
};
|
||||
|
||||
[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
|
||||
|
||||
var<private> var_a : f32;
|
||||
|
||||
var<private> var_b : vec4<f32>;
|
||||
|
||||
[[stage(vertex)]]
|
||||
fn main() -> [[builtin(position)]] vec4<f32> {
|
||||
{
|
||||
var tint_pulling_pos : u32;
|
||||
tint_pulling_pos = ((tint_pulling_vertex_index * 16u) + 0u);
|
||||
var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
|
||||
tint_pulling_pos = ((tint_pulling_vertex_index * 16u) + 0u);
|
||||
var_b = vec4<f32>(bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 8u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 12u) / 4u)]));
|
||||
}
|
||||
return vec4<f32>();
|
||||
}
|
||||
)";
|
||||
|
||||
VertexPulling::Config cfg;
|
||||
cfg.vertex_state = {
|
||||
{{16,
|
||||
InputStepMode::kVertex,
|
||||
{{VertexFormat::kF32, 0, 0}, {VertexFormat::kVec4F32, 0, 1}}}}};
|
||||
cfg.entry_point_name = "main";
|
||||
|
||||
DataMap data;
|
||||
data.Add<VertexPulling::Config>(cfg);
|
||||
auto got = Run<VertexPulling>(src, data);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace transform
|
||||
} // namespace tint
|
||||
|
||||
Reference in New Issue
Block a user