1# This test checks that the geometry shader can perform a bulk
2# assignment of an entire float[8] component of gl_ClipDistanceIn to
3# gl_ClipDistance.
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[8];
17
18void main()
19{
20  gl_Position = vertex;
21  offset_to_gs = offset;
22  for (int i = 0; i < 8; 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][8];
33out float offset_to_fs;
34out float gl_ClipDistance[8];
35
36void main()
37{
38  bool ok = true;
39  for (int i = 0; i < 3; i++) {
40    gl_Position = gl_PositionIn[i];
41    gl_ClipDistance = gl_ClipDistanceIn[i];
42    offset_to_fs = offset_to_gs[i];
43    EmitVertex();
44  }
45}
46
47[geometry layout]
48input type GL_TRIANGLES
49output type GL_TRIANGLE_STRIP
50vertices out 3
51
52[fragment shader]
53#version 130
54
55in float gl_ClipDistance[8];
56in float offset_to_fs;
57
58void main()
59{
60  bool ok = true;
61  for (int i = 0; i < 8; i++) {
62    if (distance(gl_ClipDistance[i], offset_to_fs + float(i)) > 1e-6)
63      ok = false;
64  }
65  if (ok)
66    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
67  else
68    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
69}
70
71[vertex data]
72vertex/float/2  offset/float/1
73-1.0 -1.0       1.0
74 1.0 -1.0       2.0
75 1.0  1.0       3.0
76-1.0  1.0       4.0
77
78[test]
79# Since the fragment shader's gl_ClipDistance array is only defined
80# for elements that have clipping enabled, we need to enable all 8
81# clip planes.  Fortunately the values we use for gl_ClipDistance are
82# always positive, so no pixels are actually clipped.
83enable GL_CLIP_PLANE0
84enable GL_CLIP_PLANE1
85enable GL_CLIP_PLANE2
86enable GL_CLIP_PLANE3
87enable GL_CLIP_PLANE4
88enable GL_CLIP_PLANE5
89enable GL_CLIP_PLANE6
90enable GL_CLIP_PLANE7
91draw arrays GL_TRIANGLE_FAN 0 4
92probe all rgba 0.0 1.0 0.0 1.0
93