1# This test checks that when ARB_arrays_of_arrays is supported, the
2# geometry shader can read all of gl_ClipDistanceIn using a single
3# bulk assignment.
4
5[require]
6GL >= 2.0
7GLSL >= 1.30
8GL_ARB_geometry_shader4
9GL_ARB_arrays_of_arrays
10
11[vertex shader]
12#version 130
13
14in vec4 vertex;
15in float offset;
16out float offset_to_gs;
17out float gl_ClipDistance[gl_MaxClipDistances];
18
19void main()
20{
21  gl_Position = vertex;
22  offset_to_gs = offset;
23  for (int i = 0; i < gl_MaxClipDistances; i++) {
24    gl_ClipDistance[i] = offset + float(i);
25  }
26}
27
28[geometry shader]
29#version 130
30#extension GL_ARB_geometry_shader4: enable
31#extension GL_ARB_arrays_of_arrays: enable
32
33in float offset_to_gs[3];
34in float gl_ClipDistanceIn[3][gl_MaxClipDistances];
35flat out int ok_to_fs;
36uniform float foo;
37
38void main()
39{
40  bool ok = true;
41  float clip_distance_copy[3][gl_MaxClipDistances] = gl_ClipDistanceIn;
42
43  /* Make sure the copy doesn't get optimized out */
44  clip_distance_copy[0][0] += foo;
45
46  for (int i = 0; i < 3; i++) {
47    for (int j = 0; j < gl_MaxClipDistances; j++) {
48      if (clip_distance_copy[i][j] != offset_to_gs[i] + float(j))
49        ok = false;
50    }
51  }
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]
85uniform float foo 0.0
86draw arrays GL_TRIANGLE_FAN 0 4
87probe all rgba 0.0 1.0 0.0 1.0
88