This patch adds the following GLSL ES 3.00 tests:

- varying-struct-basic: a simple test case involving a single varying
  struct.

- varying-struct-arrays: exercise complex interactions between structs
  and arrays in varyings.

- varying-struct-copy-{function,local}-vs: exercise corner cases where
  a struct internal to a vertex shader is copied to a varying struct.

- varying-struct-copy-{local,out,return,uniform}-fs: exercise corner
  cases where a varying struct is copied to a struct internal to a
  fragment shader.

- varying-struct-interpolation: verify that interpolation qualifiers
  "flat" and "smooth" are inherited by the fields within a varying
  struct.

- varying-struct-centroid: verify that the interpolation qualifier
  "centroid" is inherited by the fields within a varying struct.

Note that "centroid" is tested separately from the other interpolation
qualifiers since MSAA is required to verify that it works correctly,
so it can't be tested with a simple shader_runner test.

v2: Split varying-struct-copy-vs and varying-struct-copy-fs into
sub-tests.
---
 tests/all.tests                                    |   2 +-
 tests/spec/CMakeLists.txt                          |   1 +
 tests/spec/glsl-es-3.00/CMakeLists.txt             |   1 +
 .../glsl-es-3.00/execution/CMakeLists.gles3.txt    |   8 +
 tests/spec/glsl-es-3.00/execution/CMakeLists.txt   |   1 +
 .../execution/varying-struct-arrays.shader_test    | 236 +++++++++++++++++++++
 .../execution/varying-struct-basic.shader_test     | 114 ++++++++++
 .../execution/varying-struct-centroid.c            | 199 +++++++++++++++++
 .../varying-struct-copy-function-fs.shader_test    |  89 ++++++++
 .../varying-struct-copy-local-fs.shader_test       |  86 ++++++++
 .../varying-struct-copy-local-vs.shader_test       |  86 ++++++++
 .../varying-struct-copy-out-vs.shader_test         |  89 ++++++++
 .../varying-struct-copy-return-vs.shader_test      |  89 ++++++++
 .../varying-struct-copy-uniform-vs.shader_test     |  86 ++++++++
 .../varying-struct-interpolation.shader_test       |  86 ++++++++
 15 files changed, 1172 insertions(+), 1 deletion(-)
 create mode 100644 tests/spec/glsl-es-3.00/CMakeLists.txt
 create mode 100644 tests/spec/glsl-es-3.00/execution/CMakeLists.gles3.txt
 create mode 100644 tests/spec/glsl-es-3.00/execution/CMakeLists.txt
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-basic.shader_test
 create mode 100644 tests/spec/glsl-es-3.00/execution/varying-struct-centroid.c
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-copy-function-fs.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-fs.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-vs.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-copy-out-vs.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-copy-return-vs.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-copy-uniform-vs.shader_test
 create mode 100644 
tests/spec/glsl-es-3.00/execution/varying-struct-interpolation.shader_test

diff --git a/tests/all.tests b/tests/all.tests
index 5a76926..2ffc6e1 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -836,7 +836,7 @@ import_glsl_parser_tests(spec['glsl-es-3.00'],
 add_shader_test_dir(spec['glsl-es-3.00'],
                    os.path.join(testsDir, 'spec', 'glsl-es-3.00'),
                    recursive=True)
-
+add_concurrent_test(spec['glsl-es-3.00']['execution'], 
'varying-struct-centroid_gles3')
 
 
 # Group AMD_conservative_depth
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index a4342b7..df87181 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -48,6 +48,7 @@ add_subdirectory (glsl-1.10)
 add_subdirectory (glsl-1.20)
 add_subdirectory (glsl-1.30)
 add_subdirectory (glsl-1.40)
+add_subdirectory (glsl-es-3.00)
 add_subdirectory (gl-1.0)
 add_subdirectory (gl-2.0)
 add_subdirectory (gl-2.1)
diff --git a/tests/spec/glsl-es-3.00/CMakeLists.txt 
b/tests/spec/glsl-es-3.00/CMakeLists.txt
new file mode 100644
index 0000000..bb76f08
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory (execution)
diff --git a/tests/spec/glsl-es-3.00/execution/CMakeLists.gles3.txt 
b/tests/spec/glsl-es-3.00/execution/CMakeLists.gles3.txt
new file mode 100644
index 0000000..42f6f11
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/CMakeLists.gles3.txt
@@ -0,0 +1,8 @@
+link_libraries(
+       piglitutil_${piglit_target_api}
+       ${OPENGL_gles2_LIBRARY}
+       )
+
+piglit_add_executable (varying-struct-centroid_${piglit_target_api} 
varying-struct-centroid.c)
+
+# vim: ft=cmake:
diff --git a/tests/spec/glsl-es-3.00/execution/CMakeLists.txt 
b/tests/spec/glsl-es-3.00/execution/CMakeLists.txt
new file mode 100644
index 0000000..144a306
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test
new file mode 100644
index 0000000..5248fb8
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test
@@ -0,0 +1,236 @@
+# Test that varying structs work properly in conjunction with arrays.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This test verifies the proper functioning of varyings whose types
+# are a struct containing an array, an array of structs, and various
+# complex combinations of arrays and structs.
+#
+# Note: chapter 11 of the GLSL ES 3.00 spec ("Counting of Inputs and
+# Outputs") specifies a packing algorithm which constitutes a minimum
+# requirement for when a set of varyings must be supported by a
+# conformant implementation.  Although that chapter has not yet been
+# updated to reflect varying structs, Khronos's internal bugzilla
+# indicates that structs should be flattened before applying the
+# packing algorithm
+# (https://cvs.khronos.org/bugzilla/show_bug.cgi?id=9828).  The
+# varyings in this test flatten as follows:
+#
+# float     s1.f;             // A
+# float[3]  s1.af[];          // B
+# float[3]  as1[].f;          // C
+# float[9]  as1[].af[];       // D
+# float     s2.s1.f;          // E
+# float[3]  s2.s1.af[];       // F
+# float[2]  s2.as1[].f;       // G
+# float[6]  s2.as1[].af[];    // H
+# float[2]  as2[].s1.f;       // I
+# float[6]  as2[].s1.af[];    // J
+# float[4]  as2[].as1[].f;    // K
+# float[12] as2[].as1[].af[]; // L
+#
+# And the flattened varyings would in turn be packed like so:
+#    x y z w
+#  0 L D J G
+#  1 L D J G
+#  2 L D J I
+#  3 L D J I
+#  4 L D J
+#  5 L D J
+#  6 L D B
+#  7 L D B
+#  8 L D B
+#  9 L H C
+# 10 L H C
+# 11 L H C
+# 12 K H F
+# 13 K H F
+# 14 K H F
+# 15 K A E
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+uniform float ref;
+
+in vec4 vertex;
+struct S1
+{
+       float f;
+       float af[3];
+};
+struct S2
+{
+       S1 s1;
+       S1 as1[2];
+};
+out S1 s1;
+out S1 as1[3];
+out S2 s2;
+out S2 as2[2];
+
+void main()
+{
+       gl_Position = vertex;
+       float f = ref;
+       s1.f = f++;
+       s1.af[0] = f++;
+       s1.af[1] = f++;
+       s1.af[2] = f++;
+       as1[0].f = f++;
+       as1[0].af[0] = f++;
+       as1[0].af[1] = f++;
+       as1[0].af[2] = f++;
+       as1[1].f = f++;
+       as1[1].af[0] = f++;
+       as1[1].af[1] = f++;
+       as1[1].af[2] = f++;
+       as1[2].f = f++;
+       as1[2].af[0] = f++;
+       as1[2].af[1] = f++;
+       as1[2].af[2] = f++;
+       s2.s1.f = f++;
+       s2.s1.af[0] = f++;
+       s2.s1.af[1] = f++;
+       s2.s1.af[2] = f++;
+       s2.as1[0].f = f++;
+       s2.as1[0].af[0] = f++;
+       s2.as1[0].af[1] = f++;
+       s2.as1[0].af[2] = f++;
+       s2.as1[1].f = f++;
+       s2.as1[1].af[0] = f++;
+       s2.as1[1].af[1] = f++;
+       s2.as1[1].af[2] = f++;
+       as2[0].s1.f = f++;
+       as2[0].s1.af[0] = f++;
+       as2[0].s1.af[1] = f++;
+       as2[0].s1.af[2] = f++;
+       as2[0].as1[0].f = f++;
+       as2[0].as1[0].af[0] = f++;
+       as2[0].as1[0].af[1] = f++;
+       as2[0].as1[0].af[2] = f++;
+       as2[0].as1[1].f = f++;
+       as2[0].as1[1].af[0] = f++;
+       as2[0].as1[1].af[1] = f++;
+       as2[0].as1[1].af[2] = f++;
+       as2[1].s1.f = f++;
+       as2[1].s1.af[0] = f++;
+       as2[1].s1.af[1] = f++;
+       as2[1].s1.af[2] = f++;
+       as2[1].as1[0].f = f++;
+       as2[1].as1[0].af[0] = f++;
+       as2[1].as1[0].af[1] = f++;
+       as2[1].as1[0].af[2] = f++;
+       as2[1].as1[1].f = f++;
+       as2[1].as1[1].af[0] = f++;
+       as2[1].as1[1].af[1] = f++;
+       as2[1].as1[1].af[2] = f++;
+}
+
+[fragment shader]
+#version 300 es
+
+uniform float ref;
+
+struct S1
+{
+       float f;
+       float af[3];
+};
+struct S2
+{
+       S1 s1;
+       S1 as1[2];
+};
+in S1 s1;
+in S1 as1[3];
+in S2 s2;
+in S2 as2[2];
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+       float f = ref;
+
+       CHECK(s1.f, f++);
+       CHECK(s1.af[0], f++);
+       CHECK(s1.af[1], f++);
+       CHECK(s1.af[2], f++);
+       CHECK(as1[0].f, f++);
+       CHECK(as1[0].af[0], f++);
+       CHECK(as1[0].af[1], f++);
+       CHECK(as1[0].af[2], f++);
+       CHECK(as1[1].f, f++);
+       CHECK(as1[1].af[0], f++);
+       CHECK(as1[1].af[1], f++);
+       CHECK(as1[1].af[2], f++);
+       CHECK(as1[2].f, f++);
+       CHECK(as1[2].af[0], f++);
+       CHECK(as1[2].af[1], f++);
+       CHECK(as1[2].af[2], f++);
+       CHECK(s2.s1.f, f++);
+       CHECK(s2.s1.af[0], f++);
+       CHECK(s2.s1.af[1], f++);
+       CHECK(s2.s1.af[2], f++);
+       CHECK(s2.as1[0].f, f++);
+       CHECK(s2.as1[0].af[0], f++);
+       CHECK(s2.as1[0].af[1], f++);
+       CHECK(s2.as1[0].af[2], f++);
+       CHECK(s2.as1[1].f, f++);
+       CHECK(s2.as1[1].af[0], f++);
+       CHECK(s2.as1[1].af[1], f++);
+       CHECK(s2.as1[1].af[2], f++);
+       CHECK(as2[0].s1.f, f++);
+       CHECK(as2[0].s1.af[0], f++);
+       CHECK(as2[0].s1.af[1], f++);
+       CHECK(as2[0].s1.af[2], f++);
+       CHECK(as2[0].as1[0].f, f++);
+       CHECK(as2[0].as1[0].af[0], f++);
+       CHECK(as2[0].as1[0].af[1], f++);
+       CHECK(as2[0].as1[0].af[2], f++);
+       CHECK(as2[0].as1[1].f, f++);
+       CHECK(as2[0].as1[1].af[0], f++);
+       CHECK(as2[0].as1[1].af[1], f++);
+       CHECK(as2[0].as1[1].af[2], f++);
+       CHECK(as2[1].s1.f, f++);
+       CHECK(as2[1].s1.af[0], f++);
+       CHECK(as2[1].s1.af[1], f++);
+       CHECK(as2[1].s1.af[2], f++);
+       CHECK(as2[1].as1[0].f, f++);
+       CHECK(as2[1].as1[0].af[0], f++);
+       CHECK(as2[1].as1[0].af[1], f++);
+       CHECK(as2[1].as1[0].af[2], f++);
+       CHECK(as2[1].as1[1].f, f++);
+       CHECK(as2[1].as1[1].af[0], f++);
+       CHECK(as2[1].as1[1].af[1], f++);
+       CHECK(as2[1].as1[1].af[2], f++);
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+uniform float ref 137.035999074
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-es-3.00/execution/varying-struct-basic.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-basic.shader_test
new file mode 100644
index 0000000..4ecfdf6
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-basic.shader_test
@@ -0,0 +1,114 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This test verifies basic functionality of varying structs using a
+# varying struct containing a variety of types.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+uniform float ref;
+
+in vec4 vertex;
+struct Foo
+{
+       mat4 a;
+       mat3 b;
+       mat2 c;
+       vec4 d;
+       vec3 e;
+       vec2 f;
+       float g;
+};
+out Foo foo;
+
+void main()
+{
+       gl_Position = vertex;
+
+       foo.a = mat4(ref,        ref +  1.0, ref +  2.0, ref +  3.0,
+                    ref +  4.0, ref +  5.0, ref +  6.0, ref +  7.0,
+                    ref +  8.0, ref +  9.0, ref + 10.0, ref + 11.0,
+                    ref + 12.0, ref + 13.0, ref + 14.0, ref + 15.0);
+
+       foo.b = mat3(ref + 16.0, ref + 17.0, ref + 18.0,
+                    ref + 19.0, ref + 20.0, ref + 21.0,
+                    ref + 22.0, ref + 23.0, ref + 24.0);
+
+       foo.c = mat2(ref + 25.0, ref + 26.0,
+                    ref + 27.0, ref + 28.0);
+
+       foo.d = vec4(ref + 29.0, ref + 30.0, ref + 31.0, ref + 32.0);
+       foo.e = vec3(ref + 33.0, ref + 34.0, ref + 35.0);
+       foo.f = vec2(ref + 36.0, ref + 37.0);
+       foo.g = ref + 38.0;
+}
+
+[fragment shader]
+#version 300 es
+
+uniform float ref;
+
+struct Foo
+{
+       mat4 a;
+       mat3 b;
+       mat2 c;
+       vec4 d;
+       vec3 e;
+       vec2 f;
+       float g;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+
+       CHECK(foo.a[0], vec4(ref,        ref +  1.0, ref +  2.0, ref +  3.0));
+       CHECK(foo.a[1], vec4(ref +  4.0, ref +  5.0, ref +  6.0, ref +  7.0));
+       CHECK(foo.a[2], vec4(ref +  8.0, ref +  9.0, ref + 10.0, ref + 11.0));
+       CHECK(foo.a[3], vec4(ref + 12.0, ref + 13.0, ref + 14.0, ref + 15.0));
+
+       CHECK(foo.b[0], vec3(ref + 16.0, ref + 17.0, ref + 18.0));
+       CHECK(foo.b[1], vec3(ref + 19.0, ref + 20.0, ref + 21.0));
+       CHECK(foo.b[2], vec3(ref + 22.0, ref + 23.0, ref + 24.0));
+
+       CHECK(foo.c[0], vec2(ref + 25.0, ref + 26.0));
+       CHECK(foo.c[1], vec2(ref + 27.0, ref + 28.0));
+
+       CHECK(foo.d, vec4(ref + 29.0, ref + 30.0, ref + 31.0, ref + 32.0));
+       CHECK(foo.e, vec3(ref + 33.0, ref + 34.0, ref + 35.0));
+       CHECK(foo.f, vec2(ref + 36.0, ref + 37.0));
+       CHECK(foo.g, ref + 38.0);
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+uniform float ref 137.035999074
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-es-3.00/execution/varying-struct-centroid.c 
b/tests/spec/glsl-es-3.00/execution/varying-struct-centroid.c
new file mode 100644
index 0000000..301a19c
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-centroid.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright © 2013 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 varying-struct-centroid.c
+ *
+ * Test that varying structs work properly.
+ *
+ * From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+ *
+ *     Fragment inputs can only be signed and unsigned integers and
+ *     integer vectors, float, floating-point vectors, matrices, or
+ *     arrays or structures of these.
+ *
+ * And from section 4.3.6 ("Output Variables"):
+ *
+ *     Vertex output variables ... can only be float, floating-point
+ *     vectors, matrices, signed or unsigned integers or integer
+ *     vectors, or arrays or structures of any these.
+ *
+ * This tests that the elements of varying structs properly respect the
+ * "centroid" keyword.
+ *
+ * The test functions as follows:
+ *
+ * - Create a vertex and fragment shader whose varyings are (1) a vec4
+ *   using normal interpolation, (2) a vec4 using centroid
+ *   interpolation, (3) a struct using normal interpolation, and (4) a
+ *   struct using centroid interpolation.  Both structs contain a
+ *   single vec4.  The fragment shader compares the vec4's inside the
+ *   structs with the corresponding non-structured vec4's, and outputs
+ *   red or green depending whether they match.
+ *
+ * - Create a multisampled renderbuffer.
+ *
+ * - Draw a rectangle that covers the entire renderbuffer.
+ *
+ * - Draw a triangle over the top of this rectangle, where the
+ *   coordinates have been chosen to ensure that at least some pixels
+ *   are less than 50% covered (these pixels will have their
+ *   centroid-interpolated varyings differ from their
+ *   non-centroid-interpolated varyings since the center of the pixel
+ *   is not covered).
+ *
+ * - Use a blit to downsample the image to the screen.
+ *
+ * - Check that all pixels are green.
+ */
+
+#include "piglit-util-gl-common.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+       config.supports_gl_es_version = 30;
+       config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_ALPHA | 
PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const char vs_text[] =
+       "#version 300 es\n"
+       "in vec4 vertex;\n"
+       "struct Foo {\n"
+       "  vec4 v;\n"
+       "};\n"
+       "out Foo foo;\n"
+       "centroid out Foo foo_centroid;\n"
+       "out vec4 ref;\n"
+       "centroid out vec4 ref_centroid;\n"
+       "void main()\n"
+       "{\n"
+       "  gl_Position = vertex;\n"
+       "  foo.v = vertex;\n"
+       "  foo_centroid.v = vertex;\n"
+       "  ref = vertex;\n"
+       "  ref_centroid = vertex;\n"
+       "}\n";
+
+static const char fs_text[] =
+       "#version 300 es\n"
+       "struct Foo {\n"
+       "  vec4 v;\n"
+       "};\n"
+       "in Foo foo;\n"
+       "centroid in Foo foo_centroid;\n"
+       "in vec4 ref;\n"
+       "centroid in vec4 ref_centroid;\n"
+       "out vec4 color;\n"
+       "void main()\n"
+       "{\n"
+       "  if (distance(foo.v, ref) > 0.00001\n"
+       "      || distance(foo_centroid.v, ref_centroid) > 0.00001) {\n"
+       "    color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+       "  } else {\n"
+       "    color = vec4(0.0, 1.0, 0.0, 1.0);\n"
+       "  }\n"
+       "}\n";
+
+
+static GLuint prog;
+static GLuint fbo;
+static GLuint rb;
+
+
+void
+piglit_init(int argc, char **argv)
+{
+       /* Create the shaders */
+       prog = glCreateProgram();
+       glAttachShader(prog, piglit_compile_shader_text(GL_VERTEX_SHADER,
+                                                       vs_text));
+       glAttachShader(prog, piglit_compile_shader_text(GL_FRAGMENT_SHADER,
+                                                       fs_text));
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_POS, "vertex");
+       glLinkProgram(prog);
+       if (!piglit_link_check_status(prog))
+               piglit_report_result(PIGLIT_FAIL);
+
+       /* Create the multisampled framebuffer */
+       glGenFramebuffers(1, &fbo);
+       glGenRenderbuffers(1, &rb);
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
+       glBindRenderbuffer(GL_RENDERBUFFER, rb);
+       glRenderbufferStorageMultisample(GL_RENDERBUFFER,
+                                        4 /* samples */,
+                                        GL_RGBA8 /* internalformat */,
+                                        piglit_width, piglit_height);
+       glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                 GL_RENDERBUFFER, rb);
+       if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER)
+           != GL_FRAMEBUFFER_COMPLETE) {
+               printf("Framebuffer incomplete\n");
+               piglit_report_result(PIGLIT_FAIL);
+       }
+
+       if (!piglit_check_gl_error(GL_NO_ERROR))
+               piglit_report_result(PIGLIT_FAIL);
+}
+
+
+enum piglit_result
+piglit_display(void)
+{
+       const float verts[3][4] = {
+               { -1.0, -1.0, 0.0, 1.0 },
+               { -0.9,  1.0, 0.0, 1.0 },
+               {  1.0,  0.8, 0.0, 1.0 }
+       };
+       const float green[4] = { 0.0, 1.0, 0.0, 1.0 };
+       bool pass = true;
+
+       /* Set up to draw into the multisampled renderbuffer */
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
+       glClear(GL_COLOR_BUFFER_BIT);
+       glUseProgram(prog);
+
+       /* Draw a rectangle covering the entire buffer */
+       piglit_draw_rect(-1, -1, 2, 2);
+
+       /* Draw a triangle where some samples are <50% covered */
+       glVertexAttribPointer(PIGLIT_ATTRIB_POS, 4, GL_FLOAT, GL_FALSE, 0,
+                             verts);
+       glEnableVertexAttribArray(PIGLIT_ATTRIB_POS);
+       glDrawArrays(GL_TRIANGLES, 0, 3);
+
+       /* Blit to the main window to downsample the image */
+       glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
+       glBlitFramebuffer(0, 0, piglit_width, piglit_height,
+                         0, 0, piglit_width, piglit_height,
+                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
+
+       /* Check that the image is all green */
+       glBindFramebuffer(GL_READ_FRAMEBUFFER, piglit_winsys_fbo);
+       pass = piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height,
+                                     green) && pass;
+
+       piglit_present_results();
+       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-copy-function-fs.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-function-fs.shader_test
new file mode 100644
index 0000000..b697bf3
--- /dev/null
+++ 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-function-fs.shader_test
@@ -0,0 +1,89 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that varying structs work when copied to a struct within
+# a function via an "in" parameter.
+#
+# This case is important because in implementations that flatten
+# varying structs to their individual components, this use of varying
+# structs is likely to take a different code path than uses of varying
+# structs that access the structure elements one at a time.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+out Foo foo;
+
+void main()
+{
+       gl_Position = vertex;
+
+       foo.a = 1.0;
+       foo.b = vec2(2.0, 3.0);
+       foo.c = vec3(4.0, 5.0, 6.0);
+       foo.d = vec4(7.0, 8.0, 9.0, 10.0);
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+bool check_fn(in Foo p)
+{
+       bool failed = false;
+       CHECK(p.a, 1.0);
+       CHECK(p.b, vec2(2.0, 3.0));
+       CHECK(p.c, vec3(4.0, 5.0, 6.0));
+       CHECK(p.d, vec4(7.0, 8.0, 9.0, 10.0));
+       return failed;
+}
+
+void main()
+{
+       bool failed = check_fn(foo);
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-fs.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-fs.shader_test
new file mode 100644
index 0000000..71f82ce
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-fs.shader_test
@@ -0,0 +1,86 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that varying structs work when copied to a local struct
+# within the fragment shader.
+#
+# This case is important because in implementations that flatten
+# varying structs to their individual components, this use of varying
+# structs is likely to take a different code path than uses of varying
+# structs that access the structure elements one at a time.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+out Foo foo;
+
+void main()
+{
+       gl_Position = vertex;
+
+       foo.a = 1.0;
+       foo.b = vec2(2.0, 3.0);
+       foo.c = vec3(4.0, 5.0, 6.0);
+       foo.d = vec4(7.0, 8.0, 9.0, 10.0);
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+       Foo local_foo;
+
+       local_foo = foo;
+       CHECK(local_foo.a, 1.0);
+       CHECK(local_foo.b, vec2(2.0, 3.0));
+       CHECK(local_foo.c, vec3(4.0, 5.0, 6.0));
+       CHECK(local_foo.d, vec4(7.0, 8.0, 9.0, 10.0));
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-vs.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-vs.shader_test
new file mode 100644
index 0000000..6ebf0fe
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-local-vs.shader_test
@@ -0,0 +1,86 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that varying structs work when copied from a local struct
+# within the shader.
+#
+# This case is important because in implementations that flatten
+# varying structs to their individual components, this use of varying
+# structs is likely to take a different code path than uses of varying
+# structs that access the structure elements one at a time.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+out Foo foo;
+
+void main()
+{
+       gl_Position = vertex;
+       Foo local_foo;
+       local_foo.a = 1.0;
+       local_foo.b = vec2(2.0, 3.0);
+       local_foo.c = vec3(4.0, 5.0, 6.0);
+       local_foo.d = vec4(7.0, 8.0, 9.0, 10.0);
+
+       foo = local_foo;
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+
+       CHECK(foo.a, 1.0);
+       CHECK(foo.b, vec2(2.0, 3.0));
+       CHECK(foo.c, vec3(4.0, 5.0, 6.0));
+       CHECK(foo.d, vec4(7.0, 8.0, 9.0, 10.0));
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-copy-out-vs.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-out-vs.shader_test
new file mode 100644
index 0000000..e732468
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-out-vs.shader_test
@@ -0,0 +1,89 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that varying structs work when copied from an "out"
+# parameter of a function.
+#
+# This case is important because in implementations that flatten
+# varying structs to their individual components, this use of varying
+# structs is likely to take a different code path than uses of varying
+# structs that access the structure elements one at a time.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+out Foo foo;
+
+void out_param_foo(out Foo p)
+{
+       p.a = 1.0;
+       p.b = vec2(2.0, 3.0);
+       p.c = vec3(4.0, 5.0, 6.0);
+       p.d = vec4(7.0, 8.0, 9.0, 10.0);
+}
+
+void main()
+{
+       gl_Position = vertex;
+
+       out_param_foo(foo);
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+
+       CHECK(foo.a, 1.0);
+       CHECK(foo.b, vec2(2.0, 3.0));
+       CHECK(foo.c, vec3(4.0, 5.0, 6.0));
+       CHECK(foo.d, vec4(7.0, 8.0, 9.0, 10.0));
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-copy-return-vs.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-return-vs.shader_test
new file mode 100644
index 0000000..1c1a15e
--- /dev/null
+++ 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-return-vs.shader_test
@@ -0,0 +1,89 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that varying structs work when copied from the return
+# value of a function.
+#
+# This case is important because in implementations that flatten
+# varying structs to their individual components, this use of varying
+# structs is likely to take a different code path than uses of varying
+# structs that access the structure elements one at a time.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+out Foo foo;
+
+Foo return_foo()
+{
+       return Foo(1.0,
+                  vec2(2.0, 3.0),
+                  vec3(4.0, 5.0, 6.0),
+                  vec4(7.0, 8.0, 9.0, 10.0));
+}
+
+void main()
+{
+       gl_Position = vertex;
+
+       foo = return_foo();
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+
+       CHECK(foo.a, 1.0);
+       CHECK(foo.b, vec2(2.0, 3.0));
+       CHECK(foo.c, vec3(4.0, 5.0, 6.0));
+       CHECK(foo.d, vec4(7.0, 8.0, 9.0, 10.0));
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-copy-uniform-vs.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-uniform-vs.shader_test
new file mode 100644
index 0000000..9fef9f2
--- /dev/null
+++ 
b/tests/spec/glsl-es-3.00/execution/varying-struct-copy-uniform-vs.shader_test
@@ -0,0 +1,86 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that varying structs work when copied from a uniform
+# struct within the vertex shader.
+#
+# This case is important because in implementations that flatten
+# varying structs to their individual components, this use of varying
+# structs is likely to take a different code path than uses of varying
+# structs that access the structure elements one at a time.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+out Foo foo;
+uniform Foo uniform_foo;
+
+void main()
+{
+       gl_Position = vertex;
+
+       foo = uniform_foo;
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       float a;
+       vec2 b;
+       vec3 c;
+       vec4 d;
+};
+in Foo foo;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+
+       CHECK(foo.a, 1.0);
+       CHECK(foo.b, vec2(2.0, 3.0));
+       CHECK(foo.c, vec3(4.0, 5.0, 6.0));
+       CHECK(foo.d, vec4(7.0, 8.0, 9.0, 10.0));
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+uniform float uniform_foo.a 1.0
+uniform vec2 uniform_foo.b 2.0 3.0
+uniform vec3 uniform_foo.c 4.0 5.0 6.0
+uniform vec4 uniform_foo.d 7.0 8.0 9.0 10.0
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git 
a/tests/spec/glsl-es-3.00/execution/varying-struct-interpolation.shader_test 
b/tests/spec/glsl-es-3.00/execution/varying-struct-interpolation.shader_test
new file mode 100644
index 0000000..4930dc1
--- /dev/null
+++ b/tests/spec/glsl-es-3.00/execution/varying-struct-interpolation.shader_test
@@ -0,0 +1,86 @@
+# Test that varying structs work properly.
+#
+# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"):
+#
+#     Fragment inputs can only be signed and unsigned integers and
+#     integer vectors, float, floating-point vectors, matrices, or
+#     arrays or structures of these.
+#
+# And from section 4.3.6 ("Output Variables"):
+#
+#     Vertex output variables ... can only be float, floating-point
+#     vectors, matrices, signed or unsigned integers or integer
+#     vectors, or arrays or structures of any these.
+#
+# This tests that the elements of varying structs properly respect the
+# keywords "flat" and "smooth".
+#
+# Note: the keyword "noperspective" is not tested because it does not
+# exist in GLSL ES 3.00.
+
+[require]
+GL ES >= 3.0
+GLSL ES >= 3.00
+
+[vertex shader]
+#version 300 es
+
+in vec4 vertex;
+struct Foo
+{
+       vec4 a;
+};
+out Foo foo;
+flat out Foo foo_flat;
+smooth out Foo foo_smooth;
+out vec4 ref;
+flat out vec4 ref_flat;
+smooth out vec4 ref_smooth;
+
+void main()
+{
+       gl_Position = vertex;
+       foo.a = vertex;
+       foo_flat.a = vertex;
+       foo_smooth.a = vertex;
+       ref = vertex;
+       ref_flat = vertex;
+       ref_smooth = vertex;
+}
+
+[fragment shader]
+#version 300 es
+
+struct Foo
+{
+       vec4 a;
+};
+in Foo foo;
+flat in Foo foo_flat;
+smooth in Foo foo_smooth;
+in vec4 ref;
+flat in vec4 ref_flat;
+smooth in vec4 ref_smooth;
+out vec4 color;
+
+#define CHECK(value, expected) \
+       if (distance(value, expected) > 0.00001) \
+               failed = true
+
+void main()
+{
+       bool failed = false;
+
+       CHECK(foo.a, ref);
+       CHECK(foo_flat.a, ref_flat);
+       CHECK(foo_smooth.a, ref_smooth);
+
+       if (failed)
+               color = vec4(1.0, 0.0, 0.0, 1.0);
+       else
+               color = vec4(0.0, 1.0, 0.0, 1.0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
-- 
1.8.1.2

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to