1# This test checks that values sent to gl_ClipDistance by the vertex
2# shader are correctly received by the geometry shader.
3
4[require]
5GL >= 2.0
6GLSL >= 1.30
7GL_ARB_geometry_shader4
8
9[vertex shader]
10#version 130
11
12in vec4 vertex;
13in float offset;
14out float offset_to_gs;
15out float gl_ClipDistance[gl_MaxClipDistances];
16
17void main()
18{
19  gl_Position = vertex;
20  offset_to_gs = offset;
21  for (int i = 0; i < gl_MaxClipDistances; i++) {
22    gl_ClipDistance[i] = offset + float(i);
23  }
24}
25
26[geometry shader]
27#version 130
28#extension GL_ARB_geometry_shader4: enable
29
30in float offset_to_gs[3];
31in float gl_ClipDistanceIn[3][gl_MaxClipDistances];
32flat out int ok_to_fs;
33
34void main()
35{
36  bool ok = true;
37  for (int i = 0; i < 3; i++) {
38    for (int j = 0; j < gl_MaxClipDistances; j++) {
39      if (gl_ClipDistanceIn[i][j] != offset_to_gs[i] + float(j))
40        ok = false;
41    }
42  }
43  for (int i = 0; i < 3; i++) {
44    gl_Position = gl_PositionIn[i];
45    ok_to_fs = int(ok);
46    EmitVertex();
47  }
48}
49
50[geometry layout]
51input type GL_TRIANGLES
52output type GL_TRIANGLE_STRIP
53vertices out 3
54
55[fragment shader]
56#version 130
57
58flat in int ok_to_fs;
59
60void main()
61{
62  if (ok_to_fs != 0)
63    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
64  else
65    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
66}
67
68[vertex data]
69vertex/float/2  offset/float/1
70-1.0 -1.0       1.0
71 1.0 -1.0       2.0
72 1.0  1.0       3.0
73-1.0  1.0       4.0
74
75[test]
76draw arrays GL_TRIANGLE_FAN 0 4
77probe all rgba 0.0 1.0 0.0 1.0
78