1617a3babSopenharmony_ci#version 430
2617a3babSopenharmony_ci
3617a3babSopenharmony_ci#extension GL_3DL_array_objects : enable
4617a3babSopenharmony_ci
5617a3babSopenharmony_ciout Vertex {
6617a3babSopenharmony_ci    vec4 Position;  // API transform/feedback will use �Vertex.Position7617a3babSopenharmony_ci    vec2 Texture;
8617a3babSopenharmony_ci} Coords;           // shader will use �Coords.Position9617a3babSopenharmony_ci
10617a3babSopenharmony_ciout Vertex2 {
11617a3babSopenharmony_ci    vec4 Color;     // API will use �Color�
12617a3babSopenharmony_ci};
13617a3babSopenharmony_ci
14617a3babSopenharmony_ciuniform Transform {  // API uses �Transform[2]� to refer to instance 2
15617a3babSopenharmony_ci    mat4           ModelViewMatrix;
16617a3babSopenharmony_ci    mat4           ModelViewProjectionMatrix;
17617a3babSopenharmony_ci    vec4           a[];  // array will get implicitly sized
18617a3babSopenharmony_ci    float          Deformation;
19617a3babSopenharmony_ci} transforms[4];
20617a3babSopenharmony_ci
21617a3babSopenharmony_cilayout(location = 3) in vec4 normal;
22617a3babSopenharmony_cilayout(location = 6) in vec4 colors[3];
23617a3babSopenharmony_cilayout(location = 9) in mat4 transforms2[2];
24617a3babSopenharmony_ci
25617a3babSopenharmony_cilayout(location = 3) struct S {
26617a3babSopenharmony_ci    vec3 a1;
27617a3babSopenharmony_ci    mat2 b;
28617a3babSopenharmony_ci    vec4 c[2];
29617a3babSopenharmony_ci} s;
30617a3babSopenharmony_ci
31617a3babSopenharmony_cilayout(triangles, invocations = 6) in;
32617a3babSopenharmony_ci
33617a3babSopenharmony_cilayout(lines) in;    // legal for Color2, input size is 2, matching Color2
34617a3babSopenharmony_ci
35617a3babSopenharmony_cilayout(triangle_strip, max_vertices = 60) out;  // order does not matter
36617a3babSopenharmony_cilayout(max_vertices = 60) out;      // redeclaration okay
37617a3babSopenharmony_cilayout(triangle_strip) out;         // redeclaration okay
38617a3babSopenharmony_ci//layout(points) out;                 // error, contradicts triangle_strip
39617a3babSopenharmony_ci//layout(max_vertices = 30) out;      // error, contradicts 60
40617a3babSopenharmony_ci
41617a3babSopenharmony_cilayout(stream = 1) out;
42617a3babSopenharmony_ci
43617a3babSopenharmony_cilayout(stream=1) out;             // default is now stream 1
44617a3babSopenharmony_ciout vec4 var1;                    // var1 gets default stream (1)
45617a3babSopenharmony_cilayout(stream=2) out Block1 {     // "Block1" belongs to stream 2
46617a3babSopenharmony_ci    layout(stream=2) vec4 var2;   // redundant block member stream decl
47617a3babSopenharmony_ci    layout(stream=3) vec2 var3;   // ILLEGAL (must match block stream)
48617a3babSopenharmony_ci    vec3 var4;                    // belongs to stream 2
49617a3babSopenharmony_ci};
50617a3babSopenharmony_cilayout(stream=0) out;             // default is now stream 0
51617a3babSopenharmony_ciout vec4 var5;                    // var5 gets default stream (0)
52617a3babSopenharmony_ciout Block2 {                      // "Block2" gets default stream (0)
53617a3babSopenharmony_ci    vec4 var6;
54617a3babSopenharmony_ci};
55617a3babSopenharmony_cilayout(stream=3) out vec4 var7;   // var7 belongs to stream 3
56617a3babSopenharmony_ci
57617a3babSopenharmony_cilayout(shared, column_major) uniform;
58617a3babSopenharmony_cilayout(shared, column_major) buffer;
59617a3babSopenharmony_ci
60617a3babSopenharmony_cilayout(row_major, column_major)
61617a3babSopenharmony_ci
62617a3babSopenharmony_cilayout(shared, row_major) uniform; // default is now shared and row_major
63617a3babSopenharmony_ci
64617a3babSopenharmony_cilayout(std140) uniform Transform2 { // layout of this block is std140
65617a3babSopenharmony_ci    mat4 M1;                       // row_major
66617a3babSopenharmony_ci    layout(column_major) mat4 M2;  // column major
67617a3babSopenharmony_ci    mat3 N1;                       // row_major
68617a3babSopenharmony_ci};
69617a3babSopenharmony_ci
70617a3babSopenharmony_cilayout(column_major) uniform T3 {  // shared and column_major
71617a3babSopenharmony_ci    mat4 M13;                      // column_major
72617a3babSopenharmony_ci    layout(row_major) mat4 m14;    // row major
73617a3babSopenharmony_ci    mat3 N12;                      // column_major
74617a3babSopenharmony_ci};
75617a3babSopenharmony_ci
76617a3babSopenharmony_ci// in one compilation unit...
77617a3babSopenharmony_cilayout(binding=3) uniform sampler2D s17; // s bound to unit 3
78617a3babSopenharmony_ci
79617a3babSopenharmony_ci// in another compilation unit...
80617a3babSopenharmony_ciuniform sampler2D s17;                   // okay, s still bound at 3
81617a3babSopenharmony_ci
82617a3babSopenharmony_ci// in another compilation unit...
83617a3babSopenharmony_ci//layout(binding=4) uniform sampler2D s; // ERROR: contradictory bindings
84617a3babSopenharmony_ci
85617a3babSopenharmony_cilayout (binding = 2, offset = 4) uniform atomic_uint a2;
86617a3babSopenharmony_ci
87617a3babSopenharmony_cilayout (binding = 2) uniform atomic_uint bar;
88617a3babSopenharmony_ci
89617a3babSopenharmony_cilayout (binding = 2, offset = 4) uniform atomic_uint;
90617a3babSopenharmony_ci
91617a3babSopenharmony_cilayout (binding = 2) uniform atomic_uint bar; // offset is 4
92617a3babSopenharmony_cilayout (offset = 8) uniform atomic_uint bar23;  // error, no default binding
93617a3babSopenharmony_ci
94617a3babSopenharmony_cilayout (binding=3, offset=4) uniform atomic_uint a2; // offset = 4
95617a3babSopenharmony_cilayout (binding=2) uniform atomic_uint b2;           // offset = 0
96617a3babSopenharmony_cilayout (binding=3) uniform atomic_uint c2;           // offset = 8
97617a3babSopenharmony_cilayout (binding=2) uniform atomic_uint d2;           // offset = 4
98617a3babSopenharmony_ci
99617a3babSopenharmony_ci//layout (offset=4)                // error, must include binding
100617a3babSopenharmony_ci//layout (binding=1, offset=0)  a; // okay
101617a3babSopenharmony_ci//layout (binding=2, offset=0)  b; // okay
102617a3babSopenharmony_ci//layout (binding=1, offset=0)  c; // error, offsets must not be shared
103617a3babSopenharmony_ci//                                 //        between a and c
104617a3babSopenharmony_ci//layout (binding=1, offset=2)  d; // error, overlaps offset 0 of a
105617a3babSopenharmony_ci
106617a3babSopenharmony_ciflat  in vec4 gl_FrontColor;  // input to geometry shader, no �gl_in[]�
107617a3babSopenharmony_ciflat out vec4 gl_FrontColor;  // output from geometry shader
108617a3babSopenharmony_ci
109617a3babSopenharmony_ciinvariant gl_Position;   // make existing gl_Position be invariant
110617a3babSopenharmony_ci
111617a3babSopenharmony_ciout vec3 ColorInv;
112617a3babSopenharmony_ciinvariant ColorIvn;      // make existing Color be invariant
113617a3babSopenharmony_ci
114617a3babSopenharmony_ciinvariant centroid out vec3 Color4;
115617a3babSopenharmony_ciprecise out vec4 position;
116617a3babSopenharmony_ci
117617a3babSopenharmony_ciout vec3 Color5;
118617a3babSopenharmony_ciprecise Color5;            // make existing Color be precise
119617a3babSopenharmony_ciin vec4 a, b, c, d;
120617a3babSopenharmony_ciprecise out vec4 v;
121617a3babSopenharmony_ci
122617a3babSopenharmony_cicoherent buffer Block {
123617a3babSopenharmony_ci    readonly vec4 member1;
124617a3babSopenharmony_ci    vec4 member2;
125617a3babSopenharmony_ci};
126617a3babSopenharmony_ci
127617a3babSopenharmony_cibuffer Block2a {
128617a3babSopenharmony_ci    coherent readonly vec4 member1A;
129617a3babSopenharmony_ci    coherent vec4 member2A;
130617a3babSopenharmony_ci};
131617a3babSopenharmony_ci
132617a3babSopenharmony_cishared vec4 shv;
133617a3babSopenharmony_ci
134617a3babSopenharmony_civec4 funcA(restrict image2D a)   {  }
135617a3babSopenharmony_ci
136617a3babSopenharmony_civec4 funcB(image2D a)            {  }
137617a3babSopenharmony_cilayout(rgba32f) uniform image2D img1;
138617a3babSopenharmony_cilayout(rgba32f) coherent uniform image2D img2;
139617a3babSopenharmony_ci
140617a3babSopenharmony_cifloat func(float e, float f, float g, float h)
141617a3babSopenharmony_ci{
142617a3babSopenharmony_ci    return (e*f) + (g*h);            // no constraint on order or 
143617a3babSopenharmony_ci                                     // operator consistency
144617a3babSopenharmony_ci}
145617a3babSopenharmony_ci
146617a3babSopenharmony_cifloat func2(float e, float f, float g, float h)
147617a3babSopenharmony_ci{
148617a3babSopenharmony_ci    precise float result = (e*f) + (g*h);  // ensures same precision for
149617a3babSopenharmony_ci                                           // the two multiplies
150617a3babSopenharmony_ci    return result;
151617a3babSopenharmony_ci}
152617a3babSopenharmony_ci
153617a3babSopenharmony_cifloat func3(float i, float j, precise out float k)
154617a3babSopenharmony_ci{
155617a3babSopenharmony_ci    k = i * i + j;                   // precise, due to <k> declaration
156617a3babSopenharmony_ci}
157617a3babSopenharmony_ci
158617a3babSopenharmony_civoid main()
159617a3babSopenharmony_ci{
160617a3babSopenharmony_ci    vec3 r = vec3(a * b);           // precise, used to compute v.xyz
161617a3babSopenharmony_ci    vec3 s = vec3(c * d);           // precise, used to compute v.xyz
162617a3babSopenharmony_ci    v.xyz = r + s;                          // precise                      
163617a3babSopenharmony_ci    v.w = (a.w * b.w) + (c.w * d.w);        // precise
164617a3babSopenharmony_ci    v.x = func(a.x, b.x, c.x, d.x);         // values computed in func()
165617a3babSopenharmony_ci                                            // are NOT precise
166617a3babSopenharmony_ci    v.x = func2(a.x, b.x, c.x, d.x);        // precise!
167617a3babSopenharmony_ci    func3(a.x * b.x, c.x * d.x, v.x);       // precise!
168617a3babSopenharmony_ci        
169617a3babSopenharmony_ci    funcA(img1);              // OK, adding "restrict" is allowed, ERROR, changing formats
170617a3babSopenharmony_ci    funcB(img2);              // illegal, stripping "coherent" is not, ERROR, changing formats
171617a3babSopenharmony_ci
172617a3babSopenharmony_ci    {
173617a3babSopenharmony_ci        struct light {
174617a3babSopenharmony_ci            float intensity;
175617a3babSopenharmony_ci            vec3 position;
176617a3babSopenharmony_ci        };
177617a3babSopenharmony_ci
178617a3babSopenharmony_ci        light lightVar = light(3.0, vec3(1.0, 2.0, 3.0));
179617a3babSopenharmony_ci    }
180617a3babSopenharmony_ci    {
181617a3babSopenharmony_ci        const float c[3] = float[3](5.0, 7.2, 1.1);
182617a3babSopenharmony_ci        const float d[3] = float[](5.0, 7.2, 1.1);
183617a3babSopenharmony_ci
184617a3babSopenharmony_ci        float g;
185617a3babSopenharmony_ci        float a[5] = float[5](g, 1, g, 2.3, g);
186617a3babSopenharmony_ci        float b[3];
187617a3babSopenharmony_ci
188617a3babSopenharmony_ci        b = float[3](g, g + 1.0, g + 2.0);
189617a3babSopenharmony_ci    }
190617a3babSopenharmony_ci    {
191617a3babSopenharmony_ci        vec4 b[2] = { vec4(1.0), vec4(1.0) };
192617a3babSopenharmony_ci        vec4[3][2](b, b, b);        // constructor
193617a3babSopenharmony_ci        vec4[][2](b, b, b);         // constructor, valid, size deduced
194617a3babSopenharmony_ci        vec4[3][](b, b, b);         // compile-time error, invalid type constructed
195617a3babSopenharmony_ci    }
196617a3babSopenharmony_ci}
197