blob: 903526ff8092cc108c180ee67d9bafc2e948109d (
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
|
//TEST:SIMPLE(filecheck=CHECK_GLSL): -stage compute -entry computeMain -allow-glsl -target glsl
//TEST:SIMPLE(filecheck=CHECK_SPV): -stage compute -entry computeMain -allow-glsl -target spirv -emit-spirv-directly
// due to implementation limitations (slang-check-expr.cpp, `void visitMemberExpr()`) we are unable to
// implement and use .length with glsl vectors to test `readonly writeonly`
//#define TEST_whenVectorLengthIsImplemented
// CHECK_SPV: OpEntryPoint
//CHECK_GLSL: restrict
//CHECK_GLSL: readonly
//CHECK_GLSL: {{(writeonly|readonly)}} {{(writeonly|readonly)}}
//CHECK_GLSL: writeonly
//CHECK_GLSL: coherent
//CHECK_GLSL: volatile
//CHECK_SPV: OpMemberDecorate %{{.*}} 0 Restrict
//CHECK_SPV: OpMemberDecorate %{{.*}} 1 NonWritable
//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonWritable|NonReadable)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonWritable|NonReadable)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 3 NonReadable
//CHECK_SPV: OpMemberDecorate %{{.*}} 4 Coherent
//CHECK_SPV: OpMemberDecorate %{{.*}} 5 Volatile
//CHECK_SPV: OpDecorate %{{.*}} {{(Restrict|Volatile)}}
restrict volatile buffer Block1
{
restrict uint data1;
readonly uint data2;
readonly writeonly uint data3;
writeonly uint data4;
coherent uint data5;
volatile uint data6;
} inputBuffer1;
//CHECK_GLSL: coherent
//CHECK_GLSL: readonly
//CHECK_SPV: OpMemberDecorate %{{.*}} 0 NonWritable
//CHECK_SPV: OpDecorate %{{.*}} Coherent
coherent buffer Block2 {
readonly vec4 member1;
vec4 member2;
}inputBuffer2;
//CHECK_GLSL: {{(coherent|readonly)}} {{(coherent|readonly)}}
//CHECK_GLSL: coherent
//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 1 Coherent
//CHECK_SPV: OpDecorate %{{.*}}
buffer Block3 {
coherent readonly vec4 member1;
coherent vec4 member2;
}inputBuffer3;
//CHECK_GLSL: {{(coherent|readonly)}} {{(coherent|readonly)}}
//CHECK_GLSL: coherent
//CHECK_GLSL: {{(volatile|writeonly)}} {{(volatile|writeonly)}}
//CHECK_GLSL: readonly
//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 0 {{(Coherent|NonWritable)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 1 Coherent
//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonReadable|Volatile)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 2 {{(NonReadable|Volatile)}}
//CHECK_SPV: OpMemberDecorate %{{.*}} 3 NonWritable
buffer Block4 {
struct structTmp
{
int val;
};
coherent readonly int member1;
coherent int member2;
volatile writeonly int member3;
readonly structTmp member4;
}inputBuffer4;
// CHECK_GLSL: main
layout(local_size_x = 1) in;
void computeMain()
{
int v = inputBuffer1.data1;
v += inputBuffer1.data2;
inputBuffer1.data4 = 1;
inputBuffer1.data5 = 1;
inputBuffer1.data6 = 1;
inputBuffer2.member2 = inputBuffer2.member1;
inputBuffer3.member2 = inputBuffer3.member1;
v += inputBuffer4.member1;
v += inputBuffer4.member2;
inputBuffer4.member3 = v;
v += inputBuffer4.member4.val;
#ifdef TEST_whenVectorLengthIsImplemented
v += inputBuffer4.member3.length();
#endif
// ensure code is not optimized out
inputBuffer1.data4 = v;
}
|