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