1# This test checks that the geometry shader can read an entire
2# float[gl_MaxClipDistances] component of gl_ClipDistanceIn using a
3# single bulk assignment.
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;
34uniform float foo;
35
36void main()
37{
38  bool ok = true;
39  for (int i = 0; i < 3; i++) {
40    float clip_distance_copy[gl_MaxClipDistances] = gl_ClipDistanceIn[i];
41
42    /* Make sure the copy doesn't get optimized out */
43    clip_distance_copy[0] += foo;
44
45    for (int j = 0; j < gl_MaxClipDistances; j++) {
46      if (clip_distance_copy[j] != offset_to_gs[i] + float(j))
47        ok = false;
48    }
49  }
50  for (int i = 0; i < 3; i++) {
51    gl_Position = gl_PositionIn[i];
52    ok_to_fs = int(ok);
53    EmitVertex();
54  }
55}
56
57[geometry layout]
58input type GL_TRIANGLES
59output type GL_TRIANGLE_STRIP
60vertices out 3
61
62[fragment shader]
63#version 130
64
65flat in int ok_to_fs;
66
67void main()
68{
69  if (ok_to_fs != 0)
70    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
71  else
72    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
73}
74
75[vertex data]
76vertex/float/2  offset/float/1
77-1.0 -1.0       1.0
78 1.0 -1.0       2.0
79 1.0  1.0       3.0
80-1.0  1.0       4.0
81
82[test]
83uniform float foo 0.0
84draw arrays GL_TRIANGLE_FAN 0 4
85probe all rgba 0.0 1.0 0.0 1.0
86