1# This test checks that the geometry shader can pass an entire 2# float[gl_MaxClipDistances] component of gl_ClipDistanceIn to a 3# function. 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[gl_MaxClipDistances]; 17 18void main() 19{ 20 gl_Position = vertex; 21 offset_to_gs = offset; 22 for (int i = 0; i < gl_MaxClipDistances; 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][gl_MaxClipDistances]; 33flat out int ok_to_fs; 34 35bool test(float clip_distance_copy[gl_MaxClipDistances], float offset) 36{ 37 bool ok = true; 38 39 for (int j = 0; j < gl_MaxClipDistances; j++) { 40 if (clip_distance_copy[j] != offset + float(j)) 41 ok = false; 42 } 43 44 return ok; 45} 46 47void main() 48{ 49 bool ok = true; 50 for (int i = 0; i < 3; i++) { 51 if (!test(gl_ClipDistanceIn[i], offset_to_gs[i])) 52 ok = false; 53 } 54 for (int i = 0; i < 3; i++) { 55 gl_Position = gl_PositionIn[i]; 56 ok_to_fs = int(ok); 57 EmitVertex(); 58 } 59} 60 61[geometry layout] 62input type GL_TRIANGLES 63output type GL_TRIANGLE_STRIP 64vertices out 3 65 66[fragment shader] 67#version 130 68 69flat in int ok_to_fs; 70 71void main() 72{ 73 if (ok_to_fs != 0) 74 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 75 else 76 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 77} 78 79[vertex data] 80vertex/float/2 offset/float/1 81-1.0 -1.0 1.0 82 1.0 -1.0 2.0 83 1.0 1.0 3.0 84-1.0 1.0 4.0 85 86[test] 87draw arrays GL_TRIANGLE_FAN 0 4 88probe all rgba 0.0 1.0 0.0 1.0 89