yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

ArielG-NVRefactor memory qualifier decorators to be a bit-flag set, resolves #3841 (#3881)e0de98e9a

master
3.2 KiB95 linesraw
1//TEST:SIMPLE(filecheck=CHECK_GLSL): -stage compute -entry computeMain -allow-glsl -target glsl
2//TEST:SIMPLE(filecheck=CHECK_SPV): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
3
4// due to implementation limitations (slang-check-expr.cpp, `void visitMemberExpr()`) we are unable to 
5// implement and use .length with glsl vectors to test `readonly writeonly` 
6//#define TEST_whenVectorLengthIsImplemented
7
8// CHECK_SPV: OpEntryPoint
9
10//CHECK_GLSL: restrict
11//CHECK_GLSL: readonly
12//CHECK_GLSL: {{(writeonly|readonly)}} {{(writeonly|readonly)}}
13//CHECK_GLSL: writeonly
14//CHECK_GLSL: coherent
15//CHECK_GLSL: volatile
16//CHECK_SPV: OpMemberDecorate %{{.*}} 0 Restrict
17//CHECK_SPV: OpMemberDecorate %{{.*}} 1 NonWritable
18//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonWritable|NonReadable)}}
19//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonWritable|NonReadable)}}
20//CHECK_SPV: OpMemberDecorate %{{.*}} 3 NonReadable
21//CHECK_SPV: OpMemberDecorate %{{.*}} 4 Coherent
22//CHECK_SPV: OpMemberDecorate %{{.*}} 5 Volatile
23//CHECK_SPV: OpDecorate %{{.*}} {{(Restrict|Volatile)}}
24restrict volatile buffer Block1
25{
26    restrict uint data1;
27    readonly uint data2;
28    readonly writeonly uint data3;
29    writeonly uint data4;
30    coherent uint data5;
31    volatile uint data6;
32} inputBuffer1;
33
34//CHECK_GLSL: coherent
35//CHECK_GLSL: readonly
36//CHECK_SPV: OpMemberDecorate %{{.*}} 0 NonWritable
37//CHECK_SPV: OpDecorate %{{.*}} Coherent
38coherent buffer Block2 {
39    readonly vec4 member1;
40    vec4 member2;
41}inputBuffer2;
42
43//CHECK_GLSL: {{(coherent|readonly)}} {{(coherent|readonly)}}
44//CHECK_GLSL: coherent
45//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
46//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
47//CHECK_SPV: OpMemberDecorate %{{.*}} 1 Coherent
48//CHECK_SPV: OpDecorate %{{.*}}
49buffer Block3 {
50    coherent readonly vec4 member1;
51    coherent vec4 member2;
52}inputBuffer3;
53
54//CHECK_GLSL: {{(coherent|readonly)}} {{(coherent|readonly)}}
55//CHECK_GLSL: coherent
56//CHECK_GLSL: {{(volatile|writeonly)}} {{(volatile|writeonly)}}
57//CHECK_GLSL: readonly
58//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
59//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
60//CHECK_SPV: OpMemberDecorate %{{.*}} 1 Coherent
61//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonReadable|Volatile)}}
62//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonReadable|Volatile)}}
63//CHECK_SPV: OpMemberDecorate %{{.*}} 3 NonWritable
64buffer Block4 {
65    struct structTmp
66    {
67        int val;
68    };
69    coherent readonly int member1;
70    coherent int member2;
71    volatile writeonly int member3;
72    readonly structTmp member4;
73}inputBuffer4;
74
75// CHECK_GLSL: main
76layout(local_size_x = 1) in;
77void computeMain()
78{
79    int v = inputBuffer1.data1;
80    v += inputBuffer1.data2;
81    inputBuffer1.data4 = 1;
82    inputBuffer1.data5 = 1;
83    inputBuffer1.data6 = 1;
84    inputBuffer2.member2 = inputBuffer2.member1;
85    inputBuffer3.member2 = inputBuffer3.member1;
86    v += inputBuffer4.member1;
87    v += inputBuffer4.member2;
88    inputBuffer4.member3 = v;
89    v += inputBuffer4.member4.val;
90#ifdef TEST_whenVectorLengthIsImplemented
91    v += inputBuffer4.member3.length();
92#endif
93    // ensure code is not optimized out
94    inputBuffer1.data4 = v;
95}