[spirv-reader] Emit module-scope builtin vars
Bug: tint:3 Change-Id: I47ed2e9ed97fd7c45a5aa060a9a6aeaca88092cd Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/18500 Reviewed-by: dan sinclair <dsinclair@google.com>
This commit is contained in:
parent
e0bcb544ac
commit
84f70c0a90
|
@ -28,6 +28,8 @@
|
|||
#include "source/opt/type_manager.h"
|
||||
#include "source/opt/types.h"
|
||||
#include "spirv-tools/libspirv.hpp"
|
||||
#include "src/ast/builtin_decoration.h"
|
||||
#include "src/ast/decorated_variable.h"
|
||||
#include "src/ast/struct.h"
|
||||
#include "src/ast/struct_decoration.h"
|
||||
#include "src/ast/struct_member.h"
|
||||
|
@ -47,6 +49,7 @@
|
|||
#include "src/ast/type/void_type.h"
|
||||
#include "src/ast/variable.h"
|
||||
#include "src/ast/variable_decl_statement.h"
|
||||
#include "src/ast/variable_decoration.h"
|
||||
#include "src/type_manager.h"
|
||||
|
||||
namespace tint {
|
||||
|
@ -638,7 +641,34 @@ bool ParserImpl::EmitModuleScopeVariables() {
|
|||
}
|
||||
auto ast_var = std::make_unique<ast::Variable>(
|
||||
namer_.GetName(var.result_id()), ast_storage_class, ast_store_type);
|
||||
// TODO(dneto): decorated variables
|
||||
|
||||
std::vector<std::unique_ptr<ast::VariableDecoration>> ast_decorations;
|
||||
for (auto& deco : GetDecorationsFor(var.result_id())) {
|
||||
if (deco.empty()) {
|
||||
return Fail() << "malformed decoration on ID " << var.result_id()
|
||||
<< ": it is empty";
|
||||
}
|
||||
if (deco[0] == SpvDecorationBuiltIn) {
|
||||
if (deco.size() == 1) {
|
||||
return Fail() << "malformed BuiltIn decoration on ID "
|
||||
<< var.result_id() << ": has no operand";
|
||||
}
|
||||
auto ast_builtin =
|
||||
enum_converter_.ToBuiltin(static_cast<SpvBuiltIn>(deco[1]));
|
||||
if (ast_builtin == ast::Builtin::kNone) {
|
||||
return false;
|
||||
}
|
||||
ast_decorations.emplace_back(
|
||||
std::make_unique<ast::BuiltinDecoration>(ast_builtin));
|
||||
}
|
||||
}
|
||||
if (!ast_decorations.empty()) {
|
||||
auto decorated_var =
|
||||
std::make_unique<ast::DecoratedVariable>(std::move(ast_var));
|
||||
decorated_var->set_decorations(std::move(ast_decorations));
|
||||
ast_var = std::move(decorated_var);
|
||||
}
|
||||
|
||||
// TODO(dneto): initializers (a.k.a. constructor expression)
|
||||
ast_module_.AddGlobalVariable(std::move(ast_var));
|
||||
}
|
||||
|
|
|
@ -121,6 +121,28 @@ TEST_F(SpvParserTest, ModuleScopeVar_PrivateVar) {
|
|||
})"));
|
||||
}
|
||||
|
||||
TEST_F(SpvParserTest, ModuleScopeVar_BuiltinVerteIndex) {
|
||||
auto p = parser(test::Assemble(R"(
|
||||
OpDecorate %52 BuiltIn VertexIndex
|
||||
%uint = OpTypeInt 32 0
|
||||
%ptr = OpTypePointer Input %uint
|
||||
%52 = OpVariable %ptr Input
|
||||
)"));
|
||||
|
||||
EXPECT_TRUE(p->BuildAndParseInternalModule());
|
||||
EXPECT_TRUE(p->error().empty());
|
||||
const auto module_str = p->module().to_str();
|
||||
EXPECT_THAT(module_str, HasSubstr(R"(
|
||||
DecoratedVariable{
|
||||
Decorations{
|
||||
BuiltinDecoration{vertex_idx}
|
||||
}
|
||||
x_52
|
||||
in
|
||||
__u32
|
||||
})"));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace spirv
|
||||
} // namespace reader
|
||||
|
|
Loading…
Reference in New Issue