1# This test checks that when ARB_arrays_of_arrays is supported, the
2# geometry shader can pass all of gl_ClipDistanceIn to a function.
3
4[require]
5GL >= 2.0
6GLSL >= 1.30
7GL_ARB_geometry_shader4
8GL_ARB_arrays_of_arrays
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[3][gl_MaxClipDistances])
36{
37  bool ok = true;
38
39  for (int i = 0; i < 3; i++) {
40    for (int j = 0; j < gl_MaxClipDistances; j++) {
41      if (clip_distance_copy[i][j] != offset_to_gs[i] + float(j))
42        ok = false;
43    }
44  }
45
46  return ok;
47}
48
49void main()
50{
51  bool ok = test(gl_ClipDistanceIn);
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]
85draw arrays GL_TRIANGLE_FAN 0 4
86probe all rgba 0.0 1.0 0.0 1.0
87