1# This test checks that when ARB_arrays_of_arrays is supported, the 2# geometry shader can read all of gl_ClipDistanceIn using a single 3# bulk assignment. 4 5[require] 6GL >= 2.0 7GLSL >= 1.30 8GL_ARB_geometry_shader4 9GL_ARB_arrays_of_arrays 10 11[vertex shader] 12#version 130 13 14in vec4 vertex; 15in float offset; 16out float offset_to_gs; 17out float gl_ClipDistance[gl_MaxClipDistances]; 18 19void main() 20{ 21 gl_Position = vertex; 22 offset_to_gs = offset; 23 for (int i = 0; i < gl_MaxClipDistances; i++) { 24 gl_ClipDistance[i] = offset + float(i); 25 } 26} 27 28[geometry shader] 29#version 130 30#extension GL_ARB_geometry_shader4: enable 31#extension GL_ARB_arrays_of_arrays: enable 32 33in float offset_to_gs[3]; 34in float gl_ClipDistanceIn[3][gl_MaxClipDistances]; 35flat out int ok_to_fs; 36uniform float foo; 37 38void main() 39{ 40 bool ok = true; 41 float clip_distance_copy[3][gl_MaxClipDistances] = gl_ClipDistanceIn; 42 43 /* Make sure the copy doesn't get optimized out */ 44 clip_distance_copy[0][0] += foo; 45 46 for (int i = 0; i < 3; i++) { 47 for (int j = 0; j < gl_MaxClipDistances; j++) { 48 if (clip_distance_copy[i][j] != offset_to_gs[i] + float(j)) 49 ok = false; 50 } 51 } 52 for (int i = 0; i < 3; i++) { 53 gl_Position = gl_PositionIn[i]; 54 ok_to_fs = int(ok); 55 EmitVertex(); 56 } 57} 58 59[geometry layout] 60input type GL_TRIANGLES 61output type GL_TRIANGLE_STRIP 62vertices out 3 63 64[fragment shader] 65#version 130 66 67flat in int ok_to_fs; 68 69void main() 70{ 71 if (ok_to_fs != 0) 72 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 73 else 74 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 75} 76 77[vertex data] 78vertex/float/2 offset/float/1 79-1.0 -1.0 1.0 80 1.0 -1.0 2.0 81 1.0 1.0 3.0 82-1.0 1.0 4.0 83 84[test] 85uniform float foo 0.0 86draw arrays GL_TRIANGLE_FAN 0 4 87probe all rgba 0.0 1.0 0.0 1.0 88