Skip to content

Commit 145464b

Browse files
WIP: test(naga): add struct-layout test
* TODO: Anything left to test here?
1 parent 5c8cffb commit 145464b

11 files changed

+604
-0
lines changed

naga/tests/in/struct-layout.wgsl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Create several type definitions to test `align` and `size` layout.
2+
3+
struct NoPadding {
4+
@location(0)
5+
v3: vec3f, // align 16, size 12; no start padding needed
6+
@location(1)
7+
f3: f32, // align 4, size 4; no start padding needed
8+
}
9+
@fragment
10+
fn no_padding_frag(input: NoPadding) -> @location(0) vec4f {
11+
_ = input;
12+
return vec4f(0.0);
13+
}
14+
@vertex
15+
fn no_padding_vert(input: NoPadding) -> @builtin(position) vec4f {
16+
_ = input;
17+
return vec4f(0.0);
18+
}
19+
@group(0) @binding(0) var<uniform> no_padding_uniform: NoPadding;
20+
@group(0) @binding(1) var<storage, read_write> no_padding_storage: NoPadding;
21+
@compute @workgroup_size(16,1,1)
22+
fn no_padding_comp() {
23+
var x: NoPadding;
24+
x = no_padding_uniform;
25+
x = no_padding_storage;
26+
}
27+
28+
struct NeedsPadding {
29+
@location(0) f3_forces_padding: f32, // align 4, size 4; no start padding needed
30+
@location(1) v3_needs_padding: vec3f, // align 16, size 12; needs 12 bytes of padding
31+
@location(2) f3: f32, // align 4, size 4; no start padding needed
32+
}
33+
@fragment
34+
fn needs_padding_frag(input: NeedsPadding) -> @location(0) vec4f {
35+
_ = input;
36+
return vec4f(0.0);
37+
}
38+
@vertex
39+
fn needs_padding_vert(input: NeedsPadding) -> @builtin(position) vec4f {
40+
_ = input;
41+
return vec4f(0.0);
42+
}
43+
@group(0) @binding(2) var<uniform> needs_padding_uniform: NeedsPadding;
44+
@group(0) @binding(3) var<storage, read_write> needs_padding_storage: NeedsPadding;
45+
@compute @workgroup_size(16,1,1)
46+
fn needs_padding_comp() {
47+
var x: NeedsPadding;
48+
x = needs_padding_uniform;
49+
x = needs_padding_storage;
50+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#version 310 es
2+
3+
precision highp float;
4+
precision highp int;
5+
6+
struct NoPadding {
7+
vec3 v3_;
8+
float f3_;
9+
};
10+
struct NeedsPadding {
11+
float f3_forces_padding;
12+
vec3 v3_needs_padding;
13+
float f3_;
14+
};
15+
layout(location = 0) smooth in float _vs2fs_location0;
16+
layout(location = 1) smooth in vec3 _vs2fs_location1;
17+
layout(location = 2) smooth in float _vs2fs_location2;
18+
layout(location = 0) out vec4 _fs2p_location0;
19+
20+
void main() {
21+
NeedsPadding input_2 = NeedsPadding(_vs2fs_location0, _vs2fs_location1, _vs2fs_location2);
22+
_fs2p_location0 = vec4(0.0);
23+
return;
24+
}
25+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#version 310 es
2+
3+
precision highp float;
4+
precision highp int;
5+
6+
struct NoPadding {
7+
vec3 v3_;
8+
float f3_;
9+
};
10+
struct NeedsPadding {
11+
float f3_forces_padding;
12+
vec3 v3_needs_padding;
13+
float f3_;
14+
};
15+
layout(location = 0) in float _p2vs_location0;
16+
layout(location = 1) in vec3 _p2vs_location1;
17+
layout(location = 2) in float _p2vs_location2;
18+
19+
void main() {
20+
NeedsPadding input_3 = NeedsPadding(_p2vs_location0, _p2vs_location1, _p2vs_location2);
21+
gl_Position = vec4(0.0);
22+
gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);
23+
return;
24+
}
25+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#version 310 es
2+
3+
precision highp float;
4+
precision highp int;
5+
6+
struct NoPadding {
7+
vec3 v3_;
8+
float f3_;
9+
};
10+
struct NeedsPadding {
11+
float f3_forces_padding;
12+
vec3 v3_needs_padding;
13+
float f3_;
14+
};
15+
layout(location = 0) smooth in vec3 _vs2fs_location0;
16+
layout(location = 1) smooth in float _vs2fs_location1;
17+
layout(location = 0) out vec4 _fs2p_location0;
18+
19+
void main() {
20+
NoPadding input_ = NoPadding(_vs2fs_location0, _vs2fs_location1);
21+
_fs2p_location0 = vec4(0.0);
22+
return;
23+
}
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#version 310 es
2+
3+
precision highp float;
4+
precision highp int;
5+
6+
struct NoPadding {
7+
vec3 v3_;
8+
float f3_;
9+
};
10+
struct NeedsPadding {
11+
float f3_forces_padding;
12+
vec3 v3_needs_padding;
13+
float f3_;
14+
};
15+
layout(location = 0) in vec3 _p2vs_location0;
16+
layout(location = 1) in float _p2vs_location1;
17+
18+
void main() {
19+
NoPadding input_1 = NoPadding(_p2vs_location0, _p2vs_location1);
20+
gl_Position = vec4(0.0);
21+
gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);
22+
return;
23+
}
24+
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
struct NoPadding {
2+
float3 v3_ : LOC0;
3+
float f3_ : LOC1;
4+
};
5+
6+
struct NeedsPadding {
7+
float f3_forces_padding : LOC0;
8+
float3 v3_needs_padding : LOC1;
9+
float f3_ : LOC2;
10+
};
11+
12+
cbuffer no_padding_uniform : register(b0) { NoPadding no_padding_uniform; }
13+
RWByteAddressBuffer no_padding_storage : register(u1);
14+
cbuffer needs_padding_uniform : register(b2) { NeedsPadding needs_padding_uniform; }
15+
RWByteAddressBuffer needs_padding_storage : register(u3);
16+
17+
struct FragmentInput_no_padding_frag {
18+
float3 v3_ : LOC0;
19+
float f3_ : LOC1;
20+
};
21+
22+
struct FragmentInput_needs_padding_frag {
23+
float f3_forces_padding : LOC0;
24+
float3 v3_needs_padding : LOC1;
25+
float f3_1 : LOC2;
26+
};
27+
28+
float4 no_padding_frag(FragmentInput_no_padding_frag fragmentinput_no_padding_frag) : SV_Target0
29+
{
30+
NoPadding input = { fragmentinput_no_padding_frag.v3_, fragmentinput_no_padding_frag.f3_ };
31+
return (0.0).xxxx;
32+
}
33+
34+
float4 no_padding_vert(NoPadding input_1) : SV_Position
35+
{
36+
return (0.0).xxxx;
37+
}
38+
39+
NoPadding ConstructNoPadding(float3 arg0, float arg1) {
40+
NoPadding ret = (NoPadding)0;
41+
ret.v3_ = arg0;
42+
ret.f3_ = arg1;
43+
return ret;
44+
}
45+
46+
[numthreads(16, 1, 1)]
47+
void no_padding_comp()
48+
{
49+
NoPadding x = (NoPadding)0;
50+
51+
NoPadding _expr2 = no_padding_uniform;
52+
x = _expr2;
53+
NoPadding _expr4 = ConstructNoPadding(asfloat(no_padding_storage.Load3(0)), asfloat(no_padding_storage.Load(12)));
54+
x = _expr4;
55+
return;
56+
}
57+
58+
float4 needs_padding_frag(FragmentInput_needs_padding_frag fragmentinput_needs_padding_frag) : SV_Target0
59+
{
60+
NeedsPadding input_2 = { fragmentinput_needs_padding_frag.f3_forces_padding, fragmentinput_needs_padding_frag.v3_needs_padding, fragmentinput_needs_padding_frag.f3_1 };
61+
return (0.0).xxxx;
62+
}
63+
64+
float4 needs_padding_vert(NeedsPadding input_3) : SV_Position
65+
{
66+
return (0.0).xxxx;
67+
}
68+
69+
NeedsPadding ConstructNeedsPadding(float arg0, float3 arg1, float arg2) {
70+
NeedsPadding ret = (NeedsPadding)0;
71+
ret.f3_forces_padding = arg0;
72+
ret.v3_needs_padding = arg1;
73+
ret.f3_ = arg2;
74+
return ret;
75+
}
76+
77+
[numthreads(16, 1, 1)]
78+
void needs_padding_comp()
79+
{
80+
NeedsPadding x_1 = (NeedsPadding)0;
81+
82+
NeedsPadding _expr2 = needs_padding_uniform;
83+
x_1 = _expr2;
84+
NeedsPadding _expr4 = ConstructNeedsPadding(asfloat(needs_padding_storage.Load(0)), asfloat(needs_padding_storage.Load3(16)), asfloat(needs_padding_storage.Load(28)));
85+
x_1 = _expr4;
86+
return;
87+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
(
2+
vertex:[
3+
(
4+
entry_point:"no_padding_vert",
5+
target_profile:"vs_5_1",
6+
),
7+
(
8+
entry_point:"needs_padding_vert",
9+
target_profile:"vs_5_1",
10+
),
11+
],
12+
fragment:[
13+
(
14+
entry_point:"no_padding_frag",
15+
target_profile:"ps_5_1",
16+
),
17+
(
18+
entry_point:"needs_padding_frag",
19+
target_profile:"ps_5_1",
20+
),
21+
],
22+
compute:[
23+
(
24+
entry_point:"no_padding_comp",
25+
target_profile:"cs_5_1",
26+
),
27+
(
28+
entry_point:"needs_padding_comp",
29+
target_profile:"cs_5_1",
30+
),
31+
],
32+
)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// language: metal1.0
2+
#include <metal_stdlib>
3+
#include <simd/simd.h>
4+
5+
using metal::uint;
6+
7+
struct NoPadding {
8+
metal::packed_float3 v3_;
9+
float f3_;
10+
};
11+
struct NeedsPadding {
12+
float f3_forces_padding;
13+
char _pad1[12];
14+
metal::packed_float3 v3_needs_padding;
15+
float f3_;
16+
};
17+
18+
struct no_padding_fragInput {
19+
metal::float3 v3_ [[user(loc0), center_perspective]];
20+
float f3_ [[user(loc1), center_perspective]];
21+
};
22+
struct no_padding_fragOutput {
23+
metal::float4 member [[color(0)]];
24+
};
25+
fragment no_padding_fragOutput no_padding_frag(
26+
no_padding_fragInput varyings [[stage_in]]
27+
) {
28+
const NoPadding input = { varyings.v3_, varyings.f3_ };
29+
return no_padding_fragOutput { metal::float4(0.0) };
30+
}
31+
32+
33+
struct no_padding_vertInput {
34+
metal::float3 v3_ [[attribute(0)]];
35+
float f3_ [[attribute(1)]];
36+
};
37+
struct no_padding_vertOutput {
38+
metal::float4 member_1 [[position]];
39+
};
40+
vertex no_padding_vertOutput no_padding_vert(
41+
no_padding_vertInput varyings_1 [[stage_in]]
42+
) {
43+
const NoPadding input_1 = { varyings_1.v3_, varyings_1.f3_ };
44+
return no_padding_vertOutput { metal::float4(0.0) };
45+
}
46+
47+
48+
kernel void no_padding_comp(
49+
constant NoPadding& no_padding_uniform [[user(fake0)]]
50+
, device NoPadding const& no_padding_storage [[user(fake0)]]
51+
) {
52+
NoPadding x = {};
53+
NoPadding _e2 = no_padding_uniform;
54+
x = _e2;
55+
NoPadding _e4 = no_padding_storage;
56+
x = _e4;
57+
return;
58+
}
59+
60+
61+
struct needs_padding_fragInput {
62+
float f3_forces_padding [[user(loc0), center_perspective]];
63+
metal::float3 v3_needs_padding [[user(loc1), center_perspective]];
64+
float f3_ [[user(loc2), center_perspective]];
65+
};
66+
struct needs_padding_fragOutput {
67+
metal::float4 member_3 [[color(0)]];
68+
};
69+
fragment needs_padding_fragOutput needs_padding_frag(
70+
needs_padding_fragInput varyings_3 [[stage_in]]
71+
) {
72+
const NeedsPadding input_2 = { varyings_3.f3_forces_padding, {}, varyings_3.v3_needs_padding, varyings_3.f3_ };
73+
return needs_padding_fragOutput { metal::float4(0.0) };
74+
}
75+
76+
77+
struct needs_padding_vertInput {
78+
float f3_forces_padding [[attribute(0)]];
79+
metal::float3 v3_needs_padding [[attribute(1)]];
80+
float f3_ [[attribute(2)]];
81+
};
82+
struct needs_padding_vertOutput {
83+
metal::float4 member_4 [[position]];
84+
};
85+
vertex needs_padding_vertOutput needs_padding_vert(
86+
needs_padding_vertInput varyings_4 [[stage_in]]
87+
) {
88+
const NeedsPadding input_3 = { varyings_4.f3_forces_padding, {}, varyings_4.v3_needs_padding, varyings_4.f3_ };
89+
return needs_padding_vertOutput { metal::float4(0.0) };
90+
}
91+
92+
93+
kernel void needs_padding_comp(
94+
constant NeedsPadding& needs_padding_uniform [[user(fake0)]]
95+
, device NeedsPadding const& needs_padding_storage [[user(fake0)]]
96+
) {
97+
NeedsPadding x_1 = {};
98+
NeedsPadding _e2 = needs_padding_uniform;
99+
x_1 = _e2;
100+
NeedsPadding _e4 = needs_padding_storage;
101+
x_1 = _e4;
102+
return;
103+
}

0 commit comments

Comments
 (0)