1# This test checks that the geometry shader can perform a bulk 2# assignment of an entire float[8] component of gl_ClipDistanceIn to 3# gl_ClipDistance. 4 5[require] 6GL >= 2.0 7GLSL >= 1.30 8GL_ARB_geometry_shader4 9 10[vertex shader] 11#version 130 12 13in vec4 vertex; 14in float offset; 15out float offset_to_gs; 16out float gl_ClipDistance[8]; 17 18void main() 19{ 20 gl_Position = vertex; 21 offset_to_gs = offset; 22 for (int i = 0; i < 8; i++) { 23 gl_ClipDistance[i] = offset + float(i); 24 } 25} 26 27[geometry shader] 28#version 130 29#extension GL_ARB_geometry_shader4: enable 30 31in float offset_to_gs[3]; 32in float gl_ClipDistanceIn[3][8]; 33out float offset_to_fs; 34out float gl_ClipDistance[8]; 35 36void main() 37{ 38 bool ok = true; 39 for (int i = 0; i < 3; i++) { 40 gl_Position = gl_PositionIn[i]; 41 gl_ClipDistance = gl_ClipDistanceIn[i]; 42 offset_to_fs = offset_to_gs[i]; 43 EmitVertex(); 44 } 45} 46 47[geometry layout] 48input type GL_TRIANGLES 49output type GL_TRIANGLE_STRIP 50vertices out 3 51 52[fragment shader] 53#version 130 54 55in float gl_ClipDistance[8]; 56in float offset_to_fs; 57 58void main() 59{ 60 bool ok = true; 61 for (int i = 0; i < 8; i++) { 62 if (distance(gl_ClipDistance[i], offset_to_fs + float(i)) > 1e-6) 63 ok = false; 64 } 65 if (ok) 66 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 67 else 68 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 69} 70 71[vertex data] 72vertex/float/2 offset/float/1 73-1.0 -1.0 1.0 74 1.0 -1.0 2.0 75 1.0 1.0 3.0 76-1.0 1.0 4.0 77 78[test] 79# Since the fragment shader's gl_ClipDistance array is only defined 80# for elements that have clipping enabled, we need to enable all 8 81# clip planes. Fortunately the values we use for gl_ClipDistance are 82# always positive, so no pixels are actually clipped. 83enable GL_CLIP_PLANE0 84enable GL_CLIP_PLANE1 85enable GL_CLIP_PLANE2 86enable GL_CLIP_PLANE3 87enable GL_CLIP_PLANE4 88enable GL_CLIP_PLANE5 89enable GL_CLIP_PLANE6 90enable GL_CLIP_PLANE7 91draw arrays GL_TRIANGLE_FAN 0 4 92probe all rgba 0.0 1.0 0.0 1.0 93