John Kessenich | c027579 | 2013-08-09 17:14:49 +0000 | [diff] [blame] | 1 | #version 400 core
|
| 2 |
|
| 3 | void main()
|
| 4 | {
|
| 5 | EmitStreamVertex(1);
|
| 6 | EndStreamPrimitive(0);
|
| 7 | EmitVertex();
|
| 8 | EndPrimitive();
|
John Kessenich | e7c59c1 | 2013-10-16 22:28:35 +0000 | [diff] [blame] | 9 | int id = gl_InvocationID;
|
John Kessenich | c027579 | 2013-08-09 17:14:49 +0000 | [diff] [blame] | 10 | }
|
John Kessenich | 94fdd11 | 2013-10-23 19:34:05 +0000 | [diff] [blame] | 11 |
|
John Kessenich | 7c908d2 | 2013-12-18 03:06:24 +0000 | [diff] [blame] | 12 | layout(invocations = 4) in outbn { int a; } bn[]; // ERROR, not on a block
|
| 13 | layout(max_vertices = 127) out;
|
| 14 | layout(invocations = 4) in;
|
John Kessenich | 9497485 | 2013-10-24 22:41:04 +0000 | [diff] [blame] | 15 |
|
| 16 | #extension GL_ARB_separate_shader_objects : enable
|
| 17 |
|
| 18 | in gl_PerVertex { // testing input arrays with a block redeclaration, see 420.geom for without
|
| 19 | vec4 gl_Position;
|
John Kessenich | c719481 | 2013-12-09 00:37:46 +0000 | [diff] [blame] | 20 | layout(std140, location = 3) patch float gl_PointSize; // ERRORs...
|
John Kessenich | 9497485 | 2013-10-24 22:41:04 +0000 | [diff] [blame] | 21 | } gl_in[];
|
| 22 |
|
| 23 | void foo()
|
| 24 | {
|
| 25 | gl_in.length(); // ERROR
|
| 26 | gl_in[1].gl_Position;
|
| 27 | }
|
| 28 |
|
| 29 | in vec4 color[];
|
| 30 | in vec4 color2[];
|
| 31 | in vec4 colorS[3];
|
| 32 | in vec4 colorBad[4];
|
| 33 |
|
| 34 | void foo2()
|
| 35 | {
|
| 36 | color.length(); // ERROR
|
| 37 | colorS.length();
|
| 38 | }
|
| 39 |
|
| 40 | layout(triangles) in; // give ERROR just for colorBad
|
| 41 |
|
| 42 | in vec4 color[3];
|
| 43 | in vec4 color2[3];
|
| 44 | in vec4 colorbad2[2]; // ERROR
|
| 45 |
|
| 46 | void foo3()
|
| 47 | {
|
| 48 | gl_in.length();
|
| 49 | color.length();
|
| 50 | color2.length();
|
| 51 | colorS.length();
|
| 52 | }
|
John Kessenich | 521ca37 | 2013-12-05 20:58:16 +0000 | [diff] [blame] | 53 |
|
| 54 | layout(location = 4) in vec4 cva[3];
|
| 55 | layout(location = 5) in vec4 cvb[3];
|
| 56 | layout(location = 2) in mat3 cmc[3]; // ERROR, collision
|
John Kessenich | 116c30b | 2013-12-12 01:25:37 +0000 | [diff] [blame] | 57 |
|
John Kessenich | 7c908d2 | 2013-12-18 03:06:24 +0000 | [diff] [blame] | 58 | patch in vec4 patchIn[]; // ERROR
|
| 59 | patch out vec4 patchOut; // ERROR
|
| 60 |
|
| 61 | in float scalar; // ERROR, no array
|
| 62 |
|
| 63 | layout(max_vertices = 127, invocations = 4) out; // ERROR
|
| 64 | layout(invocations = 4, max_vertices = 127) in; // ERROR
|
| 65 | layout(max_vertices = 127, invocations = 4) uniform; // 2 ERRORs
|
| 66 |
|
| 67 | in inblockscalar {
|
| 68 | int a;
|
| 69 | } inbls; // ERROR, not an array
|
| 70 |
|
| 71 | in inblocka {
|
| 72 | int a;
|
| 73 | } inbla[17]; // ERROR, wrong array size
|
John Kessenich | be70339 | 2014-08-13 20:04:19 +0000 | [diff] [blame] | 74 |
|
| 75 | void bits()
|
| 76 | {
|
| 77 | uvec2 u2;
|
| 78 | u2 = uaddCarry(u2, u2, u2);
|
| 79 | uint u1;
|
| 80 | u1 = usubBorrow(u1, u1, u1);
|
| 81 | uvec4 u4;
|
| 82 | umulExtended(u4, u4, u4, u4);
|
| 83 | ivec4 i4;
|
| 84 | imulExtended(i4, i4, i4, i4);
|
| 85 | int i1;
|
| 86 | i1 = bitfieldExtract(i1, 4, 5);
|
| 87 | uvec3 u3;
|
| 88 | u3 = bitfieldExtract(u3, 4, 5);
|
| 89 | ivec3 i3;
|
| 90 | i3 = bitfieldInsert(i3, i3, 4, 5);
|
| 91 | u1 = bitfieldInsert(u1, u1, 4, 5);
|
| 92 | ivec2 i2;
|
| 93 | i2 = bitfieldReverse(i2);
|
| 94 | u4 = bitfieldReverse(u4);
|
| 95 | i1 = bitCount(i1);
|
| 96 | i3 = bitCount(u3);
|
| 97 | i2 = findLSB(i2);
|
| 98 | i4 = findLSB(u4);
|
| 99 | i1 = findMSB(i1);
|
| 100 | i2 = findMSB(u2);
|
| 101 | }
|
John Kessenich | aa657c1 | 2014-08-19 02:12:44 +0000 | [diff] [blame] | 102 |
|
| 103 | layout(location = 7, index = 1) out vec4 indexedOut;
|
John Kessenich | 2398b3a | 2015-09-15 19:38:56 -0600 | [diff] [blame] | 104 |
|
| 105 | uniform sampler1D samp1D;
|
| 106 | uniform sampler2DShadow samp2Ds;
|
| 107 |
|
| 108 | void qlod()
|
| 109 | {
|
| 110 | vec2 lod;
|
| 111 | float pf;
|
| 112 | vec2 pf2;
|
| 113 | vec3 pf3;
|
| 114 |
|
| 115 | lod = textureQueryLod(samp1D, pf); // ERROR, only in fragment
|
| 116 | lod = textureQueryLod(samp2Ds, pf2); // ERROR, only in fragment
|
| 117 | }
|
John Kessenich | 712ecb9 | 2016-01-16 20:37:43 -0700 | [diff] [blame] | 118 |
|
| 119 | void doubles()
|
| 120 | {
|
| 121 | double doublev;
|
| 122 | dvec2 dvec2v;
|
| 123 | dvec3 dvec3v;
|
| 124 | dvec4 dvec4v;
|
| 125 |
|
| 126 | bool boolv;
|
| 127 | bvec2 bvec2v;
|
| 128 | bvec3 bvec3v;
|
| 129 | bvec4 bvec4v;
|
| 130 |
|
| 131 | doublev = sqrt(2.9);
|
| 132 | dvec2v = sqrt(dvec2(2.7));
|
| 133 | dvec3v = sqrt(dvec3(2.0));
|
| 134 | dvec4v = sqrt(dvec4(2.1));
|
| 135 |
|
| 136 | doublev += inversesqrt(doublev);
|
| 137 | dvec2v += inversesqrt(dvec2v);
|
| 138 | dvec3v += inversesqrt(dvec3v);
|
| 139 | dvec4v += inversesqrt(dvec4v);
|
| 140 |
|
| 141 | doublev += abs(doublev);
|
| 142 | dvec2v += abs(dvec2v);
|
| 143 | dvec3v += abs(dvec3v);
|
| 144 | dvec4v += abs(dvec4v);
|
| 145 |
|
| 146 | doublev += sign(doublev);
|
| 147 | dvec2v += sign(dvec2v);
|
| 148 | dvec3v += sign(dvec3v);
|
| 149 | dvec4v += sign(dvec4v);
|
| 150 |
|
| 151 | doublev += floor(doublev);
|
| 152 | dvec2v += floor(dvec2v);
|
| 153 | dvec3v += floor(dvec3v);
|
| 154 | dvec4v += floor(dvec4v);
|
| 155 |
|
| 156 | doublev += trunc(doublev);
|
| 157 | dvec2v += trunc(dvec2v);
|
| 158 | dvec3v += trunc(dvec3v);
|
| 159 | dvec4v += trunc(dvec4v);
|
| 160 |
|
| 161 | doublev += round(doublev);
|
| 162 | dvec2v += round(dvec2v);
|
| 163 | dvec3v += round(dvec3v);
|
| 164 | dvec4v += round(dvec4v);
|
| 165 |
|
| 166 | doublev += roundEven(doublev);
|
| 167 | dvec2v += roundEven(dvec2v);
|
| 168 | dvec3v += roundEven(dvec3v);
|
| 169 | dvec4v += roundEven(dvec4v);
|
| 170 |
|
| 171 | doublev += ceil(doublev);
|
| 172 | dvec2v += ceil(dvec2v);
|
| 173 | dvec3v += ceil(dvec3v);
|
| 174 | dvec4v += ceil(dvec4v);
|
| 175 |
|
| 176 | doublev += fract(doublev);
|
| 177 | dvec2v += fract(dvec2v);
|
| 178 | dvec3v += fract(dvec3v);
|
| 179 | dvec4v += fract(dvec4v);
|
| 180 |
|
| 181 | doublev += mod(doublev, doublev);
|
| 182 | dvec2v += mod(dvec2v, doublev);
|
| 183 | dvec3v += mod(dvec3v, doublev);
|
| 184 | dvec4v += mod(dvec4v, doublev);
|
| 185 | dvec2v += mod(dvec2v, dvec2v);
|
| 186 | dvec3v += mod(dvec3v, dvec3v);
|
| 187 | dvec4v += mod(dvec4v, dvec4v);
|
| 188 |
|
| 189 | doublev += modf(doublev, doublev);
|
| 190 | dvec2v += modf(dvec2v, dvec2v);
|
| 191 | dvec3v += modf(dvec3v, dvec3v);
|
| 192 | dvec4v += modf(dvec4v, dvec4v);
|
| 193 |
|
| 194 | doublev += min(doublev, doublev);
|
| 195 | dvec2v += min(dvec2v, doublev);
|
| 196 | dvec3v += min(dvec3v, doublev);
|
| 197 | dvec4v += min(dvec4v, doublev);
|
| 198 | dvec2v += min(dvec2v, dvec2v);
|
| 199 | dvec3v += min(dvec3v, dvec3v);
|
| 200 | dvec4v += min(dvec4v, dvec4v);
|
| 201 |
|
| 202 | doublev += max(doublev, doublev);
|
| 203 | dvec2v += max(dvec2v, doublev);
|
| 204 | dvec3v += max(dvec3v, doublev);
|
| 205 | dvec4v += max(dvec4v, doublev);
|
| 206 | dvec2v += max(dvec2v, dvec2v);
|
| 207 | dvec3v += max(dvec3v, dvec3v);
|
| 208 | dvec4v += max(dvec4v, dvec4v);
|
| 209 |
|
| 210 | doublev += clamp(doublev, doublev, doublev);
|
| 211 | dvec2v += clamp(dvec2v, doublev, doublev);
|
| 212 | dvec3v += clamp(dvec3v, doublev, doublev);
|
| 213 | dvec4v += clamp(dvec4v, doublev, doublev);
|
| 214 | dvec2v += clamp(dvec2v, dvec2v, dvec2v);
|
| 215 | dvec3v += clamp(dvec3v, dvec3v, dvec3v);
|
| 216 | dvec4v += clamp(dvec4v, dvec4v, dvec4v);
|
| 217 |
|
| 218 | doublev += mix(doublev, doublev, doublev);
|
| 219 | dvec2v += mix(dvec2v, dvec2v, doublev);
|
| 220 | dvec3v += mix(dvec3v, dvec3v, doublev);
|
| 221 | dvec4v += mix(dvec4v, dvec4v, doublev);
|
| 222 | dvec2v += mix(dvec2v, dvec2v, dvec2v);
|
| 223 | dvec3v += mix(dvec3v, dvec3v, dvec3v);
|
| 224 | dvec4v += mix(dvec4v, dvec4v, dvec4v);
|
| 225 | doublev += mix(doublev, doublev, boolv);
|
| 226 | dvec2v += mix(dvec2v, dvec2v, bvec2v);
|
| 227 | dvec3v += mix(dvec3v, dvec3v, bvec3v);
|
| 228 | dvec4v += mix(dvec4v, dvec4v, bvec4v);
|
| 229 |
|
| 230 | doublev += step(doublev, doublev);
|
| 231 | dvec2v += step(dvec2v, dvec2v);
|
| 232 | dvec3v += step(dvec3v, dvec3v);
|
| 233 | dvec4v += step(dvec4v, dvec4v);
|
| 234 | dvec2v += step(doublev, dvec2v);
|
| 235 | dvec3v += step(doublev, dvec3v);
|
| 236 | dvec4v += step(doublev, dvec4v);
|
| 237 |
|
| 238 | doublev += smoothstep(doublev, doublev, doublev);
|
| 239 | dvec2v += smoothstep(dvec2v, dvec2v, dvec2v);
|
| 240 | dvec3v += smoothstep(dvec3v, dvec3v, dvec3v);
|
| 241 | dvec4v += smoothstep(dvec4v, dvec4v, dvec4v);
|
| 242 | dvec2v += smoothstep(doublev, doublev, dvec2v);
|
| 243 | dvec3v += smoothstep(doublev, doublev, dvec3v);
|
| 244 | dvec4v += smoothstep(doublev, doublev, dvec4v);
|
| 245 |
|
| 246 | boolv = isnan(doublev);
|
| 247 | bvec2v = isnan(dvec2v);
|
| 248 | bvec3v = isnan(dvec3v);
|
| 249 | bvec4v = isnan(dvec4v);
|
| 250 |
|
| 251 | boolv = boolv ? isinf(doublev) : false;
|
| 252 | bvec2v = boolv ? isinf(dvec2v) : bvec2(false);
|
| 253 | bvec3v = boolv ? isinf(dvec3v) : bvec3(false);
|
| 254 | bvec4v = boolv ? isinf(dvec4v) : bvec4(false);
|
| 255 |
|
| 256 | doublev += length(doublev);
|
| 257 | doublev += length(dvec2v);
|
| 258 | doublev += length(dvec3v);
|
| 259 | doublev += length(dvec4v);
|
| 260 |
|
| 261 | doublev += distance(doublev, doublev);
|
| 262 | doublev += distance(dvec2v, dvec2v);
|
| 263 | doublev += distance(dvec3v, dvec3v);
|
| 264 | doublev += distance(dvec4v, dvec4v);
|
| 265 |
|
| 266 | doublev += dot(doublev, doublev);
|
| 267 | doublev += dot(dvec2v, dvec2v);
|
| 268 | doublev += dot(dvec3v, dvec3v);
|
| 269 | doublev += dot(dvec4v, dvec4v);
|
| 270 |
|
| 271 | dvec3v += cross(dvec3v, dvec3v);
|
| 272 |
|
| 273 | doublev += normalize(doublev);
|
| 274 | dvec2v += normalize(dvec2v);
|
| 275 | dvec3v += normalize(dvec3v);
|
| 276 | dvec4v += normalize(dvec4v);
|
| 277 |
|
| 278 | doublev += faceforward(doublev, doublev, doublev);
|
| 279 | dvec2v += faceforward(dvec2v, dvec2v, dvec2v);
|
| 280 | dvec3v += faceforward(dvec3v, dvec3v, dvec3v);
|
| 281 | dvec4v += faceforward(dvec4v, dvec4v, dvec4v);
|
| 282 |
|
| 283 | doublev += reflect(doublev, doublev);
|
| 284 | dvec2v += reflect(dvec2v, dvec2v);
|
| 285 | dvec3v += reflect(dvec3v, dvec3v);
|
| 286 | dvec4v += reflect(dvec4v, dvec4v);
|
| 287 |
|
John Kessenich | 2a805d9 | 2018-06-19 09:43:09 -0600 | [diff] [blame^] | 288 | doublev += refract(doublev, doublev, doublev);
|
| 289 | dvec2v += refract(dvec2v, dvec2v, doublev);
|
| 290 | dvec3v += refract(dvec3v, dvec3v, doublev);
|
| 291 | dvec4v += refract(dvec4v, dvec4v, doublev);
|
John Kessenich | 712ecb9 | 2016-01-16 20:37:43 -0700 | [diff] [blame] | 292 |
|
| 293 | dmat2 dmat2v = outerProduct(dvec2v, dvec2v);
|
| 294 | dmat3 dmat3v = outerProduct(dvec3v, dvec3v);
|
| 295 | dmat4 dmat4v = outerProduct(dvec4v, dvec4v);
|
| 296 | dmat2x3 dmat2x3v = outerProduct(dvec3v, dvec2v);
|
| 297 | dmat3x2 dmat3x2v = outerProduct(dvec2v, dvec3v);
|
| 298 | dmat2x4 dmat2x4v = outerProduct(dvec4v, dvec2v);
|
| 299 | dmat4x2 dmat4x2v = outerProduct(dvec2v, dvec4v);
|
| 300 | dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v);
|
| 301 | dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v);
|
| 302 |
|
John Kessenich | 2a805d9 | 2018-06-19 09:43:09 -0600 | [diff] [blame^] | 303 | dmat2v *= matrixCompMult(dmat2v, dmat2v);
|
| 304 | dmat3v *= matrixCompMult(dmat3v, dmat3v);
|
| 305 | dmat4v *= matrixCompMult(dmat4v, dmat4v);
|
John Kessenich | 712ecb9 | 2016-01-16 20:37:43 -0700 | [diff] [blame] | 306 | dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v);
|
| 307 | dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v);
|
| 308 | dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v);
|
| 309 | dmat3x4v = matrixCompMult(dmat3x4v, dmat3x4v);
|
| 310 | dmat4x2v = matrixCompMult(dmat4x2v, dmat4x2v);
|
| 311 | dmat4x3v = matrixCompMult(dmat4x3v, dmat4x3v);
|
| 312 |
|
| 313 | dmat2v *= transpose(dmat2v);
|
| 314 | dmat3v *= transpose(dmat3v);
|
| 315 | dmat4v *= transpose(dmat4v);
|
| 316 | dmat2x3v = transpose(dmat3x2v);
|
| 317 | dmat3x2v = transpose(dmat2x3v);
|
| 318 | dmat2x4v = transpose(dmat4x2v);
|
| 319 | dmat4x2v = transpose(dmat2x4v);
|
| 320 | dmat3x4v = transpose(dmat4x3v);
|
| 321 | dmat4x3v = transpose(dmat3x4v);
|
| 322 |
|
| 323 | doublev += determinant(dmat2v);
|
| 324 | doublev += determinant(dmat3v);
|
| 325 | doublev += determinant(dmat4v);
|
| 326 |
|
| 327 | dmat2v *= inverse(dmat2v);
|
| 328 | dmat3v *= inverse(dmat3v);
|
| 329 | dmat4v *= inverse(dmat4v);
|
| 330 | }
|