validation: structures cannot be empty
Fixed many tests that had empty structures. Change-Id: Id91312afa39a6293426f99d0dd12578dba46aa61 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56621 Auto-Submit: James Price <jrprice@google.com> Commit-Queue: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
d4c64af117
commit
37cabbb468
|
@ -359,7 +359,7 @@ using StructDecorationTest = TestWithParams;
|
||||||
TEST_P(StructDecorationTest, IsValid) {
|
TEST_P(StructDecorationTest, IsValid) {
|
||||||
auto& params = GetParam();
|
auto& params = GetParam();
|
||||||
|
|
||||||
Structure("mystruct", {},
|
Structure("mystruct", {Member("a", ty.f32())},
|
||||||
createDecorations(Source{{12, 34}}, *this, params.kind));
|
createDecorations(Source{{12, 34}}, *this, params.kind));
|
||||||
|
|
||||||
WrapInFunction();
|
WrapInFunction();
|
||||||
|
|
|
@ -102,12 +102,13 @@ TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Multiple) {
|
||||||
|
|
||||||
TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Struct) {
|
TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Struct) {
|
||||||
// struct Output {
|
// struct Output {
|
||||||
|
// a : f32;
|
||||||
// };
|
// };
|
||||||
// [[stage(vertex)]]
|
// [[stage(vertex)]]
|
||||||
// fn main() -> [[location(0)]] Output {
|
// fn main() -> [[location(0)]] Output {
|
||||||
// return Output();
|
// return Output();
|
||||||
// }
|
// }
|
||||||
auto* output = Structure("Output", {});
|
auto* output = Structure("Output", {Member("a", ty.f32())});
|
||||||
Func(Source{{12, 34}}, "main", {}, ty.Of(output),
|
Func(Source{{12, 34}}, "main", {}, ty.Of(output),
|
||||||
{Return(Construct(ty.Of(output)))}, {Stage(ast::PipelineStage::kVertex)},
|
{Return(Construct(ty.Of(output)))}, {Stage(ast::PipelineStage::kVertex)},
|
||||||
{Location(Source{{13, 43}}, 0)});
|
{Location(Source{{13, 43}}, 0)});
|
||||||
|
@ -328,10 +329,11 @@ TEST_F(ResolverEntryPointValidationTest, ParameterAttribute_Multiple) {
|
||||||
|
|
||||||
TEST_F(ResolverEntryPointValidationTest, ParameterAttribute_Struct) {
|
TEST_F(ResolverEntryPointValidationTest, ParameterAttribute_Struct) {
|
||||||
// struct Input {
|
// struct Input {
|
||||||
|
// a : f32;
|
||||||
// };
|
// };
|
||||||
// [[stage(fragment)]]
|
// [[stage(fragment)]]
|
||||||
// fn main([[location(0)]] param : Input) {}
|
// fn main([[location(0)]] param : Input) {}
|
||||||
auto* input = Structure("Input", {});
|
auto* input = Structure("Input", {Member("a", ty.f32())});
|
||||||
auto* param = Param("param", ty.Of(input), {Location(Source{{13, 43}}, 0)});
|
auto* param = Param("param", ty.Of(input), {Location(Source{{13, 43}}, 0)});
|
||||||
Func(Source{{12, 34}}, "main", {param}, ty.void_(), {},
|
Func(Source{{12, 34}}, "main", {param}, ty.void_(), {},
|
||||||
{Stage(ast::PipelineStage::kFragment)});
|
{Stage(ast::PipelineStage::kFragment)});
|
||||||
|
|
|
@ -3360,6 +3360,12 @@ bool Resolver::ValidateArrayStrideDecoration(const ast::StrideDecoration* deco,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Resolver::ValidateStructure(const sem::Struct* str) {
|
bool Resolver::ValidateStructure(const sem::Struct* str) {
|
||||||
|
if (str->Members().empty()) {
|
||||||
|
AddError("structures must have at least one member",
|
||||||
|
str->Declaration()->source());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto* member : str->Members()) {
|
for (auto* member : str->Members()) {
|
||||||
if (auto* r = member->Type()->As<sem::Array>()) {
|
if (auto* r = member->Type()->As<sem::Array>()) {
|
||||||
if (r->IsRuntimeSized()) {
|
if (r->IsRuntimeSized()) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ TEST_F(BindingRemapperTest, NoRemappings) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(2), binding(1)]] var<storage, read> a : S;
|
[[group(2), binding(1)]] var<storage, read> a : S;
|
||||||
|
@ -53,6 +54,7 @@ TEST_F(BindingRemapperTest, RemapBindingPoints) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(2), binding(1)]] var<storage, read> a : S;
|
[[group(2), binding(1)]] var<storage, read> a : S;
|
||||||
|
@ -67,6 +69,7 @@ fn f() {
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(1), binding(2)]] var<storage, read> a : S;
|
[[group(1), binding(2)]] var<storage, read> a : S;
|
||||||
|
@ -95,6 +98,7 @@ TEST_F(BindingRemapperTest, RemapAccessControls) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(2), binding(1)]] var<storage, read> a : S;
|
[[group(2), binding(1)]] var<storage, read> a : S;
|
||||||
|
@ -111,6 +115,7 @@ fn f() {
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(2), binding(1)]] var<storage, write> a : S;
|
[[group(2), binding(1)]] var<storage, write> a : S;
|
||||||
|
@ -143,6 +148,7 @@ TEST_F(BindingRemapperTest, DISABLED_RemapAccessControlsWithAliases) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
type, read ReadOnlyS = S;
|
type, read ReadOnlyS = S;
|
||||||
|
@ -165,6 +171,7 @@ fn f() {
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
type, read ReadOnlyS = S;
|
type, read ReadOnlyS = S;
|
||||||
|
@ -201,6 +208,7 @@ TEST_F(BindingRemapperTest, RemapAll) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(2), binding(1)]] var<storage, read> a : S;
|
[[group(2), binding(1)]] var<storage, read> a : S;
|
||||||
|
@ -215,6 +223,7 @@ fn f() {
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(4), binding(5)]] var<storage, write> a : S;
|
[[group(4), binding(5)]] var<storage, write> a : S;
|
||||||
|
@ -363,6 +372,7 @@ TEST_F(BindingRemapperTest, NoData) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(2), binding(1)]] var<storage, read> a : S;
|
[[group(2), binding(1)]] var<storage, read> a : S;
|
||||||
|
|
|
@ -191,6 +191,7 @@ TEST_F(MslTest, HandleModuleScopeVariables_OtherVariables) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(0), binding(0)]]
|
[[group(0), binding(0)]]
|
||||||
|
@ -204,6 +205,7 @@ fn main() {
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[group(0), binding(0)]] var<uniform> u : S;
|
[[group(0), binding(0)]] var<uniform> u : S;
|
||||||
|
|
|
@ -169,7 +169,11 @@ TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Struct) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Struct_Empty) {
|
TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Struct_Empty) {
|
||||||
auto* str = Structure("S", {});
|
auto* str = Structure("S", {
|
||||||
|
Member("a", ty.i32()),
|
||||||
|
Member("b", ty.f32()),
|
||||||
|
Member("c", ty.vec3<i32>()),
|
||||||
|
});
|
||||||
|
|
||||||
WrapInFunction(Construct(ty.Of(str)));
|
WrapInFunction(Construct(ty.Of(str)));
|
||||||
|
|
||||||
|
|
|
@ -266,22 +266,6 @@ TEST_F(BuilderTest_Type, ReturnsGeneratedPtr) {
|
||||||
EXPECT_EQ(b.GenerateTypeIfNeeded(ptr), 1u);
|
EXPECT_EQ(b.GenerateTypeIfNeeded(ptr), 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BuilderTest_Type, GenerateStruct_Empty) {
|
|
||||||
auto* s = Structure("S", {});
|
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
|
||||||
|
|
||||||
auto id = b.GenerateTypeIfNeeded(program->TypeOf(s));
|
|
||||||
ASSERT_FALSE(b.has_error()) << b.error();
|
|
||||||
EXPECT_EQ(id, 1u);
|
|
||||||
|
|
||||||
EXPECT_EQ(b.types().size(), 1u);
|
|
||||||
EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
|
|
||||||
)");
|
|
||||||
EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeStruct
|
|
||||||
)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(BuilderTest_Type, GenerateStruct) {
|
TEST_F(BuilderTest_Type, GenerateStruct) {
|
||||||
auto* s = Structure("my_struct", {Member("a", ty.f32())});
|
auto* s = Structure("my_struct", {Member("a", ty.f32())});
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[stage(compute), workgroup_size(1)]]
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
@ -24,7 +25,7 @@ void main() {
|
||||||
const float3x4 m3x4_let = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
const float3x4 m3x4_let = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
tint_array_wrapper arr_var = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
tint_array_wrapper arr_var = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
const tint_array_wrapper arr_let = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
const tint_array_wrapper arr_let = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
S struct_var = {};
|
S struct_var = {0.0f};
|
||||||
const S struct_let = {};
|
const S struct_let = {0.0f};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -18,8 +18,10 @@
|
||||||
OpName %m2x3_var "m2x3_var"
|
OpName %m2x3_var "m2x3_var"
|
||||||
OpName %arr_var "arr_var"
|
OpName %arr_var "arr_var"
|
||||||
OpName %S "S"
|
OpName %S "S"
|
||||||
|
OpMemberName %S 0 "a"
|
||||||
OpName %struct_var "struct_var"
|
OpName %struct_var "struct_var"
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
|
OpMemberDecorate %S 0 Offset 0
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
|
@ -53,7 +55,7 @@
|
||||||
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
||||||
%42 = OpConstantNull %_arr_float_uint_4
|
%42 = OpConstantNull %_arr_float_uint_4
|
||||||
%_ptr_Function__arr_float_uint_4 = OpTypePointer Function %_arr_float_uint_4
|
%_ptr_Function__arr_float_uint_4 = OpTypePointer Function %_arr_float_uint_4
|
||||||
%S = OpTypeStruct
|
%S = OpTypeStruct %float
|
||||||
%46 = OpConstantNull %S
|
%46 = OpConstantNull %S
|
||||||
%_ptr_Function_S = OpTypePointer Function %S
|
%_ptr_Function_S = OpTypePointer Function %S
|
||||||
%main = OpFunction %void None %1
|
%main = OpFunction %void None %1
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[stage(compute), workgroup_size(1)]]
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
let bool_let : bool = bool();
|
let bool_let : bool = bool();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const bool bool_let = false;
|
static const bool bool_let = false;
|
||||||
|
@ -15,7 +16,7 @@ struct tint_array_wrapper {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const tint_array_wrapper arr_let = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
static const tint_array_wrapper arr_let = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
static const S struct_let = {};
|
static const S struct_let = {0.0f};
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
OpName %m3x4_let "m3x4_let"
|
OpName %m3x4_let "m3x4_let"
|
||||||
OpName %arr_let "arr_let"
|
OpName %arr_let "arr_let"
|
||||||
OpName %S "S"
|
OpName %S "S"
|
||||||
|
OpMemberName %S 0 "a"
|
||||||
OpName %struct_let "struct_let"
|
OpName %struct_let "struct_let"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
|
OpMemberDecorate %S 0 Offset 0
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%bool_let = OpConstantNull %bool
|
%bool_let = OpConstantNull %bool
|
||||||
%int = OpTypeInt 32 1
|
%int = OpTypeInt 32 1
|
||||||
|
@ -39,7 +41,7 @@
|
||||||
%uint_4 = OpConstant %uint 4
|
%uint_4 = OpConstant %uint 4
|
||||||
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
||||||
%arr_let = OpConstantNull %_arr_float_uint_4
|
%arr_let = OpConstantNull %_arr_float_uint_4
|
||||||
%S = OpTypeStruct
|
%S = OpTypeStruct %float
|
||||||
%struct_let = OpConstantNull %S
|
%struct_let = OpConstantNull %S
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%22 = OpTypeFunction %void
|
%22 = OpTypeFunction %void
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
let bool_let : bool = bool();
|
let bool_let : bool = bool();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
var<private> bool_var : bool;
|
var<private> bool_var : bool;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool bool_var = false;
|
static bool bool_var = false;
|
||||||
|
@ -15,7 +16,7 @@ struct tint_array_wrapper {
|
||||||
};
|
};
|
||||||
|
|
||||||
static tint_array_wrapper arr_var = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
static tint_array_wrapper arr_var = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
static S struct_var = {};
|
static S struct_var = {0.0f};
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
@ -29,7 +30,7 @@ void main() {
|
||||||
m2x3_var = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
m2x3_var = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
const tint_array_wrapper tint_symbol = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
const tint_array_wrapper tint_symbol = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
arr_var = tint_symbol;
|
arr_var = tint_symbol;
|
||||||
const S tint_symbol_1 = {};
|
const S tint_symbol_1 = {0.0f};
|
||||||
struct_var = tint_symbol_1;
|
struct_var = tint_symbol_1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
OpName %m2x3_var "m2x3_var"
|
OpName %m2x3_var "m2x3_var"
|
||||||
OpName %arr_var "arr_var"
|
OpName %arr_var "arr_var"
|
||||||
OpName %S "S"
|
OpName %S "S"
|
||||||
|
OpMemberName %S 0 "a"
|
||||||
OpName %struct_var "struct_var"
|
OpName %struct_var "struct_var"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
|
OpMemberDecorate %S 0 Offset 0
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%_ptr_Private_bool = OpTypePointer Private %bool
|
%_ptr_Private_bool = OpTypePointer Private %bool
|
||||||
%4 = OpConstantNull %bool
|
%4 = OpConstantNull %bool
|
||||||
|
@ -58,7 +60,7 @@
|
||||||
%_ptr_Private__arr_float_uint_4 = OpTypePointer Private %_arr_float_uint_4
|
%_ptr_Private__arr_float_uint_4 = OpTypePointer Private %_arr_float_uint_4
|
||||||
%38 = OpConstantNull %_arr_float_uint_4
|
%38 = OpConstantNull %_arr_float_uint_4
|
||||||
%arr_var = OpVariable %_ptr_Private__arr_float_uint_4 Private %38
|
%arr_var = OpVariable %_ptr_Private__arr_float_uint_4 Private %38
|
||||||
%S = OpTypeStruct
|
%S = OpTypeStruct %float
|
||||||
%_ptr_Private_S = OpTypePointer Private %S
|
%_ptr_Private_S = OpTypePointer Private %S
|
||||||
%42 = OpConstantNull %S
|
%42 = OpConstantNull %S
|
||||||
%struct_var = OpVariable %_ptr_Private_S Private %42
|
%struct_var = OpVariable %_ptr_Private_S Private %42
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
var<private> bool_var : bool;
|
var<private> bool_var : bool;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
var<private> bool_var : bool = bool();
|
var<private> bool_var : bool = bool();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool bool_var = false;
|
static bool bool_var = false;
|
||||||
|
@ -15,7 +16,7 @@ struct tint_array_wrapper {
|
||||||
};
|
};
|
||||||
|
|
||||||
static tint_array_wrapper arr_var = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
static tint_array_wrapper arr_var = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
static S struct_var = {};
|
static S struct_var = {0.0f};
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
@ -29,7 +30,7 @@ void main() {
|
||||||
m2x3_var = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
m2x3_var = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
const tint_array_wrapper tint_symbol = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
const tint_array_wrapper tint_symbol = {{0.0f, 0.0f, 0.0f, 0.0f}};
|
||||||
arr_var = tint_symbol;
|
arr_var = tint_symbol;
|
||||||
const S tint_symbol_1 = {};
|
const S tint_symbol_1 = {0.0f};
|
||||||
struct_var = tint_symbol_1;
|
struct_var = tint_symbol_1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
OpName %m2x3_var "m2x3_var"
|
OpName %m2x3_var "m2x3_var"
|
||||||
OpName %arr_var "arr_var"
|
OpName %arr_var "arr_var"
|
||||||
OpName %S "S"
|
OpName %S "S"
|
||||||
|
OpMemberName %S 0 "a"
|
||||||
OpName %struct_var "struct_var"
|
OpName %struct_var "struct_var"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
|
OpMemberDecorate %S 0 Offset 0
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%2 = OpConstantNull %bool
|
%2 = OpConstantNull %bool
|
||||||
%_ptr_Private_bool = OpTypePointer Private %bool
|
%_ptr_Private_bool = OpTypePointer Private %bool
|
||||||
|
@ -58,7 +60,7 @@
|
||||||
%36 = OpConstantNull %_arr_float_uint_4
|
%36 = OpConstantNull %_arr_float_uint_4
|
||||||
%_ptr_Private__arr_float_uint_4 = OpTypePointer Private %_arr_float_uint_4
|
%_ptr_Private__arr_float_uint_4 = OpTypePointer Private %_arr_float_uint_4
|
||||||
%arr_var = OpVariable %_ptr_Private__arr_float_uint_4 Private %36
|
%arr_var = OpVariable %_ptr_Private__arr_float_uint_4 Private %36
|
||||||
%S = OpTypeStruct
|
%S = OpTypeStruct %float
|
||||||
%40 = OpConstantNull %S
|
%40 = OpConstantNull %S
|
||||||
%_ptr_Private_S = OpTypePointer Private %S
|
%_ptr_Private_S = OpTypePointer Private %S
|
||||||
%struct_var = OpVariable %_ptr_Private_S Private %40
|
%struct_var = OpVariable %_ptr_Private_S Private %40
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
var<private> bool_var : bool = bool();
|
var<private> bool_var : bool = bool();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
fn foo(
|
fn foo(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %S "S"
|
OpName %S "S"
|
||||||
|
OpMemberName %S 0 "a"
|
||||||
OpName %foo "foo"
|
OpName %foo "foo"
|
||||||
OpName %param_bool "param_bool"
|
OpName %param_bool "param_bool"
|
||||||
OpName %param_i32 "param_i32"
|
OpName %param_i32 "param_i32"
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
OpName %param_ptr_arr "param_ptr_arr"
|
OpName %param_ptr_arr "param_ptr_arr"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
|
OpMemberDecorate %S 0 Offset 0
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%int = OpTypeInt 32 1
|
%int = OpTypeInt 32 1
|
||||||
|
@ -36,7 +38,7 @@
|
||||||
%mat2v3float = OpTypeMatrix %v3float 2
|
%mat2v3float = OpTypeMatrix %v3float 2
|
||||||
%uint_4 = OpConstant %uint 4
|
%uint_4 = OpConstant %uint 4
|
||||||
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
||||||
%S = OpTypeStruct
|
%S = OpTypeStruct %float
|
||||||
%_ptr_Function_float = OpTypePointer Function %float
|
%_ptr_Function_float = OpTypePointer Function %float
|
||||||
%_ptr_Function_v4float = OpTypePointer Function %v4float
|
%_ptr_Function_v4float = OpTypePointer Function %v4float
|
||||||
%_ptr_Function__arr_float_uint_4 = OpTypePointer Function %_arr_float_uint_4
|
%_ptr_Function__arr_float_uint_4 = OpTypePointer Function %_arr_float_uint_4
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
fn foo(param_bool : bool, param_i32 : i32, param_u32 : u32, param_f32 : f32, param_v2i32 : vec2<i32>, param_v3u32 : vec3<u32>, param_v4f32 : vec4<f32>, param_m2x3 : mat2x3<f32>, param_arr : array<f32, 4>, param_struct : S, param_ptr_f32 : ptr<function, f32>, param_ptr_vec : ptr<function, vec4<f32>>, param_ptr_arr : ptr<function, array<f32, 4>>) {
|
fn foo(param_bool : bool, param_i32 : i32, param_u32 : u32, param_f32 : f32, param_v2i32 : vec2<i32>, param_v3u32 : vec3<u32>, param_v4f32 : vec4<f32>, param_m2x3 : mat2x3<f32>, param_arr : array<f32, 4>, param_struct : S, param_ptr_f32 : ptr<function, f32>, param_ptr_vec : ptr<function, vec4<f32>>, param_ptr_arr : ptr<function, array<f32, 4>>) {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
fn ret_bool() -> bool { return bool(); }
|
fn ret_bool() -> bool { return bool(); }
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool ret_bool() {
|
bool ret_bool() {
|
||||||
|
@ -43,7 +44,7 @@ tint_array_wrapper ret_arr() {
|
||||||
}
|
}
|
||||||
|
|
||||||
S ret_struct() {
|
S ret_struct() {
|
||||||
const S tint_symbol_1 = {};
|
const S tint_symbol_1 = {0.0f};
|
||||||
return tint_symbol_1;
|
return tint_symbol_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S {
|
struct S {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
OpName %ret_m2x3 "ret_m2x3"
|
OpName %ret_m2x3 "ret_m2x3"
|
||||||
OpName %ret_arr "ret_arr"
|
OpName %ret_arr "ret_arr"
|
||||||
OpName %S "S"
|
OpName %S "S"
|
||||||
|
OpMemberName %S 0 "a"
|
||||||
OpName %ret_struct "ret_struct"
|
OpName %ret_struct "ret_struct"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
|
OpMemberDecorate %S 0 Offset 0
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%1 = OpTypeFunction %bool
|
%1 = OpTypeFunction %bool
|
||||||
%5 = OpConstantNull %bool
|
%5 = OpConstantNull %bool
|
||||||
|
@ -49,7 +51,7 @@
|
||||||
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
||||||
%42 = OpTypeFunction %_arr_float_uint_4
|
%42 = OpTypeFunction %_arr_float_uint_4
|
||||||
%47 = OpConstantNull %_arr_float_uint_4
|
%47 = OpConstantNull %_arr_float_uint_4
|
||||||
%S = OpTypeStruct
|
%S = OpTypeStruct %float
|
||||||
%48 = OpTypeFunction %S
|
%48 = OpTypeFunction %S
|
||||||
%52 = OpConstantNull %S
|
%52 = OpConstantNull %S
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S {
|
struct S {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
fn ret_bool() -> bool {
|
fn ret_bool() -> bool {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S_inner {
|
struct S_inner {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct S {
|
struct S {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S_inner {
|
struct S_inner {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
@ -18,6 +19,6 @@ struct S {
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
const S s = {false, 0, 0u, 0.0f, int2(0, 0), uint3(0u, 0u, 0u), float4(0.0f, 0.0f, 0.0f, 0.0f), float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), {{0.0f, 0.0f, 0.0f, 0.0f}}, {}};
|
const S s = {false, 0, 0u, 0.0f, int2(0, 0), uint3(0u, 0u, 0u), float4(0.0f, 0.0f, 0.0f, 0.0f), float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), {{0.0f, 0.0f, 0.0f, 0.0f}}, {0.0f}};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
struct S_inner {
|
struct S_inner {
|
||||||
|
float a;
|
||||||
};
|
};
|
||||||
struct tint_array_wrapper {
|
struct tint_array_wrapper {
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
OpMemberName %S 8 "member_arr"
|
OpMemberName %S 8 "member_arr"
|
||||||
OpMemberName %S 9 "member_struct"
|
OpMemberName %S 9 "member_struct"
|
||||||
OpName %S_inner "S_inner"
|
OpName %S_inner "S_inner"
|
||||||
|
OpMemberName %S_inner 0 "a"
|
||||||
OpMemberDecorate %S 0 Offset 0
|
OpMemberDecorate %S 0 Offset 0
|
||||||
OpMemberDecorate %S 1 Offset 4
|
OpMemberDecorate %S 1 Offset 4
|
||||||
OpMemberDecorate %S 2 Offset 8
|
OpMemberDecorate %S 2 Offset 8
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
OpMemberDecorate %S 8 Offset 96
|
OpMemberDecorate %S 8 Offset 96
|
||||||
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
OpDecorate %_arr_float_uint_4 ArrayStride 4
|
||||||
OpMemberDecorate %S 9 Offset 112
|
OpMemberDecorate %S 9 Offset 112
|
||||||
|
OpMemberDecorate %S_inner 0 Offset 0
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
|
@ -46,7 +48,7 @@
|
||||||
%mat2v3float = OpTypeMatrix %v3float 2
|
%mat2v3float = OpTypeMatrix %v3float 2
|
||||||
%uint_4 = OpConstant %uint 4
|
%uint_4 = OpConstant %uint 4
|
||||||
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
%_arr_float_uint_4 = OpTypeArray %float %uint_4
|
||||||
%S_inner = OpTypeStruct
|
%S_inner = OpTypeStruct %float
|
||||||
%S = OpTypeStruct %bool %int %uint %float %v2int %v3uint %v4float %mat2v3float %_arr_float_uint_4 %S_inner
|
%S = OpTypeStruct %bool %int %uint %float %v2int %v3uint %v4float %mat2v3float %_arr_float_uint_4 %S_inner
|
||||||
%18 = OpConstantNull %S
|
%18 = OpConstantNull %S
|
||||||
%main = OpFunction %void None %1
|
%main = OpFunction %void None %1
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
struct S_inner {
|
struct S_inner {
|
||||||
|
a : f32;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct S {
|
struct S {
|
||||||
|
|
Loading…
Reference in New Issue