1617a3babSopenharmony_ci#version 430
2617a3babSopenharmony_ci
3617a3babSopenharmony_ci#extension GL_3DL_array_objects : enable
4617a3babSopenharmony_ci
5617a3babSopenharmony_ciint  a = 0xffffffff;  // 32 bits, a gets the value -1
6617a3babSopenharmony_ciint  b = 0xffffffffU; // ERROR: can't convert uint to int
7617a3babSopenharmony_ciuint c = 0xffffffff;  // 32 bits, c gets the value 0xFFFFFFFF
8617a3babSopenharmony_ciuint d = 0xffffffffU; // 32 bits, d gets the value 0xFFFFFFFF
9617a3babSopenharmony_ciint  e = -1;          // the literal is "1", then negation is performed,
10617a3babSopenharmony_ci                      //   and the resulting non-literal 32-bit signed 
11617a3babSopenharmony_ci                      //   bit pattern of 0xFFFFFFFF is assigned, giving e 
12617a3babSopenharmony_ci                      //   the value of -1.
13617a3babSopenharmony_ciuint f = -1u;         // the literal is "1u", then negation is performed,
14617a3babSopenharmony_ci                      //   and the resulting non-literal 32-bit unsigned 
15617a3babSopenharmony_ci                      //   bit pattern of 0xFFFFFFFF is assigned, giving f 
16617a3babSopenharmony_ci                      //   the value of 0xFFFFFFFF.
17617a3babSopenharmony_ciint  g = 3000000000;  // a signed decimal literal taking 32 bits,
18617a3babSopenharmony_ci                      //   setting the sign bit, g gets -1294967296
19617a3babSopenharmony_ciint  h = 0xA0000000;  // okay, 32-bit signed hexadecimal
20617a3babSopenharmony_ciint  i = 5000000000;  // ERROR: needs more than 32 bits
21617a3babSopenharmony_ciint  j = 0xFFFFFFFFF; // ERROR: needs more that 32 bits
22617a3babSopenharmony_ciint  k = 0x80000000;  // k gets -2147483648 == 0x80000000
23617a3babSopenharmony_ciint  l = 2147483648;  // l gets -2147483648 (the literal set the sign bit)
24617a3babSopenharmony_ci
25617a3babSopenharmony_cifloat fa, fb = 1.5;     // single-precision floating-point
26617a3babSopenharmony_cidouble fc, fd = 2.0LF;  // double-precision floating-point
27617a3babSopenharmony_ci
28617a3babSopenharmony_civec2 texcoord1, texcoord2;
29617a3babSopenharmony_civec3 position;
30617a3babSopenharmony_civec4 myRGBA;
31617a3babSopenharmony_ciivec2 textureLookup;
32617a3babSopenharmony_cibvec3 less;
33617a3babSopenharmony_ci
34617a3babSopenharmony_cimat2 mat2D;
35617a3babSopenharmony_cimat3 optMatrix;
36617a3babSopenharmony_cimat4 view, projection;
37617a3babSopenharmony_cimat4x4 view;  // an alternate way of declaring a mat4
38617a3babSopenharmony_cimat3x2 m;     // a matrix with 3 columns and 2 rows
39617a3babSopenharmony_cidmat4 highPrecisionMVP;
40617a3babSopenharmony_cidmat2x4 dm;
41617a3babSopenharmony_ci
42617a3babSopenharmony_cistruct light {
43617a3babSopenharmony_ci    float intensity;
44617a3babSopenharmony_ci    vec3 position;
45617a3babSopenharmony_ci} lightVar;
46617a3babSopenharmony_ci
47617a3babSopenharmony_cistruct S { float f; };
48617a3babSopenharmony_ci
49617a3babSopenharmony_cistruct T {
50617a3babSopenharmony_ci	//S;              // Error: anonymous structures disallowed
51617a3babSopenharmony_ci	//struct { ... }; // Error: embedded structures disallowed
52617a3babSopenharmony_ci	S s;            // Okay: nested structures with name are allowed
53617a3babSopenharmony_ci};
54617a3babSopenharmony_ci
55617a3babSopenharmony_cifloat frequencies[3];	
56617a3babSopenharmony_ciuniform vec4 lightPosition[4];
57617a3babSopenharmony_cilight lights[];
58617a3babSopenharmony_ciconst int numLights = 2;
59617a3babSopenharmony_cilight lights[numLights];
60617a3babSopenharmony_ci
61617a3babSopenharmony_ciin vec3 normal;
62617a3babSopenharmony_cicentroid in vec2 TexCoord;
63617a3babSopenharmony_ciinvariant centroid in vec4 Color;
64617a3babSopenharmony_cinoperspective in float temperature;
65617a3babSopenharmony_ciflat in vec3 myColor;
66617a3babSopenharmony_cinoperspective centroid in vec2 myTexCoord;
67617a3babSopenharmony_ci
68617a3babSopenharmony_ciuniform vec4 lightPosition;
69617a3babSopenharmony_ciuniform vec3 color = vec3(0.7, 0.7, 0.2);  // value assigned at link time
70617a3babSopenharmony_ci
71617a3babSopenharmony_ciin Material {
72617a3babSopenharmony_ci    smooth in vec4 Color1; // legal, input inside in block
73617a3babSopenharmony_ci    smooth vec4 Color2;    // legal, 'in' inherited from 'in Material'
74617a3babSopenharmony_ci    vec2 TexCoordA;        // legal, TexCoord is an input
75617a3babSopenharmony_ci    uniform float Atten;   // illegal, mismatched  storage qualifier
76617a3babSopenharmony_ci
77617a3babSopenharmony_ci};
78617a3babSopenharmony_ci
79617a3babSopenharmony_ciin Light {
80617a3babSopenharmony_ci    vec4 LightPos;
81617a3babSopenharmony_ci    vec3 LightColor;
82617a3babSopenharmony_ci};
83617a3babSopenharmony_ciin ColoredTexture {
84617a3babSopenharmony_ci    vec4 Color;
85617a3babSopenharmony_ci    vec2 TexCoord;        
86617a3babSopenharmony_ci} Materiala;           // instance name
87617a3babSopenharmony_civec3 Color;            // different Color than Material.Color
88617a3babSopenharmony_ci
89617a3babSopenharmony_ciin vec4 gl_FragCoord;     // redeclaration that changes nothing is allowed
90617a3babSopenharmony_ci
91617a3babSopenharmony_ci// All the following are allowed redeclaration that change behavior
92617a3babSopenharmony_cilayout(origin_upper_left) in vec4 gl_FragCoord;
93617a3babSopenharmony_cilayout(pixel_center_integer) in vec4 gl_FragCoord;
94617a3babSopenharmony_cilayout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
95617a3babSopenharmony_ci
96617a3babSopenharmony_cilayout(early_fragment_tests) in;
97617a3babSopenharmony_ci
98617a3babSopenharmony_ci// compute shader:
99617a3babSopenharmony_cilayout (local_size_x = 32, local_size_y = 32) in;
100617a3babSopenharmony_cilayout (local_size_x = 8) in;
101617a3babSopenharmony_ci
102617a3babSopenharmony_cilayout(location = 3) out vec4 color;
103617a3babSopenharmony_cilayout(location = 3, index = 1) out vec4 factor;
104617a3babSopenharmony_cilayout(location = 2) out vec4 colors[3];
105617a3babSopenharmony_ci
106617a3babSopenharmony_cilayout (depth_greater) out float gl_FragDepth;
107617a3babSopenharmony_ci
108617a3babSopenharmony_ci// redeclaration that changes nothing is allowed
109617a3babSopenharmony_ciout float gl_FragDepth;
110617a3babSopenharmony_ci
111617a3babSopenharmony_ci// assume it may be modified in any way
112617a3babSopenharmony_cilayout (depth_any) out float gl_FragDepth;
113617a3babSopenharmony_ci
114617a3babSopenharmony_ci// assume it may be modified such that its value will only increase
115617a3babSopenharmony_cilayout (depth_greater) out float gl_FragDepth;
116617a3babSopenharmony_ci
117617a3babSopenharmony_ci// assume it may be modified such that its value will only decrease
118617a3babSopenharmony_cilayout (depth_less) out float gl_FragDepth;
119617a3babSopenharmony_ci
120617a3babSopenharmony_ci// assume it will not be modified
121617a3babSopenharmony_cilayout (depth_unchanged) out float gl_FragDepth;
122617a3babSopenharmony_ci
123617a3babSopenharmony_ciin vec4 gl_Color;             // predeclared by the fragment language
124617a3babSopenharmony_ciflat  in vec4 gl_Color;       // redeclared by user to be flat
125617a3babSopenharmony_ci
126617a3babSopenharmony_ci
127617a3babSopenharmony_cifloat[5] foo(float[5]) 
128617a3babSopenharmony_ci{
129617a3babSopenharmony_ci    return float[5](3.4, 4.2, 5.0, 5.2, 1.1);
130617a3babSopenharmony_ci}
131617a3babSopenharmony_ci
132617a3babSopenharmony_ciprecision highp float;
133617a3babSopenharmony_ciprecision highp int;
134617a3babSopenharmony_ciprecision mediump int;
135617a3babSopenharmony_ciprecision highp float;
136617a3babSopenharmony_ci
137617a3babSopenharmony_civoid main()
138617a3babSopenharmony_ci{
139617a3babSopenharmony_ci    {
140617a3babSopenharmony_ci		float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1);
141617a3babSopenharmony_ci	}
142617a3babSopenharmony_ci	{
143617a3babSopenharmony_ci		float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1);  // same thing
144617a3babSopenharmony_ci	}
145617a3babSopenharmony_ci    {
146617a3babSopenharmony_ci	    vec4 a[3][2];  // size-3 array of size-2 array of vec4
147617a3babSopenharmony_ci		vec4[2] a1[3];  // size-3 array of size-2 array of vec4
148617a3babSopenharmony_ci		vec4[3][2] a2;  // size-3 array of size-2 array of vec4
149617a3babSopenharmony_ci		vec4 b[2] = vec4[2](vec4(0.0), vec4(0.1));
150617a3babSopenharmony_ci		vec4[3][2] a3 = vec4[3][2](b, b, b);        // constructor
151617a3babSopenharmony_ci		void foo(vec4[3][2]);  // prototype with unnamed parameter
152617a3babSopenharmony_ci		vec4 a4[3][2] = {vec4[2](vec4(0.0), vec4(1.0)),   
153617a3babSopenharmony_ci						 vec4[2](vec4(0.0), vec4(1.0)),   
154617a3babSopenharmony_ci						 vec4[2](vec4(0.0), vec4(1.0)) };
155617a3babSopenharmony_ci    }
156617a3babSopenharmony_ci	{
157617a3babSopenharmony_ci		float a[5];
158617a3babSopenharmony_ci		{
159617a3babSopenharmony_ci			float b[] = a;  // b is explicitly size 5
160617a3babSopenharmony_ci		}
161617a3babSopenharmony_ci		{
162617a3babSopenharmony_ci			float b[5] = a; // means the same thing
163617a3babSopenharmony_ci		}
164617a3babSopenharmony_ci		{
165617a3babSopenharmony_ci			float b[] = float[](1,2,3,4,5);  // also explicitly sizes to 5
166617a3babSopenharmony_ci		}
167617a3babSopenharmony_ci		a.length();  // returns 5 
168617a3babSopenharmony_ci	}
169617a3babSopenharmony_ci    {
170617a3babSopenharmony_ci		vec4 a[3][2];
171617a3babSopenharmony_ci		a.length();     // this is 3
172617a3babSopenharmony_ci		a[x].length();  // this is 2
173617a3babSopenharmony_ci    }
174617a3babSopenharmony_ci	// for an array b containing a member array a:
175617a3babSopenharmony_ci	b[++x].a.length();    // b is never dereferenced, but �++x� is evaluated
176617a3babSopenharmony_ci
177617a3babSopenharmony_ci	// for an array s of a shader storage object containing a member array a:
178617a3babSopenharmony_ci	s[x].a.length();      // s is dereferenced; x needs to be a valid index
179617a3babSopenharmony_ci	//
180617a3babSopenharmony_ci	//All of the following declarations result in a compile-time error.
181617a3babSopenharmony_ci	//float a[2] = { 3.4, 4.2, 5.0 };         // illegal
182617a3babSopenharmony_ci	//vec2 b = { 1.0, 2.0, 3.0 };             // illegal
183617a3babSopenharmony_ci	//mat3x3 c = { vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0) };    // illegal
184617a3babSopenharmony_ci	//mat2x2 d = { 1.0, 0.0, 0.0, 1.0 };      // illegal, can't flatten nesting
185617a3babSopenharmony_ci	//struct {
186617a3babSopenharmony_ci	//	float a;
187617a3babSopenharmony_ci	//	int   b;
188617a3babSopenharmony_ci	//} e = { 1.2, 2, 3 };                    // illegal
189617a3babSopenharmony_ci
190617a3babSopenharmony_ci    struct {
191617a3babSopenharmony_ci        float a;
192617a3babSopenharmony_ci        int   b;
193617a3babSopenharmony_ci    } e = { 1.2, 2 };             // legal, all types match
194617a3babSopenharmony_ci
195617a3babSopenharmony_ci    struct {
196617a3babSopenharmony_ci        float a;
197617a3babSopenharmony_ci        int   b;
198617a3babSopenharmony_ci    } e = { 1, 3 };               // legal, first initializer is converted
199617a3babSopenharmony_ci
200617a3babSopenharmony_ci    //All of the following declarations result in a compile-time error.
201617a3babSopenharmony_ci    //int a = true;                           // illegal
202617a3babSopenharmony_ci    //vec4 b[2] = { vec4(0.0), 1.0 };         // illegal
203617a3babSopenharmony_ci    //mat4x2 c = { vec3(0.0), vec3(1.0) };    // illegal
204617a3babSopenharmony_ci
205617a3babSopenharmony_ci    //struct S1 {
206617a3babSopenharmony_ci    //    vec4 a;
207617a3babSopenharmony_ci    //    vec4 b;
208617a3babSopenharmony_ci    //};
209617a3babSopenharmony_ci
210617a3babSopenharmony_ci    //struct {
211617a3babSopenharmony_ci    //    float s;
212617a3babSopenharmony_ci    //    float t;
213617a3babSopenharmony_ci    //} d[] = { S1(vec4(0.0), vec4(1.1)) };   // illegal
214617a3babSopenharmony_ci
215617a3babSopenharmony_ci    {
216617a3babSopenharmony_ci        float a[] = float[](3.4, 4.2, 5.0, 5.2, 1.1);
217617a3babSopenharmony_ci        float b[] = { 3.4, 4.2, 5.0, 5.2, 1.1 };
218617a3babSopenharmony_ci        float c[] = a;                          // c is explicitly size 5
219617a3babSopenharmony_ci        float d[5] = b;                         // means the same thing
220617a3babSopenharmony_ci    }
221617a3babSopenharmony_ci    {
222617a3babSopenharmony_ci        const vec3 zAxis = vec3 (0.0, 0.0, 1.0);
223617a3babSopenharmony_ci        const float ceiling = a + b; // a and b not necessarily constants
224617a3babSopenharmony_ci    }
225617a3babSopenharmony_ci    {
226617a3babSopenharmony_ci        in vec4 position;
227617a3babSopenharmony_ci        in vec3 normal;
228617a3babSopenharmony_ci        in vec2 texCoord[4];
229617a3babSopenharmony_ci    }
230617a3babSopenharmony_ci    {
231617a3babSopenharmony_ci        lowp float color;
232617a3babSopenharmony_ci        out mediump vec2 P;
233617a3babSopenharmony_ci        lowp ivec2 foo(lowp mat3);
234617a3babSopenharmony_ci        highp mat4 m;
235617a3babSopenharmony_ci    }
236617a3babSopenharmony_ci
237617a3babSopenharmony_ci}
238