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