[hlsl-writer] Fix emission of struct aliases.

You can only typedef builtin types in HLSL. This Cl updates the struct
emission to emit named structs instead of typedef'd structs.

Bug: tint:7
Change-Id: I835b7f4d23bc225c730ef3f39c4572c043a58156
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/26921
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
dan sinclair 2020-08-19 19:00:21 +00:00 committed by Commit Bot service account
parent bfaa6f8e57
commit 1811639709
3 changed files with 22 additions and 9 deletions

View File

@ -137,11 +137,19 @@ std::string GeneratorImpl::current_ep_var_name(VarType type) {
bool GeneratorImpl::EmitAliasType(const ast::type::AliasType* alias) {
make_indent();
out_ << "typedef ";
if (!EmitType(alias->type(), "")) {
return false;
if (alias->type()->IsStruct()) {
if (!EmitType(alias->type(), namer_.NameFor(alias->name()))) {
return false;
}
out_ << ";" << std::endl;
} else {
out_ << "typedef ";
if (!EmitType(alias->type(), "")) {
return false;
}
out_ << " " << namer_.NameFor(alias->name()) << ";" << std::endl;
}
out_ << " " << namer_.NameFor(alias->name()) << ";" << std::endl;
return true;
}
@ -1268,7 +1276,12 @@ bool GeneratorImpl::EmitType(ast::type::Type* type, const std::string& name) {
// TODO(dsinclair): Block decoration?
// if (str->decoration() != ast::StructDecoration::kNone) {
// }
out_ << "struct {" << std::endl;
out_ << "struct";
// If a name was provided for the struct emit it.
if (!name.empty()) {
out_ << " " << name;
}
out_ << " {" << std::endl;
increment_indent();
for (const auto& mem : str->members()) {

View File

@ -74,10 +74,10 @@ TEST_F(HlslGeneratorImplTest, EmitAliasType_Struct) {
ast::Module m;
GeneratorImpl g(&m);
ASSERT_TRUE(g.EmitAliasType(&alias)) << g.error();
EXPECT_EQ(g.result(), R"(typedef struct {
EXPECT_EQ(g.result(), R"(struct a {
float a;
int b;
} a;
};
)");
}

View File

@ -402,9 +402,9 @@ TEST_F(HlslGeneratorImplTest, Emit_Function_EntryPoint_With_UniformStruct) {
GeneratorImpl g(&mod);
ASSERT_TRUE(g.Generate()) << g.error();
EXPECT_EQ(g.result(), R"(typedef struct {
EXPECT_EQ(g.result(), R"(struct Uniforms {
vector<float, 4> coord;
} Uniforms;
};
ConstantBuffer<Uniforms> uniforms : register(b0);