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.Position� 7617a3babSopenharmony_ci vec2 Texture; 8617a3babSopenharmony_ci} Coords; // shader will use �Coords.Position� 9617a3babSopenharmony_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