mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-08 13:09:10 +00:00
[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/type_manager.h"
|
||||||
#include "source/opt/types.h"
|
#include "source/opt/types.h"
|
||||||
#include "spirv-tools/libspirv.hpp"
|
#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.h"
|
||||||
#include "src/ast/struct_decoration.h"
|
#include "src/ast/struct_decoration.h"
|
||||||
#include "src/ast/struct_member.h"
|
#include "src/ast/struct_member.h"
|
||||||
@ -47,6 +49,7 @@
|
|||||||
#include "src/ast/type/void_type.h"
|
#include "src/ast/type/void_type.h"
|
||||||
#include "src/ast/variable.h"
|
#include "src/ast/variable.h"
|
||||||
#include "src/ast/variable_decl_statement.h"
|
#include "src/ast/variable_decl_statement.h"
|
||||||
|
#include "src/ast/variable_decoration.h"
|
||||||
#include "src/type_manager.h"
|
#include "src/type_manager.h"
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
@ -638,7 +641,34 @@ bool ParserImpl::EmitModuleScopeVariables() {
|
|||||||
}
|
}
|
||||||
auto ast_var = std::make_unique<ast::Variable>(
|
auto ast_var = std::make_unique<ast::Variable>(
|
||||||
namer_.GetName(var.result_id()), ast_storage_class, ast_store_type);
|
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)
|
// TODO(dneto): initializers (a.k.a. constructor expression)
|
||||||
ast_module_.AddGlobalVariable(std::move(ast_var));
|
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
|
||||||
} // namespace spirv
|
} // namespace spirv
|
||||||
} // namespace reader
|
} // namespace reader
|
||||||
|
Loading…
x
Reference in New Issue
Block a user