Merge in/out tests for AoA.IInterfaceArrays*
authorAndres Gomez <agomez@igalia.com>
Thu, 2 Feb 2017 15:10:14 +0000 (17:10 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 24 Mar 2017 19:06:21 +0000 (15:06 -0400)
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays2 and
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays3 test for input
and output variables respectively.

GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays5 and
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays6 test for input
and output blocks respectively.

While output tests can be tested isolatedly, input tests will fail at
linking stage if they are statically read and no matching output exists
in the previous shader stage. Therefore, we have to merge both tests
into a single one.

Affects:

GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays2
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays3
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays4
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays5
GL43-CTS.arrays_of_arrays_gl.InteractionInterfaceArrays6

Components: OpenGL
VK-GL-CTS issue: 138

Change-Id: Iff3bae7d14f76999af8975d7d4733f79cb6e8691

external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.2.x/gles31-khr-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.2.x/src/gles31-khr-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.3.x/gles31-khr-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.3.x/src/gles31-khr-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles31-khr-master.txt
external/openglcts/modules/gles31/es31cArrayOfArraysTests.cpp
external/openglcts/modules/gles31/es31cArrayOfArraysTests.hpp

index 6c3c18c..03ee838 100644 (file)
@@ -1315,8 +1315,6 @@ KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays1
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays2
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays3
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays4
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays5
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays6
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
index 6c3c18c..03ee838 100644 (file)
@@ -1315,8 +1315,6 @@ KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays1
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays2
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays3
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays4
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays5
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays6
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
index a58993e..9d96e35 100644 (file)
@@ -1315,8 +1315,6 @@ KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays1
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays2
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays3
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays4
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays5
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays6
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
index a58993e..9d96e35 100644 (file)
@@ -1315,8 +1315,6 @@ KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays1
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays2
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays3
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays4
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays5
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays6
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
index a58993e..9d96e35 100644 (file)
@@ -1315,8 +1315,6 @@ KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays1
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays2
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays3
 KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays4
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays5
-KHR-GLES31.core.arrays_of_arrays.InteractionInterfaceArrays6
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
 KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
index 1c485c0..7934f7d 100644 (file)
@@ -7780,146 +7780,411 @@ void InteractionInterfaceArrays1<API>::test_shader_compilation(
 /* Generates the shader source code for the InteractionInterfaceArrays2
  * array test, and attempts to compile the test shader.
  *
- * @tparam API               Tested API descriptor
+ * @tparam API              Tested API descriptor
  *
- * @param tested_shader_type The type of shader that is being tested.
+ * @param input_shader_type The type of shader that is being tested.
  */
 template <class API>
 void InteractionInterfaceArrays2<API>::test_shader_compilation(
-       typename TestCaseBase<API>::TestShaderType tested_shader_type)
+       typename TestCaseBase<API>::TestShaderType input_shader_type)
 {
        /* Shader source with invalid input (input cannot be of arrays of arrays type). */
-       const std::string invalid_input_shader_source[] = { "in  float input_variable", "[2][2];\n"
-                                                                                                                                                                       "out float output_variable",
-                                                                                                               ";\n\n"
-                                                                                                               "void main()\n"
-                                                                                                               "{\n"
-                                                                                                               "    output_variable",
-                                                                                                               " = input_variable", "[0][0];\n" };
-
-       /* Verify that INPUTs arrays of arrays type is rejected. */
-       if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type)
-       {
-               std::string source;
+       const std::string input_variable_shader_source[] = { "in  float inout_variable", "[2][2];\n"
+                                                                                                                                                                        "out float result",
+                                                                                                                ";\n\n"
+                                                                                                                "void main()\n"
+                                                                                                                "{\n"
+                                                                                                                "    result",
+                                                                                                                " = inout_variable", "[0][0];\n" };
+       /* Shader source with invalid output (output cannot be of arrays of arrays type). */
+       const std::string output_variable_shader_source[] = { "out float inout_variable",
+                                                                                                                 "[2][2];\n\n"
+                                                                                                                 "void main()\n"
+                                                                                                                 "{\n"
+                                                                                                                 "    inout_variable",
+                                                                                                                 "[0][0] = 0.0;\n"
+                                                                                                                 "    inout_variable",
+                                                                                                                 "[0][1] = 1.0;\n"
+                                                                                                                 "    inout_variable",
+                                                                                                                 "[1][0] = 2.0;\n"
+                                                                                                                 "    inout_variable",
+                                                                                                                 "[1][1] = 3.0;\n" };
+
+       const typename TestCaseBase<API>::TestShaderType& output_shader_type =
+               this->get_output_shader_type(input_shader_type);
+       std::string input_source;
+       std::string output_source;
 
-               source += invalid_input_shader_source[0];
+       this->prepare_sources(input_shader_type, output_shader_type, input_variable_shader_source,
+                                                 output_variable_shader_source, input_source, output_source);
 
-               if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == tested_shader_type))
+       /* Verify that INPUTs and OUTPUTs arrays of arrays type is rejected. */
+       if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != input_shader_type)
+       {
+               if (API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS)
                {
-                       source += "[]";
-               }
 
-               source += invalid_input_shader_source[1];
+                       if (API::USE_ALL_SHADER_STAGES)
+                       {
+                               const std::string& compute_shader_source = empty_string;
+                               const std::string& fragment_shader_source =
+                                       this->prepare_fragment_shader(input_shader_type, input_source, output_source);
+                               const std::string& geometry_shader_source =
+                                       this->prepare_geometry_shader(input_shader_type, input_source, output_source);
+                               const std::string& tess_ctrl_shader_source =
+                                       this->prepare_tess_ctrl_shader_source(input_shader_type, input_source, output_source);
+                               const std::string& tess_eval_shader_source =
+                                       this->prepare_tess_eval_shader_source(input_shader_type, input_source, output_source);
+                               const std::string& vertex_shader_source =
+                                       this->prepare_vertex_shader(input_shader_type, input_source, output_source);
+
+                               this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
+                                                                                       geometry_shader_source, fragment_shader_source, compute_shader_source, true,
+                                                                                       false);
+                       }
+                       else
+                       {
+                               const std::string& fragment_shader_source =
+                                       this->prepare_fragment_shader(input_shader_type, input_source, output_source);
+                               const std::string& vertex_shader_source =
+                                       this->prepare_vertex_shader(input_shader_type, input_source, output_source);
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+                               this->execute_positive_test(vertex_shader_source, fragment_shader_source, true, false);
+                       }
+               }
+               else
                {
-                       source += "[]";
+                       this->execute_negative_test(input_shader_type, input_source);
+                       this->execute_negative_test(output_shader_type, output_source);
                }
+       }
+}
 
-               source += invalid_input_shader_source[2];
+/** Gets the shader type to test for the outputs
+ *
+ * @tparam API              Tested API descriptor
+ *
+ * @param input_shader_type The type of input shader that is being tested
+ **/
+template <class API>
+const typename TestCaseBase<API>::TestShaderType InteractionInterfaceArrays2<API>::get_output_shader_type(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type)
+{
+       switch (input_shader_type)
+       {
+       case TestCaseBase<API>::VERTEX_SHADER_TYPE:
+               return TestCaseBase<API>::FRAGMENT_SHADER_TYPE;
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+       case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
+               if (API::USE_ALL_SHADER_STAGES)
                {
-                       source += "[gl_InvocationID]";
+                       return TestCaseBase<API>::GEOMETRY_SHADER_TYPE;
                }
+               else
+               {
+                       return TestCaseBase<API>::VERTEX_SHADER_TYPE;
+               }
+
+       case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
+               break;
+
+       case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
+               return TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE;
+
+       case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
+               return TestCaseBase<API>::VERTEX_SHADER_TYPE;
+
+       case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
+               return TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE;
 
-               source += invalid_input_shader_source[3];
+       default:
+               TCU_FAIL("Unrecognized shader type.");
+               break;
+       }
+
+       return input_shader_type;
+}
+
+/** Prepare fragment shader
+ *
+ * @tparam API              Tested API descriptor
+ *
+ * @param input_shader_type The type of input shader that is being tested
+ * @param input_source      Shader in case we want to test inputs for this shader
+ * @param output_source     Shader in case we want to test outputs for this shader
+ **/
+template <class API>
+const std::string InteractionInterfaceArrays2<API>::prepare_fragment_shader(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+       const std::string& output_source)
+{
+       switch (input_shader_type)
+       {
+       case TestCaseBase<API>::VERTEX_SHADER_TYPE:
+               return output_source;
+
+       case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
+               return input_source;
 
-               if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == tested_shader_type))
+       case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
+       case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
+       case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
+       case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
+               break;
+
+       default:
+               TCU_FAIL("Unrecognized shader type.");
+               break;
+       }
+
+       return default_fragment_shader_source;
+}
+
+/** Prepare geometry shader
+ *
+ * @tparam API              Tested API descriptor
+ *
+ * @param input_shader_type The type of input shader that is being tested
+ * @param input_source      Shader in case we want to test inputs for this shader
+ * @param output_source     Shader in case we want to test outputs for this shader
+ **/
+template <class API>
+const std::string InteractionInterfaceArrays2<API>::prepare_geometry_shader(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+       const std::string& output_source)
+{
+       switch (input_shader_type)
+       {
+       case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
+               if (API::USE_ALL_SHADER_STAGES)
                {
-                       source += "[0]";
+                       return output_source;
                }
+               break;
+
+       case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
+               return input_source;
+
+       case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
+       case TestCaseBase<API>::VERTEX_SHADER_TYPE:
+       case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
+       case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
+               break;
+
+       default:
+               TCU_FAIL("Unrecognized shader type.");
+               break;
+       }
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+       return default_geometry_shader_source;
+}
+
+/** Prepare tessellation control shader
+ *
+ * @tparam API              Tested API descriptor
+ *
+ * @param input_shader_type The type of input shader that is being tested
+ * @param input_source      Shader in case we want to test inputs for this shader
+ * @param output_source     Shader in case we want to test outputs for this shader
+ **/
+template <class API>
+const std::string InteractionInterfaceArrays2<API>::prepare_tess_ctrl_shader_source(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+       const std::string& output_source)
+{
+       switch (input_shader_type)
+       {
+       case TestCaseBase<API>::VERTEX_SHADER_TYPE:
+       case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
+       case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
+       case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
+               break;
+
+       case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
+               return input_source;
+
+       case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
+               return output_source;
+
+       default:
+               TCU_FAIL("Unrecognized shader type.");
+               break;
+       }
+
+       return default_tc_shader_source;
+}
+
+/** Prepare tessellation evaluation shader
+ *
+ * @tparam API              Tested API descriptor
+ *
+ * @param input_shader_type The type of input shader that is being tested
+ * @param input_source      Shader in case we want to test inputs for this shader
+ * @param output_source     Shader in case we want to test outputs for this shader
+ **/
+template <class API>
+const std::string InteractionInterfaceArrays2<API>::prepare_tess_eval_shader_source(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+       const std::string& output_source)
+{
+       switch (input_shader_type)
+       {
+       case TestCaseBase<API>::VERTEX_SHADER_TYPE:
+       case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
+       case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
+       case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
+               break;
+
+       case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
+               return output_source;
+
+       case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
+               return input_source;
+
+       default:
+               TCU_FAIL("Unrecognized shader type.");
+               break;
+       }
+
+       return default_te_shader_source;
+}
+
+/** Prepare vertex shader
+ *
+ * @tparam API              Tested API descriptor
+ *
+ * @param input_shader_type The type of input shader that is being tested
+ * @param input_source      Shader in case we want to test inputs for this shader
+ * @param output_source     Shader in case we want to test outputs for this shader
+ **/
+template <class API>
+const std::string InteractionInterfaceArrays2<API>::prepare_vertex_shader(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+       const std::string& output_source)
+{
+       switch (input_shader_type)
+       {
+       case TestCaseBase<API>::VERTEX_SHADER_TYPE:
+               return input_source;
+
+       case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
+               if (!API::USE_ALL_SHADER_STAGES)
                {
-                       source += "[gl_InvocationID]";
+                       return output_source;
                }
+               break;
 
-               source += invalid_input_shader_source[4];
+       case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
+               return output_source;
 
-               DEFAULT_MAIN_ENDING(tested_shader_type, source);
+       case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
+       case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
+       case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
+               break;
 
-               EXECUTE_SHADER_TEST(API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS, tested_shader_type, source);
+       default:
+               TCU_FAIL("Unrecognized shader type.");
+               break;
        }
+
+       return default_vertex_shader_source;
 }
 
-/* Generates the shader source code for the InteractionInterfaceArrays3
- * array test, and attempts to compile the test shader.
+/** Prepare the inputs and outputs shaders
  *
- * @tparam API               Tested API descriptor
+ * @tparam API                 Tested API descriptor
  *
- * @param tested_shader_type The type of shader that is being tested.
- */
+ * @param input_shader_type    The type of input shader that is being tested
+ * @param output_shader_type   The type of output shader that is being tested
+ * @param input_shader_source  Snippet used to prepare the input shader
+ * @param output_shader_source Snippet used to prepare the output shader
+ * @param input_source         Resulting input shader
+ * @param output_source        Resulting output shader
+ **/
 template <class API>
-void InteractionInterfaceArrays3<API>::test_shader_compilation(
-       typename TestCaseBase<API>::TestShaderType tested_shader_type)
+void InteractionInterfaceArrays2<API>::prepare_sources(
+       const typename TestCaseBase<API>::TestShaderType& input_shader_type,
+       const typename TestCaseBase<API>::TestShaderType& output_shader_type, const std::string* input_shader_source,
+       const std::string* output_shader_source, std::string& input_source, std::string& output_source)
 {
-       /* Shader source with invalid output (output cannot be of arrays of arrays type). */
-       const std::string invalid_output_shader_source[] = { "out float output_variable",
-                                                                                                                "[2][2];\n\n"
-                                                                                                                "void main()\n"
-                                                                                                                "{\n"
-                                                                                                                "    output_variable",
-                                                                                                                "[0][0] = 0.0;\n"
-                                                                                                                "    output_variable",
-                                                                                                                "[0][1] = 1.0;\n"
-                                                                                                                "    output_variable",
-                                                                                                                "[1][0] = 2.0;\n"
-                                                                                                                "    output_variable",
-                                                                                                                "[1][1] = 3.0;\n" };
-
-       /* Verify that OUTPUTs arrays of arrays type is rejected. */
-       if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type)
+       if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != input_shader_type)
        {
-               std::string source;
+               input_source += input_shader_source[0];
+               output_source += output_shader_source[0];
 
-               source += invalid_output_shader_source[0];
+               if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == input_shader_type) ||
+                       (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type) ||
+                       (TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == input_shader_type))
+               {
+                       input_source += "[]";
+               }
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
                {
-                       source += "[]";
+                       output_source += "[]";
                }
 
-               source += invalid_output_shader_source[1];
+               input_source += input_shader_source[1];
+               output_source += output_shader_source[1];
+
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type)
+               {
+                       input_source += "[]";
+               }
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
                {
-                       source += "[gl_InvocationID]";
+                       output_source += "[gl_InvocationID]";
                }
 
-               source += invalid_output_shader_source[2];
+               input_source += input_shader_source[2];
+               output_source += output_shader_source[2];
+
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type)
+               {
+                       input_source += "[gl_InvocationID]";
+               }
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
                {
-                       source += "[gl_InvocationID]";
+                       output_source += "[gl_InvocationID]";
                }
 
-               source += invalid_output_shader_source[3];
+               input_source += input_shader_source[3];
+               output_source += output_shader_source[3];
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+               if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == input_shader_type) ||
+                       (TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == input_shader_type))
                {
-                       source += "[gl_InvocationID]";
+                       input_source += "[0]";
                }
 
-               source += invalid_output_shader_source[4];
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type)
+               {
+                       input_source += "[gl_InvocationID]";
+               }
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
                {
-                       source += "[gl_InvocationID]";
+                       output_source += "[gl_InvocationID]";
                }
 
-               source += invalid_output_shader_source[5];
+               input_source += input_shader_source[4];
+               output_source += output_shader_source[4];
 
-               DEFAULT_MAIN_ENDING(tested_shader_type, source);
+               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
+               {
+                       output_source += "[gl_InvocationID]";
+               }
 
-               EXECUTE_SHADER_TEST(API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS, tested_shader_type, source);
+               output_source += output_shader_source[5];
+
+               DEFAULT_MAIN_ENDING(input_shader_type, input_source);
+               DEFAULT_MAIN_ENDING(output_shader_type, output_source);
        }
 }
 
-/* Generates the shader source code for the InteractionInterfaceArrays4
+/* Generates the shader source code for the InteractionInterfaceArrays3
  * array test, and attempts to compile the test shader.
  *
  * @tparam API               Tested API descriptor
@@ -7927,7 +8192,7 @@ void InteractionInterfaceArrays3<API>::test_shader_compilation(
  * @param tested_shader_type The type of shader that is being tested.
  */
 template <class API>
-void InteractionInterfaceArrays4<API>::test_shader_compilation(
+void InteractionInterfaceArrays3<API>::test_shader_compilation(
        typename TestCaseBase<API>::TestShaderType tested_shader_type)
 {
        /* Shader source with invalid uniform block (uniform block cannot be of arrays of arrays type). */
@@ -7950,137 +8215,93 @@ void InteractionInterfaceArrays4<API>::test_shader_compilation(
        }
 }
 
-/* Generates the shader source code for the InteractionInterfaceArrays5
+/* Generates the shader source code for the InteractionInterfaceArrays4
  * array test, and attempts to compile the test shader.
  *
- * @tparam API               Tested API descriptor
+ * @tparam API              Tested API descriptor
  *
- * @param tested_shader_type The type of shader that is being tested.
+ * @param input_shader_type The type of shader that is being tested.
  */
 template <class API>
-void InteractionInterfaceArrays5<API>::test_shader_compilation(
-       typename TestCaseBase<API>::TestShaderType tested_shader_type)
+void InteractionInterfaceArrays4<API>::test_shader_compilation(
+       typename TestCaseBase<API>::TestShaderType input_shader_type)
 {
        /* Shader source with invalid input (input cannot be of arrays of arrays type). */
-       const std::string input_block_shader_source[] = { "in  InBlock {\n"
-                                                                                                         "    float input_variable;\n"
-                                                                                                         "} in_block",
+       const std::string input_block_shader_source[] = { "in  InOutBlock {\n"
+                                                                                                         "    float inout_variable;\n"
+                                                                                                         "} inout_block",
                                                                                                          "[2][2];\n"
-                                                                                                         "out float output_variable;\n"
-                                                                                                         "\n"
+                                                                                                         "out float result",
+                                                                                                         ";\n\n"
                                                                                                          "void main()\n"
                                                                                                          "{\n"
-                                                                                                         "    output_variable = in_block",
-                                                                                                         "[0][0].input_variable;\n" };
-
-       /* Verifies if arrays of arrays of input blocks are accepted */
-       if ((TestCaseBase<API>::VERTEX_SHADER_TYPE != tested_shader_type) &&
-               (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type))
-       {
-               std::string source;
-
-               source += input_block_shader_source[0];
-
-               if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == tested_shader_type))
-               {
-                       source += "[]";
-               }
-
-               source += input_block_shader_source[1];
-
-               if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type) ||
-                       (TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == tested_shader_type))
-               {
-                       source += "[0]";
-               }
-
-               source += input_block_shader_source[2];
-
-               DEFAULT_MAIN_ENDING(tested_shader_type, source);
-
-               EXECUTE_SHADER_TEST(API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS && API::ALLOW_IN_OUT_INTERFACE_BLOCKS,
-                                                       tested_shader_type, source);
-       }
-}
-
-/* Generates the shader source code for the InteractionInterfaceArrays6
- * array test, and attempts to compile the test shader.
- *
- * @tparam API               Tested API descriptor
- *
- * @param tested_shader_type The type of shader that is being tested.
- */
-template <class API>
-void InteractionInterfaceArrays6<API>::test_shader_compilation(
-       typename TestCaseBase<API>::TestShaderType tested_shader_type)
-{
+                                                                                                         "    result",
+                                                                                                         " = inout_block", "[0][0].inout_variable;\n" };
        /* Shader source with invalid output (output cannot be of arrays of arrays type). */
-       const std::string output_block_shader_source[] = { "out OutBlock {\n"
-                                                                                                          "    float output_variable;\n"
-                                                                                                          "} out_block",
+       const std::string output_block_shader_source[] = { "out InOutBlock {\n"
+                                                                                                          "    float inout_variable;\n"
+                                                                                                          "} inout_block",
                                                                                                           "[2][2];\n"
                                                                                                           "\n"
                                                                                                           "void main()\n"
                                                                                                           "{\n"
-                                                                                                          "    out_block",
-                                                                                                          "[0][0].output_variable = 0.0;\n"
-                                                                                                          "    out_block",
-                                                                                                          "[0][1].output_variable = 1.0;\n"
-                                                                                                          "    out_block",
-                                                                                                          "[1][0].output_variable = 2.0;\n"
-                                                                                                          "    out_block",
-                                                                                                          "[1][1].output_variable = 3.0;\n" };
-
-       /* Verifies if arrays of arrays of output blocks are accepted */
-       if ((TestCaseBase<API>::FRAGMENT_SHADER_TYPE != tested_shader_type) &&
-               (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type))
-       {
-               std::string source;
+                                                                                                          "    inout_block",
+                                                                                                          "[0][0].inout_variable = 0.0;\n"
+                                                                                                          "    inout_block",
+                                                                                                          "[0][1].inout_variable = 1.0;\n"
+                                                                                                          "    inout_block",
+                                                                                                          "[1][0].inout_variable = 2.0;\n"
+                                                                                                          "    inout_block",
+                                                                                                          "[1][1].inout_variable = 3.0;\n" };
 
-               source = output_block_shader_source[0];
+       const typename TestCaseBase<API>::TestShaderType& output_shader_type =
+               this->get_output_shader_type(input_shader_type);
+       std::string input_source;
+       std::string output_source;
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
-               {
-                       source += "[]";
-               }
+       this->prepare_sources(input_shader_type, output_shader_type, input_block_shader_source, output_block_shader_source,
+                                                 input_source, output_source);
 
-               source += output_block_shader_source[1];
-
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+       /* Verify that INPUTs and OUTPUTs arrays of arrays type is rejected. */
+       if ((TestCaseBase<API>::VERTEX_SHADER_TYPE != input_shader_type) &&
+               (TestCaseBase<API>::COMPUTE_SHADER_TYPE != input_shader_type))
+       {
+               if (API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS && API::ALLOW_IN_OUT_INTERFACE_BLOCKS)
                {
-                       source += "[gl_InvocationID]";
-               }
-
-               source += output_block_shader_source[2];
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
-               {
-                       source += "[gl_InvocationID]";
-               }
+                       if (API::USE_ALL_SHADER_STAGES)
+                       {
+                               const std::string& compute_shader_source = empty_string;
+                               const std::string& fragment_shader_source =
+                                       this->prepare_fragment_shader(input_shader_type, input_source, output_source);
+                               const std::string& geometry_shader_source =
+                                       this->prepare_geometry_shader(input_shader_type, input_source, output_source);
+                               const std::string& tess_ctrl_shader_source =
+                                       this->prepare_tess_ctrl_shader_source(input_shader_type, input_source, output_source);
+                               const std::string& tess_eval_shader_source =
+                                       this->prepare_tess_eval_shader_source(input_shader_type, input_source, output_source);
+                               const std::string& vertex_shader_source =
+                                       this->prepare_vertex_shader(input_shader_type, input_source, output_source);
 
-               source += output_block_shader_source[3];
+                               this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
+                                                                                       geometry_shader_source, fragment_shader_source, compute_shader_source, true,
+                                                                                       false);
+                       }
+                       else
+                       {
+                               const std::string& fragment_shader_source =
+                                       this->prepare_fragment_shader(input_shader_type, input_source, output_source);
+                               const std::string& vertex_shader_source =
+                                       this->prepare_vertex_shader(input_shader_type, input_source, output_source);
 
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
-               {
-                       source += "[gl_InvocationID]";
+                               this->execute_positive_test(vertex_shader_source, fragment_shader_source, true, false);
+                       }
                }
-
-               source += output_block_shader_source[4];
-
-               if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == tested_shader_type)
+               else
                {
-                       source += "[gl_InvocationID]";
+                       this->execute_negative_test(input_shader_type, input_source);
+                       this->execute_negative_test(output_shader_type, output_source);
                }
-
-               source += output_block_shader_source[5];
-
-               DEFAULT_MAIN_ENDING(tested_shader_type, source);
-
-               EXECUTE_SHADER_TEST(API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS && API::ALLOW_IN_OUT_INTERFACE_BLOCKS,
-                                                       tested_shader_type, source);
        }
 }
 
@@ -10620,8 +10841,6 @@ void initTests(TestCaseGroup& group, glcts::Context& context)
        group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays2<API>(context));
        group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays3<API>(context));
        group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays4<API>(context));
-       group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays5<API>(context));
-       group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays6<API>(context));
 
        if (API::USE_STORAGE_BLOCK)
        {
index c235a5a..90bb6b0 100644 (file)
@@ -2093,9 +2093,15 @@ class InteractionInterfaceArrays2 : public TestCaseBase<API>
 {
 public:
        /* Public methods */
+       InteractionInterfaceArrays2(Context& context, const glw::GLchar* name, const glw::GLchar* description)
+               : TestCaseBase<API>(context, name, description)
+       {
+               /* Left empty on purpose */
+       }
+
        InteractionInterfaceArrays2(Context& context)
                : TestCaseBase<API>(context, "InteractionInterfaceArrays2",
-                                                       " Verifies that 2-dimensional arrays of input variables\n"
+                                                       " Verifies that 2-dimensional arrays of input and output variables\n"
                                                        " are correctly rejected.\n")
        {
                /* Left empty on purpose */
@@ -2108,7 +2114,25 @@ public:
 
 protected:
        /* Protected methods */
-       void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
+       const typename TestCaseBase<API>::TestShaderType get_output_shader_type(
+               const typename TestCaseBase<API>::TestShaderType& input_shader_type);
+       const std::string prepare_fragment_shader(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
+                                                                                         const std::string& input_source, const std::string& output_source);
+       const std::string prepare_geometry_shader(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
+                                                                                         const std::string& input_source, const std::string& output_source);
+       const std::string prepare_tess_ctrl_shader_source(
+               const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+               const std::string& output_source);
+       const std::string prepare_tess_eval_shader_source(
+               const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
+               const std::string& output_source);
+       const std::string prepare_vertex_shader(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
+                                                                                       const std::string& input_source, const std::string& output_source);
+       void prepare_sources(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
+                                                const typename TestCaseBase<API>::TestShaderType& output_shader_type,
+                                                const std::string* input_shader_source, const std::string* output_shader_source,
+                                                std::string& input_source, std::string& output_source);
+       void test_shader_compilation(typename TestCaseBase<API>::TestShaderType input_shader_type);
 };
 
 template <class API>
@@ -2118,7 +2142,7 @@ public:
        /* Public methods */
        InteractionInterfaceArrays3(Context& context)
                : TestCaseBase<API>(context, "InteractionInterfaceArrays3",
-                                                       " Verifies that 2-dimensional arrays of output variables\n"
+                                                       " Verifies that 2-dimensional arrays of uniform interface blocks\n"
                                                        " are correctly rejected.\n")
        {
                /* Left empty on purpose */
@@ -2135,14 +2159,14 @@ protected:
 };
 
 template <class API>
-class InteractionInterfaceArrays4 : public TestCaseBase<API>
+class InteractionInterfaceArrays4 : public InteractionInterfaceArrays2<API>
 {
 public:
        /* Public methods */
        InteractionInterfaceArrays4(Context& context)
-               : TestCaseBase<API>(context, "InteractionInterfaceArrays4",
-                                                       " Verifies that 2-dimensional arrays of uniform interface blocks\n"
-                                                       " are correctly rejected.\n")
+               : InteractionInterfaceArrays2<API>(context, "InteractionInterfaceArrays4",
+                                                                                  " Verifies that 2-dimensional arrays of input and output interface blocks\n"
+                                                                                  " are correctly rejected.\n")
        {
                /* Left empty on purpose */
        }
@@ -2154,53 +2178,7 @@ public:
 
 protected:
        /* Protected methods */
-       void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
-};
-
-template <class API>
-class InteractionInterfaceArrays5 : public TestCaseBase<API>
-{
-public:
-       /* Public methods */
-       InteractionInterfaceArrays5(Context& context)
-               : TestCaseBase<API>(context, "InteractionInterfaceArrays5",
-                                                       " Verifies that 2-dimensional arrays of input interface blocks\n"
-                                                       " are correctly rejected.\n")
-       {
-               /* Left empty on purpose */
-       }
-
-       virtual ~InteractionInterfaceArrays5()
-       {
-               /* Left empty on purpose */
-       }
-
-protected:
-       /* Protected methods */
-       void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
-};
-
-template <class API>
-class InteractionInterfaceArrays6 : public TestCaseBase<API>
-{
-public:
-       /* Public methods */
-       InteractionInterfaceArrays6(Context& context)
-               : TestCaseBase<API>(context, "InteractionInterfaceArrays6",
-                                                       " Verifies that 2-dimensional arrays of output interface blocks\n"
-                                                       " are correctly rejected.\n")
-       {
-               /* Left empty on purpose */
-       }
-
-       virtual ~InteractionInterfaceArrays6()
-       {
-               /* Left empty on purpose */
-       }
-
-protected:
-       /* Protected methods */
-       void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
+       void test_shader_compilation(typename TestCaseBase<API>::TestShaderType input_shader_type);
 };
 
 /** Implements test AtomicDeclaration, desription follows: