summaryrefslogtreecommitdiffstats
path: root/tests/hlsl/cbuffer-float3-offsets-aligned.slang
blob: e45959d57d4ba07a8b5456683e710934a6a671b3 (plain)
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

}