3 // Note 'location' tests for enhanced layouts are in 330.frag
\r
5 layout(location = 2, component = 2) in vec2 a;
\r
6 layout(location = 2, component = 1) in float b;
\r
8 layout(location = 3, component = 2) in vec3 c; // ERROR: c overflows components 2 and 3
\r
10 layout(location = 0, component = 3) in float d[4];
\r
12 layout(location = 4, component = 0) in vec3 e[5];
\r
13 layout(location = 4, component = 3) in float f[5];
\r
15 layout(location = 9, component = 4) in float g[6]; // ERROR, component too big
\r
17 layout(location = 4, component = 2) in vec2 h; // component overlap okay for vertex in
\r
19 layout(location = 3, component = 2) out vec2 i;
\r
20 layout(location = 3, component = 0) out vec2 j;
\r
22 layout(location = 4, component = 2) out vec2 k;
\r
23 layout(location = 4, component = 2) out vec2 m; // ERROR, component overlap
\r
25 layout(location = 2, component = 2) out vec2 n;
\r
26 layout(location = 2, component = 0) out vec3 p; // ERROR, component overlap
\r
28 layout(location = 10, component = 3) out float q[6];
\r
29 layout(location = 10, component = 0) out vec3 r[6];
\r
31 layout(location = 15, component = 3) out float s; // ERROR, overlap
\r
32 layout(location = 10, component = 1) out float t; // ERROR, overlap
\r
34 layout(location = 20, component = 2) out float u;
\r
35 layout(location = 20, component = 0) out float v;
\r
36 layout(location = 20, component = 3) out float w;
\r
37 layout(location = 20, component = 1) out vec2 x; // ERROR, overlap
\r
39 layout(location = 30, component = 3) out vec2 y; // ERROR, goes to component 4
\r
40 layout(location = 31, component = 1) out vec4 z; // ERROR, goes to component 4
\r
42 layout(location = 32, component = 1) out mat4 ba; // ERROR
\r
43 layout(location = 33, component = 1) out struct S {int a;} Ss; // ERROR
\r
44 layout(location = 34, component = 1) out bn { int a;} bb; // ERROR
\r
46 layout(component = 1) out float bc; // ERROR, no location
\r
49 layout(location = 40, component = 2) out float u;
\r
50 layout(location = 40, component = 0) out float v;
\r
51 layout(location = 40, component = 3) out float w;
\r
52 layout(location = 40, component = 1) out vec2 x; // ERROR, overlap
\r
54 layout(location = 41, component = 3) out vec2 y; // ERROR, goes to component 4
\r
55 layout(location = 42, component = 1) out vec4 z; // ERROR, goes to component 4
\r
57 layout(location = 42, component = 1) out mat4 ba; // ERROR
\r
58 layout(location = 43, component = 1) out S Ss; // ERROR
\r
61 layout(location = 1, component = 1) out; // ERROR, no global setting
\r
63 layout(location = 50, component = 3) out int be;
\r
64 layout(location = 50, component = 0) out vec3 bf;
\r
66 layout(location = 51, component = 1) out double dfo; // ERROR, odd component
\r
67 layout(location = 52, component = 2) out dvec2 dvo; // ERROR, overflow
\r
68 layout(location = 53) out double dfo2;
\r
69 layout(location = 53, component = 2) out vec2 ffv2; // okay, fits
\r
70 layout(location = 54) out dvec4 dvec4out; // uses up location 55 too
\r
71 layout(location = 55) out float overf; // ERROR, collides with previous dvec4
\r
72 layout(location = 56, component = 1) out vec2 df2o;
\r
73 layout(location = 56, component = 3) out float sf2o;
\r
74 layout(location = 57, component = 2) out vec2 dv3o;
\r
75 layout(location = 57, component = 3) out float sf4o; // ERROR, overlapping component
\r
82 layout(xfb_offset=64) vec4 bbv;
\r
85 layout(xfb_buffer = 3, xfb_stride = 64) out; // default buffer is 3
\r
88 layout(xfb_offset=16) vec4 bbv; // in xfb_buffer 3
\r
92 layout(xfb_offset=16) vec4 bbv; // ERROR, not in a uniform
\r
95 layout(xfb_buffer=2, xfb_offset=48, xfb_stride=80) out vec4 bg;
\r
96 layout( xfb_offset=32, xfb_stride=64) out vec4 bh;
\r
98 layout(xfb_offset=48) out; // ERROR
\r
100 layout(xfb_stride=80, xfb_buffer=2, xfb_offset=16) out bblck4 {
\r
106 layout(xfb_offset=0) vec4 bbv1;
\r
107 layout(xfb_stride=64, xfb_buffer=3, xfb_offset=48) vec4 bbv2;
\r
108 layout(xfb_buffer=2) vec4 bbv3; // ERROR, wrong buffer
\r
111 out layout(xfb_buffer=2) bblck6 {
\r
112 layout(xfb_offset=0) vec4 bbv1;
\r
113 layout(xfb_stride=64, xfb_buffer=3, xfb_offset=32) vec4 bbv2; // ERROR, overlap 32 from bh, and buffer contradiction
\r
114 layout(xfb_buffer=2, xfb_offset=0) vec4 bbv3; // ERROR, overlap 0 from bbinst5
\r
115 layout(xfb_buffer=2) vec4 bbv5;
\r
116 layout(xfb_offset=24) float bbf6; // ERROR, overlap 24 from bbv1 in bbinst4
\r
119 layout(xfb_stride=48) out; // ERROR, stride of buffer 3
\r
121 layout(xfb_buffer=1) out; // default buffer is 1
\r
122 layout(xfb_offset=4) out float bj;
\r
123 layout(xfb_offset=0) out ivec2 bk; // ERROR, overlap 4
\r
125 layout(xfb_buffer=3, xfb_stride=48) out; // ERROR, stride of buffer 3 (default is now 3)
\r
126 layout(xfb_stride=48) out float bl; // ERROR, stride of buffer 3
\r
128 layout(xfb_stride=48) out bblck7 { // ERROR, stride of buffer 3
\r
129 layout(xfb_stride=64) vec4 bbv1;
\r
130 layout(xfb_stride=32) vec4 bbv2; // ERROR, stride of buffer 3
\r
134 int i; // 4 bytes plus 4 byte hole
\r
135 double d; // 8 bytes
\r
136 float f; // 4 bytes
\r
137 }; // total size = 20
\r
140 bool b; // 4 plus 4 byte hole
\r
143 }; // total size = 36
\r
145 out layout(xfb_buffer=0, xfb_offset=0, xfb_stride=92) bblck8 { // ERROR, stride not multiple of 8
\r
146 bool b; // offset 0
\r
147 T t; // offset 8, size 40
\r
148 int i; // offset 40 + 4 = 48
\r
149 mat3x3 m3; // offset 52
\r
150 float f; // offset 52 + 9*4 = 88
\r
151 float g; // ERROR, overflow stride
\r
154 out layout(xfb_buffer=4) bblck9 {
\r
155 layout(xfb_offset=1) bool b; // ERROR
\r
156 layout(xfb_offset=12) T t; // ERROR
\r
157 layout(xfb_offset=52) mat3x3 m3; // non-multiple of 8 okay
\r
158 layout(xfb_offset=90) int i; // ERROR
\r
159 layout(xfb_offset=98) double d; // ERROR
\r
160 layout(xfb_offset=108) S s; // non-multiple of 8 okay
\r
163 layout(xfb_buffer=5, xfb_stride=6) out; // link ERROR, stride not multiple of 4
\r
164 layout(xfb_offset=0) out float bm;
\r
166 layout(xfb_buffer=6, xfb_stride=2000) out; // ERROR, stride too big
\r
168 out layout(xfb_buffer=7, xfb_offset=0) bblck10 { // link ERROR, implicit stride too big
\r
174 int drawParamsBad()
\r
176 return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; // ERROR, extension not requested
\r
179 #extension GL_ARB_shader_draw_parameters: enable
\r
183 return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB;
\r
184 gl_BaseVertexARB = 3; // ERROR, can't write to shader 'in'
\r
185 gl_BaseInstanceARB = 3; // ERROR, can't write to shader 'in'
\r
186 gl_DrawIDARB = 3; // ERROR, can't write to shader 'in'
\r
187 glBaseInstanceARB; // ERROR, not defined
\r