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