Remove the `@stage` attribute
This CL removes the `@stage` attribute. Bug: tint:1503 Change-Id: I1e31e96056a053f0c1e92b4bfc3c63c3592e9765 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/108860 Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
4cd8452c3c
commit
f218af0461
|
@ -5,6 +5,8 @@
|
||||||
### Breaking changes
|
### Breaking changes
|
||||||
|
|
||||||
* `textureDimensions()`, `textureNumLayers()` and `textureNumLevels()` now return unsigned integers / vectors. [tint:1526](crbug.com/tint/1526)
|
* `textureDimensions()`, `textureNumLayers()` and `textureNumLevels()` now return unsigned integers / vectors. [tint:1526](crbug.com/tint/1526)
|
||||||
|
* The `@stage` attribute has been removed. The short forms should be used
|
||||||
|
instead (`@vertex`, `@fragment`, or `@compute`). [tint:1503](crbug.com/tint/1503)
|
||||||
|
|
||||||
### New features
|
### New features
|
||||||
|
|
||||||
|
|
|
@ -581,8 +581,8 @@ libtint_source_set("libtint_core_all_src") {
|
||||||
"utils/enum_set.h",
|
"utils/enum_set.h",
|
||||||
"utils/foreach_macro.h",
|
"utils/foreach_macro.h",
|
||||||
"utils/hash.h",
|
"utils/hash.h",
|
||||||
"utils/hashmap_base.h",
|
|
||||||
"utils/hashmap.h",
|
"utils/hashmap.h",
|
||||||
|
"utils/hashmap_base.h",
|
||||||
"utils/hashset.h",
|
"utils/hashset.h",
|
||||||
"utils/map.h",
|
"utils/map.h",
|
||||||
"utils/math.h",
|
"utils/math.h",
|
||||||
|
@ -1423,7 +1423,6 @@ if (tint_build_unittests) {
|
||||||
"reader/wgsl/parser_impl_multiplicative_expression_test.cc",
|
"reader/wgsl/parser_impl_multiplicative_expression_test.cc",
|
||||||
"reader/wgsl/parser_impl_param_list_test.cc",
|
"reader/wgsl/parser_impl_param_list_test.cc",
|
||||||
"reader/wgsl/parser_impl_paren_expression_test.cc",
|
"reader/wgsl/parser_impl_paren_expression_test.cc",
|
||||||
"reader/wgsl/parser_impl_pipeline_stage_test.cc",
|
|
||||||
"reader/wgsl/parser_impl_primary_expression_test.cc",
|
"reader/wgsl/parser_impl_primary_expression_test.cc",
|
||||||
"reader/wgsl/parser_impl_relational_expression_test.cc",
|
"reader/wgsl/parser_impl_relational_expression_test.cc",
|
||||||
"reader/wgsl/parser_impl_reserved_keyword_test.cc",
|
"reader/wgsl/parser_impl_reserved_keyword_test.cc",
|
||||||
|
|
|
@ -1054,7 +1054,6 @@ if(TINT_BUILD_TESTS)
|
||||||
reader/wgsl/parser_impl_multiplicative_expression_test.cc
|
reader/wgsl/parser_impl_multiplicative_expression_test.cc
|
||||||
reader/wgsl/parser_impl_param_list_test.cc
|
reader/wgsl/parser_impl_param_list_test.cc
|
||||||
reader/wgsl/parser_impl_paren_expression_test.cc
|
reader/wgsl/parser_impl_paren_expression_test.cc
|
||||||
reader/wgsl/parser_impl_pipeline_stage_test.cc
|
|
||||||
reader/wgsl/parser_impl_primary_expression_test.cc
|
reader/wgsl/parser_impl_primary_expression_test.cc
|
||||||
reader/wgsl/parser_impl_relational_expression_test.cc
|
reader/wgsl/parser_impl_relational_expression_test.cc
|
||||||
reader/wgsl/parser_impl_reserved_keyword_test.cc
|
reader/wgsl/parser_impl_reserved_keyword_test.cc
|
||||||
|
|
|
@ -1613,29 +1613,6 @@ Expect<ast::Parameter*> ParserImpl::expect_param() {
|
||||||
std::move(attrs.value)); // attributes
|
std::move(attrs.value)); // attributes
|
||||||
}
|
}
|
||||||
|
|
||||||
// pipeline_stage
|
|
||||||
// : VERTEX
|
|
||||||
// | FRAGMENT
|
|
||||||
// | COMPUTE
|
|
||||||
//
|
|
||||||
// TODO(crbug.com/tint/1503): Remove when deprecation period is over.
|
|
||||||
Expect<ast::PipelineStage> ParserImpl::expect_pipeline_stage() {
|
|
||||||
auto& t = peek();
|
|
||||||
if (t == "vertex") {
|
|
||||||
next(); // Consume the peek
|
|
||||||
return {ast::PipelineStage::kVertex, t.source()};
|
|
||||||
}
|
|
||||||
if (t == "fragment") {
|
|
||||||
next(); // Consume the peek
|
|
||||||
return {ast::PipelineStage::kFragment, t.source()};
|
|
||||||
}
|
|
||||||
if (t == "compute") {
|
|
||||||
next(); // Consume the peek
|
|
||||||
return {ast::PipelineStage::kCompute, t.source()};
|
|
||||||
}
|
|
||||||
return add_error(peek(), "invalid value for stage attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
// interpolation_sample_name
|
// interpolation_sample_name
|
||||||
// : 'center'
|
// : 'center'
|
||||||
// | 'centroid'
|
// | 'centroid'
|
||||||
|
@ -3637,34 +3614,6 @@ Maybe<const ast::Attribute*> ParserImpl::attribute() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(crbug.com/tint/1503): Remove when deprecation period is over.
|
|
||||||
if (t == "stage") {
|
|
||||||
return expect_paren_block("stage attribute", [&]() -> Result {
|
|
||||||
auto stage = expect_pipeline_stage();
|
|
||||||
if (stage.errored) {
|
|
||||||
return Failure::kErrored;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string warning = "remove stage and use @";
|
|
||||||
switch (stage.value) {
|
|
||||||
case ast::PipelineStage::kVertex:
|
|
||||||
warning += "vertex";
|
|
||||||
break;
|
|
||||||
case ast::PipelineStage::kFragment:
|
|
||||||
warning += "fragment";
|
|
||||||
break;
|
|
||||||
case ast::PipelineStage::kCompute:
|
|
||||||
warning += "compute";
|
|
||||||
break;
|
|
||||||
case ast::PipelineStage::kNone:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
deprecated(t.source(), warning);
|
|
||||||
|
|
||||||
return create<ast::StageAttribute>(t.source(), stage.value);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t == "vertex") {
|
if (t == "vertex") {
|
||||||
return create<ast::StageAttribute>(t.source(), ast::PipelineStage::kVertex);
|
return create<ast::StageAttribute>(t.source(), ast::PipelineStage::kVertex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -351,48 +351,6 @@ fn f() { static_assert true }
|
||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(crbug.com/tint/1503): Remove this when @stage is removed
|
|
||||||
TEST_F(ParserImplErrorTest, FunctionDeclStageMissingLParen) {
|
|
||||||
EXPECT("@stage vertex) fn f() {}",
|
|
||||||
R"(test.wgsl:1:8 error: expected '(' for stage attribute
|
|
||||||
@stage vertex) fn f() {}
|
|
||||||
^^^^^^
|
|
||||||
)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplErrorTest, FunctionDeclStageMissingRParen) {
|
|
||||||
EXPECT(
|
|
||||||
"@stage(vertex fn f() {}",
|
|
||||||
R"(test.wgsl:1:2 warning: use of deprecated language feature: remove stage and use @vertex
|
|
||||||
@stage(vertex fn f() {}
|
|
||||||
^^^^^
|
|
||||||
|
|
||||||
test.wgsl:1:15 error: expected ')' for stage attribute
|
|
||||||
@stage(vertex fn f() {}
|
|
||||||
^^
|
|
||||||
)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplErrorTest, FunctionDeclStageInvalid) {
|
|
||||||
EXPECT("@stage(x) fn f() {}",
|
|
||||||
R"(test.wgsl:1:8 error: invalid value for stage attribute
|
|
||||||
@stage(x) fn f() {}
|
|
||||||
^
|
|
||||||
)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplErrorTest, FunctionDeclStageTypeInvalid) {
|
|
||||||
EXPECT("@shader(vertex) fn main() {}",
|
|
||||||
R"(test.wgsl:1:2 error: expected attribute
|
|
||||||
@shader(vertex) fn main() {}
|
|
||||||
^^^^^^
|
|
||||||
|
|
||||||
test.wgsl:1:8 error: unexpected token
|
|
||||||
@shader(vertex) fn main() {}
|
|
||||||
^
|
|
||||||
)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplErrorTest, FunctionDeclWorkgroupSizeXInvalid) {
|
TEST_F(ParserImplErrorTest, FunctionDeclWorkgroupSizeXInvalid) {
|
||||||
EXPECT("@workgroup_size() fn f() {}",
|
EXPECT("@workgroup_size() fn f() {}",
|
||||||
R"(test.wgsl:1:17 error: expected workgroup_size x parameter
|
R"(test.wgsl:1:17 error: expected workgroup_size x parameter
|
||||||
|
|
|
@ -18,33 +18,6 @@
|
||||||
namespace tint::reader::wgsl {
|
namespace tint::reader::wgsl {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// TODO(crbug.com/tint/1503): Remove this when @stage is removed
|
|
||||||
TEST_F(ParserImplTest, AttributeList_Parses_Stage) {
|
|
||||||
auto p = parser("@workgroup_size(2) @stage(compute)");
|
|
||||||
auto attrs = p->attribute_list();
|
|
||||||
EXPECT_FALSE(p->has_error()) << p->error();
|
|
||||||
EXPECT_FALSE(attrs.errored);
|
|
||||||
EXPECT_TRUE(attrs.matched);
|
|
||||||
ASSERT_EQ(attrs.value.Length(), 2u);
|
|
||||||
|
|
||||||
auto* attr_0 = attrs.value[0]->As<ast::Attribute>();
|
|
||||||
auto* attr_1 = attrs.value[1]->As<ast::Attribute>();
|
|
||||||
ASSERT_NE(attr_0, nullptr);
|
|
||||||
ASSERT_NE(attr_1, nullptr);
|
|
||||||
|
|
||||||
ASSERT_TRUE(attr_0->Is<ast::WorkgroupAttribute>());
|
|
||||||
const ast::Expression* x = attr_0->As<ast::WorkgroupAttribute>()->x;
|
|
||||||
ASSERT_NE(x, nullptr);
|
|
||||||
auto* x_literal = x->As<ast::LiteralExpression>();
|
|
||||||
ASSERT_NE(x_literal, nullptr);
|
|
||||||
ASSERT_TRUE(x_literal->Is<ast::IntLiteralExpression>());
|
|
||||||
EXPECT_EQ(x_literal->As<ast::IntLiteralExpression>()->value, 2);
|
|
||||||
EXPECT_EQ(x_literal->As<ast::IntLiteralExpression>()->suffix,
|
|
||||||
ast::IntLiteralExpression::Suffix::kNone);
|
|
||||||
ASSERT_TRUE(attr_1->Is<ast::StageAttribute>());
|
|
||||||
EXPECT_EQ(attr_1->As<ast::StageAttribute>()->stage, ast::PipelineStage::kCompute);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, AttributeList_Parses) {
|
TEST_F(ParserImplTest, AttributeList_Parses) {
|
||||||
auto p = parser("@workgroup_size(2) @compute");
|
auto p = parser("@workgroup_size(2) @compute");
|
||||||
auto attrs = p->attribute_list();
|
auto attrs = p->attribute_list();
|
||||||
|
@ -81,14 +54,5 @@ TEST_F(ParserImplTest, AttributeList_Invalid) {
|
||||||
EXPECT_EQ(p->error(), "1:2: expected attribute");
|
EXPECT_EQ(p->error(), "1:2: expected attribute");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, AttributeList_BadAttribute) {
|
|
||||||
auto p = parser("@stage()");
|
|
||||||
auto attrs = p->attribute_list();
|
|
||||||
EXPECT_TRUE(p->has_error());
|
|
||||||
EXPECT_TRUE(attrs.errored);
|
|
||||||
EXPECT_FALSE(attrs.matched);
|
|
||||||
EXPECT_EQ(p->error(), "1:8: invalid value for stage attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace tint::reader::wgsl
|
} // namespace tint::reader::wgsl
|
||||||
|
|
|
@ -397,61 +397,6 @@ TEST_F(ParserImplTest, Attribute_Workgroup_Missing_Z_Comma) {
|
||||||
EXPECT_EQ(p->error(), "1:21: expected ')' for workgroup_size attribute");
|
EXPECT_EQ(p->error(), "1:21: expected ')' for workgroup_size attribute");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(crbug.com/tint/1503): Remove when @stage is removed
|
|
||||||
TEST_F(ParserImplTest, Attribute_Stage) {
|
|
||||||
auto p = parser("stage(compute)");
|
|
||||||
auto attr = p->attribute();
|
|
||||||
EXPECT_TRUE(attr.matched);
|
|
||||||
EXPECT_FALSE(attr.errored);
|
|
||||||
ASSERT_NE(attr.value, nullptr) << p->error();
|
|
||||||
ASSERT_FALSE(p->has_error());
|
|
||||||
auto* func_attr = attr.value->As<ast::Attribute>();
|
|
||||||
ASSERT_NE(func_attr, nullptr);
|
|
||||||
ASSERT_TRUE(func_attr->Is<ast::StageAttribute>());
|
|
||||||
EXPECT_EQ(func_attr->As<ast::StageAttribute>()->stage, ast::PipelineStage::kCompute);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, Attribute_Stage_MissingValue) {
|
|
||||||
auto p = parser("stage()");
|
|
||||||
auto attr = p->attribute();
|
|
||||||
EXPECT_FALSE(attr.matched);
|
|
||||||
EXPECT_TRUE(attr.errored);
|
|
||||||
EXPECT_EQ(attr.value, nullptr);
|
|
||||||
EXPECT_TRUE(p->has_error());
|
|
||||||
EXPECT_EQ(p->error(), "1:7: invalid value for stage attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, Attribute_Stage_MissingInvalid) {
|
|
||||||
auto p = parser("stage(nan)");
|
|
||||||
auto attr = p->attribute();
|
|
||||||
EXPECT_FALSE(attr.matched);
|
|
||||||
EXPECT_TRUE(attr.errored);
|
|
||||||
EXPECT_EQ(attr.value, nullptr);
|
|
||||||
EXPECT_TRUE(p->has_error());
|
|
||||||
EXPECT_EQ(p->error(), "1:7: invalid value for stage attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, Attribute_Stage_MissingLeftParen) {
|
|
||||||
auto p = parser("stage compute)");
|
|
||||||
auto attr = p->attribute();
|
|
||||||
EXPECT_FALSE(attr.matched);
|
|
||||||
EXPECT_TRUE(attr.errored);
|
|
||||||
EXPECT_EQ(attr.value, nullptr);
|
|
||||||
EXPECT_TRUE(p->has_error());
|
|
||||||
EXPECT_EQ(p->error(), "1:7: expected '(' for stage attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, Attribute_Stage_MissingRightParen) {
|
|
||||||
auto p = parser("stage(compute");
|
|
||||||
auto attr = p->attribute();
|
|
||||||
EXPECT_FALSE(attr.matched);
|
|
||||||
EXPECT_TRUE(attr.errored);
|
|
||||||
EXPECT_EQ(attr.value, nullptr);
|
|
||||||
EXPECT_TRUE(p->has_error());
|
|
||||||
EXPECT_EQ(p->error(), R"(1:1: use of deprecated language feature: remove stage and use @compute
|
|
||||||
1:14: expected ')' for stage attribute)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, Attribute_Compute) {
|
TEST_F(ParserImplTest, Attribute_Compute) {
|
||||||
auto p = parser("compute");
|
auto p = parser("compute");
|
||||||
auto attr = p->attribute();
|
auto attr = p->attribute();
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
// 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/tint/reader/wgsl/parser_impl_test_helper.h"
|
|
||||||
|
|
||||||
namespace tint::reader::wgsl {
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
struct PipelineStageData {
|
|
||||||
std::string input;
|
|
||||||
ast::PipelineStage result;
|
|
||||||
};
|
|
||||||
inline std::ostream& operator<<(std::ostream& out, PipelineStageData data) {
|
|
||||||
return out << data.input;
|
|
||||||
}
|
|
||||||
|
|
||||||
class PipelineStageTest : public ParserImplTestWithParam<PipelineStageData> {};
|
|
||||||
|
|
||||||
TEST_P(PipelineStageTest, Parses) {
|
|
||||||
auto params = GetParam();
|
|
||||||
auto p = parser(params.input);
|
|
||||||
|
|
||||||
auto stage = p->expect_pipeline_stage();
|
|
||||||
ASSERT_FALSE(p->has_error()) << p->error();
|
|
||||||
ASSERT_FALSE(stage.errored);
|
|
||||||
EXPECT_EQ(stage.value, params.result);
|
|
||||||
EXPECT_EQ(stage.source.range.begin.line, 1u);
|
|
||||||
EXPECT_EQ(stage.source.range.begin.column, 1u);
|
|
||||||
EXPECT_EQ(stage.source.range.end.line, 1u);
|
|
||||||
EXPECT_EQ(stage.source.range.end.column, 1u + params.input.size());
|
|
||||||
|
|
||||||
auto& t = p->next();
|
|
||||||
EXPECT_TRUE(t.IsEof());
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_SUITE_P(
|
|
||||||
ParserImplTest,
|
|
||||||
PipelineStageTest,
|
|
||||||
testing::Values(PipelineStageData{"vertex", ast::PipelineStage::kVertex},
|
|
||||||
PipelineStageData{"fragment", ast::PipelineStage::kFragment},
|
|
||||||
PipelineStageData{"compute", ast::PipelineStage::kCompute}));
|
|
||||||
|
|
||||||
TEST_F(ParserImplTest, PipelineStage_NoMatch) {
|
|
||||||
auto p = parser("not-a-stage");
|
|
||||||
auto stage = p->expect_pipeline_stage();
|
|
||||||
ASSERT_TRUE(p->has_error());
|
|
||||||
ASSERT_TRUE(stage.errored);
|
|
||||||
ASSERT_EQ(p->error(), "1:1: invalid value for stage attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
} // namespace tint::reader::wgsl
|
|
Loading…
Reference in New Issue