summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/all.tests4
-rw-r--r--tests/spec/CMakeLists.txt1
-rw-r--r--tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-different-from-position.shader_test (renamed from tests/spec/glsl-1.20/execution/vs-clip-vertex-02.shader_test)0
-rw-r--r--tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-equal-to-position.shader_test (renamed from tests/spec/glsl-1.20/execution/vs-clip-vertex-01.shader_test)0
-rw-r--r--tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-homogeneity.shader_test67
-rw-r--r--tests/spec/glsl-1.30/CMakeLists.txt1
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/fs-clip-distance-interpolated.shader_test89
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position-homogeneity.shader_test65
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position.shader_test62
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-all-planes-enabled.shader_test (renamed from tests/spec/glsl-1.30/execution/vs-clip-distance-01.shader_test)0
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-enables.shader_test147
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-explicitly-sized.shader_test44
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-implicitly-sized.shader_test52
-rw-r--r--tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-sizeable-to-max.shader_test45
-rw-r--r--tests/spec/glsl-1.30/linker/CMakeLists.txt1
-rw-r--r--tests/spec/glsl-1.30/linker/clipping/CMakeLists.gl.txt18
-rw-r--r--tests/spec/glsl-1.30/linker/clipping/CMakeLists.txt1
-rw-r--r--tests/spec/glsl-1.30/linker/clipping/clip-distance-not-sizeable-above-max.c123
-rw-r--r--tests/spec/glsl-1.30/linker/clipping/mixing-clip-distance-and-clip-vertex-disallowed.c111
-rw-r--r--tests/spec/glsl-1.30/linker/placeholder0
20 files changed, 831 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests
index 0de2e30b..de64e7ec 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -765,6 +765,10 @@ spec['glsl-1.30']['execution'] = Group()
add_shader_test_dir(spec['glsl-1.30']['execution'],
os.path.join(os.path.dirname(__file__), 'spec', 'glsl-1.30', 'execution'),
recursive=True)
+spec['glsl-1.30']['linker'] = Group()
+spec['glsl-1.30']['linker']['clipping'] = Group()
+add_plain_test(spec['glsl-1.30']['linker']['clipping'], 'clip-distance-not-sizeable-above-max')
+add_plain_test(spec['glsl-1.30']['linker']['clipping'], 'mixing-clip-distance-and-clip-vertex-disallowed')
# Group AMD_conservative_depth
spec['AMD_conservative_depth'] = Group()
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index d5a969c8..e3585e77 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -18,3 +18,4 @@ add_subdirectory (arb_draw_elements_base_vertex)
add_subdirectory (arb_vertex_buffer_object)
add_subdirectory (arb_vertex_program)
add_subdirectory (arb_copy_buffer)
+add_subdirectory (glsl-1.30)
diff --git a/tests/spec/glsl-1.20/execution/vs-clip-vertex-02.shader_test b/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-different-from-position.shader_test
index ae1440d7..ae1440d7 100644
--- a/tests/spec/glsl-1.20/execution/vs-clip-vertex-02.shader_test
+++ b/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-different-from-position.shader_test
diff --git a/tests/spec/glsl-1.20/execution/vs-clip-vertex-01.shader_test b/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-equal-to-position.shader_test
index 773936ba..773936ba 100644
--- a/tests/spec/glsl-1.20/execution/vs-clip-vertex-01.shader_test
+++ b/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-equal-to-position.shader_test
diff --git a/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-homogeneity.shader_test b/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-homogeneity.shader_test
new file mode 100644
index 00000000..03e8d73a
--- /dev/null
+++ b/tests/spec/glsl-1.20/execution/clipping/vs-clip-vertex-homogeneity.shader_test
@@ -0,0 +1,67 @@
+# This test verifies that the homogeneous coordinate of gl_ClipVertex
+# is properly respected, by doubling all the coordinates of
+# gl_ClipVertex (including the homogeneous coordinate) and verifying
+# that the clipped shape is still correct.
+#
+# In addition, this test:
+# - uses all 6 clip planes to clip a rectangle to a hexagon shape.
+# - sets gl_Position and gl_ClipVertex to different values, to verify
+# that gl_Position determines screen position and gl_ClipVertex
+# determines clipping.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Transform gl_ClipVertex in an arbitrary way so that
+ // we can verify it is being used for clipping instead of
+ // gl_Position. The x and y coordinates are multiplied by 5,
+ // and the homogeneous coordinate is multiplied by 0.5, so the
+ // net result should be that x and y are scaled by a factor of
+ // 10.
+ gl_ClipVertex = gl_Vertex * vec4(5.0, 5.0, 1.0, 0.5);
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+ortho 0 1 0 1
+clip plane 0 0 1 0 -2.5
+clip plane 1 -1 1 0 4
+clip plane 2 -1 -1 0 14
+clip plane 3 0 -1 0 7.5
+clip plane 4 1 -1 0 4
+clip plane 5 1 1 0 -6
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0)
diff --git a/tests/spec/glsl-1.30/CMakeLists.txt b/tests/spec/glsl-1.30/CMakeLists.txt
new file mode 100644
index 00000000..4d1c2670
--- /dev/null
+++ b/tests/spec/glsl-1.30/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory (linker)
diff --git a/tests/spec/glsl-1.30/execution/clipping/fs-clip-distance-interpolated.shader_test b/tests/spec/glsl-1.30/execution/clipping/fs-clip-distance-interpolated.shader_test
new file mode 100644
index 00000000..de05ab1a
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/fs-clip-distance-interpolated.shader_test
@@ -0,0 +1,89 @@
+# From the GLSL 1.30 spec, section 7.2 (Fragment Shader Special
+# Variables):
+#
+# The built-in input variable gl_ClipDistance array contains
+# linearly interpolated values for the vertex values written by the
+# vertex shader to the gl_ClipDistance vertex output variable. This
+# array must be sized in the fragment shader either implicitly or
+# explicitly to be the same size as it was sized in the vertex
+# shader. Only elements in this array that have clipping enabled
+# will have defined values.
+#
+# This test checks proper operation of gl_ClipDistance in fragment
+# shaders by setting each element of gl_ClipDistance to simple linear
+# function of gl_Vertex (computed by taking the dot product of
+# gl_Vertex with a uniform vector, and dividing the result by
+# gl_Vertex's homogeneous coordinate). gl_Vertex is also passed
+# through to the fragment shader, which uses the same dot product to
+# verify that gl_ClipDistance has been properly interpolated.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+uniform vec4 transform[6];
+out vec4 vertex;
+out float gl_ClipDistance[6];
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Set each value of gl_ClipDistance to a linear transformation of
+ // gl_Vertex.
+ for (int i = 0; i < 6; ++i) {
+ gl_ClipDistance[i] = dot(transform[i], gl_Vertex) / gl_Vertex.w;
+ }
+
+ // Pass through gl_Vertex to the fragment shader so that it can
+ // verify the interpolated values of gl_ClipDistance.
+ vertex = gl_Vertex;
+}
+
+[fragment shader]
+#version 130
+uniform vec4 transform[6];
+in vec4 vertex;
+
+void main()
+{
+ bool test_passed = true;
+
+ // Check that each value of gl_ClipDistance matches the value
+ // computed in the vertex shader.
+ for (int i = 0; i < 6; ++i) {
+ float expected_distance = dot(transform[i], vertex) / vertex.w;
+ float deviation = distance(gl_ClipDistance[i], expected_distance);
+ if (deviation > 1.0e-5) {
+ test_passed = false;
+ }
+ }
+
+ // Report pass/fail as a red or green pixel.
+ gl_FragColor = test_passed ? vec4(0.0, 1.0, 0.0, 1.0)
+ : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+ortho 0 1 0 1
+
+# Since the fragment shader's gl_ClipDistance array is only defined
+# for elements that have clipping enabled, we need to enable all 6
+# clip planes and carefully shoose the transform vectors to make sure
+# that no pixels are actually clipped.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+uniform vec4 transform[0] 1.0 1.0 0.0 0.0 # clipDistance[0] = x + y
+uniform vec4 transform[1] 1.0 2.0 0.0 0.0 # clipDistance[1] = x + 2*y
+uniform vec4 transform[2] 2.0 1.0 0.0 0.0 # clipDistance[2] = 2*x + y
+uniform vec4 transform[3] 2.0 2.0 0.0 0.0 # clipDistance[3] = 2*x + 2*y
+uniform vec4 transform[4] -1.0 -1.0 0.0 2.0 # clipDistance[4] = 2.0 - x - y
+uniform vec4 transform[5] -1.0 1.0 0.0 1.0 # clipDistance[5] = 1.0 - x + y
+
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position-homogeneity.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position-homogeneity.shader_test
new file mode 100644
index 00000000..ce16956c
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position-homogeneity.shader_test
@@ -0,0 +1,65 @@
+# [description]
+#
+# From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special
+# Variables):
+#
+# If a linked set of shaders forming the vertex stage contains no
+# static write to gl_ClipVertex or gl_ClipDistance, but the
+# application has requested clipping against user clip planes
+# through the API, then the coordinate written to gl_Position is
+# used for comparison against the user clip planes.
+#
+# This test:
+# - uses all 6 clip planes to clip a rectangle to a hexagon shape.
+# - Multiplies all coordinates of gl_Position by 2 (including the
+# homogeneous coordinate) to verify that homogeneity is properly
+# accounted for in clipping.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+void main(void)
+{
+ gl_Position = 2.0 * gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+#version 130
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+ortho 0 1 0 1
+clip plane 0 0 1 0 0.5
+clip plane 1 -1 1 0 0.8
+clip plane 2 -1 -1 0 0.8
+clip plane 3 0 -1 0 0.5
+clip plane 4 1 -1 0 0.8
+clip plane 5 1 1 0 0.8
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0)
diff --git a/tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position.shader_test
new file mode 100644
index 00000000..d01cae45
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-based-on-position.shader_test
@@ -0,0 +1,62 @@
+# [description]
+#
+# From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special
+# Variables):
+#
+# If a linked set of shaders forming the vertex stage contains no
+# static write to gl_ClipVertex or gl_ClipDistance, but the
+# application has requested clipping against user clip planes
+# through the API, then the coordinate written to gl_Position is
+# used for comparison against the user clip planes.
+#
+# This test uses all 6 clip planes to clip a rectangle to a hexagon
+# shape.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+#version 130
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+ortho 0 1 0 1
+clip plane 0 0 1 0 0.5
+clip plane 1 -1 1 0 0.8
+clip plane 2 -1 -1 0 0.8
+clip plane 3 0 -1 0 0.5
+clip plane 4 1 -1 0 0.8
+clip plane 5 1 1 0 0.8
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0)
diff --git a/tests/spec/glsl-1.30/execution/vs-clip-distance-01.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-all-planes-enabled.shader_test
index adb5ad2b..adb5ad2b 100644
--- a/tests/spec/glsl-1.30/execution/vs-clip-distance-01.shader_test
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-all-planes-enabled.shader_test
diff --git a/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-enables.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-enables.shader_test
new file mode 100644
index 00000000..2cb0105b
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-enables.shader_test
@@ -0,0 +1,147 @@
+# From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special
+# Variables):
+#
+# Values written into gl_ClipDistance for planes that are not
+# enabled have no effect.
+#
+# This test sets up 6 clipping planes using gl_ClipDistance, which
+# clip a rectangle to a hexagon shape. Then it tests various
+# combinations of enables for the 6 clipping planes, and verifies that
+# they all create the correct shape.
+#
+# To verify that each enable works, the combinations of enables were
+# chosen such that:
+# - Every plane is enabled at least once and disbled at least once.
+# - Every plane is enabled and disabled in a different pattern.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ gl_ClipDistance[0] = gl_Vertex.y - 0.25;
+ gl_ClipDistance[1] = gl_Vertex.y - gl_Vertex.x + 0.4;
+ gl_ClipDistance[2] = 1.4 - gl_Vertex.x - gl_Vertex.y;
+ gl_ClipDistance[3] = 0.75 - gl_Vertex.y;
+ gl_ClipDistance[4] = gl_Vertex.x - gl_Vertex.y + 0.4;
+ gl_ClipDistance[5] = gl_Vertex.x + gl_Vertex.y - 0.6;
+}
+
+[fragment shader]
+#version 130
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+ortho 0 1 0 1
+clear color 0.0 0.0 0.0 0.0
+
+# Test with planes 0, 2, and 4 enabled.
+enable GL_CLIP_PLANE0
+disable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+disable GL_CLIP_PLANE5
+clear
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 5
+
+# Test with planes 0, 1, 4, and 5 enabled.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+disable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+clear
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 5
+
+# Test with planes 0, 1, 2, and 3 enabled.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+disable GL_CLIP_PLANE4
+disable GL_CLIP_PLANE5
+clear
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 5
+
+# Test with planes 4 and 5 enabled.
+disable GL_CLIP_PLANE0
+disable GL_CLIP_PLANE1
+disable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+clear
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (1.0, 1.0, 1.0, 1.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 5
diff --git a/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-explicitly-sized.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-explicitly-sized.shader_test
new file mode 100644
index 00000000..00023c93
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-explicitly-sized.shader_test
@@ -0,0 +1,44 @@
+# From the GLSL 1.30 spec section 7.1 (Vertex Shader Special
+# Variables):
+#
+# The gl_ClipDistance array is predeclared as unsized and must be
+# sized by the shader either redeclaring it with a size or indexing
+# it only with integral constant expressions. This needs to size the
+# array to include all the clip planes that are enabled via the
+# OpenGL API; if the size does not include all enabled planes,
+# results are undefined. The size can be at most
+# gl_MaxClipDistances. The number of varying components (see
+# gl_MaxVaryingComponents) consumed by gl_ClipDistance will match
+# the size of the array, no matter how many planes are enabled. The
+# shader must also set all values in gl_ClipDistance that have been
+# enabled via the OpenGL API, or results are undefined. Values
+# written into gl_ClipDistance for planes that are not enabled have
+# no effect.
+#
+# This test checks that the GLSL compiler respects the size of
+# gl_ClipDistance when it is explicitly declared in the vertex shader.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+out float gl_ClipDistance[3];
+
+void main()
+{
+ gl_Position = gl_Vertex;
+ gl_FrontColor = (gl_ClipDistance.length() == 3) ? vec4(0.0, 1.0, 0.0, 1.0)
+ : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[fragment shader]
+#version 130
+void main()
+{
+ gl_FragColor = gl_Color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-implicitly-sized.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-implicitly-sized.shader_test
new file mode 100644
index 00000000..185fb22e
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-implicitly-sized.shader_test
@@ -0,0 +1,52 @@
+# From the GLSL 1.30 spec section 7.1 (Vertex Shader Special
+# Variables):
+#
+# The gl_ClipDistance array is predeclared as unsized and must be
+# sized by the shader either redeclaring it with a size or indexing
+# it only with integral constant expressions. This needs to size the
+# array to include all the clip planes that are enabled via the
+# OpenGL API; if the size does not include all enabled planes,
+# results are undefined. The size can be at most
+# gl_MaxClipDistances. The number of varying components (see
+# gl_MaxVaryingComponents) consumed by gl_ClipDistance will match
+# the size of the array, no matter how many planes are enabled. The
+# shader must also set all values in gl_ClipDistance that have been
+# enabled via the OpenGL API, or results are undefined. Values
+# written into gl_ClipDistance for planes that are not enabled have
+# no effect.
+#
+# This test checks that the GLSL compiler respects the size of
+# gl_ClipDistance when it is implicitly sized in the vertex shader by
+# indexing into it with integral constant expressions.
+#
+# The spec isn't clear about whether it's necessary for the GLSL
+# compiler to size gl_ClipDistance to the minimum size possible. In
+# other words, if only gl_ClipDistance[2] is accessed, must the
+# compiler infer that the size of gl_ClipDistance is 3, or is any size
+# greater than or equal to 3 acceptable? This test assumes any size
+# greater than or equal to 3 is acceptable.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+
+void main()
+{
+ gl_Position = gl_Vertex;
+ gl_FrontColor = (gl_ClipDistance.length() >= 3) ? vec4(0.0, 1.0, 0.0, 1.0)
+ : vec4(1.0, 0.0, 0.0, 1.0);
+ gl_ClipDistance[2] = 1.0;
+}
+
+[fragment shader]
+#version 130
+void main()
+{
+ gl_FragColor = gl_Color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-sizeable-to-max.shader_test b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-sizeable-to-max.shader_test
new file mode 100644
index 00000000..accd639a
--- /dev/null
+++ b/tests/spec/glsl-1.30/execution/clipping/vs-clip-distance-sizeable-to-max.shader_test
@@ -0,0 +1,45 @@
+# From the GLSL 1.30 spec section 7.1 (Vertex Shader Special
+# Variables):
+#
+# The gl_ClipDistance array is predeclared as unsized and must be
+# sized by the shader either redeclaring it with a size or indexing
+# it only with integral constant expressions. This needs to size the
+# array to include all the clip planes that are enabled via the
+# OpenGL API; if the size does not include all enabled planes,
+# results are undefined. The size can be at most
+# gl_MaxClipDistances. The number of varying components (see
+# gl_MaxVaryingComponents) consumed by gl_ClipDistance will match
+# the size of the array, no matter how many planes are enabled. The
+# shader must also set all values in gl_ClipDistance that have been
+# enabled via the OpenGL API, or results are undefined. Values
+# written into gl_ClipDistance for planes that are not enabled have
+# no effect.
+#
+# This test checks that the size of gl_ClipDistance can be set to
+# gl_MaxClipDistances without error, and that this actually causes the
+# size of the array to be set properly.
+
+[require]
+GLSL >= 1.30
+
+[vertex shader]
+#version 130
+out float gl_ClipDistance[gl_MaxClipDistances];
+
+void main()
+{
+ gl_Position = gl_Vertex;
+ gl_FrontColor = (gl_ClipDistance.length() == gl_MaxClipDistances)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[fragment shader]
+#version 130
+void main()
+{
+ gl_FragColor = gl_Color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-1.30/linker/CMakeLists.txt b/tests/spec/glsl-1.30/linker/CMakeLists.txt
new file mode 100644
index 00000000..611a57e6
--- /dev/null
+++ b/tests/spec/glsl-1.30/linker/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory (clipping)
diff --git a/tests/spec/glsl-1.30/linker/clipping/CMakeLists.gl.txt b/tests/spec/glsl-1.30/linker/clipping/CMakeLists.gl.txt
new file mode 100644
index 00000000..233c4f7e
--- /dev/null
+++ b/tests/spec/glsl-1.30/linker/clipping/CMakeLists.gl.txt
@@ -0,0 +1,18 @@
+
+include_directories(
+ ${GLEXT_INCLUDE_DIR}
+ ${OPENGL_INCLUDE_PATH}
+ ${GLUT_INCLUDE_DIR}
+ ${piglit_SOURCE_DIR}/tests/mesa/util
+ ${piglit_SOURCE_DIR}/tests/util
+)
+
+link_libraries (
+ piglitutil
+ ${OPENGL_gl_LIBRARY}
+ ${OPENGL_glu_LIBRARY}
+ ${GLUT_glut_LIBRARY}
+)
+
+add_executable (clip-distance-not-sizeable-above-max clip-distance-not-sizeable-above-max.c)
+add_executable (mixing-clip-distance-and-clip-vertex-disallowed mixing-clip-distance-and-clip-vertex-disallowed.c)
diff --git a/tests/spec/glsl-1.30/linker/clipping/CMakeLists.txt b/tests/spec/glsl-1.30/linker/clipping/CMakeLists.txt
new file mode 100644
index 00000000..144a306f
--- /dev/null
+++ b/tests/spec/glsl-1.30/linker/clipping/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git a/tests/spec/glsl-1.30/linker/clipping/clip-distance-not-sizeable-above-max.c b/tests/spec/glsl-1.30/linker/clipping/clip-distance-not-sizeable-above-max.c
new file mode 100644
index 00000000..249210d4
--- /dev/null
+++ b/tests/spec/glsl-1.30/linker/clipping/clip-distance-not-sizeable-above-max.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file clip-distance-not-sizeable-above-max.c
+ *
+ * From the GLSL 1.30 spec section 7.1 (Vertex Shader Special
+ * Variables):
+ *
+ * The gl_ClipDistance array is predeclared as unsized and must be
+ * sized by the shader either redeclaring it with a size or indexing
+ * it only with integral constant expressions. This needs to size
+ * the array to include all the clip planes that are enabled via the
+ * OpenGL API; if the size does not include all enabled planes,
+ * results are undefined. The size can be at most
+ * gl_MaxClipDistances. The number of varying components (see
+ * gl_MaxVaryingComponents) consumed by gl_ClipDistance will match
+ * the size of the array, no matter how many planes are enabled. The
+ * shader must also set all values in gl_ClipDistance that have been
+ * enabled via the OpenGL API, or results are undefined. Values
+ * written into gl_ClipDistance for planes that are not enabled have
+ * no effect.
+ *
+ * This test checks that the an error occurs when trying to set the
+ * size of gl_ClipDistance larger than gl_MaxClipDistances.
+ *
+ * Note: we don't care about the specific error that is generated or
+ * the precise circumstances under which it occurs--we just want to
+ * make sure that gl_MaxClipDistances isn't too small. So to provoke
+ * the error into occurring, we also try to access the first
+ * disallowed element of the array.
+ */
+#include "piglit-util.h"
+
+int piglit_width = 100, piglit_height = 100;
+int piglit_window_mode = GLUT_RGB | GLUT_DOUBLE;
+
+static const char vert[] =
+ "#version 130\n"
+ "out float gl_ClipDistance[gl_MaxClipDistances + 1];\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = gl_Vertex;\n"
+ " gl_ClipDistance[gl_MaxClipDistances] = 1.0;\n"
+ "}\n";
+
+static const char frag[] =
+ "#version 130\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = gl_Color;\n"
+ "}\n";
+
+enum piglit_result
+piglit_display(void)
+{
+ return PIGLIT_FAIL;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+ const char *glsl_version_string;
+ float glsl_version;
+ GLint ok;
+ GLuint prog;
+ GLuint vs;
+ GLuint fs;
+
+
+ piglit_require_GLSL();
+
+ glsl_version_string = (char *)
+ glGetString(GL_SHADING_LANGUAGE_VERSION);
+ glsl_version = (glsl_version_string == NULL)
+ ? 0.0 : strtod(glsl_version_string, NULL);
+ if (glsl_version <= 1.299999) {
+ printf("Test requires GLSL version >= 1.3. "
+ "Actual version is %.1f.\n",
+ glsl_version);
+ piglit_report_result(PIGLIT_SKIP);
+ }
+
+ vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
+ fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
+ prog = glCreateProgram();
+ glAttachShader(prog, vs);
+ glAttachShader(prog, fs);
+ glLinkProgram(prog);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ ok = piglit_link_check_status_quiet(prog);
+ if (ok) {
+ fprintf(stderr,
+ "Linking with a shader that accesses gl_ClipDistance "
+ "beyond gl_MaxClipDistances succeeded when it should "
+ "have failed.\n");
+ piglit_report_result(PIGLIT_FAIL);
+ }
+
+ piglit_report_result(PIGLIT_PASS);
+}
diff --git a/tests/spec/glsl-1.30/linker/clipping/mixing-clip-distance-and-clip-vertex-disallowed.c b/tests/spec/glsl-1.30/linker/clipping/mixing-clip-distance-and-clip-vertex-disallowed.c
new file mode 100644
index 00000000..94c35652
--- /dev/null
+++ b/tests/spec/glsl-1.30/linker/clipping/mixing-clip-distance-and-clip-vertex-disallowed.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file mixing-clip-distance-and-clip-vertex-disallowed.c
+ *
+ * From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special
+ * Variables):
+ *
+ * It is an error for a shader to statically write both
+ * gl_ClipVertex and gl_ClipDistance.
+ *
+ * This test verifies that an error is generated if the shader
+ * contains writes to both variables, even if those writes would never
+ * both occur in the same render.
+ */
+#include "piglit-util.h"
+
+int piglit_width = 100, piglit_height = 100;
+int piglit_window_mode = GLUT_RGB | GLUT_DOUBLE;
+
+static const char vert[] =
+ "#version 130\n"
+ "uniform bool use_ClipDistance;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vec4(0.0);\n"
+ " if (use_ClipDistance) {\n"
+ " gl_ClipDistance[0] = 1.0;\n"
+ " } else {\n"
+ " gl_ClipVertex = vec4(0.0);\n"
+ " }\n"
+ "}\n";
+
+static const char frag[] =
+ "#version 130\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = gl_Color;\n"
+ "}\n";
+
+enum piglit_result
+piglit_display(void)
+{
+ return PIGLIT_FAIL;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+ const char *glsl_version_string;
+ float glsl_version;
+ GLint ok;
+ GLuint prog;
+ GLuint vs;
+ GLuint fs;
+
+
+ piglit_require_GLSL();
+
+ glsl_version_string = (char *)
+ glGetString(GL_SHADING_LANGUAGE_VERSION);
+ glsl_version = (glsl_version_string == NULL)
+ ? 0.0 : strtod(glsl_version_string, NULL);
+ if (glsl_version <= 1.299999) {
+ printf("Test requires GLSL version >= 1.3. "
+ "Actual version is %.1f.\n",
+ glsl_version);
+ piglit_report_result(PIGLIT_SKIP);
+ }
+
+ vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
+ fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
+ prog = glCreateProgram();
+ glAttachShader(prog, vs);
+ glAttachShader(prog, fs);
+ glLinkProgram(prog);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ ok = piglit_link_check_status_quiet(prog);
+ if (ok) {
+ fprintf(stderr,
+ "Linking with a shader that accesses both "
+ "gl_ClipDistance and gl_ClipVertex succeeded when it "
+ "should have failed.\n");
+ piglit_report_result(PIGLIT_FAIL);
+ }
+
+ piglit_report_result(PIGLIT_PASS);
+}
diff --git a/tests/spec/glsl-1.30/linker/placeholder b/tests/spec/glsl-1.30/linker/placeholder
deleted file mode 100644
index e69de29b..00000000
--- a/tests/spec/glsl-1.30/linker/placeholder
+++ /dev/null