1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
//TEST:SIMPLE(filecheck=SPIRV): -target spirv -emit-spirv-directly -profile cs_6_2 -entry computeMain -line-directive-mode none -fvk-use-dx-layout
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-slang -compute -dx12 -profile cs_6_2 -Xslang... -Xdxc -fvk-use-dx-layout -Xdxc -enable-16bit-types -X. -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-slang -compute -vk -profile cs_6_2 -emit-spirv-directly -Xslang... -fvk-use-dx-layout -X. -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUFFER):-cuda -compute -output-using-type
//TEST:REFLECTION(filecheck=REFLECT):-stage compute -entry computeMain -target spirv -profile cs_6_2 -no-codegen -line-directive-mode none -fvk-use-dx-layout
//TEST_INPUT:ubuffer(stride=4, count=17):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
//TEST_INPUT:set Constants.v0={1.0,2.0,3.0}
//TEST_INPUT:set Constants.v1=4.0
//TEST_INPUT:set Constants.v2=5.0
//TEST_INPUT:set Constants.v3[0]={6.0,7.0,8.0}
//TEST_INPUT:set Constants.v3[1]={9.0,10.0,11.0}
//TEST_INPUT:set Constants.v4=12.0
//TEST_INPUT:set Constants.v5=13.0
//TEST_INPUT:set Constants.v6[0]={14.0,15.0,16.0}
//TEST_INPUT:set Constants.v7=17.0
// Checks cbuffer packing rule cases involving 3-element vectors.
// HLSL aligns at the element size, while GLSL std140 and std430
// align to the size of a 4-element vector of the element type.
// Checks cases that are compatible with std140 and std430.
cbuffer Constants
{
// float v1 should be packed in with float3 v0
float3 v0;
float v1;
// float3[2] v3 should be aligned to next 16 byte boundary,
// and not packed in with float v2.
float v2;
float3 v3[2];
// float v4 should be packed in with last float3 from v3.
float v4;
// float3[1] v6 should be aligned to next 16 byte boundary
// and not packed in with float v5.
float v5;
float3 v6[1];
// float v7 should be packed in with float3 from v6.
float v7;
};
// For spirv, check that the offsets are correct.
// SPIRV: OpMemberDecorate {{.*}} 0 Offset 0
// SPIRV: OpMemberDecorate {{.*}} 1 Offset 12
// SPIRV: OpMemberDecorate {{.*}} 2 Offset 16
// SPIRV: OpMemberDecorate {{.*}} 3 Offset 32
// SPIRV: OpMemberDecorate {{.*}} 4 Offset 60
// SPIRV: OpMemberDecorate {{.*}} 5 Offset 64
// SPIRV: OpMemberDecorate {{.*}} 6 Offset 80
// SPIRV: OpMemberDecorate {{.*}} 7 Offset 92
// REFLECT: "name": "v0",
// REFLECT: "offset": 0
// REFLECT: "name": "v1",
// REFLECT: "offset": 12
// REFLECT: "name": "v2",
// REFLECT: "offset": 16
// REFLECT: "name": "v3",
// REFLECT: "offset": 32
// REFLECT: "name": "v4",
// REFLECT: "offset": 60
// REFLECT: "name": "v5",
// REFLECT: "offset": 64
// REFLECT: "name": "v6",
// REFLECT: "offset": 80
// REFLECT: "name": "v7",
// REFLECT: "offset": 92
[numthreads(1, 1, 1)]
void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
{
int i = 0;
outputBuffer[i++] = v0.x;
outputBuffer[i++] = v0.y;
outputBuffer[i++] = v0.z;
outputBuffer[i++] = v1;
outputBuffer[i++] = v2;
outputBuffer[i++] = v3[0].x;
outputBuffer[i++] = v3[0].y;
outputBuffer[i++] = v3[0].z;
outputBuffer[i++] = v3[1].x;
outputBuffer[i++] = v3[1].y;
outputBuffer[i++] = v3[1].z;
outputBuffer[i++] = v4;
outputBuffer[i++] = v5;
outputBuffer[i++] = v6[0].x;
outputBuffer[i++] = v6[0].y;
outputBuffer[i++] = v6[0].z;
outputBuffer[i++] = v7;
// BUFFER: 1
// BUFFER-NEXT: 2
// BUFFER-NEXT: 3
// BUFFER-NEXT: 4
// BUFFER-NEXT: 5
// BUFFER-NEXT: 6
// BUFFER-NEXT: 7
// BUFFER-NEXT: 8
// BUFFER-NEXT: 9
// BUFFER-NEXT: 10
// BUFFER-NEXT: 11
// BUFFER-NEXT: 12
// BUFFER-NEXT: 13
// BUFFER-NEXT: 14
// BUFFER-NEXT: 15
// BUFFER-NEXT: 16
// BUFFER-NEXT: 17
}
|