1#version 440 2 3// Note 'location' tests for enhanced layouts are in 330.frag 4 5layout(location = 2, component = 2) in vec2 a; 6layout(location = 2, component = 1) in float b; 7 8layout(location = 3, component = 2) in vec3 c; // ERROR: c overflows components 2 and 3 9 10layout(location = 0, component = 3) in float d[4]; 11 12layout(location = 4, component = 0) in vec3 e[5]; 13layout(location = 4, component = 3) in float f[5]; 14 15layout(location = 9, component = 4) in float g[6]; // ERROR, component too big 16 17layout(location = 4, component = 2) in vec2 h; // component overlap okay for vertex in 18 19layout(location = 3, component = 2) out vec2 i; 20layout(location = 3, component = 0) out vec2 j; 21 22layout(location = 4, component = 2) out vec2 k; 23layout(location = 4, component = 2) out vec2 m; // ERROR, component overlap 24 25layout(location = 2, component = 2) out vec2 n; 26layout(location = 2, component = 0) out vec3 p; // ERROR, component overlap 27 28layout(location = 10, component = 3) out float q[6]; 29layout(location = 10, component = 0) out vec3 r[6]; 30 31layout(location = 15, component = 3) out float s; // ERROR, overlap 32layout(location = 10, component = 1) out float t; // ERROR, overlap 33 34layout(location = 20, component = 2) out float u; 35layout(location = 20, component = 0) out float v; 36layout(location = 20, component = 3) out float w; 37layout(location = 20, component = 1) out vec2 x; // ERROR, overlap 38 39layout(location = 30, component = 3) out vec2 y; // ERROR, goes to component 4 40layout(location = 31, component = 1) out vec4 z; // ERROR, goes to component 4 41 42layout(location = 32, component = 1) out mat4 ba; // ERROR 43layout(location = 33, component = 1) out struct S {int a;} Ss; // ERROR 44layout(location = 34, component = 1) out bn { int a;} bb; // ERROR 45 46layout(component = 1) out float bc; // ERROR, no location 47 48out blockname { 49 layout(location = 40, component = 2) out float u; 50 layout(location = 40, component = 0) out float v; 51 layout(location = 40, component = 3) out float w; 52 layout(location = 40, component = 1) out vec2 x; // ERROR, overlap 53 54 layout(location = 41, component = 3) out vec2 y; // ERROR, goes to component 4 55 layout(location = 42, component = 1) out vec4 z; // ERROR, goes to component 4 56 57 layout(location = 42, component = 1) out mat4 ba; // ERROR 58 layout(location = 43, component = 1) out S Ss; // ERROR 59} bd; 60 61layout(location = 1, component = 1) out; // ERROR, no global setting 62 63layout(location = 50, component = 3) out int be; 64layout(location = 50, component = 0) out vec3 bf; 65 66layout(location = 51, component = 1) out double dfo; // ERROR, odd component 67layout(location = 52, component = 2) out dvec2 dvo; // ERROR, overflow 68layout(location = 53) out double dfo2; 69layout(location = 53, component = 2) out vec2 ffv2; // okay, fits 70layout(location = 54) out dvec4 dvec4out; // uses up location 55 too 71layout(location = 55) out float overf; // ERROR, collides with previous dvec4 72layout(location = 56, component = 1) out vec2 df2o; 73layout(location = 56, component = 3) out float sf2o; 74layout(location = 57, component = 2) out vec2 dv3o; 75layout(location = 57, component = 3) out float sf4o; // ERROR, overlapping component 76layout(location=58) out flat dvec3 dv3o2; // uses part of location 59 77layout(location=59, component=2) out flat double dfo3; // okay, fits 78layout(location=59, component=0) out flat double dfo4; // ERROR, overlaps the dvec3 in starting in 58 79 80out bblck1 { 81 vec4 bbv; 82} bbinst1; 83 84out bblck2 { 85 layout(xfb_offset=64) vec4 bbv; 86} bbinst2; 87 88layout(xfb_buffer = 3, xfb_stride = 64) out; // default buffer is 3 89 90out bblck3 { 91 layout(xfb_offset=16) vec4 bbv; // in xfb_buffer 3 92} bbinst3; 93 94uniform ubblck3 { 95 layout(xfb_offset=16) vec4 bbv; // ERROR, not in a uniform 96} ubbinst3; 97 98layout(xfb_buffer=2, xfb_offset=48, xfb_stride=80) out vec4 bg; 99layout( xfb_offset=32, xfb_stride=64) out vec4 bh; 100 101layout(xfb_offset=48) out; // ERROR 102 103layout(xfb_stride=80, xfb_buffer=2, xfb_offset=16) out bblck4 { 104 vec4 bbv1; 105 vec4 bbv2; 106} bbinst4; 107 108out bblck5 { 109 layout(xfb_offset=0) vec4 bbv1; 110 layout(xfb_stride=64, xfb_buffer=3, xfb_offset=48) vec4 bbv2; 111 layout(xfb_buffer=2) vec4 bbv3; // ERROR, wrong buffer 112} bbinst5; 113 114out layout(xfb_buffer=2) bblck6 { 115 layout(xfb_offset=0) vec4 bbv1; 116 layout(xfb_stride=64, xfb_buffer=3, xfb_offset=32) vec4 bbv2; // ERROR, overlap 32 from bh, and buffer contradiction 117 layout(xfb_buffer=2, xfb_offset=0) vec4 bbv3; // ERROR, overlap 0 from bbinst5 118 layout(xfb_buffer=2) vec4 bbv5; 119 layout(xfb_offset=24) float bbf6; // ERROR, overlap 24 from bbv1 in bbinst4 120} bbinst6; 121 122layout(xfb_stride=48) out; // ERROR, stride of buffer 3 123 124layout(xfb_buffer=1) out; // default buffer is 1 125layout(xfb_offset=4) out float bj; 126layout(xfb_offset=0) out ivec2 bk; // ERROR, overlap 4 127 128layout(xfb_buffer=3, xfb_stride=48) out; // ERROR, stride of buffer 3 (default is now 3) 129layout(xfb_stride=48) out float bl; // ERROR, stride of buffer 3 130 131layout(xfb_stride=48) out bblck7 { // ERROR, stride of buffer 3 132 layout(xfb_stride=64) vec4 bbv1; 133 layout(xfb_stride=32) vec4 bbv2; // ERROR, stride of buffer 3 134} bbinst7; 135 136struct S5 { 137 int i; // 4 bytes plus 4 byte hole 138 double d; // 8 bytes 139 float f; // 4 bytes 140}; // total size = 20 141 142struct T { 143 bool b; // 4 plus 4 byte hole 144 S5 s; // 20 145 vec2 v2; // 8 146}; // total size = 36 147 148out layout(xfb_buffer=0, xfb_offset=0, xfb_stride=92) bblck8 { // ERROR, stride not multiple of 8 149 bool b; // offset 0 150 T t; // offset 8, size 40 151 int i; // offset 40 + 4 = 48 152 mat3x3 m3; // offset 52 153 float f; // offset 52 + 9*4 = 88 154 float g; // ERROR, overflow stride 155} bbinst8; 156 157out layout(xfb_buffer=4) bblck9 { 158 layout(xfb_offset=1) bool b; // ERROR 159 layout(xfb_offset=12) T t; // ERROR 160 layout(xfb_offset=52) mat3x3 m3; // non-multiple of 8 okay 161 layout(xfb_offset=90) int i; // ERROR 162 layout(xfb_offset=98) double d; // ERROR 163 layout(xfb_offset=108) S s; // non-multiple of 8 okay 164} bbinst9; 165 166layout(xfb_buffer=5, xfb_stride=6) out; // link ERROR, stride not multiple of 4 167layout(xfb_offset=0) out float bm; 168 169layout(xfb_buffer=6, xfb_stride=2000) out; // ERROR, stride too big 170 171out layout(xfb_buffer=7, xfb_offset=0) bblck10 { // link ERROR, implicit stride too big 172 dmat4x4 m1; 173 dmat4x4 m2; 174 float f; 175} bbinst10; 176 177layout(xfb_buffer = 3) out; 178layout(xfb_offset = 32) out gl_PerVertex { 179 layout(xfb_buffer = 2) float gl_PointSize; // ERROR, change in xfb_buffer 180 vec4 gl_Position; 181}; 182 183int drawParamsBad() 184{ 185 return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; // ERROR, extension not requested 186} 187 188#extension GL_ARB_shader_draw_parameters: enable 189 190int drawParams() 191{ 192 return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; 193 gl_BaseVertexARB = 3; // ERROR, can't write to shader 'in' 194 gl_BaseInstanceARB = 3; // ERROR, can't write to shader 'in' 195 gl_DrawIDARB = 3; // ERROR, can't write to shader 'in' 196 glBaseInstanceARB; // ERROR, not defined 197} 198