[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:
David Neto 2020-04-01 17:56:18 +00:00 committed by dan sinclair
parent e0bcb544ac
commit 84f70c0a90
2 changed files with 53 additions and 1 deletions

View File

@ -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));
}

View File

@ -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