Home | History | Annotate | Download | only in gles31
      1 /*-------------------------------------------------------------------------
      2  * OpenGL Conformance Test Suite
      3  * -----------------------------
      4  *
      5  * Copyright (c) 2014-2016 The Khronos Group Inc.
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  */ /*!
     20  * \file
     21  * \brief
     22  */ /*-------------------------------------------------------------------*/
     23 
     24 #include "es31cArrayOfArraysTests.hpp"
     25 #include "gluContextInfo.hpp"
     26 #include "gluDefs.hpp"
     27 #include "gluRenderContext.hpp"
     28 #include "glwFunctions.hpp"
     29 #include "tcuTestLog.hpp"
     30 
     31 #include <algorithm>
     32 #include <cassert>
     33 #include <cstdio>
     34 #include <string>
     35 using std::string;
     36 
     37 /* Selects if debug output is enabled */
     38 #define IS_DEBUG 0
     39 #define IS_DEBUG_DUMP_ALL_SHADERS 0
     40 
     41 /* Selects if workaround in ExpressionsInvalid2 test is enabled */
     42 #define WRKARD_EXPRESSIONSINVALID2 0
     43 
     44 #if IS_DEBUG
     45 #include "tcuTestLog.hpp"
     46 #endif
     47 
     48 namespace glcts
     49 {
     50 namespace ArraysOfArrays
     51 {
     52 namespace Interface
     53 {
     54 /* Sets limits on number of dimensions. Value 8 comes from ogirinal "ES" implementation.
     55  * Explanation was as follows:
     56  *
     57  *     "The current specifations allow up to 8 array dimensions."
     58  */
     59 const size_t ES::MAX_ARRAY_DIMENSIONS = 8;
     60 const size_t GL::MAX_ARRAY_DIMENSIONS = 8;
     61 
     62 /* API specific shader parts */
     63 const char* ES::shader_version_gpu5 =
     64 	"#version 310 es\n#extension GL_EXT_gpu_shader5 : require\nprecision mediump float;\n\n";
     65 const char* ES::shader_version = "#version 310 es\nprecision mediump float;\n\n";
     66 
     67 const char* GL::shader_version_gpu5 = "#version 430 core\n\n";
     68 const char* GL::shader_version		= "#version 430 core\n\n";
     69 } /* namespace Interface */
     70 
     71 /* Dummy fragment shader source code.
     72  * Used when testing the vertex shader. */
     73 const std::string default_fragment_shader_source = "//default fragment shader\n"
     74 												   "out vec4 color;\n"
     75 												   "void main()\n"
     76 												   "{\n"
     77 												   "    color = vec4(1.0);\n"
     78 												   "}\n";
     79 
     80 /* Dummy vertex shader source code.
     81  * Used when testing the fragment shader. */
     82 const std::string default_vertex_shader_source = "//default vertex shader\n"
     83 												 "\n"
     84 												 "void main()\n"
     85 												 "{\n"
     86 												 "    gl_Position = vec4(0.0,0.0,0.0,1.0);\n"
     87 												 "}\n";
     88 
     89 /* Dummy geometry shader source code.
     90  * Used when testing the other shaders. */
     91 const std::string default_geometry_shader_source = "//default geometry\n"
     92 												   "\n"
     93 												   "void main()\n"
     94 												   "{\n"
     95 												   "    gl_Position  = vec4(-1, -1, 0, 1);\n"
     96 												   "    EmitVertex();\n"
     97 												   "    gl_Position  = vec4(-1, 1, 0, 1);\n"
     98 												   "    EmitVertex();\n"
     99 												   "    gl_Position  = vec4(1, -1, 0, 1);\n"
    100 												   "    EmitVertex();\n"
    101 												   "    gl_Position  = vec4(1, 1, 0, 1);\n"
    102 												   "    EmitVertex();\n"
    103 												   "}\n";
    104 
    105 /* Dummy tesselation control shader source code.
    106  * Used when testing the other shaders. */
    107 const std::string default_tc_shader_source = "//default tcs\n"
    108 											 "\n"
    109 											 "void main()\n"
    110 											 "{\n"
    111 											 "    gl_TessLevelOuter[0] = 1.0;\n"
    112 											 "    gl_TessLevelOuter[1] = 1.0;\n"
    113 											 "    gl_TessLevelOuter[2] = 1.0;\n"
    114 											 "    gl_TessLevelOuter[3] = 1.0;\n"
    115 											 "    gl_TessLevelInner[0] = 1.0;\n"
    116 											 "    gl_TessLevelInner[1] = 1.0;\n"
    117 											 "}\n";
    118 
    119 /* Dummy tesselation evaluation shader source code.
    120  * Used when testing the other shaders. */
    121 const std::string default_te_shader_source = "//default tes\n"
    122 											 "\n"
    123 											 "void main()\n"
    124 											 "{\n"
    125 											 "}\n";
    126 
    127 /* Pass-through shaders source code. Used when testing other stage. */
    128 const std::string pass_fragment_shader_source = "//pass fragment shader\n"
    129 												"in float fs_result;\n"
    130 												"out vec4 color;\n"
    131 												"\n"
    132 												"void main()\n"
    133 												"{\n"
    134 												"    color = vec4(fs_result);\n"
    135 												"}\n";
    136 
    137 const std::string pass_geometry_shader_source = "//pass geometry\n"
    138 												"in  float gs_result[];\n"
    139 												"out float fs_result;\n"
    140 												"\n"
    141 												"void main()\n"
    142 												"{\n"
    143 												"    gl_Position  = vec4(-1, -1, 0, 1);\n"
    144 												"    fs_result = gs_result[0];\n"
    145 												"    EmitVertex();\n"
    146 												"    gl_Position  = vec4(-1, 1, 0, 1);\n"
    147 												"    fs_result = gs_result[0];\n"
    148 												"    EmitVertex();\n"
    149 												"    gl_Position  = vec4(1, -1, 0, 1);\n"
    150 												"    fs_result = gs_result[0];\n"
    151 												"    EmitVertex();\n"
    152 												"    gl_Position  = vec4(1, 1, 0, 1);\n"
    153 												"    fs_result = gs_result[0];\n"
    154 												"    EmitVertex();\n"
    155 												"}\n";
    156 
    157 const std::string pass_te_shader_source = "//pass tes\n"
    158 										  "in  float tcs_result[];\n"
    159 										  "out float fs_result;\n"
    160 										  "\n"
    161 										  "void main()\n"
    162 										  "{\n"
    163 										  "    fs_result = tcs_result[0];\n"
    164 										  "}\n";
    165 
    166 /* Empty string */
    167 static const std::string empty_string = "";
    168 
    169 /* Beginning of a shader source code. */
    170 const std::string shader_start = "void main()\n"
    171 								 "{\n";
    172 
    173 /* End of a shader source code. */
    174 const std::string shader_end = "}\n";
    175 
    176 /* Emit full screen quad from GS */
    177 const std::string emit_quad = "    gl_Position  = vec4(-1, -1, 0, 1);\n"
    178 							  "    EmitVertex();\n"
    179 							  "    gl_Position  = vec4(-1, 1, 0, 1);\n"
    180 							  "    EmitVertex();\n"
    181 							  "    gl_Position  = vec4(1, -1, 0, 1);\n"
    182 							  "    EmitVertex();\n"
    183 							  "    gl_Position  = vec4(1, 1, 0, 1);\n"
    184 							  "    EmitVertex();\n";
    185 
    186 /* Set tesselation levels */
    187 const std::string set_tesseation = "    gl_TessLevelOuter[0] = 1.0;\n"
    188 								   "    gl_TessLevelOuter[1] = 1.0;\n"
    189 								   "    gl_TessLevelOuter[2] = 1.0;\n"
    190 								   "    gl_TessLevelOuter[3] = 1.0;\n"
    191 								   "    gl_TessLevelInner[0] = 1.0;\n"
    192 								   "    gl_TessLevelInner[1] = 1.0;\n";
    193 
    194 /* Input and output data type modifiers. */
    195 const std::string in_out_type_modifiers[] = { "in", "out", "uniform" };
    196 
    197 /* Types and appropriate initialisers, used throughout these tests */
    198 const var_descriptor var_descriptors[] = {
    199 	{ "bool", "", "true", "false", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    200 	{ "int", "", "1", "0", "0", "int", "", "iterator", "1", "N/A", "N/A" },
    201 	{ "uint", "", "1u", "0u", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    202 	{ "float", "", "1.0", "0.0", "0.0", "float", "", "iterator", "1.0", "N/A", "N/A" },
    203 	{ "vec2", "", "vec2(1.0)", "vec2(0.0)", "0.0", "float", "[0]", "vec2(iterator)", "vec2(1.0)", "N/A", "N/A" },
    204 	{ "vec3", "", "vec3(1.0)", "vec3(0.0)", "0.0", "float", "[0]", "vec3(iterator)", "vec3(1.0)", "N/A", "N/A" },
    205 	{ "vec4", "", "vec4(1.0)", "vec4(0.0)", "0.0", "float", "[0]", "vec4(iterator)", "vec4(1.0)", "N/A", "N/A" },
    206 	{ "bvec2", "", "bvec2(1)", "bvec2(0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    207 	{ "bvec3", "", "bvec3(1)", "bvec3(0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    208 	{ "bvec4", "", "bvec4(1)", "bvec4(0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    209 	{ "ivec2", "", "ivec2(1)", "ivec2(0)", "0", "int", "[0]", "ivec2(iterator)", "ivec2(1)", "N/A", "N/A" },
    210 	{ "ivec3", "", "ivec3(1)", "ivec3(0)", "0", "int", "[0]", "ivec3(iterator)", "ivec3(1)", "N/A", "N/A" },
    211 	{ "ivec4", "", "ivec4(1)", "ivec4(0)", "0", "int", "[0]", "ivec4(iterator)", "ivec4(1)", "N/A", "N/A" },
    212 	{ "uvec2", "", "uvec2(1u)", "uvec2(0u)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    213 	{ "uvec3", "", "uvec3(1u)", "uvec3(0u)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    214 	{ "uvec4", "", "uvec4(1u)", "uvec4(0u)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    215 	{ "mat2", "", "mat2(1.0)", "mat2(0.0)", "0.0", "float", "[0][0]", "mat2(iterator)", "mat2(1.0)", "N/A", "N/A" },
    216 	{ "mat3", "", "mat3(1.0)", "mat3(0.0)", "0.0", "float", "[0][0]", "mat3(iterator)", "mat3(1.0)", "N/A", "N/A" },
    217 	{ "mat4", "", "mat4(1.0)", "mat4(0.0)", "0.0", "float", "[0][0]", "mat4(iterator)", "mat4(1.0)", "N/A", "N/A" },
    218 	{ "mat2x2", "", "mat2x2(1.0)", "mat2x2(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    219 	{ "mat2x3", "", "mat2x3(1.0)", "mat2x3(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    220 	{ "mat2x4", "", "mat2x4(1.0)", "mat2x4(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    221 	{ "mat3x2", "", "mat3x2(1.0)", "mat3x2(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    222 	{ "mat3x3", "", "mat3x3(1.0)", "mat3x3(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    223 	{ "mat3x4", "", "mat3x4(1.0)", "mat3x4(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    224 	{ "mat4x2", "", "mat4x2(1.0)", "mat4x2(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    225 	{ "mat4x3", "", "mat4x3(1.0)", "mat4x3(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    226 	{ "mat4x4", "", "mat4x4(1.0)", "mat4x4(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    227 	{ "imageBuffer", "", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    228 	{ "iimageBuffer", "", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    229 	{ "uimageBuffer", "", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    230 	{ "samplerBuffer", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    231 	{ "isamplerBuffer", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    232 	{ "usamplerBuffer", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    233 	{ "sampler2D", "", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec2(0.0)", "vec4" },
    234 	{ "sampler3D", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "vec4" },
    235 	{ "samplerCube", "", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "vec4" },
    236 	{
    237 		"samplerCubeShadow", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec4(0.0)", "float",
    238 	},
    239 	{ "sampler2DShadow", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "float" },
    240 	{ "sampler2DArray", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "vec4" },
    241 	{ "sampler2DArrayShadow", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec4(0.0)", "float" },
    242 	{ "isampler2D", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec2(0.0)", "ivec4" },
    243 	{ "isampler3D", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "ivec4" },
    244 	{ "isamplerCube", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "ivec4" },
    245 	{ "isampler2DArray", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "ivec4" },
    246 	{ "usampler2D", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec2(0.0)", "uvec4" },
    247 	{ "usampler3D", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "uvec4" },
    248 	{ "usamplerCube", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "uvec4" },
    249 	{ "usampler2DArray", "lowp", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "vec3(0.0)", "uvec4" },
    250 };
    251 
    252 const var_descriptor var_double_descriptors[] = {
    253 	{ "double", "", "1.0", "0.0", "0.0", "double", "", "iterator", "1.0", "N/A", "N/A" },
    254 	{ "dmat2", "", "dmat2(1.0)", "dmat2(0.0)", "0.0", "double", "[0][0]", "dmat2(iterator)", "dmat2(1.0)", "N/A",
    255 	  "N/A" },
    256 	{ "dmat3", "", "dmat3(1.0)", "dmat3(0.0)", "0.0", "double", "[0][0]", "dmat3(iterator)", "dmat3(1.0)", "N/A",
    257 	  "N/A" },
    258 	{ "dmat4", "", "dmat4(1.0)", "dmat4(0.0)", "0.0", "double", "[0][0]", "dmat4(iterator)", "dmat4(1.0)", "N/A",
    259 	  "N/A" },
    260 	{ "dmat2x2", "", "dmat2x2(1.0)", "dmat2x2(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    261 	{ "dmat2x3", "", "dmat2x3(1.0)", "dmat2x3(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    262 	{ "dmat2x4", "", "dmat2x4(1.0)", "dmat2x4(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    263 	{ "dmat3x2", "", "dmat3x2(1.0)", "dmat3x2(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    264 	{ "dmat3x3", "", "dmat3x3(1.0)", "dmat3x3(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    265 	{ "dmat3x4", "", "dmat3x4(1.0)", "dmat3x4(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    266 	{ "dmat4x2", "", "dmat4x2(1.0)", "dmat4x2(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    267 	{ "dmat4x3", "", "dmat4x3(1.0)", "dmat4x3(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    268 	{ "dmat4x4", "", "dmat4x4(1.0)", "dmat4x4(0.0)", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" },
    269 };
    270 
    271 _supported_variable_types_map supported_variable_types_map;
    272 
    273 /** List of all supported variable types for es. */
    274 const test_var_type var_types_es[] = {
    275 	VAR_TYPE_BOOL,   VAR_TYPE_INT,	VAR_TYPE_UINT,   VAR_TYPE_FLOAT,  VAR_TYPE_VEC2,   VAR_TYPE_VEC3,
    276 	VAR_TYPE_VEC4,   VAR_TYPE_BVEC2,  VAR_TYPE_BVEC3,  VAR_TYPE_BVEC4,  VAR_TYPE_IVEC2,  VAR_TYPE_IVEC3,
    277 	VAR_TYPE_IVEC4,  VAR_TYPE_UVEC2,  VAR_TYPE_UVEC3,  VAR_TYPE_UVEC4,  VAR_TYPE_MAT2,   VAR_TYPE_MAT3,
    278 	VAR_TYPE_MAT4,   VAR_TYPE_MAT2X2, VAR_TYPE_MAT2X3, VAR_TYPE_MAT2X4, VAR_TYPE_MAT3X2, VAR_TYPE_MAT3X3,
    279 	VAR_TYPE_MAT3X4, VAR_TYPE_MAT4X2, VAR_TYPE_MAT4X3, VAR_TYPE_MAT4X4,
    280 };
    281 
    282 const test_var_type* Interface::ES::var_types   = var_types_es;
    283 const size_t		 Interface::ES::n_var_types = sizeof(var_types_es) / sizeof(var_types_es[0]);
    284 
    285 /** List of all supported variable types for gl. */
    286 static const glcts::test_var_type var_types_gl[] = {
    287 	VAR_TYPE_BOOL,	VAR_TYPE_INT,		VAR_TYPE_UINT,	VAR_TYPE_FLOAT,   VAR_TYPE_VEC2,	VAR_TYPE_VEC3,
    288 	VAR_TYPE_VEC4,	VAR_TYPE_BVEC2,   VAR_TYPE_BVEC3,   VAR_TYPE_BVEC4,   VAR_TYPE_IVEC2,   VAR_TYPE_IVEC3,
    289 	VAR_TYPE_IVEC4,   VAR_TYPE_UVEC2,   VAR_TYPE_UVEC3,   VAR_TYPE_UVEC4,   VAR_TYPE_MAT2,	VAR_TYPE_MAT3,
    290 	VAR_TYPE_MAT4,	VAR_TYPE_MAT2X2,  VAR_TYPE_MAT2X3,  VAR_TYPE_MAT2X4,  VAR_TYPE_MAT3X2,  VAR_TYPE_MAT3X3,
    291 	VAR_TYPE_MAT3X4,  VAR_TYPE_MAT4X2,  VAR_TYPE_MAT4X3,  VAR_TYPE_MAT4X4,  VAR_TYPE_DOUBLE,  VAR_TYPE_DMAT2,
    292 	VAR_TYPE_DMAT3,   VAR_TYPE_DMAT4,   VAR_TYPE_DMAT2X2, VAR_TYPE_DMAT2X3, VAR_TYPE_DMAT2X4, VAR_TYPE_DMAT3X2,
    293 	VAR_TYPE_DMAT3X3, VAR_TYPE_DMAT3X4, VAR_TYPE_DMAT4X2, VAR_TYPE_DMAT4X3, VAR_TYPE_DMAT4X4,
    294 };
    295 
    296 const test_var_type* Interface::GL::var_types   = var_types_gl;
    297 const size_t		 Interface::GL::n_var_types = sizeof(var_types_gl) / sizeof(var_types_gl[0]);
    298 
    299 /** List of all supported opaque types. */
    300 const glcts::test_var_type opaque_var_types[] = {
    301 	//Floating Point Sampler Types (opaque)
    302 	VAR_TYPE_SAMPLER2D, VAR_TYPE_SAMPLER3D, VAR_TYPE_SAMPLERCUBE, VAR_TYPE_SAMPLERCUBESHADOW, VAR_TYPE_SAMPLER2DSHADOW,
    303 	VAR_TYPE_SAMPLER2DARRAY, VAR_TYPE_SAMPLER2DARRAYSHADOW,
    304 	//Signed Integer Sampler Types (opaque)
    305 	VAR_TYPE_ISAMPLER2D, VAR_TYPE_ISAMPLER3D, VAR_TYPE_ISAMPLERCUBE, VAR_TYPE_ISAMPLER2DARRAY,
    306 	//Unsigned Integer Sampler Types (opaque)
    307 	VAR_TYPE_USAMPLER2D, VAR_TYPE_USAMPLER3D, VAR_TYPE_USAMPLERCUBE, VAR_TYPE_USAMPLER2DARRAY,
    308 };
    309 
    310 /** Sets up the type map that will be used to look up the type names, initialisation
    311  *  values, etc., associated with each of the types used within the array tests
    312  *
    313  **/
    314 template <class API>
    315 void initializeMap()
    316 {
    317 	int temp_index = 0;
    318 
    319 	// Set up the map
    320 	supported_variable_types_map[VAR_TYPE_BOOL]					= var_descriptors[temp_index++];
    321 	supported_variable_types_map[VAR_TYPE_INT]					= var_descriptors[temp_index++];
    322 	supported_variable_types_map[VAR_TYPE_UINT]					= var_descriptors[temp_index++];
    323 	supported_variable_types_map[VAR_TYPE_FLOAT]				= var_descriptors[temp_index++];
    324 	supported_variable_types_map[VAR_TYPE_VEC2]					= var_descriptors[temp_index++];
    325 	supported_variable_types_map[VAR_TYPE_VEC3]					= var_descriptors[temp_index++];
    326 	supported_variable_types_map[VAR_TYPE_VEC4]					= var_descriptors[temp_index++];
    327 	supported_variable_types_map[VAR_TYPE_BVEC2]				= var_descriptors[temp_index++];
    328 	supported_variable_types_map[VAR_TYPE_BVEC3]				= var_descriptors[temp_index++];
    329 	supported_variable_types_map[VAR_TYPE_BVEC4]				= var_descriptors[temp_index++];
    330 	supported_variable_types_map[VAR_TYPE_IVEC2]				= var_descriptors[temp_index++];
    331 	supported_variable_types_map[VAR_TYPE_IVEC3]				= var_descriptors[temp_index++];
    332 	supported_variable_types_map[VAR_TYPE_IVEC4]				= var_descriptors[temp_index++];
    333 	supported_variable_types_map[VAR_TYPE_UVEC2]				= var_descriptors[temp_index++];
    334 	supported_variable_types_map[VAR_TYPE_UVEC3]				= var_descriptors[temp_index++];
    335 	supported_variable_types_map[VAR_TYPE_UVEC4]				= var_descriptors[temp_index++];
    336 	supported_variable_types_map[VAR_TYPE_MAT2]					= var_descriptors[temp_index++];
    337 	supported_variable_types_map[VAR_TYPE_MAT3]					= var_descriptors[temp_index++];
    338 	supported_variable_types_map[VAR_TYPE_MAT4]					= var_descriptors[temp_index++];
    339 	supported_variable_types_map[VAR_TYPE_MAT2X2]				= var_descriptors[temp_index++];
    340 	supported_variable_types_map[VAR_TYPE_MAT2X3]				= var_descriptors[temp_index++];
    341 	supported_variable_types_map[VAR_TYPE_MAT2X4]				= var_descriptors[temp_index++];
    342 	supported_variable_types_map[VAR_TYPE_MAT3X2]				= var_descriptors[temp_index++];
    343 	supported_variable_types_map[VAR_TYPE_MAT3X3]				= var_descriptors[temp_index++];
    344 	supported_variable_types_map[VAR_TYPE_MAT3X4]				= var_descriptors[temp_index++];
    345 	supported_variable_types_map[VAR_TYPE_MAT4X2]				= var_descriptors[temp_index++];
    346 	supported_variable_types_map[VAR_TYPE_MAT4X3]				= var_descriptors[temp_index++];
    347 	supported_variable_types_map[VAR_TYPE_MAT4X4]				= var_descriptors[temp_index++];
    348 	supported_variable_types_map[VAR_TYPE_IMAGEBUFFER]			= var_descriptors[temp_index++];
    349 	supported_variable_types_map[VAR_TYPE_IIMAGEBUFFER]			= var_descriptors[temp_index++];
    350 	supported_variable_types_map[VAR_TYPE_UIMAGEBUFFER]			= var_descriptors[temp_index++];
    351 	supported_variable_types_map[VAR_TYPE_SAMPLERBUFFER]		= var_descriptors[temp_index++];
    352 	supported_variable_types_map[VAR_TYPE_ISAMPLERBUFFER]		= var_descriptors[temp_index++];
    353 	supported_variable_types_map[VAR_TYPE_USAMPLERBUFFER]		= var_descriptors[temp_index++];
    354 	supported_variable_types_map[VAR_TYPE_SAMPLER2D]			= var_descriptors[temp_index++];
    355 	supported_variable_types_map[VAR_TYPE_SAMPLER3D]			= var_descriptors[temp_index++];
    356 	supported_variable_types_map[VAR_TYPE_SAMPLERCUBE]			= var_descriptors[temp_index++];
    357 	supported_variable_types_map[VAR_TYPE_SAMPLERCUBESHADOW]	= var_descriptors[temp_index++];
    358 	supported_variable_types_map[VAR_TYPE_SAMPLER2DSHADOW]		= var_descriptors[temp_index++];
    359 	supported_variable_types_map[VAR_TYPE_SAMPLER2DARRAY]		= var_descriptors[temp_index++];
    360 	supported_variable_types_map[VAR_TYPE_SAMPLER2DARRAYSHADOW] = var_descriptors[temp_index++];
    361 	supported_variable_types_map[VAR_TYPE_ISAMPLER2D]			= var_descriptors[temp_index++];
    362 	supported_variable_types_map[VAR_TYPE_ISAMPLER3D]			= var_descriptors[temp_index++];
    363 	supported_variable_types_map[VAR_TYPE_ISAMPLERCUBE]			= var_descriptors[temp_index++];
    364 	supported_variable_types_map[VAR_TYPE_ISAMPLER2DARRAY]		= var_descriptors[temp_index++];
    365 	supported_variable_types_map[VAR_TYPE_USAMPLER2D]			= var_descriptors[temp_index++];
    366 	supported_variable_types_map[VAR_TYPE_USAMPLER3D]			= var_descriptors[temp_index++];
    367 	supported_variable_types_map[VAR_TYPE_USAMPLERCUBE]			= var_descriptors[temp_index++];
    368 	supported_variable_types_map[VAR_TYPE_USAMPLER2DARRAY]		= var_descriptors[temp_index++];
    369 
    370 	if (API::USE_DOUBLE)
    371 	{
    372 		temp_index = 0;
    373 
    374 		supported_variable_types_map[VAR_TYPE_DOUBLE]  = var_double_descriptors[temp_index++];
    375 		supported_variable_types_map[VAR_TYPE_DMAT2]   = var_double_descriptors[temp_index++];
    376 		supported_variable_types_map[VAR_TYPE_DMAT3]   = var_double_descriptors[temp_index++];
    377 		supported_variable_types_map[VAR_TYPE_DMAT4]   = var_double_descriptors[temp_index++];
    378 		supported_variable_types_map[VAR_TYPE_DMAT2X2] = var_double_descriptors[temp_index++];
    379 		supported_variable_types_map[VAR_TYPE_DMAT2X3] = var_double_descriptors[temp_index++];
    380 		supported_variable_types_map[VAR_TYPE_DMAT2X4] = var_double_descriptors[temp_index++];
    381 		supported_variable_types_map[VAR_TYPE_DMAT3X2] = var_double_descriptors[temp_index++];
    382 		supported_variable_types_map[VAR_TYPE_DMAT3X3] = var_double_descriptors[temp_index++];
    383 		supported_variable_types_map[VAR_TYPE_DMAT3X4] = var_double_descriptors[temp_index++];
    384 		supported_variable_types_map[VAR_TYPE_DMAT4X2] = var_double_descriptors[temp_index++];
    385 		supported_variable_types_map[VAR_TYPE_DMAT4X3] = var_double_descriptors[temp_index++];
    386 		supported_variable_types_map[VAR_TYPE_DMAT4X4] = var_double_descriptors[temp_index++];
    387 	}
    388 }
    389 
    390 /** Macro appends default ending of main function to source string
    391  *
    392  * @param SOURCE Tested shader source
    393  **/
    394 #define DEFAULT_MAIN_ENDING(TYPE, SOURCE)                           \
    395 	{                                                               \
    396 		/* Apply stage specific stuff */                            \
    397 		switch (TYPE)                                               \
    398 		{                                                           \
    399 		case TestCaseBase<API>::VERTEX_SHADER_TYPE:                 \
    400 			SOURCE += "\n	gl_Position = vec4(0.0);\n";            \
    401 			break;                                                  \
    402 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:               \
    403 			break;                                                  \
    404 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:                \
    405 			break;                                                  \
    406 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:               \
    407 			SOURCE += emit_quad;                                    \
    408 			break;                                                  \
    409 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:    \
    410 			SOURCE += set_tesseation;                               \
    411 			break;                                                  \
    412 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE: \
    413 			break;                                                  \
    414 		default:                                                    \
    415 			TCU_FAIL("Unrecognized shader type.");                  \
    416 			break;                                                  \
    417 		}                                                           \
    418                                                                     \
    419 		/* End main function */                                     \
    420 		SOURCE += shader_end;                                       \
    421 	}
    422 
    423 /** Macro executes positive test selected on USE_ALL_SHADER_STAGES
    424  *
    425  * @param TYPE	Tested shader stage
    426  * @param SOURCE Tested shader source
    427  * @param DELETE Selects if program should be deleted afterwards
    428  **/
    429 #define EXECUTE_POSITIVE_TEST(TYPE, SOURCE, DELETE, GPU5)                              \
    430 	{                                                                                  \
    431 		const std::string* cs  = &empty_string;                                        \
    432 		const std::string* vs  = &default_vertex_shader_source;                        \
    433 		const std::string* tcs = &default_tc_shader_source;                            \
    434 		const std::string* tes = &default_te_shader_source;                            \
    435 		const std::string* gs  = &default_geometry_shader_source;                      \
    436 		const std::string* fs  = &default_fragment_shader_source;                      \
    437                                                                                        \
    438 		switch (TYPE)                                                                  \
    439 		{                                                                              \
    440 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:                                   \
    441 			cs  = &SOURCE;                                                             \
    442 			vs  = &empty_string;                                                       \
    443 			tcs = &empty_string;                                                       \
    444 			tes = &empty_string;                                                       \
    445 			gs  = &empty_string;                                                       \
    446 			fs  = &empty_string;                                                       \
    447 			break;                                                                     \
    448 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:                                  \
    449 			fs = &SOURCE;                                                              \
    450 			break;                                                                     \
    451 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:                                  \
    452 			gs = &SOURCE;                                                              \
    453 			break;                                                                     \
    454 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:                       \
    455 			tcs = &SOURCE;                                                             \
    456 			break;                                                                     \
    457 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:                    \
    458 			tes = &SOURCE;                                                             \
    459 			break;                                                                     \
    460 		case TestCaseBase<API>::VERTEX_SHADER_TYPE:                                    \
    461 			vs = &SOURCE;                                                              \
    462 			break;                                                                     \
    463 		default:                                                                       \
    464 			TCU_FAIL("Invalid enum");                                                  \
    465 			break;                                                                     \
    466 		};                                                                             \
    467                                                                                        \
    468 		if (API::USE_ALL_SHADER_STAGES)                                                \
    469 		{                                                                              \
    470 			this->execute_positive_test(*vs, *tcs, *tes, *gs, *fs, *cs, DELETE, GPU5); \
    471 		}                                                                              \
    472 		else                                                                           \
    473 		{                                                                              \
    474 			this->execute_positive_test(*vs, *fs, DELETE, GPU5);                       \
    475 		}                                                                              \
    476 	}
    477 
    478 /** Macro executes either positive or negative test
    479  *
    480  * @param S		Selects negative test when 0, positive test otherwise
    481  * @param TYPE	Tested shader stage
    482  * @param SOURCE Tested shader source
    483  **/
    484 #define EXECUTE_SHADER_TEST(S, TYPE, SOURCE)              \
    485 	if (S)                                                \
    486 	{                                                     \
    487 		EXECUTE_POSITIVE_TEST(TYPE, SOURCE, true, false); \
    488 	}                                                     \
    489 	else                                                  \
    490 	{                                                     \
    491 		this->execute_negative_test(TYPE, SOURCE);        \
    492 	}
    493 
    494 /** Test case constructor.
    495  *
    496  * @tparam API        Tested API descriptor
    497  *
    498  * @param context     EGL context ID.
    499  * @param name        Name of a test case.
    500  * @param description Test case description.
    501  **/
    502 template <class API>
    503 TestCaseBase<API>::TestCaseBase(Context& context, const char* name, const char* description)
    504 	: tcu::TestCase(context.getTestContext(), name, description)
    505 	, context_id(context)
    506 	, program_object_id(0)
    507 	, compute_shader_object_id(0)
    508 	, fragment_shader_object_id(0)
    509 	, geometry_shader_object_id(0)
    510 	, tess_ctrl_shader_object_id(0)
    511 	, tess_eval_shader_object_id(0)
    512 	, vertex_shader_object_id(0)
    513 {
    514 	/* Left blank on purpose */
    515 }
    516 
    517 /** Clears up the shaders and program that were created during the tests
    518  *
    519  * @tparam API Tested API descriptor
    520  */
    521 template <class API>
    522 void TestCaseBase<API>::delete_objects(void)
    523 {
    524 	const glw::Functions& gl = context_id.getRenderContext().getFunctions();
    525 
    526 	/* Release all ES objects that may have been created by iterate() */
    527 	if (program_object_id != 0)
    528 	{
    529 		gl.deleteProgram(program_object_id);
    530 		program_object_id = 0;
    531 	}
    532 
    533 	/* Use default program object to be sure the objects were released. */
    534 	gl.useProgram(0);
    535 }
    536 
    537 /** Releases all OpenGL ES objects that were created for test case purposes.
    538  *
    539  * @tparam API Tested API descriptor
    540  */
    541 template <class API>
    542 void TestCaseBase<API>::deinit(void)
    543 {
    544 	this->delete_objects();
    545 }
    546 
    547 /** Runs the actual test for each shader type.
    548  *
    549  * @tparam API               Tested API descriptor
    550  *
    551  *  @return QP_TEST_RESULT_FAIL - test has failed;
    552  *          QP_TEST_RESULT_PASS - test has succeeded;
    553  **/
    554 template <class API>
    555 tcu::TestNode::IterateResult TestCaseBase<API>::iterate(void)
    556 {
    557 	test_shader_compilation(TestCaseBase<API>::VERTEX_SHADER_TYPE);
    558 	test_shader_compilation(TestCaseBase<API>::FRAGMENT_SHADER_TYPE);
    559 
    560 	if (API::USE_ALL_SHADER_STAGES)
    561 	{
    562 		test_shader_compilation(TestCaseBase<API>::COMPUTE_SHADER_TYPE);
    563 		test_shader_compilation(TestCaseBase<API>::GEOMETRY_SHADER_TYPE);
    564 		test_shader_compilation(TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE);
    565 		test_shader_compilation(TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE);
    566 	}
    567 
    568 	return STOP;
    569 }
    570 
    571 /** Generates a shader object of the specified type,
    572  *  attaches the specified shader source,
    573  *  compiles it, and returns the compilation result.
    574  *
    575  * @tparam API               Tested API descriptor
    576  *
    577  * @param shader_source      The source for the shader object.
    578  * @param tested_shader_type The type of shader being compiled (vertex or fragment).
    579  *
    580  * @return Compilation result (GL_TRUE if the shader compilation succeeded, GL_FALSE otherwise).
    581  **/
    582 template <class API>
    583 glw::GLint TestCaseBase<API>::compile_shader_and_get_compilation_result(const std::string& tested_snippet,
    584 																		TestShaderType	 tested_shader_type,
    585 																		bool			   require_gpu_shader5)
    586 {
    587 	static const char* preamble_cs = "\n"
    588 									 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
    589 									 "\n";
    590 
    591 	static const char* preamble_gs = "\n"
    592 									 "layout(points)                           in;\n"
    593 									 "layout(triangle_strip, max_vertices = 4) out;\n"
    594 									 "\n";
    595 
    596 	static const char* preamble_tcs = "\n"
    597 									  "layout(vertices = 1) out;\n"
    598 									  "\n";
    599 
    600 	static const char* preamble_tes = "\n"
    601 									  "layout(isolines, point_mode) in;\n"
    602 									  "\n";
    603 
    604 	glw::GLint			  compile_status   = GL_TRUE;
    605 	const glw::Functions& gl			   = context_id.getRenderContext().getFunctions();
    606 	glw::GLint			  shader_object_id = 0;
    607 
    608 	std::string shader_source;
    609 
    610 	if (true == tested_snippet.empty())
    611 	{
    612 		return compile_status;
    613 	}
    614 
    615 	if (require_gpu_shader5)
    616 	{
    617 		// Add the version number here, rather than in each individual test
    618 		shader_source = API::shader_version_gpu5;
    619 	}
    620 	else
    621 	{
    622 		// Add the version number here, rather than in each individual test
    623 		shader_source = API::shader_version;
    624 	}
    625 
    626 	/* Apply stage specific stuff */
    627 	switch (tested_shader_type)
    628 	{
    629 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
    630 		break;
    631 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
    632 		break;
    633 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
    634 		shader_source += preamble_cs;
    635 		break;
    636 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
    637 		shader_source += preamble_gs;
    638 		break;
    639 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
    640 		shader_source += preamble_tcs;
    641 		break;
    642 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
    643 		shader_source += preamble_tes;
    644 		break;
    645 	default:
    646 		TCU_FAIL("Unrecognized shader type.");
    647 		break;
    648 	}
    649 
    650 	shader_source += tested_snippet;
    651 
    652 	/* Prepare shader object */
    653 	switch (tested_shader_type)
    654 	{
    655 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
    656 	{
    657 		shader_object_id = gl.createShader(GL_VERTEX_SHADER);
    658 		assert(0 == vertex_shader_object_id);
    659 		vertex_shader_object_id = shader_object_id;
    660 
    661 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a vertex shader.");
    662 
    663 		break;
    664 	} /* case TestCaseBase<API>::VERTEX_SHADER_TYPE: */
    665 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
    666 	{
    667 		shader_object_id = gl.createShader(GL_FRAGMENT_SHADER);
    668 		assert(0 == fragment_shader_object_id);
    669 		fragment_shader_object_id = shader_object_id;
    670 
    671 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a fragment shader.");
    672 
    673 		break;
    674 	} /* case TestCaseBase<API>::FRAGMENT_SHADER_TYPE: */
    675 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
    676 	{
    677 		shader_object_id = gl.createShader(GL_COMPUTE_SHADER);
    678 		assert(0 == compute_shader_object_id);
    679 		compute_shader_object_id = shader_object_id;
    680 
    681 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a compute shader.");
    682 
    683 		break;
    684 	} /* case TestCaseBase<API>::COMPUTE_SHADER_TYPE: */
    685 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
    686 	{
    687 		shader_object_id = gl.createShader(GL_GEOMETRY_SHADER);
    688 		assert(0 == geometry_shader_object_id);
    689 		geometry_shader_object_id = shader_object_id;
    690 
    691 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a geometry shader.");
    692 
    693 		break;
    694 	} /* case TestCaseBase<API>::GEOMETRY_SHADER_TYPE: */
    695 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
    696 	{
    697 		shader_object_id = gl.createShader(GL_TESS_CONTROL_SHADER);
    698 		assert(0 == tess_ctrl_shader_object_id);
    699 		tess_ctrl_shader_object_id = shader_object_id;
    700 
    701 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a tesselation control shader.");
    702 
    703 		break;
    704 	} /* case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: */
    705 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
    706 	{
    707 		shader_object_id = gl.createShader(GL_TESS_EVALUATION_SHADER);
    708 		assert(0 == tess_eval_shader_object_id);
    709 		tess_eval_shader_object_id = shader_object_id;
    710 
    711 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a tesselation evaluation shader.");
    712 
    713 		break;
    714 	} /* case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE: */
    715 	default:
    716 	{
    717 		TCU_FAIL("Unrecognized shader type.");
    718 
    719 		break;
    720 	} /* default: */
    721 	} /* switch (tested_shader_type) */
    722 
    723 	/* Assign source code to the objects */
    724 	const char* code_ptr = shader_source.c_str();
    725 
    726 #if IS_DEBUG_DUMP_ALL_SHADERS
    727 	context_id.getTestContext().getLog() << tcu::TestLog::Message << "Compiling: " << tcu::TestLog::EndMessage;
    728 	context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(code_ptr);
    729 #endif /* IS_DEBUG_DUMP_ALL_SHADERS */
    730 
    731 	gl.shaderSource(shader_object_id, 1 /* count */, &code_ptr, NULL);
    732 	GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() failed");
    733 
    734 	/* Compile the shader */
    735 	gl.compileShader(shader_object_id);
    736 	GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader() failed");
    737 
    738 	/* Get the compilation result. */
    739 	gl.getShaderiv(shader_object_id, GL_COMPILE_STATUS, &compile_status);
    740 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() failed");
    741 
    742 #if IS_DEBUG
    743 	if (GL_TRUE != compile_status)
    744 	{
    745 		glw::GLint  length = 0;
    746 		std::string message;
    747 
    748 		/* Error log length */
    749 		gl.getShaderiv(shader_object_id, GL_INFO_LOG_LENGTH, &length);
    750 		GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderiv");
    751 
    752 		/* Prepare storage */
    753 		message.resize(length, 0);
    754 
    755 		/* Get error log */
    756 		gl.getShaderInfoLog(shader_object_id, length, 0, &message[0]);
    757 		GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderInfoLog");
    758 
    759 		context_id.getTestContext().getLog() << tcu::TestLog::Message << "Error message: " << &message[0]
    760 											 << tcu::TestLog::EndMessage;
    761 
    762 #if IS_DEBUG_DUMP_ALL_SHADERS
    763 #else  /* IS_DEBUG_DUMP_ALL_SHADERS */
    764 		context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(code_ptr);
    765 #endif /* IS_DEBUG_DUMP_ALL_SHADERS */
    766 	}
    767 #endif /* IS_DEBUG */
    768 
    769 	return compile_status;
    770 }
    771 
    772 /** Runs the negative test.
    773  *  The shader sources are considered as invalid,
    774  *  and the compilation of a shader object with the specified
    775  *  shader source is expected to fail.
    776  *
    777  * @tparam API               Tested API descriptor
    778  *
    779  * @param tested_shader_type The type of shader object (can be fragment or vertex).
    780  * @param shader_source      The source for the shader object to be used for this test.
    781  *
    782  *  @return QP_TEST_RESULT_FAIL - test has failed;
    783  *          QP_TEST_RESULT_PASS - test has succeeded;
    784  **/
    785 template <class API>
    786 tcu::TestNode::IterateResult TestCaseBase<API>::execute_negative_test(
    787 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& shader_source)
    788 {
    789 	glw::GLint			  compile_status = GL_FALSE;
    790 	const char*			  error_message  = 0;
    791 	const glw::Functions& gl			 = context_id.getRenderContext().getFunctions();
    792 	bool				  test_result	= true;
    793 
    794 	/* Try to generate and compile the shader object. */
    795 	switch (tested_shader_type)
    796 	{
    797 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
    798 		error_message =
    799 			"The fragment shader was expected to fail to compile, but the compilation process was successful.";
    800 		break;
    801 
    802 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
    803 		error_message =
    804 			"The vertex shader was expected to fail to compile, but the compilation process was successful.";
    805 
    806 		break;
    807 
    808 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
    809 		error_message =
    810 			"The compute shader was expected to fail to compile, but the compilation process was successful.";
    811 		break;
    812 
    813 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
    814 		error_message =
    815 			"The geometry shader was expected to fail to compile, but the compilation process was successful.";
    816 		break;
    817 
    818 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
    819 		error_message = "The tesselation control shader was expected to fail to compile, but the compilation process "
    820 						"was successful.";
    821 		break;
    822 
    823 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
    824 		error_message = "The tesselation evaluation shader was expected to fail to compile, but the compilation "
    825 						"process was successful.";
    826 		break;
    827 
    828 	default:
    829 		TCU_FAIL("Unrecognized shader type.");
    830 		test_result = false;
    831 
    832 		break;
    833 	} /* switch (shader_type) */
    834 
    835 	compile_status = compile_shader_and_get_compilation_result(shader_source, tested_shader_type);
    836 
    837 	if (compile_status == GL_TRUE)
    838 	{
    839 		TCU_FAIL(error_message);
    840 
    841 		test_result = false;
    842 	}
    843 
    844 	/* Deallocate any resources used. */
    845 	this->delete_objects();
    846 	if (0 != compute_shader_object_id)
    847 	{
    848 		gl.deleteShader(compute_shader_object_id);
    849 		compute_shader_object_id = 0;
    850 	}
    851 	if (0 != fragment_shader_object_id)
    852 	{
    853 		gl.deleteShader(fragment_shader_object_id);
    854 		fragment_shader_object_id = 0;
    855 	}
    856 	if (0 != geometry_shader_object_id)
    857 	{
    858 		gl.deleteShader(geometry_shader_object_id);
    859 		geometry_shader_object_id = 0;
    860 	}
    861 	if (0 != tess_ctrl_shader_object_id)
    862 	{
    863 		gl.deleteShader(tess_ctrl_shader_object_id);
    864 		tess_ctrl_shader_object_id = 0;
    865 	}
    866 	if (0 != tess_eval_shader_object_id)
    867 	{
    868 		gl.deleteShader(tess_eval_shader_object_id);
    869 		tess_eval_shader_object_id = 0;
    870 	}
    871 	if (0 != vertex_shader_object_id)
    872 	{
    873 		gl.deleteShader(vertex_shader_object_id);
    874 		vertex_shader_object_id = 0;
    875 	}
    876 
    877 	/* Return test pass if true. */
    878 	if (true == test_result)
    879 	{
    880 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    881 	}
    882 
    883 	return CONTINUE;
    884 }
    885 
    886 /** Runs the positive test.
    887  *  The shader sources are considered as valid,
    888  *  and the compilation and program linking are expected to succeed.
    889  *
    890  * @tparam API                     Tested API descriptor
    891  *
    892  * @param vertex_shader_source     The source for the vertex shader to be used for this test.
    893  * @param fragment_shader_source   The source for the fragment shader to be used for this test.
    894  * @param delete_generated_objects If true, the compiled shader objects will be deleted before returning.
    895  *
    896  *  @return QP_TEST_RESULT_FAIL - test has failed;
    897  *          QP_TEST_RESULT_PASS - test has succeeded;
    898  **/
    899 template <class API>
    900 tcu::TestNode::IterateResult TestCaseBase<API>::execute_positive_test(const std::string& vertex_shader_source,
    901 																	  const std::string& fragment_shader_source,
    902 																	  bool				 delete_generated_objects,
    903 																	  bool				 require_gpu_shader5)
    904 {
    905 	glw::GLint			  compile_status = GL_TRUE;
    906 	const glw::Functions& gl			 = context_id.getRenderContext().getFunctions();
    907 	glw::GLint			  link_status	= GL_TRUE;
    908 	bool				  test_result	= true;
    909 
    910 	/* Compile, and check the compilation result for the fragment shader object. */
    911 	compile_status = compile_shader_and_get_compilation_result(
    912 		fragment_shader_source, TestCaseBase<API>::FRAGMENT_SHADER_TYPE, require_gpu_shader5);
    913 
    914 	if (compile_status == GL_FALSE)
    915 	{
    916 		TCU_FAIL("The fragment shader was expected to compile successfully, but failed to compile.");
    917 
    918 		test_result = false;
    919 	}
    920 
    921 	/* Compile, and check the compilation result for the vertex shader object. */
    922 	compile_status = compile_shader_and_get_compilation_result(
    923 		vertex_shader_source, TestCaseBase<API>::VERTEX_SHADER_TYPE, require_gpu_shader5);
    924 
    925 	if (compile_status == GL_FALSE)
    926 	{
    927 		TCU_FAIL("The vertex shader was expected to compile successfully, but failed to compile.");
    928 
    929 		test_result = false;
    930 	}
    931 
    932 	if (true == test_result)
    933 	{
    934 		/* Create program object. */
    935 		assert(0 == program_object_id);
    936 		program_object_id = gl.createProgram();
    937 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a program object.");
    938 
    939 		/* Configure the program object */
    940 		gl.attachShader(program_object_id, fragment_shader_object_id);
    941 		gl.attachShader(program_object_id, vertex_shader_object_id);
    942 		GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader() failed.");
    943 
    944 		gl.deleteShader(fragment_shader_object_id);
    945 		gl.deleteShader(vertex_shader_object_id);
    946 		fragment_shader_object_id = 0;
    947 		vertex_shader_object_id   = 0;
    948 
    949 		/* Link the program object */
    950 		gl.linkProgram(program_object_id);
    951 		GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() failed.");
    952 
    953 		/* Make sure the linking operation succeeded. */
    954 		gl.getProgramiv(program_object_id, GL_LINK_STATUS, &link_status);
    955 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() failed.");
    956 
    957 		if (link_status != GL_TRUE)
    958 		{
    959 #if IS_DEBUG
    960 			glw::GLint  length = 0;
    961 			std::string message;
    962 
    963 			/* Get error log length */
    964 			gl.getProgramiv(program_object_id, GL_INFO_LOG_LENGTH, &length);
    965 			GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv");
    966 
    967 			message.resize(length, 0);
    968 
    969 			/* Get error log */
    970 			gl.getProgramInfoLog(program_object_id, length, 0, &message[0]);
    971 			GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramInfoLog");
    972 
    973 			context_id.getTestContext().getLog() << tcu::TestLog::Message << "Error message: " << &message[0]
    974 												 << tcu::TestLog::EndMessage;
    975 
    976 #if IS_DEBUG_DUMP_ALL_SHADERS
    977 #else  /* IS_DEBUG_DUMP_ALL_SHADERS */
    978 			context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(vertex_shader_source);
    979 			context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(fragment_shader_source);
    980 #endif /* IS_DEBUG_DUMP_ALL_SHADERS */
    981 #endif /* IS_DEBUG */
    982 
    983 			TCU_FAIL("Linking was expected to succeed, but the process was unsuccessful.");
    984 
    985 			test_result = false;
    986 		}
    987 	}
    988 
    989 	if (delete_generated_objects)
    990 	{
    991 		/* Deallocate any resources used. */
    992 		this->delete_objects();
    993 	}
    994 
    995 	/* Return test pass if true. */
    996 	if (true == test_result)
    997 	{
    998 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    999 	}
   1000 
   1001 	return CONTINUE;
   1002 }
   1003 
   1004 /** Runs the positive test.
   1005  *  The shader sources are considered as valid,
   1006  *  and the compilation and program linking are expected to succeed.
   1007  *
   1008  * @tparam API                     Tested API descriptor
   1009  *
   1010  * @param vertex_shader_source     The source for the vertex shader to be used for this test.
   1011  * @param tess_ctrl_shader_source  The source for the vertex shader to be used for this test.
   1012  * @param tess_eval_shader_source  The source for the vertex shader to be used for this test.
   1013  * @param geometry_shader_source   The source for the vertex shader to be used for this test.
   1014  * @param fragment_shader_source   The source for the vertex shader to be used for this test.
   1015  * @param compute_shader_source    The source for the fragment shader to be used for this test.
   1016  * @param delete_generated_objects If true, the compiled shader objects will be deleted before returning.
   1017  *
   1018  *  @return QP_TEST_RESULT_FAIL - test has failed;
   1019  *          QP_TEST_RESULT_PASS - test has succeeded;
   1020  **/
   1021 template <class API>
   1022 tcu::TestNode::IterateResult TestCaseBase<API>::execute_positive_test(
   1023 	const std::string& vertex_shader_source, const std::string& tess_ctrl_shader_source,
   1024 	const std::string& tess_eval_shader_source, const std::string& geometry_shader_source,
   1025 	const std::string& fragment_shader_source, const std::string& compute_shader_source, bool delete_generated_objects,
   1026 	bool require_gpu_shader5)
   1027 {
   1028 	glw::GLint			  compile_status = GL_TRUE;
   1029 	const glw::Functions& gl			 = context_id.getRenderContext().getFunctions();
   1030 	glw::GLint			  link_status	= GL_TRUE;
   1031 	bool				  test_compute   = !compute_shader_source.empty();
   1032 	bool				  test_result	= true;
   1033 
   1034 	if (false == test_compute)
   1035 	{
   1036 		/* Compile, and check the compilation result for the fragment shader object. */
   1037 		compile_status = compile_shader_and_get_compilation_result(
   1038 			fragment_shader_source, TestCaseBase<API>::FRAGMENT_SHADER_TYPE, require_gpu_shader5);
   1039 
   1040 		if (compile_status == GL_FALSE)
   1041 		{
   1042 			TCU_FAIL("The fragment shader was expected to compile successfully, but failed to compile.");
   1043 
   1044 			test_result = false;
   1045 		}
   1046 
   1047 		/* Compile, and check the compilation result for the geometry shader object. */
   1048 		compile_status = compile_shader_and_get_compilation_result(
   1049 			geometry_shader_source, TestCaseBase<API>::GEOMETRY_SHADER_TYPE, require_gpu_shader5);
   1050 
   1051 		if (compile_status == GL_FALSE)
   1052 		{
   1053 			TCU_FAIL("The geometry shader was expected to compile successfully, but failed to compile.");
   1054 
   1055 			test_result = false;
   1056 		}
   1057 
   1058 		/* Compile, and check the compilation result for the te shader object. */
   1059 		compile_status = compile_shader_and_get_compilation_result(
   1060 			tess_eval_shader_source, TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE, require_gpu_shader5);
   1061 
   1062 		if (compile_status == GL_FALSE)
   1063 		{
   1064 			TCU_FAIL("The tesselation evaluation shader was expected to compile successfully, but failed to compile.");
   1065 
   1066 			test_result = false;
   1067 		}
   1068 
   1069 		/* Compile, and check the compilation result for the tc shader object. */
   1070 		compile_status = compile_shader_and_get_compilation_result(
   1071 			tess_ctrl_shader_source, TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE, require_gpu_shader5);
   1072 
   1073 		if (compile_status == GL_FALSE)
   1074 		{
   1075 			TCU_FAIL("The tesselation control shader was expected to compile successfully, but failed to compile.");
   1076 
   1077 			test_result = false;
   1078 		}
   1079 
   1080 		/* Compile, and check the compilation result for the vertex shader object. */
   1081 		compile_status = compile_shader_and_get_compilation_result(
   1082 			vertex_shader_source, TestCaseBase<API>::VERTEX_SHADER_TYPE, require_gpu_shader5);
   1083 
   1084 		if (compile_status == GL_FALSE)
   1085 		{
   1086 			TCU_FAIL("The vertex shader was expected to compile successfully, but failed to compile.");
   1087 
   1088 			test_result = false;
   1089 		}
   1090 	}
   1091 	else
   1092 	{
   1093 		/* Compile, and check the compilation result for the compute shader object. */
   1094 		compile_status = compile_shader_and_get_compilation_result(
   1095 			compute_shader_source, TestCaseBase<API>::COMPUTE_SHADER_TYPE, require_gpu_shader5);
   1096 
   1097 		if (compile_status == GL_FALSE)
   1098 		{
   1099 			TCU_FAIL("The compute shader was expected to compile successfully, but failed to compile.");
   1100 
   1101 			test_result = false;
   1102 		}
   1103 	}
   1104 
   1105 	if (true == test_result)
   1106 	{
   1107 		/* Create program object. */
   1108 		program_object_id = gl.createProgram();
   1109 		GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create a program object.");
   1110 
   1111 		/* Configure the program object */
   1112 		if (false == test_compute)
   1113 		{
   1114 			gl.attachShader(program_object_id, fragment_shader_object_id);
   1115 
   1116 			if (geometry_shader_object_id)
   1117 			{
   1118 				gl.attachShader(program_object_id, geometry_shader_object_id);
   1119 			}
   1120 
   1121 			if (tess_ctrl_shader_object_id)
   1122 			{
   1123 				gl.attachShader(program_object_id, tess_ctrl_shader_object_id);
   1124 			}
   1125 
   1126 			if (tess_eval_shader_object_id)
   1127 			{
   1128 				gl.attachShader(program_object_id, tess_eval_shader_object_id);
   1129 			}
   1130 
   1131 			gl.attachShader(program_object_id, vertex_shader_object_id);
   1132 		}
   1133 		else
   1134 		{
   1135 			gl.attachShader(program_object_id, compute_shader_object_id);
   1136 		}
   1137 		GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader() failed.");
   1138 
   1139 		if (false == test_compute)
   1140 		{
   1141 			gl.deleteShader(fragment_shader_object_id);
   1142 
   1143 			if (geometry_shader_object_id)
   1144 			{
   1145 				gl.deleteShader(geometry_shader_object_id);
   1146 			}
   1147 
   1148 			if (tess_ctrl_shader_object_id)
   1149 			{
   1150 				gl.deleteShader(tess_ctrl_shader_object_id);
   1151 			}
   1152 
   1153 			if (tess_eval_shader_object_id)
   1154 			{
   1155 				gl.deleteShader(tess_eval_shader_object_id);
   1156 			}
   1157 
   1158 			gl.deleteShader(vertex_shader_object_id);
   1159 		}
   1160 		else
   1161 		{
   1162 			gl.deleteShader(compute_shader_object_id);
   1163 		}
   1164 
   1165 		fragment_shader_object_id  = 0;
   1166 		vertex_shader_object_id	= 0;
   1167 		geometry_shader_object_id  = 0;
   1168 		tess_ctrl_shader_object_id = 0;
   1169 		tess_eval_shader_object_id = 0;
   1170 		compute_shader_object_id   = 0;
   1171 
   1172 		/* Link the program object */
   1173 		gl.linkProgram(program_object_id);
   1174 		GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() failed.");
   1175 
   1176 		/* Make sure the linking operation succeeded. */
   1177 		gl.getProgramiv(program_object_id, GL_LINK_STATUS, &link_status);
   1178 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() failed.");
   1179 
   1180 		if (link_status != GL_TRUE)
   1181 		{
   1182 #if IS_DEBUG
   1183 			glw::GLint  length = 0;
   1184 			std::string message;
   1185 
   1186 			/* Get error log length */
   1187 			gl.getProgramiv(program_object_id, GL_INFO_LOG_LENGTH, &length);
   1188 			GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv");
   1189 
   1190 			message.resize(length, 0);
   1191 
   1192 			/* Get error log */
   1193 			gl.getProgramInfoLog(program_object_id, length, 0, &message[0]);
   1194 			GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramInfoLog");
   1195 
   1196 			context_id.getTestContext().getLog() << tcu::TestLog::Message << "Error message: " << &message[0]
   1197 												 << tcu::TestLog::EndMessage;
   1198 
   1199 #if IS_DEBUG_DUMP_ALL_SHADERS
   1200 			if (false == test_compute)
   1201 			{
   1202 				context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(vertex_shader_source);
   1203 				context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(tess_ctrl_shader_source);
   1204 				context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(tess_eval_shader_source);
   1205 				context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(geometry_shader_source);
   1206 				context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(fragment_shader_source);
   1207 			}
   1208 			else
   1209 			{
   1210 				context_id.getTestContext().getLog() << tcu::TestLog::KernelSource(compute_shader_source);
   1211 			}
   1212 #endif /* IS_DEBUG_DUMP_ALL_SHADERS */
   1213 #endif /* IS_DEBUG */
   1214 
   1215 			TCU_FAIL("Linking was expected to succeed, but the process was unsuccessful.");
   1216 
   1217 			test_result = false;
   1218 		}
   1219 	}
   1220 
   1221 	if (delete_generated_objects)
   1222 	{
   1223 		/* Deallocate any resources used. */
   1224 		this->delete_objects();
   1225 	}
   1226 
   1227 	/* Return test pass if true. */
   1228 	if (true == test_result)
   1229 	{
   1230 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1231 	}
   1232 
   1233 	return CONTINUE;
   1234 }
   1235 
   1236 /** Adds the specified @param sub_script onto the base_string @param number_of_elements times.
   1237  *  E.g. extend_string("a", [2], 3) would give a[2][2][2].
   1238  *
   1239  * @tparam API               Tested API descriptor
   1240  *
   1241  * @param base_string        The base string that is to be added to.
   1242  * @param sub_string         The string to be repeatedly added
   1243  * @param number_of_elements The number of repetitions.
   1244  *
   1245  *  @return The extended string.
   1246  **/
   1247 template <class API>
   1248 std::string TestCaseBase<API>::extend_string(std::string base_string, std::string sub_string, size_t number_of_elements)
   1249 {
   1250 	std::string temp_string = base_string;
   1251 
   1252 	for (size_t sub_script_index = 0; sub_script_index < number_of_elements; sub_script_index++)
   1253 	{
   1254 		temp_string += sub_string;
   1255 	}
   1256 
   1257 	return temp_string;
   1258 }
   1259 
   1260 /* Generates the shader source code for the SizedDeclarationsPrimitive
   1261  * array tests, and attempts to compile each test shader, for both
   1262  * vertex and fragment shaders.
   1263  *
   1264  * @tparam API               Tested API descriptor
   1265  *
   1266  * @param tested_shader_type The type of shader that is being tested
   1267  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1268  *
   1269  **/
   1270 template <class API>
   1271 void SizedDeclarationsPrimitive<API>::test_shader_compilation(
   1272 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1273 {
   1274 	for (size_t var_type_index = 0; var_type_index < API::n_var_types; var_type_index++)
   1275 	{
   1276 		_supported_variable_types_map_const_iterator var_iterator =
   1277 			supported_variable_types_map.find(API::var_types[var_type_index]);
   1278 
   1279 		if (var_iterator != supported_variable_types_map.end())
   1280 		{
   1281 			/* Loop round for each var_types ("int", "uint", "float", etc.)
   1282 			 * We are testing a[][] to a [][][][][][][][], so start counter at 2. */
   1283 			for (size_t max_dimension_limit = 2; max_dimension_limit <= API::MAX_ARRAY_DIMENSIONS;
   1284 				 max_dimension_limit++)
   1285 			{
   1286 				// Record the base varTypeModifier + varType
   1287 				std::string base_var_type		 = var_iterator->second.type;
   1288 				std::string base_variable_string = base_var_type;
   1289 
   1290 				for (size_t base_sub_script_index = 0; base_sub_script_index <= max_dimension_limit;
   1291 					 base_sub_script_index++)
   1292 				{
   1293 					std::string shader_source = "";
   1294 
   1295 					// Add the shader body start, and the base varTypeModifier + varType + variable name.
   1296 					shader_source += shader_start + "    " + base_variable_string + " a";
   1297 
   1298 					for (size_t remaining_sub_script_index = base_sub_script_index;
   1299 						 remaining_sub_script_index < max_dimension_limit; remaining_sub_script_index++)
   1300 					{
   1301 						/* Add as many array sub_scripts as we can, up to the current dimension limit. */
   1302 						shader_source += "[2]";
   1303 					}
   1304 
   1305 					/* End line */
   1306 					shader_source += ";\n";
   1307 
   1308 					/* End main */
   1309 					DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1310 
   1311 					/* Execute test */
   1312 					EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1313 
   1314 					/* From now on, we'll have an extra sub_script each time. */
   1315 					base_variable_string += "[2]";
   1316 				} /* for (int base_sub_script_index = 0; ...) */
   1317 			}	 /* for (int max_dimension_limit = 2; ...) */
   1318 		}		  /* if var_type iterator found */
   1319 		else
   1320 		{
   1321 			TCU_FAIL("Type not found.");
   1322 		}
   1323 	} /* for (int var_type_index = 0; ...) */
   1324 }
   1325 
   1326 /* Generates the shader source code for the SizedDeclarationsStructTypes1
   1327  * array tests, and attempts to compile each test shader, for both
   1328  * vertex and fragment shaders.
   1329  *
   1330  * @tparam API               Tested API descriptor
   1331  *
   1332  * @param tested_shader_type The type of shader that is being tested
   1333  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1334  */
   1335 template <class API>
   1336 void SizedDeclarationsStructTypes1<API>::test_shader_compilation(
   1337 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1338 {
   1339 	std::string example_struct("struct light {\n"
   1340 							   "    float intensity;\n"
   1341 							   "    int   position;\n"
   1342 							   "};\n\n");
   1343 	std::string shader_source;
   1344 
   1345 	for (size_t max_dimension_index = 1; max_dimension_index < API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1346 	{
   1347 		shader_source = example_struct;
   1348 		shader_source += shader_start;
   1349 		shader_source += "    light[2]";
   1350 
   1351 		for (size_t temp_dimension_index = 0; temp_dimension_index < max_dimension_index; temp_dimension_index++)
   1352 		{
   1353 			shader_source += "[2]";
   1354 		}
   1355 
   1356 		shader_source += " x;\n";
   1357 
   1358 		/* End main */
   1359 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1360 
   1361 		/* Execute test */
   1362 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1363 
   1364 	} /* for (int max_dimension_index = 1; ...) */
   1365 }
   1366 
   1367 /* Generates the shader source code for the SizedDeclarationsStructTypes2
   1368  * array tests, and attempts to compile each test shader, for both
   1369  * vertex and fragment shaders.
   1370  *
   1371  * @tparam API               Tested API descriptor
   1372  *
   1373  * @param tested_shader_type The type of shader that is being tested
   1374  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1375  */
   1376 template <class API>
   1377 void SizedDeclarationsStructTypes2<API>::test_shader_compilation(
   1378 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1379 {
   1380 	std::string structure_declaration = "struct MyStructure {\n"
   1381 										"   float a[2], "
   1382 										"b[2][2], "
   1383 										"c[2][2][2], "
   1384 										"d[2][2][2][2], "
   1385 										"e[2][2][2][2][2], "
   1386 										"f[2][2][2][2][2][2], "
   1387 										"g[2][2][2][2][2][2][2], "
   1388 										"h[2][2][2][2][2][2][2][2];\n"
   1389 										"} myStructureObject;\n\n";
   1390 	std::string shader_source = structure_declaration;
   1391 
   1392 	shader_source += shader_start;
   1393 
   1394 	/* End main */
   1395 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1396 
   1397 	/* Execute test */
   1398 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1399 }
   1400 
   1401 /* Generates the shader source code for the SizedDeclarationsStructTypes3
   1402  * array tests, and attempts to compile each test shader, for both
   1403  * vertex and fragment shaders.
   1404  *
   1405  * @tparam API               Tested API descriptor
   1406  *
   1407  * @param tested_shader_type The type of shader that is being tested
   1408  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1409  */
   1410 template <class API>
   1411 void SizedDeclarationsStructTypes3<API>::test_shader_compilation(
   1412 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1413 {
   1414 	std::string example_struct("struct light {\n"
   1415 							   "    float[2] intensity;\n"
   1416 							   "    int[2] position;\n"
   1417 							   "};\n");
   1418 	std::string shader_source;
   1419 
   1420 	for (size_t max_dimension_index = 1; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1421 	{
   1422 		shader_source = example_struct;
   1423 		shader_source += shader_start;
   1424 		shader_source += this->extend_string("    light my_light_object", "[2]", max_dimension_index);
   1425 		shader_source += ";\n";
   1426 
   1427 		/* End main */
   1428 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1429 
   1430 		/* Execute test */
   1431 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1432 	} /* for (int max_dimension_index = 1; ...) */
   1433 }
   1434 
   1435 /* Generates the shader source code for the SizedDeclarationsStructTypes4
   1436  * array tests, and attempts to compile each test shader, for both
   1437  * vertex and fragment shaders.
   1438  *
   1439  * @tparam API               Tested API descriptor
   1440  *
   1441  * @param tested_shader_type The type of shader that is being tested
   1442  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1443  */
   1444 template <class API>
   1445 void SizedDeclarationsStructTypes4<API>::test_shader_compilation(
   1446 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1447 {
   1448 	std::string example_struct("struct light {\n"
   1449 							   "    float[2] intensity;\n"
   1450 							   "    int[2] position;\n"
   1451 							   "} lightVar[2]");
   1452 	std::string shader_source;
   1453 
   1454 	for (size_t max_dimension_index = 1; max_dimension_index < API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1455 	{
   1456 		shader_source = example_struct;
   1457 
   1458 		for (size_t temp_dimension_index = 0; temp_dimension_index < max_dimension_index; temp_dimension_index++)
   1459 		{
   1460 			shader_source += "[2]";
   1461 		}
   1462 		shader_source += ";\n\n";
   1463 		shader_source += shader_start;
   1464 
   1465 		/* End main */
   1466 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1467 
   1468 		/* Execute test */
   1469 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1470 	} /* for (int max_dimension_index = 1; ...) */
   1471 }
   1472 
   1473 /* Generates the shader source code for the SizedDeclarationsTypenameStyle1
   1474  * array tests, and attempts to compile each test shader, for both
   1475  * vertex and fragment shaders.
   1476  *
   1477  * @tparam API               Tested API descriptor
   1478  *
   1479  * @param tested_shader_type The type of shader that is being tested
   1480  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1481  */
   1482 template <class API>
   1483 void SizedDeclarationsTypenameStyle1<API>::test_shader_compilation(
   1484 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1485 {
   1486 	for (size_t max_dimension_index = 1; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1487 	{
   1488 		std::string shader_source = shader_start;
   1489 
   1490 		shader_source += this->extend_string("    float", "[2]", max_dimension_index);
   1491 		shader_source += this->extend_string(" x", "[2]", API::MAX_ARRAY_DIMENSIONS - max_dimension_index);
   1492 		shader_source += ";\n";
   1493 
   1494 		/* End main */
   1495 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1496 
   1497 		/* Execute test */
   1498 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1499 	} /* for (int max_dimension_index = 1; ...) */
   1500 }
   1501 
   1502 /* Generates the shader source code for the SizedDeclarationsTypenameStyle2
   1503  * array tests, and attempts to compile each test shader, for both
   1504  * vertex and fragment shaders.
   1505  *
   1506  * @tparam API               Tested API descriptor
   1507  *
   1508  * @param tested_shader_type The type of shader that is being tested
   1509  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1510  */
   1511 template <class API>
   1512 void SizedDeclarationsTypenameStyle2<API>::test_shader_compilation(
   1513 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1514 {
   1515 	std::string shader_source = shader_start;
   1516 
   1517 	shader_source += this->extend_string("    float", "[2]", 2);
   1518 	shader_source += this->extend_string(" a", "[2]", 0);
   1519 	shader_source += ", ";
   1520 	shader_source += this->extend_string("b", "[2]", 1);
   1521 	shader_source += ", ";
   1522 	shader_source += this->extend_string("c", "[2]", 2);
   1523 	shader_source += ", ";
   1524 	shader_source += this->extend_string("d", "[2]", 3);
   1525 	shader_source += ", ";
   1526 	shader_source += this->extend_string("e", "[2]", 4);
   1527 	shader_source += ", ";
   1528 	shader_source += this->extend_string("f", "[2]", 5);
   1529 	shader_source += ", ";
   1530 	shader_source += this->extend_string("g", "[2]", 6);
   1531 	shader_source += ";\n";
   1532 
   1533 	/* End main */
   1534 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1535 
   1536 	/* Execute test */
   1537 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1538 }
   1539 
   1540 /* Generates the shader source code for the SizedDeclarationsTypenameStyle3
   1541  * array tests, and attempts to compile each test shader, for both
   1542  * vertex and fragment shaders.
   1543  *
   1544  * @tparam API               Tested API descriptor
   1545  *
   1546  * @param tested_shader_type The type of shader that is being tested
   1547  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1548  */
   1549 template <class API>
   1550 void SizedDeclarationsTypenameStyle3<API>::test_shader_compilation(
   1551 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1552 {
   1553 	std::string shader_source = "struct{\n" + this->extend_string("    float", "[2]", 2);
   1554 
   1555 	shader_source += this->extend_string(" a", "[2]", API::MAX_ARRAY_DIMENSIONS - API::MAX_ARRAY_DIMENSIONS);
   1556 	shader_source += ",";
   1557 	shader_source += this->extend_string("    b", "[2]", 1);
   1558 	shader_source += ",";
   1559 	shader_source += this->extend_string("    c", "[2]", 2);
   1560 	shader_source += ",";
   1561 	shader_source += this->extend_string("    d", "[2]", 3);
   1562 	shader_source += ",";
   1563 	shader_source += this->extend_string("    e", "[2]", 4);
   1564 	shader_source += ",";
   1565 	shader_source += this->extend_string("    f", "[2]", 5);
   1566 	shader_source += ",";
   1567 	shader_source += this->extend_string("    g", "[2]", 6);
   1568 	shader_source += ";\n} x;\n\n";
   1569 	shader_source += shader_start;
   1570 
   1571 	/* End main */
   1572 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1573 
   1574 	/* Execute test */
   1575 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1576 }
   1577 
   1578 /* Generates the shader source code for the SizedDeclarationsTypenameStyle4
   1579  * array tests, and attempts to compile each test shader, for both
   1580  * vertex and fragment shaders.
   1581  *
   1582  * @tparam API               Tested API descriptor
   1583  *
   1584  * @param tested_shader_type The type of shader that is being tested
   1585  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1586  */
   1587 template <class API>
   1588 void SizedDeclarationsTypenameStyle4<API>::test_shader_compilation(
   1589 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1590 {
   1591 	std::string example_struct_begin("struct light {\n");
   1592 	std::string example_struct_end("};\n\n");
   1593 
   1594 	for (size_t max_dimension_index = 1; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1595 	{
   1596 		std::string shader_source = example_struct_begin;
   1597 
   1598 		shader_source += this->extend_string("    float", "[2]", max_dimension_index);
   1599 		shader_source += this->extend_string(" x", "[2]", API::MAX_ARRAY_DIMENSIONS - max_dimension_index);
   1600 		shader_source += ";\n";
   1601 		shader_source += example_struct_end;
   1602 		shader_source += shader_start;
   1603 
   1604 		/* End main */
   1605 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1606 
   1607 		/* Execute test */
   1608 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1609 	} /* for (int max_dimension_index = 1; ...) */
   1610 }
   1611 
   1612 /* Generates the shader source code for the SizedDeclarationsTypenameStyle5
   1613  * array tests, and attempts to compile each test shader, for both
   1614  * vertex and fragment shaders.
   1615  *
   1616  * @tparam API               Tested API descriptor
   1617  *
   1618  * @param tested_shader_type The type of shader that is being tested
   1619  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1620  */
   1621 template <class API>
   1622 void SizedDeclarationsTypenameStyle5<API>::test_shader_compilation(
   1623 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1624 {
   1625 	std::string example_struct_begin("struct light {\n");
   1626 	std::string example_struct_end("};\n\n");
   1627 
   1628 	std::string shader_source = example_struct_begin;
   1629 
   1630 	shader_source += this->extend_string("    float", "[2]", 2);
   1631 	shader_source += this->extend_string(" a", "[2]", API::MAX_ARRAY_DIMENSIONS - API::MAX_ARRAY_DIMENSIONS);
   1632 	shader_source += ", ";
   1633 	shader_source += this->extend_string("b", "[2]", 2);
   1634 	shader_source += ", ";
   1635 	shader_source += this->extend_string("c", "[2]", 3);
   1636 	shader_source += ", ";
   1637 	shader_source += this->extend_string("d", "[2]", 4);
   1638 	shader_source += ", ";
   1639 	shader_source += this->extend_string("e", "[2]", 5);
   1640 	shader_source += ", ";
   1641 	shader_source += this->extend_string("f", "[2]", 6);
   1642 	shader_source += ";\n";
   1643 	shader_source += example_struct_end;
   1644 	shader_source += shader_start;
   1645 
   1646 	/* End main */
   1647 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1648 
   1649 	/* Execute test */
   1650 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1651 }
   1652 
   1653 /* Generates the shader source code for the SizedDeclarationsFunctionParams
   1654  * array tests, and attempts to compile each test shader, for both
   1655  * vertex and fragment shaders.
   1656  *
   1657  * @tparam API               Tested API descriptor
   1658  *
   1659  * @param tested_shader_type The type of shader that is being tested
   1660  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1661  */
   1662 template <class API>
   1663 void SizedDeclarationsFunctionParams<API>::test_shader_compilation(
   1664 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1665 {
   1666 	size_t		dimension_index = 0;
   1667 	std::string example_struct1("\nvoid my_function(");
   1668 	std::string example_struct2(")\n"
   1669 								"{\n"
   1670 								"}\n\n");
   1671 	std::string base_variable_string;
   1672 	std::string variable_basenames[API::MAX_ARRAY_DIMENSIONS] = { "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8" };
   1673 	std::string full_variable_names[API::MAX_ARRAY_DIMENSIONS];
   1674 
   1675 	for (size_t max_dimension_index = 0; max_dimension_index < API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1676 	{
   1677 		full_variable_names[max_dimension_index] =
   1678 			this->extend_string(variable_basenames[max_dimension_index], "[2]", max_dimension_index + 1);
   1679 	}
   1680 
   1681 	for (size_t max_dimension_index = 0; max_dimension_index < API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1682 	{
   1683 		base_variable_string += "float ";
   1684 		base_variable_string += full_variable_names[max_dimension_index];
   1685 		base_variable_string += ";\n";
   1686 	}
   1687 
   1688 	base_variable_string += example_struct1;
   1689 	base_variable_string += this->extend_string("float a", "[2]", 1);
   1690 	base_variable_string += ", ";
   1691 	base_variable_string += this->extend_string("float b", "[2]", 2);
   1692 	base_variable_string += ", ";
   1693 	base_variable_string += this->extend_string("float c", "[2]", 3);
   1694 	base_variable_string += ", ";
   1695 	base_variable_string += this->extend_string("float d", "[2]", 4);
   1696 	base_variable_string += ", ";
   1697 	base_variable_string += this->extend_string("float e", "[2]", 5);
   1698 	base_variable_string += ", ";
   1699 	base_variable_string += this->extend_string("float f", "[2]", 6);
   1700 	base_variable_string += ", ";
   1701 	base_variable_string += this->extend_string("float g", "[2]", 7);
   1702 	base_variable_string += ", ";
   1703 	base_variable_string += this->extend_string("float h", "[2]", 8);
   1704 	base_variable_string += example_struct2;
   1705 
   1706 	std::string shader_source = base_variable_string;
   1707 
   1708 	shader_source += shader_start;
   1709 	shader_source += "    my_function(";
   1710 
   1711 	for (dimension_index = 0; dimension_index < API::MAX_ARRAY_DIMENSIONS - 1; dimension_index++)
   1712 	{
   1713 		shader_source += variable_basenames[dimension_index];
   1714 		shader_source += ", ";
   1715 	}
   1716 
   1717 	shader_source += variable_basenames[dimension_index];
   1718 	shader_source += ");\n";
   1719 
   1720 	/* End main */
   1721 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1722 
   1723 	/* Execute test */
   1724 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   1725 
   1726 	/* Only the previous case should succeed, so start from index 1 rather than 0.
   1727 	 * The other cases should fail, so only compile them, rather than trying to also link them.
   1728 	 * We'll swap items 2/3, then 2/4, then 2/5, then 2/6, ...
   1729 	 * Then we'll swap items 3/4, then 3/5, ...
   1730 	 * Repeat, starting for 4/5-8, 5/6-8, 6/7-8...
   1731 	 * Finally, we'll swap items 7/8
   1732 	 */
   1733 	for (size_t swap_item = 1; swap_item < API::MAX_ARRAY_DIMENSIONS; swap_item++)
   1734 	{
   1735 		for (size_t max_dimension_index = swap_item + 1; max_dimension_index < API::MAX_ARRAY_DIMENSIONS;
   1736 			 max_dimension_index++)
   1737 		{
   1738 			std::string temp = variable_basenames[swap_item];
   1739 
   1740 			shader_source							= base_variable_string;
   1741 			variable_basenames[swap_item]			= variable_basenames[max_dimension_index];
   1742 			variable_basenames[max_dimension_index] = temp;
   1743 
   1744 			shader_source += shader_start;
   1745 			shader_source += "    my_function(";
   1746 
   1747 			for (dimension_index = 0; dimension_index < API::MAX_ARRAY_DIMENSIONS - 1; dimension_index++)
   1748 			{
   1749 				shader_source += variable_basenames[dimension_index];
   1750 				shader_source += ", ";
   1751 			}
   1752 
   1753 			shader_source += variable_basenames[dimension_index];
   1754 			shader_source += ");\n";
   1755 
   1756 			temp									= variable_basenames[swap_item];
   1757 			variable_basenames[swap_item]			= variable_basenames[max_dimension_index];
   1758 			variable_basenames[max_dimension_index] = temp;
   1759 
   1760 			/* End main */
   1761 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1762 
   1763 			/* Execute test */
   1764 			this->execute_negative_test(tested_shader_type, shader_source);
   1765 		} /* for (int max_dimension_index = swap_item + 1; ...) */
   1766 	}	 /* for (int swap_item = 1; ...) */
   1767 }
   1768 
   1769 /* Generates the shader source code for the sized_declarations_invalid_sizes1
   1770  * array tests, and attempts to compile each test shader, for both
   1771  * vertex and fragment shaders.
   1772  *
   1773  * @tparam API               Tested API descriptor
   1774  *
   1775  * @param tested_shader_type The type of shader that is being tested
   1776  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1777  */
   1778 template <class API>
   1779 void sized_declarations_invalid_sizes1<API>::test_shader_compilation(
   1780 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1781 {
   1782 	std::string invalid_declarations[] = {
   1783 		"float x[2][2][2][0];\n", "float x[2][2][0][2];\n", "float x[2][0][2][2];\n", "float x[0][2][2][2];\n",
   1784 		"float x[2][2][0][0];\n", "float x[2][0][2][0];\n", "float x[0][2][2][0];\n", "float x[2][0][0][2];\n",
   1785 		"float x[0][2][0][2];\n", "float x[0][0][2][2];\n", "float x[2][0][0][0];\n", "float x[0][2][0][0];\n",
   1786 		"float x[0][0][2][0];\n", "float x[0][0][0][2];\n", "float x[0][0][0][0];\n"
   1787 	};
   1788 
   1789 	for (size_t invalid_declarations_index = 0;
   1790 		 invalid_declarations_index < sizeof(invalid_declarations) / sizeof(invalid_declarations);
   1791 		 invalid_declarations_index++)
   1792 	{
   1793 		std::string shader_source;
   1794 
   1795 		shader_source = shader_start;
   1796 		shader_source += invalid_declarations[invalid_declarations_index];
   1797 
   1798 		/* End main */
   1799 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1800 
   1801 		/* Execute test */
   1802 		this->execute_negative_test(tested_shader_type, shader_source);
   1803 	} /* for (int invalid_declarations_index = 0; ...) */
   1804 }
   1805 
   1806 /* Generates the shader source code for the sized_declarations_invalid_sizes2
   1807  * array tests, and attempts to compile each test shader, for both
   1808  * vertex and fragment shaders.
   1809  *
   1810  * @tparam API               Tested API descriptor
   1811  *
   1812  * @param tested_shader_type The type of shader that is being tested
   1813  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1814  */
   1815 template <class API>
   1816 void sized_declarations_invalid_sizes2<API>::test_shader_compilation(
   1817 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1818 {
   1819 	std::string invalid_declarations[] = {
   1820 		"    float x[2][2][2][-1];\n",   "    float x[2][2][-1][2];\n",   "    float x[2][-1][2][2];\n",
   1821 		"    float x[-1][2][2][2];\n",   "    float x[2][2][-1][-1];\n",  "    float x[2][-1][2][-1];\n",
   1822 		"    float x[-1][2][2][-1];\n",  "    float x[2][-1][-1][2];\n",  "    float x[-1][2][-1][2];\n",
   1823 		"    float x[-1][-1][2][2];\n",  "    float x[2][-1][-1][-1];\n", "    float x[-1][2][-1][-1];\n",
   1824 		"    float x[-1][-1][2][-1];\n", "    float x[-1][-1][-1][2];\n", "    float x[-1][-1][-1][-1];\n"
   1825 	};
   1826 
   1827 	for (size_t invalid_declarations_index = 0;
   1828 		 invalid_declarations_index < sizeof(invalid_declarations) / sizeof(invalid_declarations);
   1829 		 invalid_declarations_index++)
   1830 	{
   1831 		std::string shader_source;
   1832 
   1833 		shader_source = shader_start;
   1834 		shader_source += invalid_declarations[invalid_declarations_index];
   1835 
   1836 		/* End main */
   1837 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1838 
   1839 		/* Execute test */
   1840 		this->execute_negative_test(tested_shader_type, shader_source);
   1841 	} /* for (int invalid_declarations_index = 0; ...) */
   1842 }
   1843 
   1844 /* Generates the shader source code for the sized_declarations_invalid_sizes3
   1845  * array tests, and attempts to compile each test shader, for both
   1846  * vertex and fragment shaders.
   1847  *
   1848  * @tparam API               Tested API descriptor
   1849  *
   1850  * @param tested_shader_type The type of shader that is being tested
   1851  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1852  */
   1853 template <class API>
   1854 void sized_declarations_invalid_sizes3<API>::test_shader_compilation(
   1855 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1856 {
   1857 	std::string invalid_declarations[] = {
   1858 		"    float x[2][2][2][a];\n", "    float x[2][2][a][2];\n", "    float x[2][a][2][2];\n",
   1859 		"    float x[a][2][2][2];\n", "    float x[2][2][a][a];\n", "    float x[2][a][2][a];\n",
   1860 		"    float x[a][2][2][a];\n", "    float x[2][a][a][2];\n", "    float x[a][2][a][2];\n",
   1861 		"    float x[a][a][2][2];\n", "    float x[2][a][a][a];\n", "    float x[a][2][a][a];\n",
   1862 		"    float x[a][a][2][a];\n", "    float x[a][a][a][2];\n", "    float x[a][a][a][a];\n"
   1863 	};
   1864 	std::string non_constant_variable_declaration = "    uint a = 2u;\n";
   1865 
   1866 	for (size_t invalid_declarations_index = 0;
   1867 		 invalid_declarations_index < sizeof(invalid_declarations) / sizeof(invalid_declarations);
   1868 		 invalid_declarations_index++)
   1869 	{
   1870 		std::string shader_source;
   1871 
   1872 		shader_source = shader_start;
   1873 		shader_source += non_constant_variable_declaration;
   1874 		shader_source += invalid_declarations[invalid_declarations_index];
   1875 
   1876 		/* End main */
   1877 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1878 
   1879 		/* Execute test */
   1880 		this->execute_negative_test(tested_shader_type, shader_source);
   1881 	} /* for (int invalid_declarations_index = 0; ...) */
   1882 }
   1883 
   1884 /* Generates the shader source code for the sized_declarations_invalid_sizes4
   1885  * array tests, and attempts to compile each test shader, for both
   1886  * vertex and fragment shaders.
   1887  *
   1888  * @tparam API               Tested API descriptor
   1889  *
   1890  * @param tested_shader_type The type of shader that is being tested
   1891  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1892  */
   1893 template <class API>
   1894 void sized_declarations_invalid_sizes4<API>::test_shader_compilation(
   1895 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1896 {
   1897 	std::string input[] = { "    float x[2,2][2][2];\n", "    float x[2][2,2][2];\n", "    float x[2][2][2,2];\n",
   1898 							"    float x[2,2,2][2];\n",  "    float x[2][2,2,2];\n",  "    float x[2,2,2,2];\n" };
   1899 
   1900 	for (size_t string_index = 0; string_index < sizeof(input) / sizeof(input[0]); string_index++)
   1901 	{
   1902 		std::string shader_source;
   1903 
   1904 		shader_source += shader_start;
   1905 		shader_source += input[string_index];
   1906 
   1907 		/* End main */
   1908 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1909 
   1910 		/* Execute test */
   1911 		this->execute_negative_test(tested_shader_type, shader_source);
   1912 	} /* for (int string_index = 0; ...) */
   1913 }
   1914 
   1915 /* Constructs a suitable constructor for the specified number of dimensions.
   1916  *
   1917  * @tparam API            Tested API descriptor
   1918  *
   1919  * @param var_type        The type of the variable
   1920  * @param dimension_index The current recursion level (counts down)
   1921  * @param init_string     The initialisation string
   1922  */
   1923 template <class API>
   1924 std::string ConstructorsAndUnsizedDeclConstructors1<API>::recursively_initialise(std::string var_type,
   1925 																				 size_t		 dimension_index,
   1926 																				 std::string init_string)
   1927 {
   1928 	std::string temp_string;
   1929 
   1930 	if (dimension_index == 0)
   1931 	{
   1932 		temp_string = init_string;
   1933 	}
   1934 	else
   1935 	{
   1936 		std::string prefix = "\n";
   1937 
   1938 		for (size_t indent_index = dimension_index; indent_index < (API::MAX_ARRAY_DIMENSIONS + 1); indent_index++)
   1939 		{
   1940 			prefix += "    ";
   1941 		}
   1942 
   1943 		prefix += this->extend_string(var_type, "[]", dimension_index);
   1944 		prefix += "(";
   1945 		for (int sub_script_index = 0; sub_script_index < 2; sub_script_index++)
   1946 		{
   1947 			temp_string += prefix;
   1948 			temp_string += recursively_initialise(var_type, dimension_index - 1, init_string);
   1949 			prefix = ", ";
   1950 			if (sub_script_index == 1)
   1951 			{
   1952 				break;
   1953 			}
   1954 		}
   1955 		temp_string += ")";
   1956 	}
   1957 
   1958 	return temp_string;
   1959 }
   1960 
   1961 /* Generates the shader source code for the ConstructorsAndUnsizedDeclConstructors1
   1962  * array tests, and attempts to compile each test shader, for both
   1963  * vertex and fragment shaders.
   1964  *
   1965  * @tparam API               Tested API descriptor
   1966  *
   1967  * @param tested_shader_type The type of shader that is being tested
   1968  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   1969  */
   1970 template <class API>
   1971 void ConstructorsAndUnsizedDeclConstructors1<API>::test_shader_compilation(
   1972 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   1973 {
   1974 	//vec4 color = vec4(0.0, 1.0, 0.0, 1.0);
   1975 	int num_var_types = API::n_var_types;
   1976 
   1977 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   1978 	{
   1979 		_supported_variable_types_map_const_iterator var_iterator =
   1980 			supported_variable_types_map.find(API::var_types[var_type_index]);
   1981 
   1982 		if (var_iterator != supported_variable_types_map.end())
   1983 		{
   1984 			for (size_t max_dimension_index = 2; max_dimension_index < API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   1985 			{
   1986 				std::string base_variable_string =
   1987 					this->extend_string("    " + var_iterator->second.type + " a", "[]", max_dimension_index);
   1988 
   1989 				base_variable_string += " = ";
   1990 				base_variable_string += recursively_initialise(var_iterator->second.type, max_dimension_index,
   1991 															   var_iterator->second.initializer_with_ones);
   1992 				base_variable_string += ";\n\n";
   1993 
   1994 				std::string shader_source = shader_start + base_variable_string;
   1995 
   1996 				/* End main */
   1997 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   1998 
   1999 				/* Execute test */
   2000 				EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2001 			} /* for (int max_dimension_index = 1; ...) */
   2002 		}	 /* if var_type iterator found */
   2003 		else
   2004 		{
   2005 			TCU_FAIL("Type not found.");
   2006 		}
   2007 	} /* for (int var_type_index = 0; ...) */
   2008 
   2009 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   2010 	{
   2011 		_supported_variable_types_map_const_iterator var_iterator =
   2012 			supported_variable_types_map.find(API::var_types[var_type_index]);
   2013 
   2014 		if (var_iterator != supported_variable_types_map.end())
   2015 		{
   2016 			std::string base_structure = "struct my_structure\n";
   2017 
   2018 			base_structure += "{\n";
   2019 			base_structure += "    " + var_iterator->second.type + " b;\n";
   2020 			base_structure += "    " + var_iterator->second.type + " c;\n";
   2021 			base_structure += "};\n\n";
   2022 
   2023 			for (size_t max_dimension_index = 1; max_dimension_index < API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   2024 			{
   2025 				std::string outer_separator = "(";
   2026 				std::string base_variable_string;
   2027 
   2028 				base_variable_string +=
   2029 					this->extend_string("    " + var_iterator->second.type + " a", "[2]", max_dimension_index);
   2030 				base_variable_string += " = ";
   2031 				base_variable_string += recursively_initialise(var_iterator->second.type, max_dimension_index,
   2032 															   var_iterator->second.initializer_with_ones);
   2033 				base_variable_string += ";\n\n";
   2034 
   2035 				std::string shader_source = base_structure + shader_start + base_variable_string;
   2036 
   2037 				/* End main */
   2038 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2039 
   2040 				/* Execute test */
   2041 				EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2042 			} /* for (int max_dimension_index = 1; ...) */
   2043 		}	 /* if var_type iterator found */
   2044 		else
   2045 		{
   2046 			TCU_FAIL("Type not found.");
   2047 		}
   2048 	} /* for (int var_type_index = 0; ...) */
   2049 }
   2050 
   2051 /* Generates the shader source code for the ConstructorsAndUnsizedDeclConstructors2
   2052  * array tests, and attempts to compile each test shader, for both
   2053  * vertex and fragment shaders.
   2054  *
   2055  * @tparam API               Tested API descriptor
   2056  *
   2057  * @param tested_shader_type The type of shader that is being tested
   2058  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2059  */
   2060 template <class API>
   2061 void ConstructorsAndUnsizedDeclConstructors2<API>::test_shader_compilation(
   2062 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2063 {
   2064 	std::string base_variable_string = "    float[2][2] x = float[2][2](float[4](1.0, 2.0, 3.0, 4.0));\n";
   2065 	std::string shader_source		 = shader_start + base_variable_string;
   2066 
   2067 	/* End main */
   2068 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2069 
   2070 	/* Execute test */
   2071 	this->execute_negative_test(tested_shader_type, shader_source);
   2072 
   2073 	base_variable_string = "float[2][2] x = float[2][2](float[1][4](float[4](1.0, 2.0, 3.0, 4.0)));\n\n";
   2074 	shader_source		 = base_variable_string + shader_start;
   2075 
   2076 	/* End main */
   2077 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2078 
   2079 	/* Execute test */
   2080 	this->execute_negative_test(tested_shader_type, shader_source);
   2081 }
   2082 
   2083 /* Generates the shader source code for the ConstructorsAndUnsizedDeclUnsizedConstructors
   2084  * array tests, and attempts to compile each test shader, for both
   2085  * vertex and fragment shaders.
   2086  *
   2087  * @tparam API               Tested API descriptor
   2088  *
   2089  * @param tested_shader_type The type of shader that is being tested
   2090  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2091  */
   2092 template <class API>
   2093 void ConstructorsAndUnsizedDeclUnsizedConstructors<API>::test_shader_compilation(
   2094 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2095 {
   2096 	std::string shader_variable_declarations = "= float[2][1][2][1](\n"
   2097 											   "        float[1][2][1](\n"
   2098 											   "            float[2][1]( \n"
   2099 											   "                float[1](12.3), float[1](54.2) \n"
   2100 											   "            )\n"
   2101 											   "        ),\n"
   2102 											   "        float[1][2][1](\n"
   2103 											   "            float[2][1]( \n"
   2104 											   "                float[1]( 3.2), float[1]( 7.4) \n"
   2105 											   "            )\n"
   2106 											   "        )\n"
   2107 											   "    );\n\n";
   2108 
   2109 	std::string input[] = { "float a[2][1][2][]", "float a[2][1][][1]", "float a[2][1][][]", "float a[2][][2][1]",
   2110 							"float a[2][][2][]",  "float a[2][][][1]",  "float a[2][][][]",  "float a[][1][2][1]",
   2111 							"float a[][1][2][]",  "float a[][1][][1]",  "float a[][1][][]",  "float a[][][2][1]",
   2112 							"float a[][][2][]",   "float a[][][][1]",   "float a[][][][]" };
   2113 
   2114 	for (size_t string_index = 0; string_index < sizeof(input) / sizeof(input[0]); string_index++)
   2115 	{
   2116 		std::string shader_source = shader_start + "    " + input[string_index] + shader_variable_declarations;
   2117 
   2118 		/* End main */
   2119 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2120 
   2121 		/* Execute test */
   2122 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2123 	} /* for (int string_index = 0; ...) */
   2124 }
   2125 
   2126 /* Generates the shader source code for the ConstructorsAndUnsizedDeclConst
   2127  * array tests, and attempts to compile each test shader, for both
   2128  * vertex and fragment shaders.
   2129  *
   2130  * @tparam API               Tested API descriptor
   2131  *
   2132  * @param tested_shader_type The type of shader that is being tested
   2133  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2134  */
   2135 template <class API>
   2136 void ConstructorsAndUnsizedDeclConst<API>::test_shader_compilation(
   2137 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2138 {
   2139 	std::string shader_source = "const float[2][2] x = float[2][2](float[2](1.0, 2.0), float[2](3.0, 4.0));\n\n";
   2140 	shader_source += shader_start;
   2141 
   2142 	/* End main */
   2143 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2144 
   2145 	/* Execute test */
   2146 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2147 }
   2148 
   2149 /* Generates the shader source code for the ConstructorsAndUnsizedDeclInvalidConstructors1
   2150  * array tests, and attempts to compile each test shader, for both
   2151  * vertex and fragment shaders.
   2152  *
   2153  * @tparam API               Tested API descriptor
   2154  *
   2155  * @param tested_shader_type The type of shader that is being tested
   2156  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2157  */
   2158 template <class API>
   2159 void ConstructorsAndUnsizedDeclInvalidConstructors1<API>::test_shader_compilation(
   2160 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2161 {
   2162 	int num_var_types = sizeof(opaque_var_types) / sizeof(opaque_var_types[0]);
   2163 
   2164 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   2165 	{
   2166 		_supported_variable_types_map_const_iterator var_iterator =
   2167 			supported_variable_types_map.find(opaque_var_types[var_type_index]);
   2168 
   2169 		if (var_iterator != supported_variable_types_map.end())
   2170 		{
   2171 			std::string base_variable_string =
   2172 				"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " my_sampler1;\n" +
   2173 				"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " my_sampler2;\n" +
   2174 				"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " my_sampler3;\n" +
   2175 				"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " my_sampler4;\n\n";
   2176 
   2177 			std::string shader_source = base_variable_string + shader_start;
   2178 			shader_source += "    const " + var_iterator->second.type + "[2][2] x = " + var_iterator->second.type +
   2179 							 "[2][2](" + var_iterator->second.type + "[2](my_sampler1, my_sampler2), " +
   2180 							 var_iterator->second.type + "[2](my_sampler3, my_sampler4));\n\n";
   2181 
   2182 			/* End main */
   2183 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2184 
   2185 			/* Execute test */
   2186 			this->execute_negative_test(tested_shader_type, shader_source);
   2187 		} /* if var_type iterator found */
   2188 		else
   2189 		{
   2190 			TCU_FAIL("Type not found.");
   2191 		}
   2192 	} /* for (int var_type_index = 0; ...) */
   2193 }
   2194 
   2195 /* Generates the shader source code for the ConstructorsAndUnsizedDeclInvalidConstructors2
   2196  * array tests, and attempts to compile each test shader, for both
   2197  * vertex and fragment shaders.
   2198  *
   2199  * @tparam API               Tested API descriptor
   2200  *
   2201  * @param tested_shader_type The type of shader that is being tested
   2202  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2203  */
   2204 template <class API>
   2205 void ConstructorsAndUnsizedDeclInvalidConstructors2<API>::test_shader_compilation(
   2206 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2207 {
   2208 	std::string invalid_initializers[] = { "    int x[2][2][0]; \n", "    int x[2][0][2]; \n", "    int x[0][2][2]; \n",
   2209 										   "    int x[2][0][0]; \n", "    int x[0][2][0]; \n", "    int x[0][0][2]; \n",
   2210 										   "    int x[0][0][0]; \n" };
   2211 
   2212 	for (size_t invalid_initializers_index = 0;
   2213 		 invalid_initializers_index < sizeof(invalid_initializers) / sizeof(invalid_initializers[0]);
   2214 		 invalid_initializers_index++)
   2215 	{
   2216 		std::string shader_source;
   2217 
   2218 		shader_source = shader_start;
   2219 		shader_source += invalid_initializers[invalid_initializers_index];
   2220 
   2221 		/* End main */
   2222 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2223 
   2224 		/* Execute test */
   2225 		this->execute_negative_test(tested_shader_type, shader_source);
   2226 	} /* for (int invalid_initializers_index = 0; ...) */
   2227 }
   2228 
   2229 /* Generates the shader source code for the ConstructorsAndUnsizedDeclInvalidConstructors3
   2230  * array tests, and attempts to compile each test shader, for both
   2231  * vertex and fragment shaders.
   2232  *
   2233  * @tparam API               Tested API descriptor
   2234  *
   2235  * @param tested_shader_type The type of shader that is being tested
   2236  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2237  */
   2238 template <class API>
   2239 void ConstructorsAndUnsizedDeclInvalidConstructors3<API>::test_shader_compilation(
   2240 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2241 {
   2242 	std::string invalid_initializers[] = { "    int x[2][2][-1]; \n",  "    int x[2][-1][2]; \n",
   2243 										   "    int x[-1][2][2]; \n",  "    int x[2][-1][-1]; \n",
   2244 										   "    int x[-1][2][-1]; \n", "    int x[-1][-1][2]; \n",
   2245 										   "    int x[-1][-1][-1]; \n" };
   2246 
   2247 	for (size_t invalid_initializers_index = 0;
   2248 		 invalid_initializers_index < sizeof(invalid_initializers) / sizeof(invalid_initializers[0]);
   2249 		 invalid_initializers_index++)
   2250 	{
   2251 		std::string shader_source;
   2252 
   2253 		shader_source = shader_start;
   2254 		shader_source += invalid_initializers[invalid_initializers_index];
   2255 
   2256 		/* End main */
   2257 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2258 
   2259 		/* Execute test */
   2260 		this->execute_negative_test(tested_shader_type, shader_source);
   2261 	} /* for (int invalid_initializers_index = 0; ...) */
   2262 }
   2263 
   2264 /* Generates the shader source code for the ConstructorsAndUnsizedDeclInvalidConstructors4
   2265  * array tests, and attempts to compile each test shader, for both
   2266  * vertex and fragment shaders.
   2267  *
   2268  * @tparam API               Tested API descriptor
   2269  *
   2270  * @param tested_shader_type The type of shader that is being tested
   2271  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2272  */
   2273 template <class API>
   2274 void ConstructorsAndUnsizedDeclInvalidConstructors4<API>::test_shader_compilation(
   2275 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2276 {
   2277 	std::string invalid_initializers[] = { "    int x[2][2][a]; \n", "    int x[2][a][2]; \n", "    int x[a][2][2]; \n",
   2278 										   "    int x[2][a][a]; \n", "    int x[a][2][a]; \n", "    int x[a][a][2]; \n",
   2279 										   "    int x[a][a][a]; \n" };
   2280 	std::string non_constant_variable_init = "    uint a = 2u;\n";
   2281 
   2282 	for (size_t invalid_initializers_index = 0;
   2283 		 invalid_initializers_index < sizeof(invalid_initializers) / sizeof(invalid_initializers[0]);
   2284 		 invalid_initializers_index++)
   2285 	{
   2286 		std::string shader_source;
   2287 
   2288 		shader_source = shader_start;
   2289 		shader_source += non_constant_variable_init;
   2290 		shader_source += invalid_initializers[invalid_initializers_index];
   2291 
   2292 		/* End main */
   2293 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2294 
   2295 		/* Execute test */
   2296 		this->execute_negative_test(tested_shader_type, shader_source);
   2297 	} /* for (int invalid_initializers_index = 0; ...) */
   2298 }
   2299 
   2300 /* Generates the shader source code for the ConstructorsAndUnsizedDeclConstructorSizing1
   2301  * array tests, and attempts to compile each test shader, for both
   2302  * vertex and fragment shaders.
   2303  *
   2304  * @tparam API               Tested API descriptor
   2305  *
   2306  * @param tested_shader_type The type of shader that is being tested
   2307  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2308  */
   2309 template <class API>
   2310 void ConstructorsAndUnsizedDeclConstructorSizing1<API>::test_shader_compilation(
   2311 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2312 {
   2313 	std::string valid_size_initializers[] = { "[1][1][1][]", "[1][1][][1]", "[1][][1][1]", "[][1][1][1]", "[1][1][][]",
   2314 											  "[1][][1][]",  "[][1][1][]",  "[1][][][1]",  "[][1][][1]",  "[][][1][1]",
   2315 											  "[1][][][]",   "[][1][][]",   "[][][1][]",   "[][][][1]",   "[][][][]" };
   2316 
   2317 	for (size_t var_type_index = 0; var_type_index < API::n_var_types; var_type_index++)
   2318 	{
   2319 		_supported_variable_types_map_const_iterator var_iterator =
   2320 			supported_variable_types_map.find(API::var_types[var_type_index]);
   2321 
   2322 		if (var_iterator != supported_variable_types_map.end())
   2323 		{
   2324 			for (size_t valid_size_initializers_index = 0;
   2325 				 valid_size_initializers_index < sizeof(valid_size_initializers) / sizeof(valid_size_initializers[0]);
   2326 				 valid_size_initializers_index++)
   2327 			{
   2328 				std::string shader_source;
   2329 				std::string variable_constructor =
   2330 					"    " + var_iterator->second.type + " x" + valid_size_initializers[valid_size_initializers_index] +
   2331 					" = " + var_iterator->second.type + "[1][1][1][1](" + var_iterator->second.type + "[1][1][1](" +
   2332 					var_iterator->second.type + "[1][1](" + var_iterator->second.type + "[1](" +
   2333 					var_iterator->second.initializer_with_zeroes + "))));\n";
   2334 
   2335 				shader_source = shader_start;
   2336 				shader_source += variable_constructor;
   2337 
   2338 				/* End main */
   2339 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2340 
   2341 				/* Execute test */
   2342 				EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2343 			} /* for (int valid_size_initializers_index = 0; ...) */
   2344 		}	 /* if var_type iterator found */
   2345 		else
   2346 		{
   2347 			TCU_FAIL("Type not found.");
   2348 		}
   2349 	} /* for (int var_type_index = 0; ...) */
   2350 }
   2351 
   2352 /* Generates the shader source code for the ConstructorsAndUnsizedDeclConstructorSizing2
   2353  * array tests, and attempts to compile each test shader, for both
   2354  * vertex and fragment shaders.
   2355  *
   2356  * @tparam API               Tested API descriptor
   2357  *
   2358  * @param tested_shader_type The type of shader that is being tested
   2359  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2360  */
   2361 template <class API>
   2362 void ConstructorsAndUnsizedDeclConstructorSizing2<API>::test_shader_compilation(
   2363 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2364 {
   2365 	std::string shader_source = shader_start;
   2366 
   2367 	shader_source += "    float[] a ="
   2368 					 "            float[](1.0, 2.0),"
   2369 					 "        b[] ="
   2370 					 "         float[][]("
   2371 					 "             float[](1.0, 2.0),"
   2372 					 "             float[](3.0, 4.0)"
   2373 					 "         ),"
   2374 					 "        c[][] ="
   2375 					 "         float[][][]("
   2376 					 "             float[][]("
   2377 					 "                 float[](1.0),"
   2378 					 "                 float[](2.0)"
   2379 					 "             )"
   2380 					 "         ),"
   2381 					 "        d[][][] ="
   2382 					 "         float[][][][]("
   2383 					 "             float[][][]("
   2384 					 "                 float[][]("
   2385 					 "                     float[](1.0, 2.0),"
   2386 					 "                     float[](3.0, 4.0),"
   2387 					 "                     float[](5.0, 6.0)"
   2388 					 "                 )"
   2389 					 "             ),"
   2390 					 "             float[][][]("
   2391 					 "                 float[][]("
   2392 					 "                     float[](1.0, 2.0),"
   2393 					 "                     float[](3.0, 4.0),"
   2394 					 "                     float[](5.0, 6.0)"
   2395 					 "                 )"
   2396 					 "             )"
   2397 					 "         ),"
   2398 					 "        e[][][][]="
   2399 					 "         float[][][][][]("
   2400 					 "             float[][][][]("
   2401 					 "                 float[][][]("
   2402 					 "                     float[][]("
   2403 					 "                         float[](1.0),"
   2404 					 "                         float[](2.0)"
   2405 					 "                     ),"
   2406 					 "                     float[][]("
   2407 					 "                         float[](1.0),"
   2408 					 "                         float[](2.0)"
   2409 					 "                     ),"
   2410 					 "                     float[][]("
   2411 					 "                         float[](1.0),"
   2412 					 "                         float[](2.0)"
   2413 					 "                     )"
   2414 					 "                 ),"
   2415 					 "                 float[][][]("
   2416 					 "                     float[][]("
   2417 					 "                         float[](1.0),"
   2418 					 "                         float[](2.0)"
   2419 					 "                     ),"
   2420 					 "                     float[][]("
   2421 					 "                         float[](1.0),"
   2422 					 "                         float[](2.0)"
   2423 					 "                     ),"
   2424 					 "                     float[][]("
   2425 					 "                         float[](1.0),"
   2426 					 "                         float[](2.0)"
   2427 					 "                     )"
   2428 					 "                 )"
   2429 					 "             )"
   2430 					 "         ),"
   2431 					 "        f[][][][][]="
   2432 					 "         float[][][][][][]("
   2433 					 "             float[][][][][]("
   2434 					 "                 float[][][][]("
   2435 					 "                     float[][][]("
   2436 					 "                         float[][]("
   2437 					 "                             float[](1.0)"
   2438 					 "                         )"
   2439 					 "                     )"
   2440 					 "                 )"
   2441 					 "             )"
   2442 					 "         ),"
   2443 					 "        g[][][][][][]="
   2444 					 "         float[][][][][][][]("
   2445 					 "             float[][][][][][]("
   2446 					 "                 float[][][][][]("
   2447 					 "                     float[][][][]("
   2448 					 "                         float[][][]("
   2449 					 "                             float[][]("
   2450 					 "                                 float[](1.0)"
   2451 					 "                             )"
   2452 					 "                         )"
   2453 					 "                     )"
   2454 					 "                 )"
   2455 					 "             )"
   2456 					 "         ),"
   2457 					 "        h[][][][][][][]="
   2458 					 "         float[][][][][][][][]("
   2459 					 "             float[][][][][][][]("
   2460 					 "                 float[][][][][][]("
   2461 					 "                     float[][][][][]("
   2462 					 "                         float[][][][]("
   2463 					 "                             float[][][]("
   2464 					 "                                 float[][]("
   2465 					 "                                     float[](1.0)"
   2466 					 "                                 )"
   2467 					 "                             )"
   2468 					 "                         )"
   2469 					 "                     )"
   2470 					 "                 )"
   2471 					 "             )"
   2472 					 "         );\n";
   2473 
   2474 	/* End main */
   2475 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2476 
   2477 	/* Execute test */
   2478 	EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2479 }
   2480 
   2481 /* Constructs a suitable constructor for the specified number of dimensions.
   2482  *
   2483  * @tparam API            Tested API descriptor
   2484  *
   2485  * @param var_type        The type of the variable
   2486  * @param dimension_index The current recursion level (counts down)
   2487  * @param init_string     The initialisation string
   2488  */
   2489 template <class API>
   2490 std::string ConstructorsAndUnsizedDeclStructConstructors<API>::recursively_initialise(std::string var_type,
   2491 																					  size_t	  dimension_index,
   2492 																					  std::string init_string)
   2493 {
   2494 	std::string temp_string;
   2495 
   2496 	if (dimension_index == 0)
   2497 	{
   2498 		temp_string = var_type + "(" + init_string + ")";
   2499 	}
   2500 	else
   2501 	{
   2502 		std::string prefix = "\n";
   2503 
   2504 		for (size_t indent_index = dimension_index; indent_index < (API::MAX_ARRAY_DIMENSIONS + 1); indent_index++)
   2505 		{
   2506 			prefix += "    ";
   2507 		}
   2508 
   2509 		prefix += this->extend_string(var_type, "[]", dimension_index);
   2510 		prefix += "(";
   2511 
   2512 		for (int sub_script_index = 0; sub_script_index < 2; sub_script_index++)
   2513 		{
   2514 			temp_string += prefix;
   2515 			temp_string += recursively_initialise(var_type, dimension_index - 1, init_string);
   2516 			prefix = ", ";
   2517 
   2518 			if (dimension_index == 1)
   2519 			{
   2520 				break;
   2521 			}
   2522 		}
   2523 		temp_string += ")";
   2524 	}
   2525 
   2526 	return temp_string;
   2527 }
   2528 
   2529 /* Generates the shader source code for the ConstructorsAndUnsizedDeclStructConstructors
   2530  * array tests, and attempts to compile each test shader, for both
   2531  * vertex and fragment shaders.
   2532  *
   2533  * @tparam API               Tested API descriptor
   2534  *
   2535  * @param tested_shader_type The type of shader that is being tested
   2536  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2537  */
   2538 template <class API>
   2539 void ConstructorsAndUnsizedDeclStructConstructors<API>::test_shader_compilation(
   2540 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2541 {
   2542 	std::string example_structure_definition("struct light {\n"
   2543 											 "    float intensity;\n"
   2544 											 "    int position;\n"
   2545 											 "};\n");
   2546 	std::string example_structure_object("    light my_light_variable");
   2547 
   2548 	for (size_t max_dimension_index = 2; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   2549 	{
   2550 		std::string base_variable_string = this->extend_string(example_structure_object, "[]", max_dimension_index);
   2551 		base_variable_string += " = ";
   2552 		base_variable_string += recursively_initialise("light", max_dimension_index, "1.0, 2");
   2553 		base_variable_string += ";\n\n";
   2554 
   2555 		std::string shader_source = example_structure_definition + shader_start + base_variable_string;
   2556 
   2557 		/* End main */
   2558 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2559 
   2560 		/* Execute test */
   2561 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2562 	} /* for (int max_dimension_index = 2; ...) */
   2563 }
   2564 
   2565 /* Generates the shader source code for the ConstructorsAndUnsizedDeclUnsizedArrays1
   2566  * array tests, and attempts to compile each test shader, for both
   2567  * vertex and fragment shaders.
   2568  *
   2569  * @tparam API               Tested API descriptor
   2570  *
   2571  * @param tested_shader_type The type of shader that is being tested
   2572  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2573  */
   2574 template <class API>
   2575 void ConstructorsAndUnsizedDeclUnsizedArrays1<API>::test_shader_compilation(
   2576 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2577 {
   2578 	std::string base_variable_string;
   2579 
   2580 	for (size_t max_dimension_index = 2; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   2581 	{
   2582 		base_variable_string = this->extend_string("    int x", "[]", max_dimension_index);
   2583 		base_variable_string += ";\n\n";
   2584 
   2585 		std::string shader_source = shader_start + base_variable_string;
   2586 
   2587 		/* End main */
   2588 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2589 
   2590 		/* Execute test */
   2591 		this->execute_negative_test(tested_shader_type, shader_source);
   2592 	} /* for (int max_dimension_index = 2; ...) */
   2593 }
   2594 
   2595 /* Generates the shader source code for the ConstructorsAndUnsizedDeclUnsizedArrays2
   2596  * array tests, and attempts to compile each test shader, for both
   2597  * vertex and fragment shaders.
   2598  *
   2599  * @tparam API               Tested API descriptor
   2600  *
   2601  * @param tested_shader_type The type of shader that is being tested
   2602  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2603  */
   2604 template <class API>
   2605 void ConstructorsAndUnsizedDeclUnsizedArrays2<API>::test_shader_compilation(
   2606 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2607 {
   2608 	std::string input[] = { "    float [] x = float[](1), y;\n\n" };
   2609 
   2610 	for (size_t string_index = 0; string_index < sizeof(input) / sizeof(input[0]); string_index++)
   2611 	{
   2612 		std::string shader_source;
   2613 
   2614 		shader_source += shader_start;
   2615 		shader_source += input[string_index];
   2616 
   2617 		/* End main */
   2618 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2619 
   2620 		/* Execute test */
   2621 		EXECUTE_SHADER_TEST(API::ALLOW_UNSIZED_DECLARATION, tested_shader_type, shader_source);
   2622 	} /* for (int string_index = 0; ...) */
   2623 }
   2624 
   2625 /* Generates the shader source code for the ConstructorsAndUnsizedDeclUnsizedArrays3
   2626  * array tests, and attempts to compile each test shader, for both
   2627  * vertex and fragment shaders.
   2628  *
   2629  * @tparam API               Tested API descriptor
   2630  *
   2631  * @param tested_shader_type The type of shader that is being tested
   2632  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2633  */
   2634 template <class API>
   2635 void ConstructorsAndUnsizedDeclUnsizedArrays3<API>::test_shader_compilation(
   2636 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2637 {
   2638 	std::string base_variable_string("    float[][] x = mat4(0);\n\n");
   2639 
   2640 	std::string shader_source = shader_start + base_variable_string;
   2641 
   2642 	/* End main */
   2643 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2644 
   2645 	/* Execute test */
   2646 	this->execute_negative_test(tested_shader_type, shader_source);
   2647 }
   2648 
   2649 /* Generates the shader source code for the ConstructorsAndUnsizedDeclUnsizedArrays4
   2650  * array tests, and attempts to compile each test shader, for both
   2651  * vertex and fragment shaders.
   2652  *
   2653  * @tparam API               Tested API descriptor
   2654  *
   2655  * @param tested_shader_type The type of shader that is being tested
   2656  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2657  */
   2658 template <class API>
   2659 void ConstructorsAndUnsizedDeclUnsizedArrays4<API>::test_shader_compilation(
   2660 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2661 {
   2662 	std::string example_struct("struct light {\n"
   2663 							   "    float[][] intensity;\n"
   2664 							   "    int       position;\n"
   2665 							   "} myLight;\n\n");
   2666 
   2667 	std::string shader_source = example_struct + shader_start;
   2668 
   2669 	/* End main */
   2670 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2671 
   2672 	/* Execute test */
   2673 	this->execute_negative_test(tested_shader_type, shader_source);
   2674 }
   2675 
   2676 /* Constructs a suitable constructor for the specified number of dimensions.
   2677  *
   2678  * @tparam API            Tested API descriptor
   2679  *
   2680  * @param dimension_index The current recursion level (counts down)
   2681  * @param init_string     The initialisation string
   2682  */
   2683 template <class API>
   2684 std::string ExpressionsAssignment1<API>::recursively_initialise(std::string var_type, size_t dimension_index,
   2685 																std::string init_string)
   2686 {
   2687 	std::string temp_string;
   2688 
   2689 	if (dimension_index == 0)
   2690 	{
   2691 		temp_string = init_string;
   2692 	}
   2693 	else
   2694 	{
   2695 		std::string prefix = "\n";
   2696 
   2697 		for (size_t indent_index = dimension_index; indent_index < (API::MAX_ARRAY_DIMENSIONS + 1); indent_index++)
   2698 		{
   2699 			prefix += "    ";
   2700 		}
   2701 
   2702 		prefix += this->extend_string(var_type, "[]", dimension_index);
   2703 		prefix += "(";
   2704 		for (int sub_script_index = 0; sub_script_index < 2; sub_script_index++)
   2705 		{
   2706 			temp_string += prefix;
   2707 			temp_string += recursively_initialise(var_type, dimension_index - 1, init_string);
   2708 			prefix = ", ";
   2709 			if (dimension_index == 1)
   2710 			{
   2711 				break;
   2712 			}
   2713 		}
   2714 		temp_string += ")";
   2715 	}
   2716 
   2717 	return temp_string;
   2718 }
   2719 
   2720 /* Generates the shader source code for the ExpressionsAssignment1
   2721  * array tests, and attempts to compile each test shader, for both
   2722  * vertex and fragment shaders.
   2723  *
   2724  * @tparam API               Tested API descriptor
   2725  *
   2726  * @param tested_shader_type The type of shader that is being tested
   2727  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2728  */
   2729 template <class API>
   2730 void ExpressionsAssignment1<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2731 {
   2732 	for (size_t max_dimension_index = 2; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   2733 	{
   2734 		std::string prefix = "(";
   2735 		std::string base_variable_string;
   2736 
   2737 		base_variable_string += this->extend_string("    float x", "[2]", max_dimension_index);
   2738 		base_variable_string += " = ";
   2739 		base_variable_string += recursively_initialise("float", max_dimension_index, "4.0, 6.0");
   2740 		base_variable_string += ";\n";
   2741 		base_variable_string += this->extend_string("    float y", "[2]", max_dimension_index);
   2742 		base_variable_string += " = ";
   2743 		base_variable_string += recursively_initialise("float", max_dimension_index, "1.0, 2.0");
   2744 		base_variable_string += ";\n\n";
   2745 
   2746 		std::string shader_source = shader_start + base_variable_string;
   2747 
   2748 		shader_source += "    x = y;\n";
   2749 
   2750 		/* End main */
   2751 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2752 
   2753 		/* Execute test */
   2754 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2755 	} /* for (int max_dimension_index = 2; ...) */
   2756 }
   2757 
   2758 /* Generates the shader source code for the ExpressionsAssignment2
   2759  * array tests, and attempts to compile each test shader, for both
   2760  * vertex and fragment shaders.
   2761  *
   2762  * @tparam API               Tested API descriptor
   2763  *
   2764  * @param tested_shader_type The type of shader that is being tested
   2765  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2766  */
   2767 template <class API>
   2768 void ExpressionsAssignment2<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2769 {
   2770 	std::string shader_body("    float a[2] = float[](1.0, 2.0);\n"
   2771 							"    float b[2][2] = float[][](float[](1.0, 2.0), float[](1.0, 2.0));\n"
   2772 							"    float c[2][2][2] = float[][][]("
   2773 							"float[][](float[](1.0, 2.0), float[](1.0, 2.0)),"
   2774 							"float[][](float[](1.0, 2.0), float[](1.0, 2.0)));\n"
   2775 							"    float d[2][2][2][2] = float[][][][]("
   2776 							"float[][][]("
   2777 							"float[][](float[](1.0, 2.0), float[](1.0, 2.0)), "
   2778 							"float[][](float[](1.0, 2.0), float[](1.0, 2.0))),"
   2779 							"float[][][]("
   2780 							"float[][](float[](1.0, 2.0), float[](1.0, 2.0)), "
   2781 							"float[][](float[](1.0, 2.0), float[](1.0, 2.0))));\n\n");
   2782 
   2783 	std::string variable_basenames[] = { "a", "b", "c", "d" };
   2784 	int			number_of_elements   = sizeof(variable_basenames) / sizeof(variable_basenames[0]);
   2785 
   2786 	for (int variable_index = 0; variable_index < number_of_elements; variable_index++)
   2787 	{
   2788 		for (int value_index = variable_index; value_index < number_of_elements; value_index++)
   2789 		{
   2790 			std::string shader_source = shader_start + shader_body;
   2791 
   2792 			/* Avoid the situation when a variable is assign to itself. */
   2793 			if (variable_index != value_index)
   2794 			{
   2795 				shader_source += "    " + variable_basenames[variable_index] + " = " + variable_basenames[value_index];
   2796 				shader_source += ";\n";
   2797 
   2798 				/* End main */
   2799 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2800 
   2801 				/* Execute test */
   2802 				this->execute_negative_test(tested_shader_type, shader_source);
   2803 			} /* if(variable_index != value_index) */
   2804 		}	 /* for (int value_index = variable_index; ...) */
   2805 	}		  /* for (int variable_index = 0; ...) */
   2806 }
   2807 
   2808 /* Generates the shader source code for the ExpressionsAssignment3
   2809  * array tests, and attempts to compile each test shader, for both
   2810  * vertex and fragment shaders.
   2811  *
   2812  * @tparam API               Tested API descriptor
   2813  *
   2814  * @param tested_shader_type The type of shader that is being tested
   2815  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2816  */
   2817 template <class API>
   2818 void ExpressionsAssignment3<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2819 {
   2820 	std::string prefix, base_variable_string;
   2821 
   2822 	const int test_array_dimensions = 4;
   2823 
   2824 	prefix = this->extend_string("    float a", "[1]", 4);
   2825 	prefix += " = float[][][][](\n"
   2826 			  "       float[][][](\n"
   2827 			  "           float[][](\n"
   2828 			  "               float[](1.0))));\n";
   2829 
   2830 	prefix += "    float b";
   2831 
   2832 	for (int permutation = 0; permutation < (1 << test_array_dimensions); permutation++)
   2833 	{
   2834 		base_variable_string = prefix;
   2835 
   2836 		for (int sub_script_index = test_array_dimensions - 1; sub_script_index >= 0; sub_script_index--)
   2837 		{
   2838 			if (permutation & (1 << sub_script_index))
   2839 			{
   2840 				base_variable_string += "[1]";
   2841 			}
   2842 			else
   2843 			{
   2844 				base_variable_string += "[2]";
   2845 			}
   2846 		}
   2847 
   2848 		base_variable_string += ";\n\n";
   2849 
   2850 		if (permutation != (1 << test_array_dimensions) - 1)
   2851 		{
   2852 			std::string shader_source = shader_start + base_variable_string;
   2853 
   2854 			shader_source += "    b = a;\n";
   2855 
   2856 			/* End main */
   2857 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2858 
   2859 			/* Execute test */
   2860 			this->execute_negative_test(tested_shader_type, shader_source);
   2861 		} /* if (permutation != (1 << test_array_dimensions) - 1) */
   2862 	}	 /* for (int permutation = 0; ...) */
   2863 }
   2864 
   2865 /* Generates the shader source code for the ExpressionsTypeRestrictions1
   2866  * array tests, and attempts to compile each test shader, for both
   2867  * vertex and fragment shaders.
   2868  *
   2869  * @tparam API               Tested API descriptor
   2870  *
   2871  * @param tested_shader_type The type of shader that is being tested
   2872  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2873  */
   2874 template <class API>
   2875 void ExpressionsTypeRestrictions1<API>::test_shader_compilation(
   2876 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2877 {
   2878 	int num_var_types = sizeof(opaque_var_types) / sizeof(opaque_var_types[0]);
   2879 
   2880 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   2881 	{
   2882 		_supported_variable_types_map_const_iterator var_iterator =
   2883 			supported_variable_types_map.find(opaque_var_types[var_type_index]);
   2884 
   2885 		if (var_iterator != supported_variable_types_map.end())
   2886 		{
   2887 			std::string shader_source =
   2888 				"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " var1[2][2];\n"
   2889 																								"uniform " +
   2890 				var_iterator->second.precision + " " + var_iterator->second.type + " var2[2][2];\n\n";
   2891 			shader_source += shader_start;
   2892 
   2893 			shader_source += "    var1 = var2;\n";
   2894 
   2895 			/* End main */
   2896 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2897 
   2898 			/* Execute test */
   2899 			this->execute_negative_test(tested_shader_type, shader_source);
   2900 		} /* if var_type iterator found */
   2901 		else
   2902 		{
   2903 			TCU_FAIL("Type not found.");
   2904 		}
   2905 	} /* for (int var_type_index = 0; ...) */
   2906 }
   2907 
   2908 /* Generates the shader source code for the ExpressionsTypeRestrictions2
   2909  * array tests, and attempts to compile each test shader, for both
   2910  * vertex and fragment shaders.
   2911  *
   2912  * @tparam API               Tested API descriptor
   2913  *
   2914  * @param tested_shader_type The type of shader that is being tested
   2915  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2916  */
   2917 template <class API>
   2918 void ExpressionsTypeRestrictions2<API>::test_shader_compilation(
   2919 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2920 {
   2921 	int num_var_types = sizeof(opaque_var_types) / sizeof(opaque_var_types[0]);
   2922 
   2923 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   2924 	{
   2925 		_supported_variable_types_map_const_iterator var_iterator =
   2926 			supported_variable_types_map.find(opaque_var_types[var_type_index]);
   2927 
   2928 		if (var_iterator != supported_variable_types_map.end())
   2929 		{
   2930 			std::string shader_source =
   2931 				"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " sampler1;\n"
   2932 																								"uniform " +
   2933 				var_iterator->second.precision + " " + var_iterator->second.type + " sampler2;\n"
   2934 																				   "uniform " +
   2935 				var_iterator->second.precision + " " + var_iterator->second.type + " sampler3;\n"
   2936 																				   "uniform " +
   2937 				var_iterator->second.precision + " " + var_iterator->second.type + " sampler4;\n"
   2938 																				   "struct light1 {\n"
   2939 																				   "    " +
   2940 				var_iterator->second.type + " var1[2][2];\n"
   2941 											"};\n\n";
   2942 			shader_source += shader_start;
   2943 
   2944 			shader_source +=
   2945 				("    light1 x = light1(" + var_iterator->second.type + "[][](" + var_iterator->second.type +
   2946 				 "[](sampler1, sampler2), " + var_iterator->second.type + "[](sampler3, sampler4)));\n");
   2947 			shader_source += "    light1 y = x;\n\n";
   2948 
   2949 			/* End main */
   2950 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2951 
   2952 			/* Execute test */
   2953 			this->execute_negative_test(tested_shader_type, shader_source);
   2954 		} /* if var_type iterator found */
   2955 		else
   2956 		{
   2957 			TCU_FAIL("Type not found.");
   2958 		}
   2959 	} /* for (int var_type_index = 0; ...) */
   2960 }
   2961 
   2962 /* Generates the shader source code for the ExpressionsIndexingScalar1
   2963  * array tests, and attempts to compile each test shader, for both
   2964  * vertex and fragment shaders.
   2965  *
   2966  * @tparam API               Tested API descriptor
   2967  *
   2968  * @param tested_shader_type The type of shader that is being tested
   2969  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   2970  */
   2971 template <class API>
   2972 void ExpressionsIndexingScalar1<API>::test_shader_compilation(
   2973 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   2974 {
   2975 	for (size_t var_type_index = 0; var_type_index < API::n_var_types; var_type_index++)
   2976 	{
   2977 		_supported_variable_types_map_const_iterator var_iterator =
   2978 			supported_variable_types_map.find(API::var_types[var_type_index]);
   2979 
   2980 		if (var_iterator != supported_variable_types_map.end())
   2981 		{
   2982 			std::string shader_source = shader_start + "    " + var_iterator->second.type + " x[1][2][3][4];\n\n";
   2983 
   2984 			shader_source += "    for (uint i = 0u; i < 2u; i++) {\n";
   2985 			shader_source += "        for (uint j = 0u; j < 3u; j++) {\n";
   2986 			shader_source += "            for (uint k = 0u; k < 4u; k++) {\n";
   2987 			shader_source += "                x[0][i][j][k] = " + var_iterator->second.initializer_with_ones + ";\n";
   2988 			shader_source += "            }\n";
   2989 			shader_source += "        }\n";
   2990 			shader_source += "    }\n";
   2991 
   2992 			/* End main */
   2993 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   2994 
   2995 			/* Execute test */
   2996 			EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   2997 		} /* if var_type iterator found */
   2998 		else
   2999 		{
   3000 			TCU_FAIL("Type not found.");
   3001 		}
   3002 	}
   3003 }
   3004 
   3005 /* Generates the shader source code for the ExpressionsIndexingScalar2
   3006  * array tests, and attempts to compile each test shader, for both
   3007  * vertex and fragment shaders.
   3008  *
   3009  * @tparam API               Tested API descriptor
   3010  *
   3011  * @param tested_shader_type The type of shader that is being tested
   3012  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3013  */
   3014 template <class API>
   3015 void ExpressionsIndexingScalar2<API>::test_shader_compilation(
   3016 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3017 {
   3018 	std::string base_shader_string, shader_source;
   3019 
   3020 	// This test tests arrays with 4 dimensions, e.g. x[1][1][1][1]
   3021 	const int test_array_dimensions = 4;
   3022 
   3023 	base_shader_string = "float a[1][2][3][4];\n";
   3024 	base_shader_string += "float b = 2.0;\n\n";
   3025 	base_shader_string += shader_start;
   3026 
   3027 	// There are 16 permutations, so loop 4x4 times.
   3028 	for (int permutation = 0; permutation < (1 << test_array_dimensions); permutation++)
   3029 	{
   3030 		shader_source = base_shader_string + "    a"; // a var called 'a'
   3031 
   3032 		for (int sub_script_index = test_array_dimensions - 1; sub_script_index >= 0; sub_script_index--)
   3033 		{
   3034 			/* If any bit is set for a particular number then add
   3035 			 * a valid array sub_script at that place, otherwise
   3036 			 * add an invalid array sub_script. */
   3037 			if (permutation & (1 << sub_script_index))
   3038 			{
   3039 				shader_source += "[0]";
   3040 			}
   3041 			else
   3042 			{
   3043 				shader_source += "[-1]";
   3044 			}
   3045 		}
   3046 
   3047 		shader_source += " = b;\n";
   3048 
   3049 		if (permutation != (1 << test_array_dimensions) - 1)
   3050 		{
   3051 			/* End main */
   3052 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3053 
   3054 			/* Execute test */
   3055 			this->execute_negative_test(tested_shader_type, shader_source);
   3056 		} /* if (permutation != (1 << test_array_dimensions) - 1) */
   3057 	}	 /* for (int permutation = 0; ...) */
   3058 }
   3059 
   3060 /* Generates the shader source code for the ExpressionsIndexingScalar3
   3061  * array tests, and attempts to compile each test shader, for both
   3062  * vertex and fragment shaders.
   3063  *
   3064  * @tparam API               Tested API descriptor
   3065  *
   3066  * @param tested_shader_type The type of shader that is being tested
   3067  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3068  */
   3069 template <class API>
   3070 void ExpressionsIndexingScalar3<API>::test_shader_compilation(
   3071 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3072 {
   3073 	std::string base_shader_string;
   3074 	std::string shader_source;
   3075 	const int   test_array_dimensions = 4;
   3076 
   3077 	base_shader_string = "float a[1][2][3][4];\n";
   3078 	base_shader_string += "float b = 2.0;\n\n";
   3079 	base_shader_string += shader_start;
   3080 
   3081 	for (int permutation = 0; permutation < (1 << test_array_dimensions); permutation++)
   3082 	{
   3083 		shader_source = base_shader_string + "    a";
   3084 
   3085 		for (int sub_script_index = test_array_dimensions - 1; sub_script_index >= 0; sub_script_index--)
   3086 		{
   3087 			if (permutation & (1 << sub_script_index))
   3088 			{
   3089 				shader_source += "[0]";
   3090 			}
   3091 			else
   3092 			{
   3093 				shader_source += "[4]";
   3094 			}
   3095 		}
   3096 
   3097 		shader_source += " = b;\n";
   3098 
   3099 		if (permutation != (1 << test_array_dimensions) - 1)
   3100 		{
   3101 			/* End main */
   3102 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3103 
   3104 			/* Execute test */
   3105 			this->execute_negative_test(tested_shader_type, shader_source);
   3106 		} /* if (permutation != (1 << test_array_dimensions) - 1) */
   3107 	}	 /* for (int permutation = 0; ...) */
   3108 }
   3109 
   3110 /* Generates the shader source code for the ExpressionsIndexingScalar4
   3111  * array tests, and attempts to compile each test shader, for both
   3112  * vertex and fragment shaders.
   3113  *
   3114  * @tparam API               Tested API descriptor
   3115  *
   3116  * @param tested_shader_type The type of shader that is being tested
   3117  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3118  */
   3119 template <class API>
   3120 void ExpressionsIndexingScalar4<API>::test_shader_compilation(
   3121 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3122 {
   3123 	std::string base_shader_string;
   3124 	std::string shader_source;
   3125 
   3126 	const int test_array_dimensions = 4;
   3127 
   3128 	base_shader_string = "float a[1][2][3][4];\n";
   3129 	base_shader_string += "float b = 2.0;\n\n";
   3130 	base_shader_string += shader_start;
   3131 
   3132 	for (int permutation = 0; permutation < (1 << test_array_dimensions); permutation++)
   3133 	{
   3134 		shader_source = base_shader_string + "    a";
   3135 
   3136 		for (int sub_script_index = test_array_dimensions - 1; sub_script_index >= 0; sub_script_index--)
   3137 		{
   3138 			if (permutation & (1 << sub_script_index))
   3139 			{
   3140 				shader_source += "[0]";
   3141 			}
   3142 			else
   3143 			{
   3144 				shader_source += "[]";
   3145 			}
   3146 		}
   3147 
   3148 		shader_source += " = b;\n";
   3149 
   3150 		if (permutation != (1 << test_array_dimensions) - 1)
   3151 		{
   3152 			/* End main */
   3153 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3154 
   3155 			/* Execute test */
   3156 			this->execute_negative_test(tested_shader_type, shader_source);
   3157 		} /* if (permutation != (1 << test_array_dimensions) - 1) */
   3158 	}	 /* for (int permutation = 0; ...) */
   3159 }
   3160 
   3161 /* Generates the shader source code for the ExpressionsIndexingArray1
   3162  * array tests, and attempts to compile each test shader, for both
   3163  * vertex and fragment shaders.
   3164  *
   3165  * @tparam API               Tested API descriptor
   3166  *
   3167  * @param tested_shader_type The type of shader that is being tested
   3168  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3169  */
   3170 template <class API>
   3171 void ExpressionsIndexingArray1<API>::test_shader_compilation(
   3172 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3173 {
   3174 	std::string shader_source;
   3175 	std::string variable_declaration = "float x[1][1][1][1][1][1][1][1];\n\n";
   3176 
   3177 	std::string variable_initializations[] = {
   3178 		"x[0]                      = float[1][1][1][1][1][1][1]("
   3179 		"float[1][1][1][1][1][1](float[1][1][1][1][1](float[1][1][1][1](float[1][1][1](float[1][1](float[1](1.0)))))));"
   3180 		"\n",
   3181 		"x[0][0]                   = "
   3182 		"float[1][1][1][1][1][1](float[1][1][1][1][1](float[1][1][1][1](float[1][1][1](float[1][1](float[1](1.0))))));"
   3183 		"\n",
   3184 		"x[0][0][0]                = "
   3185 		"float[1][1][1][1][1](float[1][1][1][1](float[1][1][1](float[1][1](float[1](1.0)))));\n",
   3186 		"x[0][0][0][0]             = float[1][1][1][1](float[1][1][1](float[1][1](float[1](1.0))));\n",
   3187 		"x[0][0][0][0][0]          = float[1][1][1](float[1][1](float[1](1.0)));\n",
   3188 		"x[0][0][0][0][0][0]       = float[1][1](float[1](1.0));\n", "x[0][0][0][0][0][0][0]    = float[1](1.0);\n",
   3189 		"x[0][0][0][0][0][0][0][0] = 1.0;\n"
   3190 	};
   3191 
   3192 	for (size_t string_index = 0; string_index < sizeof(variable_initializations) / sizeof(variable_initializations[0]);
   3193 		 string_index++)
   3194 	{
   3195 		shader_source = variable_declaration + shader_start;
   3196 		shader_source += "    " + variable_initializations[string_index];
   3197 
   3198 		/* End main */
   3199 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3200 
   3201 		/* Execute test */
   3202 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   3203 	} /* for (int string_index = 0; ...) */
   3204 }
   3205 
   3206 /* Constructs a suitable constructor for the specified number of dimensions.
   3207  *
   3208  * @tparam API            Tested API descriptor
   3209  *
   3210  * @param dimension_index The current recursion level (counts down)
   3211  * @param init_string     The initialisation string
   3212  */
   3213 template <class API>
   3214 std::string ExpressionsIndexingArray2<API>::recursively_initialise(std::string var_type, size_t dimension_index,
   3215 																   std::string init_string)
   3216 {
   3217 	std::string temp_string;
   3218 
   3219 	if (dimension_index == 0)
   3220 	{
   3221 		temp_string = init_string;
   3222 	}
   3223 	else
   3224 	{
   3225 		std::string prefix = "\n";
   3226 
   3227 		for (size_t indent_index = dimension_index; indent_index < (API::MAX_ARRAY_DIMENSIONS + 1); indent_index++)
   3228 		{
   3229 			prefix += "    ";
   3230 		}
   3231 
   3232 		prefix += this->extend_string(var_type, "[]", dimension_index);
   3233 		prefix += "(";
   3234 		for (int sub_script_index = 0; sub_script_index < 2; sub_script_index++)
   3235 		{
   3236 			temp_string += prefix;
   3237 			temp_string += recursively_initialise(var_type, dimension_index - 1, init_string);
   3238 			prefix = ", ";
   3239 			if (dimension_index == 1)
   3240 			{
   3241 				break;
   3242 			}
   3243 		}
   3244 		temp_string += ")";
   3245 	}
   3246 
   3247 	return temp_string;
   3248 }
   3249 
   3250 /* Generates the shader source code for the ExpressionsIndexingArray2
   3251  * array tests, and attempts to compile each test shader, for both
   3252  * vertex and fragment shaders.
   3253  *
   3254  * @tparam API               Tested API descriptor
   3255  *
   3256  * @param tested_shader_type The type of shader that is being tested
   3257  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3258  */
   3259 template <class API>
   3260 void ExpressionsIndexingArray2<API>::test_shader_compilation(
   3261 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3262 {
   3263 	std::string variable_initialiser = "    float[](float[](float(float(float(float(float(float(1.0))))))));\n";
   3264 
   3265 	std::string x_variable_initializaton =
   3266 		"    float x[2][2][2][2][2][2][2][1] = " + recursively_initialise("float", API::MAX_ARRAY_DIMENSIONS, "1.0") +
   3267 		";\n";
   3268 	std::string y_variable_initializaton =
   3269 		"    float y[2][2][2][2][2][2][2][1] = " + recursively_initialise("float", API::MAX_ARRAY_DIMENSIONS, "1.0") +
   3270 		";\n";
   3271 
   3272 	std::string shader_code_common_part = shader_start + x_variable_initializaton + y_variable_initializaton;
   3273 
   3274 	for (size_t max_dimension_index = 1; max_dimension_index <= API::MAX_ARRAY_DIMENSIONS; max_dimension_index++)
   3275 	{
   3276 		std::string iteration_specific_shader_code_part;
   3277 
   3278 		iteration_specific_shader_code_part += this->extend_string("    x", "[0]", max_dimension_index);
   3279 		iteration_specific_shader_code_part += " = ";
   3280 		iteration_specific_shader_code_part += this->extend_string("y", "[0]", max_dimension_index);
   3281 		iteration_specific_shader_code_part += ";\n";
   3282 
   3283 		std::string shader_source = shader_code_common_part + iteration_specific_shader_code_part;
   3284 
   3285 		/* End main */
   3286 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3287 
   3288 		/* Execute test */
   3289 		EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   3290 	}
   3291 }
   3292 
   3293 /* Generates the shader source code for the ExpressionsIndexingArray3
   3294  * array tests, and attempts to compile each test shader, for both
   3295  * vertex and fragment shaders.
   3296  *
   3297  * @tparam API               Tested API descriptor
   3298  *
   3299  * @param tested_shader_type The type of shader that is being tested
   3300  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3301  */
   3302 template <class API>
   3303 void ExpressionsIndexingArray3<API>::test_shader_compilation(
   3304 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3305 {
   3306 	std::string input[] = { "    x[ivec2(0)] = 1.0;\n\n", "    x[ivec3(0)] = 1.0;\n\n", "    x[ivec4(0)] = 1.0;\n\n" };
   3307 
   3308 	for (size_t string_index = 0; string_index < sizeof(input) / sizeof(input[0]); string_index++)
   3309 	{
   3310 		std::string shader_source = shader_start + this->extend_string("    float x", "[2]", (int)string_index + 2) +
   3311 									";\n\n" + input[string_index];
   3312 
   3313 		/* End main */
   3314 		DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3315 
   3316 		/* Execute test */
   3317 		this->execute_negative_test(tested_shader_type, shader_source);
   3318 	} /* for (int string_index = 0; ...) */
   3319 }
   3320 
   3321 /* Generates the shader source code for the ExpressionsDynamicIndexing1
   3322  * array tests, and attempts to compile each test shader, for both
   3323  * vertex and fragment shaders.
   3324  *
   3325  * @tparam API               Tested API descriptor
   3326  *
   3327  * @param tested_shader_type The type of shader that is being tested
   3328  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3329  */
   3330 template <class API>
   3331 void ExpressionsDynamicIndexing1<API>::test_shader_compilation(
   3332 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3333 {
   3334 	std::string expression_type_declarations = "uniform int a;\n"
   3335 											   "const int b = 0;\n"
   3336 											   "int c = 0;\n"
   3337 											   "float x[2][2];\n";
   3338 
   3339 	std::string expressions[] = { "a", "b", "c", "0 + 1" };
   3340 	std::string shader_source;
   3341 
   3342 	for (size_t write_index = 0; write_index < sizeof(expressions) / sizeof(expressions[0]); write_index++)
   3343 	{
   3344 		for (size_t read_index = 0; read_index < sizeof(expressions) / sizeof(expressions[0]); read_index++)
   3345 		{
   3346 			shader_source = expression_type_declarations;
   3347 			shader_source += shader_start;
   3348 			shader_source += "    x[";
   3349 			shader_source += expressions[write_index];
   3350 			shader_source += "][";
   3351 			shader_source += expressions[read_index];
   3352 			shader_source += "] = 1.0;\n\n";
   3353 
   3354 			/* End main */
   3355 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3356 
   3357 			/* Execute test */
   3358 			EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   3359 		} /* for (int read_index = 0; ...) */
   3360 	}	 /* for (int write_index = 0; ...) */
   3361 }
   3362 
   3363 /* Generates the shader source code for the ExpressionsDynamicIndexing2
   3364  * array tests, and attempts to compile each test shader, for both
   3365  * vertex and fragment shaders.
   3366  *
   3367  * @tparam API               Tested API descriptor
   3368  *
   3369  * @param tested_shader_type The type of shader that is being tested
   3370  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3371  */
   3372 template <class API>
   3373 void ExpressionsDynamicIndexing2<API>::test_shader_compilation(
   3374 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3375 {
   3376 	int				  num_var_types				  = sizeof(opaque_var_types) / sizeof(opaque_var_types[0]);
   3377 	const std::string invalid_size_declarations[] = { "[0][0][0][y]", "[0][0][y][0]", "[0][y][0][0]", "[y][0][0][0]",
   3378 													  "[0][0][y][y]", "[0][y][0][y]", "[y][0][0][y]", "[0][y][y][0]",
   3379 													  "[y][0][y][0]", "[y][y][0][0]", "[0][y][y][y]", "[y][0][y][y]",
   3380 													  "[y][y][0][y]", "[y][y][y][0]", "[y][y][y][y]" };
   3381 
   3382 	bool dynamic_indexing_supported = false;
   3383 	if (glu::contextSupports(this->context_id.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
   3384 		glu::contextSupports(this->context_id.getRenderContext().getType(), glu::ApiType::core(4, 0)) ||
   3385 		this->context_id.getContextInfo().isExtensionSupported("GL_EXT_gpu_shader5"))
   3386 	{
   3387 		dynamic_indexing_supported = true;
   3388 	}
   3389 
   3390 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   3391 	{
   3392 		_supported_variable_types_map_const_iterator var_iterator =
   3393 			supported_variable_types_map.find(opaque_var_types[var_type_index]);
   3394 
   3395 		if (var_iterator != supported_variable_types_map.end())
   3396 		{
   3397 			int num_invalid_size_declarations =
   3398 				sizeof(invalid_size_declarations) / sizeof(invalid_size_declarations[0]);
   3399 
   3400 			for (int invalid_size_index = 0; invalid_size_index < num_invalid_size_declarations; invalid_size_index++)
   3401 			{
   3402 				std::string shader_source = "int y = 1;\n";
   3403 
   3404 				shader_source += "uniform " + var_iterator->second.precision + " " + var_iterator->second.type +
   3405 								 " x[2][2][2][2];\n\n";
   3406 				shader_source += "void main()\n";
   3407 				shader_source += "{\n";
   3408 				shader_source += ("    " + var_iterator->second.type_of_result_of_texture_function +
   3409 								  " color = texture(x" + invalid_size_declarations[invalid_size_index] + ", " +
   3410 								  var_iterator->second.coord_param_for_texture_function + ");\n");
   3411 
   3412 				/* End main */
   3413 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3414 
   3415 				if (dynamic_indexing_supported)
   3416 				{
   3417 					EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, true);
   3418 				}
   3419 				else
   3420 				{
   3421 					this->execute_negative_test(tested_shader_type, shader_source);
   3422 				}
   3423 			} /* for (int invalid_size_index = 0; ...) */
   3424 		}	 /* if var_type iterator found */
   3425 		else
   3426 		{
   3427 			TCU_FAIL("Type not found.");
   3428 		}
   3429 	} /* for (int var_type_index = 0; ...) */
   3430 }
   3431 
   3432 /* Generates the shader source code for the ExpressionsEquality1
   3433  * array tests, and attempts to compile each test shader, for both
   3434  * vertex and fragment shaders.
   3435  *
   3436  * @tparam API               Tested API descriptor
   3437  *
   3438  * @param tested_shader_type The type of shader that is being tested
   3439  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3440  */
   3441 template <class API>
   3442 void ExpressionsEquality1<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3443 {
   3444 	int num_var_types = API::n_var_types;
   3445 
   3446 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   3447 	{
   3448 		_supported_variable_types_map_const_iterator var_iterator =
   3449 			supported_variable_types_map.find(API::var_types[var_type_index]);
   3450 
   3451 		if (var_iterator != supported_variable_types_map.end())
   3452 		{
   3453 			std::string shader_source = shader_start;
   3454 
   3455 			shader_source += "    ";
   3456 			shader_source += var_iterator->second.type;
   3457 			shader_source += "[][] x = ";
   3458 			shader_source += var_iterator->second.type;
   3459 			shader_source += "[][](";
   3460 			shader_source += var_iterator->second.type;
   3461 			shader_source += "[](";
   3462 			shader_source += var_iterator->second.initializer_with_zeroes;
   3463 			shader_source += ",";
   3464 			shader_source += var_iterator->second.initializer_with_zeroes;
   3465 			shader_source += "),";
   3466 			shader_source += var_iterator->second.type;
   3467 			shader_source += "[](";
   3468 			shader_source += var_iterator->second.initializer_with_zeroes;
   3469 			shader_source += ",";
   3470 			shader_source += var_iterator->second.initializer_with_zeroes;
   3471 			shader_source += "));\n";
   3472 			shader_source += "    ";
   3473 			shader_source += var_iterator->second.type;
   3474 			shader_source += "[][] y = ";
   3475 			shader_source += var_iterator->second.type;
   3476 			shader_source += "[][](";
   3477 			shader_source += var_iterator->second.type;
   3478 			shader_source += "[](";
   3479 			shader_source += var_iterator->second.initializer_with_zeroes;
   3480 			shader_source += ",";
   3481 			shader_source += var_iterator->second.initializer_with_zeroes;
   3482 			shader_source += "),";
   3483 			shader_source += var_iterator->second.type;
   3484 			shader_source += "[](";
   3485 			shader_source += var_iterator->second.initializer_with_zeroes;
   3486 			shader_source += ",";
   3487 			shader_source += var_iterator->second.initializer_with_zeroes;
   3488 			shader_source += "));\n\n";
   3489 			shader_source += "    float result = 0.0;\n\n";
   3490 			shader_source += "    if (x == y)\n";
   3491 			shader_source += "    {\n";
   3492 			shader_source += "        result = 1.0;\n";
   3493 			shader_source += "    }\n";
   3494 			shader_source += "    if (y != x)\n";
   3495 			shader_source += "    {\n";
   3496 			shader_source += "        result = 2.0;\n";
   3497 			shader_source += "    }\n";
   3498 
   3499 			/* End main */
   3500 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   3501 
   3502 			/* Execute test */
   3503 			EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   3504 		} /* if var_type iterator found */
   3505 		else
   3506 		{
   3507 			TCU_FAIL("Type not found.");
   3508 		}
   3509 	}
   3510 }
   3511 
   3512 /* Generates the shader source code for the ExpressionsEquality2
   3513  * array tests, and attempts to compile each test shader, for both
   3514  * vertex and fragment shaders.
   3515  *
   3516  * @tparam API               Tested API descriptor
   3517  *
   3518  * @param tested_shader_type The type of shader that is being tested
   3519  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3520  */
   3521 template <class API>
   3522 void ExpressionsEquality2<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3523 {
   3524 	int num_var_types = API::n_var_types;
   3525 
   3526 	for (int var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   3527 	{
   3528 		_supported_variable_types_map_const_iterator var_iterator =
   3529 			supported_variable_types_map.find(API::var_types[var_type_index]);
   3530 
   3531 		if (var_iterator != supported_variable_types_map.end())
   3532 		{
   3533 			std::string shader_source = "struct light {\n    float intensity;\n    int position;\n};\n\n";
   3534 
   3535 			shader_source += shader_start;
   3536 			shader_source += "    light[][] x =";
   3537 			shader_source += "light";
   3538 			shader_source += "[][](";
   3539 			shader_source += "light";
   3540 			shader_source += "[](light(1.0, 1)),";
   3541 			shader_source += "light";
   3542 			shader_source += "[](light(2.0, 2)));\n\n";
   3543 			shader_source += "    light[][] y =";
   3544 			shader_source += "light";
   3545 			shader_source += "[][](";
   3546 			shader_source += "light";
   3547 			shader_source += "[](light(3.0, 3)),";
   3548 			shader_source += "light";
   3549 			shader_source += "[](light(4.0, 4)));\n\n";
   3550 			shader_source += "    float result = 0.0;\n\n";
   3551 			shader_source += "    if (x == y)\n";
   3552 			shader_source += "    {\n";
   3553 			shader_source += "        result = 1.0;\n";
   3554 			shader_source += "    }\n";
   3555 			shader_source += "    if (y != x)\n";
   3556 			shader_source += "    {\n";
   3557 			shader_source += "        result = 2.0;\n";
   3558 			shader_source += "    }\n";
   3559 
   3560 			/* Apply stage specific stuff */
   3561 			switch (tested_shader_type)
   3562 			{
   3563 			case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   3564 				shader_source += "\n    gl_Position = vec4(0.0,0.0,0.0,1.0);\n";
   3565 				break;
   3566 			case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   3567 				shader_source += "\n    gl_FragDepth = result;\n";
   3568 				break;
   3569 			case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   3570 				break;
   3571 			case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   3572 				shader_source += emit_quad;
   3573 				break;
   3574 			case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   3575 				shader_source += set_tesseation;
   3576 				break;
   3577 			case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   3578 				break;
   3579 			default:
   3580 				TCU_FAIL("Unrecognized shader type.");
   3581 				break;
   3582 			}
   3583 
   3584 			/* End main function */
   3585 			shader_source += shader_end;
   3586 
   3587 			/* Execute test */
   3588 			EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   3589 		} /* if var_type iterator found */
   3590 		else
   3591 		{
   3592 			TCU_FAIL("Type not found.");
   3593 		}
   3594 	}
   3595 }
   3596 
   3597 /* Generates the shader source code for the ExpressionsLength1
   3598  * array tests, and attempts to compile each test shader, for both
   3599  * vertex and fragment shaders.
   3600  *
   3601  * @tparam API               Tested API descriptor
   3602  *
   3603  * @param tested_shader_type The type of shader that is being tested
   3604  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   3605  */
   3606 template <class API>
   3607 void ExpressionsLength1<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   3608 {
   3609 	std::string array_declaration	  = "    int x[4][3][2][1];\n\n";
   3610 	std::string case_specific_string[] = { "    if (x.length() != 4) {\n"
   3611 										   "        result = 0.0f;\n    }\n",
   3612 										   "    if (x[0].length() != 3) {\n"
   3613 										   "        result = 0.0f;\n    }\n",
   3614 										   "    if (x[0][0].length() != 2) {\n"
   3615 										   "        result = 0.0f;\n    }\n",
   3616 										   "    if (x[0][0][0].length() != 1) {\n"
   3617 										   "        result = 0.0f;\n    }\n" };
   3618 	const bool test_compute = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   3619 
   3620 	for (size_t case_specific_string_index = 0;
   3621 		 case_specific_string_index < sizeof(case_specific_string) / sizeof(case_specific_string[0]);
   3622 		 case_specific_string_index++)
   3623 	{
   3624 		const std::string& test_snippet = case_specific_string[case_specific_string_index];
   3625 
   3626 		if (false == test_compute)
   3627 		{
   3628 			execute_draw_test(tested_shader_type, array_declaration, test_snippet);
   3629 		}
   3630 		else
   3631 		{
   3632 			execute_dispatch_test(tested_shader_type, array_declaration, test_snippet);
   3633 		}
   3634 
   3635 		/* Deallocate any resources used. */
   3636 		this->delete_objects();
   3637 	} /* for (int case_specific_string_index = 0; ...) */
   3638 }
   3639 
   3640 /** Executes test for compute program
   3641  *
   3642  * @tparam API               Tested API descriptor
   3643  *
   3644  * @param tested_shader_type The type of shader that is being tested
   3645  * @param tested_declaration Declaration used to prepare shader
   3646  * @param tested_snippet     Snippet used to prepare shader
   3647  **/
   3648 template <class API>
   3649 void ExpressionsLength1<API>::execute_dispatch_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
   3650 													const std::string&						   tested_declaration,
   3651 													const std::string&						   tested_snippet)
   3652 {
   3653 	const std::string& compute_shader_source =
   3654 		prepare_compute_shader(tested_shader_type, tested_declaration, tested_snippet);
   3655 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   3656 
   3657 	this->execute_positive_test(empty_string, empty_string, empty_string, empty_string, empty_string,
   3658 								compute_shader_source, false, false);
   3659 
   3660 	/* We are now ready to verify whether the returned size is correct. */
   3661 	unsigned char buffer[4]				= { 0 };
   3662 	glw::GLuint   framebuffer_object_id = 0;
   3663 	glw::GLint	location				= -1;
   3664 	glw::GLuint   texture_object_id		= 0;
   3665 	glw::GLuint   vao_id				= 0;
   3666 
   3667 	gl.useProgram(this->program_object_id);
   3668 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   3669 
   3670 	gl.genTextures(1, &texture_object_id);
   3671 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   3672 
   3673 	gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   3674 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   3675 
   3676 	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   3677 	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   3678 
   3679 	gl.bindImageTexture(0 /* image unit */, texture_object_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */,
   3680 						GL_WRITE_ONLY, GL_RGBA8);
   3681 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture() failed.");
   3682 
   3683 	location = gl.getUniformLocation(this->program_object_id, "uni_image");
   3684 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() failed.");
   3685 
   3686 	if (-1 == location)
   3687 	{
   3688 		TCU_FAIL("Uniform is inactive");
   3689 	}
   3690 
   3691 	gl.uniform1i(location, 0 /* image unit */);
   3692 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i() failed.");
   3693 
   3694 	gl.genVertexArrays(1, &vao_id);
   3695 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   3696 
   3697 	gl.bindVertexArray(vao_id);
   3698 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   3699 
   3700 	gl.dispatchCompute(1, 1, 1);
   3701 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   3702 
   3703 	gl.genFramebuffers(1, &framebuffer_object_id);
   3704 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   3705 
   3706 	gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   3707 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   3708 
   3709 	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   3710 	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   3711 
   3712 	gl.viewport(0, 0, 1, 1);
   3713 	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   3714 
   3715 	gl.readBuffer(GL_COLOR_ATTACHMENT0);
   3716 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadBuffer() failed.");
   3717 
   3718 	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
   3719 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed.");
   3720 
   3721 	if (buffer[0] != 255)
   3722 	{
   3723 		TCU_FAIL("Invalid array size was returned.");
   3724 	}
   3725 
   3726 	/* Delete generated objects. */
   3727 	gl.deleteTextures(1, &texture_object_id);
   3728 	gl.deleteFramebuffers(1, &framebuffer_object_id);
   3729 	gl.deleteVertexArrays(1, &vao_id);
   3730 	GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   3731 }
   3732 
   3733 /** Executes test for draw program
   3734  *
   3735  * @tparam API               Tested API descriptor
   3736  *
   3737  * @param tested_shader_type The type of shader that is being tested
   3738  * @param tested_declaration Declaration used to prepare shader
   3739  * @param tested_snippet     Snippet used to prepare shader
   3740  **/
   3741 template <class API>
   3742 void ExpressionsLength1<API>::execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
   3743 												const std::string&						   tested_declaration,
   3744 												const std::string&						   tested_snippet)
   3745 {
   3746 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   3747 
   3748 	if (API::USE_ALL_SHADER_STAGES)
   3749 	{
   3750 		const std::string& compute_shader_source = empty_string;
   3751 		const std::string& fragment_shader_source =
   3752 			this->prepare_fragment_shader(tested_shader_type, tested_declaration, tested_snippet);
   3753 		const std::string& geometry_shader_source =
   3754 			this->prepare_geometry_shader(tested_shader_type, tested_declaration, tested_snippet);
   3755 		const std::string& tess_ctrl_shader_source =
   3756 			this->prepare_tess_ctrl_shader(tested_shader_type, tested_declaration, tested_snippet);
   3757 		const std::string& tess_eval_shader_source =
   3758 			this->prepare_tess_eval_shader(tested_shader_type, tested_declaration, tested_snippet);
   3759 		const std::string& vertex_shader_source =
   3760 			this->prepare_vertex_shader(tested_shader_type, tested_declaration, tested_snippet);
   3761 
   3762 		switch (tested_shader_type)
   3763 		{
   3764 		case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   3765 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   3766 			this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   3767 			break;
   3768 
   3769 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   3770 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   3771 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   3772 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   3773 			this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   3774 										geometry_shader_source, fragment_shader_source, compute_shader_source, false,
   3775 										false);
   3776 			break;
   3777 
   3778 		default:
   3779 			TCU_FAIL("Invalid enum");
   3780 			break;
   3781 		}
   3782 	}
   3783 	else
   3784 	{
   3785 		const std::string& fragment_shader_source =
   3786 			this->prepare_fragment_shader(tested_shader_type, tested_declaration, tested_snippet);
   3787 		const std::string& vertex_shader_source =
   3788 			this->prepare_vertex_shader(tested_shader_type, tested_declaration, tested_snippet);
   3789 
   3790 		this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   3791 	}
   3792 
   3793 	/* We are now ready to verify whether the returned size is correct. */
   3794 	unsigned char buffer[4]				= { 0 };
   3795 	glw::GLuint   framebuffer_object_id = 0;
   3796 	glw::GLuint   texture_object_id		= 0;
   3797 	glw::GLuint   vao_id				= 0;
   3798 
   3799 	gl.useProgram(this->program_object_id);
   3800 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   3801 
   3802 	gl.genTextures(1, &texture_object_id);
   3803 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   3804 
   3805 	gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   3806 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   3807 
   3808 	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   3809 	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   3810 
   3811 	gl.genFramebuffers(1, &framebuffer_object_id);
   3812 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   3813 
   3814 	gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   3815 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   3816 
   3817 	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   3818 	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   3819 
   3820 	gl.viewport(0, 0, 1, 1);
   3821 	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   3822 
   3823 	gl.genVertexArrays(1, &vao_id);
   3824 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   3825 
   3826 	gl.bindVertexArray(vao_id);
   3827 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   3828 
   3829 	switch (tested_shader_type)
   3830 	{
   3831 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE: /* Fall through */
   3832 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   3833 		gl.drawArrays(GL_TRIANGLE_FAN, 0, 4);
   3834 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   3835 		break;
   3836 
   3837 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   3838 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   3839 		/* Tesselation patch set up */
   3840 		gl.patchParameteri(GL_PATCH_VERTICES, 1);
   3841 		GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
   3842 
   3843 		gl.drawArrays(GL_PATCHES, 0, 1);
   3844 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   3845 		break;
   3846 
   3847 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   3848 		gl.drawArrays(GL_POINTS, 0, 1);
   3849 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   3850 		break;
   3851 
   3852 	default:
   3853 		TCU_FAIL("Invalid enum");
   3854 		break;
   3855 	}
   3856 
   3857 	gl.readBuffer(GL_COLOR_ATTACHMENT0);
   3858 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadBuffer() failed.");
   3859 
   3860 	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
   3861 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed.");
   3862 
   3863 	if (buffer[0] != 255)
   3864 	{
   3865 		TCU_FAIL("Invalid array size was returned.");
   3866 	}
   3867 
   3868 	/* Delete generated objects. */
   3869 	gl.deleteTextures(1, &texture_object_id);
   3870 	gl.deleteFramebuffers(1, &framebuffer_object_id);
   3871 	gl.deleteVertexArrays(1, &vao_id);
   3872 	GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   3873 }
   3874 
   3875 /** Prepare shader
   3876  *
   3877  * @tparam API               Tested API descriptor
   3878  *
   3879  * @param tested_shader_type The type of shader that is being tested
   3880  * @param tested_declaration Declaration used to prepare shader
   3881  * @param tested_snippet     Snippet used to prepare shader
   3882  **/
   3883 template <class API>
   3884 std::string ExpressionsLength1<API>::prepare_compute_shader(
   3885 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& tested_declaration,
   3886 	const std::string& tested_snippet)
   3887 {
   3888 	std::string compute_shader_source;
   3889 
   3890 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type)
   3891 	{
   3892 		compute_shader_source = "writeonly uniform image2D uni_image;\n"
   3893 								"\n"
   3894 								"void main()\n"
   3895 								"{\n"
   3896 								"    float result = 1u;\n"
   3897 								"\n";
   3898 		compute_shader_source += tested_declaration;
   3899 		compute_shader_source += tested_snippet;
   3900 		compute_shader_source += "\n"
   3901 								 "    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), vec4(result, 0, 0, 0));\n"
   3902 								 "}\n"
   3903 								 "\n";
   3904 	}
   3905 
   3906 	return compute_shader_source;
   3907 }
   3908 
   3909 /** Prepare shader
   3910  *
   3911  * @tparam API               Tested API descriptor
   3912  *
   3913  * @param tested_shader_type The type of shader that is being tested
   3914  * @param tested_declaration Declaration used to prepare shader
   3915  * @param tested_snippet     Snippet used to prepare shader
   3916  **/
   3917 template <class API>
   3918 std::string ExpressionsLength1<API>::prepare_fragment_shader(
   3919 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& tested_declaration,
   3920 	const std::string& tested_snippet)
   3921 {
   3922 	std::string fragment_shader_source;
   3923 
   3924 	switch (tested_shader_type)
   3925 	{
   3926 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   3927 		break;
   3928 
   3929 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   3930 		fragment_shader_source = "out vec4 colour;\n"
   3931 								 "\n"
   3932 								 "void main()\n"
   3933 								 "{\n";
   3934 		fragment_shader_source += tested_declaration;
   3935 		fragment_shader_source += "    float result = 1.0f;\n";
   3936 		fragment_shader_source += tested_snippet;
   3937 		fragment_shader_source += "    colour = vec4(result);\n"
   3938 								  "}\n\n";
   3939 		break;
   3940 
   3941 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   3942 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   3943 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   3944 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   3945 		fragment_shader_source = "in float fs_result;\n\n"
   3946 								 "out vec4 colour;\n\n"
   3947 								 "void main()\n"
   3948 								 "{\n"
   3949 								 "    colour =  vec4(fs_result);\n"
   3950 								 "}\n"
   3951 								 "\n";
   3952 		break;
   3953 
   3954 	default:
   3955 		TCU_FAIL("Unrecognized shader object type.");
   3956 		break;
   3957 	}
   3958 
   3959 	return fragment_shader_source;
   3960 }
   3961 
   3962 /** Prepare shader
   3963  *
   3964  * @tparam API               Tested API descriptor
   3965  *
   3966  * @param tested_shader_type The type of shader that is being tested
   3967  * @param tested_declaration Declaration used to prepare shader
   3968  * @param tested_snippet     Snippet used to prepare shader
   3969  **/
   3970 template <class API>
   3971 std::string ExpressionsLength1<API>::prepare_geometry_shader(
   3972 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& tested_declaration,
   3973 	const std::string& tested_snippet)
   3974 {
   3975 	std::string geometry_shader_source;
   3976 
   3977 	switch (tested_shader_type)
   3978 	{
   3979 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   3980 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   3981 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   3982 		break;
   3983 
   3984 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   3985 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   3986 		geometry_shader_source = "layout(points)                           in;\n"
   3987 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   3988 								 "\n"
   3989 								 "in  float tes_result[];\n"
   3990 								 "out float fs_result;\n"
   3991 								 "\n"
   3992 								 "void main()\n"
   3993 								 "{\n"
   3994 								 "    gl_Position  = vec4(-1, -1, 0, 1);\n"
   3995 								 "    fs_result    = tes_result[0];\n"
   3996 								 "    EmitVertex();\n"
   3997 								 "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   3998 								 "    fs_result    = tes_result[0];\n"
   3999 								 "    EmitVertex();\n"
   4000 								 "    gl_Position  = vec4(1, -1, 0, 1);\n"
   4001 								 "    fs_result    = tes_result[0];\n"
   4002 								 "    EmitVertex();\n"
   4003 								 "    gl_Position  = vec4(1, 1, 0, 1);\n"
   4004 								 "    fs_result    = tes_result[0];\n"
   4005 								 "    EmitVertex();\n"
   4006 								 "}\n";
   4007 		break;
   4008 
   4009 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4010 		geometry_shader_source = "layout(points)                           in;\n"
   4011 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   4012 								 "\n"
   4013 								 "out float fs_result;\n"
   4014 								 "\n"
   4015 								 "void main()\n"
   4016 								 "{\n";
   4017 		geometry_shader_source += tested_declaration;
   4018 		geometry_shader_source += "    float result = 1.0;\n\n";
   4019 		geometry_shader_source += tested_snippet;
   4020 		geometry_shader_source += "\n    gl_Position  = vec4(-1, -1, 0, 1);\n"
   4021 								  "    fs_result    = result;\n"
   4022 								  "    EmitVertex();\n"
   4023 								  "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   4024 								  "    fs_result    = result;\n"
   4025 								  "    EmitVertex();\n"
   4026 								  "    gl_Position  = vec4(1, -1, 0, 1);\n"
   4027 								  "    fs_result    = result;\n"
   4028 								  "    EmitVertex();\n"
   4029 								  "    gl_Position  = vec4(1, 1, 0, 1);\n"
   4030 								  "    fs_result    = result;\n"
   4031 								  "    EmitVertex();\n"
   4032 								  "}\n";
   4033 		break;
   4034 
   4035 	default:
   4036 		TCU_FAIL("Unrecognized shader object type.");
   4037 		break;
   4038 	}
   4039 
   4040 	return geometry_shader_source;
   4041 }
   4042 
   4043 /** Prepare shader
   4044  *
   4045  * @tparam API               Tested API descriptor
   4046  *
   4047  * @param tested_shader_type The type of shader that is being tested
   4048  * @param tested_declaration Declaration used to prepare shader
   4049  * @param tested_snippet     Snippet used to prepare shader
   4050  **/
   4051 template <class API>
   4052 std::string ExpressionsLength1<API>::prepare_tess_ctrl_shader(
   4053 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& tested_declaration,
   4054 	const std::string& tested_snippet)
   4055 {
   4056 	std::string tess_ctrl_shader_source;
   4057 
   4058 	switch (tested_shader_type)
   4059 	{
   4060 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4061 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4062 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4063 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4064 		break;
   4065 
   4066 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   4067 		tess_ctrl_shader_source = "layout(vertices = 1) out;\n"
   4068 								  "\n"
   4069 								  "out float tcs_result[];\n"
   4070 								  "\n"
   4071 								  "void main()\n"
   4072 								  "{\n";
   4073 		tess_ctrl_shader_source += tested_declaration;
   4074 		tess_ctrl_shader_source += "    float result = 1.0;\n\n";
   4075 		tess_ctrl_shader_source += tested_snippet;
   4076 		tess_ctrl_shader_source += "    tcs_result[gl_InvocationID] = result;\n"
   4077 								   "\n"
   4078 								   "    gl_TessLevelOuter[0] = 1.0;\n"
   4079 								   "    gl_TessLevelOuter[1] = 1.0;\n"
   4080 								   "    gl_TessLevelOuter[2] = 1.0;\n"
   4081 								   "    gl_TessLevelOuter[3] = 1.0;\n"
   4082 								   "    gl_TessLevelInner[0] = 1.0;\n"
   4083 								   "    gl_TessLevelInner[1] = 1.0;\n"
   4084 								   "}\n";
   4085 		break;
   4086 
   4087 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4088 		tess_ctrl_shader_source = default_tc_shader_source;
   4089 		break;
   4090 
   4091 	default:
   4092 		TCU_FAIL("Unrecognized shader object type.");
   4093 		break;
   4094 	}
   4095 
   4096 	return tess_ctrl_shader_source;
   4097 }
   4098 
   4099 /** Prepare shader
   4100  *
   4101  * @tparam API               Tested API descriptor
   4102  *
   4103  * @param tested_shader_type The type of shader that is being tested
   4104  * @param tested_declaration Declaration used to prepare shader
   4105  * @param tested_snippet     Snippet used to prepare shader
   4106  **/
   4107 template <class API>
   4108 std::string ExpressionsLength1<API>::prepare_tess_eval_shader(
   4109 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& tested_declaration,
   4110 	const std::string& tested_snippet)
   4111 {
   4112 	std::string tess_eval_shader_source;
   4113 
   4114 	switch (tested_shader_type)
   4115 	{
   4116 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4117 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4118 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4119 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4120 		break;
   4121 
   4122 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   4123 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   4124 								  "\n"
   4125 								  "in  float tcs_result[];\n"
   4126 								  "out float tes_result;\n"
   4127 								  "\n"
   4128 								  "void main()\n"
   4129 								  "{\n"
   4130 								  "    tes_result = tcs_result[0];\n"
   4131 								  "}\n";
   4132 		break;
   4133 
   4134 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4135 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   4136 								  "\n"
   4137 								  "out float tes_result;\n"
   4138 								  "\n"
   4139 								  "void main()\n"
   4140 								  "{\n";
   4141 		tess_eval_shader_source += tested_declaration;
   4142 		tess_eval_shader_source += "    float result = 1.0;\n\n";
   4143 		tess_eval_shader_source += tested_snippet;
   4144 		tess_eval_shader_source += "    tes_result = result;\n"
   4145 								   "}\n";
   4146 		break;
   4147 
   4148 	default:
   4149 		TCU_FAIL("Unrecognized shader object type.");
   4150 		break;
   4151 	}
   4152 
   4153 	return tess_eval_shader_source;
   4154 }
   4155 
   4156 /** Prepare shader
   4157  *
   4158  * @tparam API               Tested API descriptor
   4159  *
   4160  * @param tested_shader_type The type of shader that is being tested
   4161  * @param tested_declaration Declaration used to prepare shader
   4162  * @param tested_snippet     Snippet used to prepare shader
   4163  **/
   4164 template <class API>
   4165 std::string ExpressionsLength1<API>::prepare_vertex_shader(
   4166 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& tested_declaration,
   4167 	const std::string& tested_snippet)
   4168 {
   4169 	std::string vertex_shader_source;
   4170 
   4171 	switch (tested_shader_type)
   4172 	{
   4173 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4174 		break;
   4175 
   4176 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4177 		vertex_shader_source = "/** GL_TRIANGLE_FAN-type quad vertex data. */\n"
   4178 							   "const vec4 vertex_positions[4] = vec4[4](vec4( 1.0, -1.0, 0.0, 1.0),\n"
   4179 							   "                                         vec4(-1.0, -1.0, 0.0, 1.0),\n"
   4180 							   "                                         vec4(-1.0,  1.0, 0.0, 1.0),\n"
   4181 							   "                                         vec4( 1.0,  1.0, 0.0, 1.0) );\n"
   4182 							   "\n"
   4183 							   "void main()\n"
   4184 							   "{\n"
   4185 							   "    gl_Position = vertex_positions[gl_VertexID];"
   4186 							   "}\n\n";
   4187 		break;
   4188 
   4189 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4190 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   4191 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4192 		vertex_shader_source = default_vertex_shader_source;
   4193 		break;
   4194 
   4195 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4196 		vertex_shader_source = "out float fs_result;\n"
   4197 							   "\n"
   4198 							   "/** GL_TRIANGLE_FAN-type quad vertex data. */\n"
   4199 							   "const vec4 vertex_positions[4] = vec4[4](vec4( 1.0, -1.0, 0.0, 1.0),\n"
   4200 							   "                                         vec4(-1.0, -1.0, 0.0, 1.0),\n"
   4201 							   "                                         vec4(-1.0,  1.0, 0.0, 1.0),\n"
   4202 							   "                                         vec4( 1.0,  1.0, 0.0, 1.0) );\n"
   4203 							   "\n"
   4204 							   "void main()\n"
   4205 							   "{\n";
   4206 		vertex_shader_source += tested_declaration;
   4207 		vertex_shader_source += "    float result = 1.0;\n\n";
   4208 		vertex_shader_source += tested_snippet;
   4209 		vertex_shader_source += "    gl_Position = vertex_positions[gl_VertexID];\n"
   4210 								"    fs_result = result;\n";
   4211 		vertex_shader_source += shader_end;
   4212 		break;
   4213 
   4214 	default:
   4215 		TCU_FAIL("Unrecognized shader object type.");
   4216 		break;
   4217 	}
   4218 
   4219 	return vertex_shader_source;
   4220 }
   4221 
   4222 /* Generates the shader source code for the ExpressionsLength2
   4223  * array tests, and attempts to compile each test shader, for both
   4224  * vertex and fragment shaders.
   4225  *
   4226  * @tparam API               Tested API descriptor
   4227  *
   4228  * @param tested_shader_type The type of shader that is being tested
   4229  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   4230  */
   4231 template <class API>
   4232 void ExpressionsLength2<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   4233 {
   4234 	std::string array_declaration	  = "    int x[1][2][3][4];\n\n";
   4235 	std::string case_specific_string[] = { "    if (x.length() != 1) {\n"
   4236 										   "        result = 0.0f;\n    }\n",
   4237 										   "    if (x[0].length() != 2) {\n"
   4238 										   "        result = 0.0f;\n    }\n",
   4239 										   "    if (x[0][0].length() != 3) {\n"
   4240 										   "        result = 0.0f;\n    }\n",
   4241 										   "    if (x[0][0][0].length() != 4) {\n"
   4242 										   "        result = 0.0f;\n    }\n" };
   4243 	const bool test_compute = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   4244 
   4245 	for (size_t case_specific_string_index = 0;
   4246 		 case_specific_string_index < sizeof(case_specific_string) / sizeof(case_specific_string[0]);
   4247 		 case_specific_string_index++)
   4248 	{
   4249 		const std::string& test_snippet = case_specific_string[case_specific_string_index];
   4250 
   4251 		if (false == test_compute)
   4252 		{
   4253 			this->execute_draw_test(tested_shader_type, array_declaration, test_snippet);
   4254 		}
   4255 		else
   4256 		{
   4257 			this->execute_dispatch_test(tested_shader_type, array_declaration, test_snippet);
   4258 		}
   4259 
   4260 		/* Deallocate any resources used. */
   4261 		this->delete_objects();
   4262 	} /* for (int case_specific_string_index = 0; ...) */
   4263 }
   4264 
   4265 /* Generates the shader source code for the ExpressionsLength3
   4266  * array tests, and attempts to compile each test shader, for both
   4267  * vertex and fragment shaders.
   4268  *
   4269  * @tparam API               Tested API descriptor
   4270  *
   4271  * @param tested_shader_type The type of shader that is being tested
   4272  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   4273  */
   4274 template <class API>
   4275 void ExpressionsLength3<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   4276 {
   4277 	std::string array_declaration = "    int x[1][1][1][1];\n\n";
   4278 	std::string input[]			  = { "    if (x[].length() != 2) {\n"
   4279 							"        result = 0.0f;\n    }\n",
   4280 							"    if (x[][].length() != 2)  {\n"
   4281 							"        result = 0.0f;\n    }\n",
   4282 							"    if (x[][][].length() != 2)  {\n"
   4283 							"        result = 0.0f;\n    }\n" };
   4284 
   4285 	for (size_t string_index = 0; string_index < sizeof(input) / sizeof(input[0]); string_index++)
   4286 	{
   4287 		std::string		   shader_source;
   4288 		const std::string& test_snippet = input[string_index];
   4289 
   4290 		switch (tested_shader_type)
   4291 		{
   4292 		case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4293 			shader_source = this->prepare_vertex_shader(tested_shader_type, array_declaration, test_snippet);
   4294 			break;
   4295 
   4296 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4297 			shader_source = this->prepare_fragment_shader(tested_shader_type, array_declaration, test_snippet);
   4298 			break;
   4299 
   4300 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4301 			shader_source = this->prepare_compute_shader(tested_shader_type, array_declaration, test_snippet);
   4302 			break;
   4303 
   4304 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4305 			shader_source = this->prepare_geometry_shader(tested_shader_type, array_declaration, test_snippet);
   4306 			break;
   4307 
   4308 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   4309 			shader_source = this->prepare_tess_ctrl_shader(tested_shader_type, array_declaration, test_snippet);
   4310 			break;
   4311 
   4312 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4313 			shader_source = this->prepare_tess_eval_shader(tested_shader_type, array_declaration, test_snippet);
   4314 			break;
   4315 
   4316 		default:
   4317 			TCU_FAIL("Unrecognized shader type.");
   4318 			break;
   4319 		} /* switch (tested_shader_type) */
   4320 
   4321 		this->execute_negative_test(tested_shader_type, shader_source);
   4322 	} /* for (int string_index = 0; ...) */
   4323 }
   4324 
   4325 /* Generates the shader source code for the ExpressionsInvalid1
   4326  * array tests, and attempts to compile each test shader, for both
   4327  * vertex and fragment shaders.
   4328  *
   4329  * @tparam API               Tested API descriptor
   4330  *
   4331  * @param tested_shader_type The type of shader that is being tested
   4332  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   4333  */
   4334 template <class API>
   4335 void ExpressionsInvalid1<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   4336 {
   4337 	std::string shader_variable_declarations =
   4338 		"    mat2  y       = mat2(0.0);\n"
   4339 		"    float x[2][2] = float[2][2](float[2](4.0, 5.0), float[2](6.0, 7.0));\n\n";
   4340 
   4341 	std::string shader_source = shader_start + shader_variable_declarations;
   4342 
   4343 	shader_source += "    y = x;\n";
   4344 
   4345 	DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   4346 
   4347 	this->execute_negative_test(tested_shader_type, shader_source);
   4348 }
   4349 
   4350 /* Generates the shader source code for the ExpressionsInvalid2
   4351  * array tests, and attempts to compile each test shader, for both
   4352  * vertex and fragment shaders.
   4353  *
   4354  * @tparam API               Tested API descriptor
   4355  *
   4356  * @param tested_shader_type The type of shader that is being tested
   4357  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   4358  */
   4359 template <class API>
   4360 void ExpressionsInvalid2<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   4361 {
   4362 
   4363 	std::string shader_variable_declarations[] = { " x", " y" };
   4364 	std::string variable_relation_opeartors[]  = {
   4365 		"    float result = 0.0;\n\n    if(x < y)\n    {\n        result = 1.0;\n    }\n\n\n",
   4366 		"    float result = 0.0;\n\n    if(x <= y)\n    {\n        result = 1.0;\n    }\n\n\n",
   4367 		"    float result = 0.0;\n\n    if(x > y)\n    {\n        result = 1.0;\n    }\n\n\n",
   4368 		"    float result = 0.0;\n\n    if(x >= y)\n    {\n        result = 1.0;\n    }\n\n\n"
   4369 	};
   4370 	std::string valid_relation_opeartors =
   4371 		"    float result = 0.0;\n\n    if(x == y)\n    {\n        result = 1.0;\n    }\n\n\n";
   4372 
   4373 	for (size_t var_type_index = 0; var_type_index < API::n_var_types; var_type_index++)
   4374 	{
   4375 		_supported_variable_types_map_const_iterator var_iterator =
   4376 			supported_variable_types_map.find(API::var_types[var_type_index]);
   4377 
   4378 		if (var_iterator != supported_variable_types_map.end())
   4379 		{
   4380 			std::string base_variable_string;
   4381 
   4382 			for (size_t variable_declaration_index = 0;
   4383 				 variable_declaration_index <
   4384 				 sizeof(shader_variable_declarations) / sizeof(shader_variable_declarations[0]);
   4385 				 variable_declaration_index++)
   4386 			{
   4387 				base_variable_string += var_iterator->second.type;
   4388 				base_variable_string += shader_variable_declarations[variable_declaration_index];
   4389 
   4390 				base_variable_string += "[1][1][1][1][1][1][1][1] = ";
   4391 
   4392 				for (size_t sub_script_index = 0; sub_script_index < API::MAX_ARRAY_DIMENSIONS; sub_script_index++)
   4393 				{
   4394 					base_variable_string += this->extend_string(var_iterator->second.type, "[1]",
   4395 																API::MAX_ARRAY_DIMENSIONS - sub_script_index);
   4396 					base_variable_string += "(";
   4397 				}
   4398 
   4399 				base_variable_string += var_iterator->second.initializer_with_ones;
   4400 
   4401 				for (size_t sub_script_index = 0; sub_script_index < API::MAX_ARRAY_DIMENSIONS; sub_script_index++)
   4402 				{
   4403 					base_variable_string += ")";
   4404 				}
   4405 
   4406 				base_variable_string += ";\n";
   4407 			} /* for (int variable_declaration_index = 0; ...) */
   4408 
   4409 			/* Run positive case */
   4410 			{
   4411 				std::string shader_source;
   4412 
   4413 				shader_source = base_variable_string + "\n";
   4414 				shader_source += shader_start + valid_relation_opeartors;
   4415 
   4416 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   4417 
   4418 				EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   4419 			}
   4420 
   4421 			/* Run negative cases */
   4422 			for (size_t string_index = 0;
   4423 				 string_index < sizeof(variable_relation_opeartors) / sizeof(variable_relation_opeartors[0]);
   4424 				 string_index++)
   4425 			{
   4426 				std::string shader_source;
   4427 
   4428 				shader_source = base_variable_string + "\n";
   4429 				shader_source += shader_start + variable_relation_opeartors[string_index];
   4430 
   4431 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   4432 
   4433 				this->execute_negative_test(tested_shader_type, shader_source);
   4434 			} /* for (int string_index = 0; ...) */
   4435 		}	 /* if var_type iterator found */
   4436 		else
   4437 		{
   4438 			TCU_FAIL("Type not found.");
   4439 		}
   4440 	} /* for (int var_type_index = 0; ...) */
   4441 }
   4442 
   4443 /* Generates the shader source code for the InteractionFunctionCalls1
   4444  * array tests, and attempts to compile each test shader, for both
   4445  * vertex and fragment shaders.
   4446  *
   4447  * @tparam API               Tested API descriptor
   4448  *
   4449  * @param tested_shader_type The type of shader that is being tested
   4450  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   4451  */
   4452 template <class API>
   4453 void InteractionFunctionCalls1<API>::test_shader_compilation(
   4454 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   4455 {
   4456 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   4457 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   4458 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   4459 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   4460 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   4461 
   4462 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   4463 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   4464 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   4465 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   4466 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   4467 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   4468 
   4469 	const std::string iteration_loop_end = "                               }\n"
   4470 										   "                           }\n"
   4471 										   "                        }\n"
   4472 										   "                    }\n"
   4473 										   "                }\n"
   4474 										   "            }\n"
   4475 										   "        }\n"
   4476 										   "    }\n";
   4477 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   4478 											 "    {\n"
   4479 											 "        for (uint b = 0u; b < 2u; b++)\n"
   4480 											 "        {\n"
   4481 											 "            for (uint c = 0u; c < 2u; c++)\n"
   4482 											 "            {\n"
   4483 											 "                for (uint d = 0u; d < 2u; d++)\n"
   4484 											 "                {\n"
   4485 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   4486 											 "                    {\n"
   4487 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   4488 											 "                        {\n"
   4489 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   4490 											 "                           {\n"
   4491 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   4492 											 "                               {\n";
   4493 	const glcts::test_var_type* var_types_set = var_types_set_es;
   4494 	size_t						num_var_types = num_var_types_es;
   4495 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   4496 
   4497 	if (API::USE_DOUBLE)
   4498 	{
   4499 		var_types_set = var_types_set_gl;
   4500 		num_var_types = num_var_types_gl;
   4501 	}
   4502 
   4503 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   4504 	{
   4505 		_supported_variable_types_map_const_iterator var_iterator =
   4506 			supported_variable_types_map.find(var_types_set[var_type_index]);
   4507 
   4508 		if (var_iterator != supported_variable_types_map.end())
   4509 		{
   4510 			std::string iterator_declaration = "    " + var_iterator->second.iterator_type +
   4511 											   " iterator = " + var_iterator->second.iterator_initialization + ";\n";
   4512 
   4513 			std::string function_definition;
   4514 			std::string function_use;
   4515 			std::string verification;
   4516 
   4517 			function_definition = "void my_function(out ";
   4518 			function_definition += var_iterator->second.type;
   4519 			function_definition += " output_array[2][2][2][2][2][2][2][2]) {\n";
   4520 			function_definition += iterator_declaration;
   4521 			function_definition += iteration_loop_start;
   4522 			function_definition += "                                   output_array[a][b][c][d][e][f][g][h] = " +
   4523 								   var_iterator->second.variable_type_initializer1 + ";\n";
   4524 			function_definition +=
   4525 				"                                   iterator += " + var_iterator->second.iterator_type + "(1);\n";
   4526 			function_definition += iteration_loop_end;
   4527 			function_definition += "}";
   4528 
   4529 			function_use = "    " + var_iterator->second.type + " my_array[2][2][2][2][2][2][2][2];\n";
   4530 			function_use += "    my_function(my_array);";
   4531 
   4532 			verification = iterator_declaration;
   4533 			verification += "    float result = 1.0;\n";
   4534 			verification += iteration_loop_start;
   4535 			verification += "                                   if (my_array[a][b][c][d][e][f][g][h] " +
   4536 							var_iterator->second.specific_element +
   4537 							" != iterator)\n"
   4538 							"                                   {\n"
   4539 							"                                       result = 0.0;\n"
   4540 							"                                   }\n"
   4541 							"                                   iterator += " +
   4542 							var_iterator->second.iterator_type + "(1);\n";
   4543 			verification += iteration_loop_end;
   4544 
   4545 			if (false == test_compute)
   4546 			{
   4547 				execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   4548 			}
   4549 			else
   4550 			{
   4551 				execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   4552 			}
   4553 
   4554 			/* Deallocate any resources used. */
   4555 			this->delete_objects();
   4556 		} /* if var_type iterator found */
   4557 		else
   4558 		{
   4559 			TCU_FAIL("Type not found.");
   4560 		}
   4561 	} /* for (int var_type_index = 0; ...) */
   4562 }
   4563 
   4564 /** Executes test for compute program
   4565  *
   4566  * @tparam API                Tested API descriptor
   4567  *
   4568  * @param tested_shader_type  The type of shader that is being tested
   4569  * @param function_definition Definition used to prepare shader
   4570  * @param function_use        Snippet that makes use of defined function
   4571  * @param verification        Snippet that verifies results
   4572  **/
   4573 template <class API>
   4574 void InteractionFunctionCalls1<API>::execute_dispatch_test(
   4575 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   4576 	const std::string& function_use, const std::string& verification)
   4577 {
   4578 	const std::string& compute_shader_source =
   4579 		prepare_compute_shader(tested_shader_type, function_definition, function_use, verification);
   4580 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   4581 
   4582 	this->execute_positive_test(empty_string, empty_string, empty_string, empty_string, empty_string,
   4583 								compute_shader_source, false, false);
   4584 
   4585 	/* We are now ready to verify whether the returned size is correct. */
   4586 	unsigned char buffer[4]				= { 0 };
   4587 	glw::GLuint   framebuffer_object_id = 0;
   4588 	glw::GLint	location				= -1;
   4589 	glw::GLuint   texture_object_id		= 0;
   4590 	glw::GLuint   vao_id				= 0;
   4591 
   4592 	gl.useProgram(this->program_object_id);
   4593 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   4594 
   4595 	gl.genTextures(1, &texture_object_id);
   4596 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   4597 
   4598 	gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   4599 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   4600 
   4601 	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   4602 	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   4603 
   4604 	gl.bindImageTexture(0 /* image unit */, texture_object_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */,
   4605 						GL_WRITE_ONLY, GL_RGBA8);
   4606 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture() failed.");
   4607 
   4608 	location = gl.getUniformLocation(this->program_object_id, "uni_image");
   4609 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() failed.");
   4610 
   4611 	if (-1 == location)
   4612 	{
   4613 		TCU_FAIL("Uniform is inactive");
   4614 	}
   4615 
   4616 	gl.uniform1i(location, 0 /* image unit */);
   4617 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i() failed.");
   4618 
   4619 	gl.genVertexArrays(1, &vao_id);
   4620 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   4621 
   4622 	gl.bindVertexArray(vao_id);
   4623 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   4624 
   4625 	gl.dispatchCompute(1, 1, 1);
   4626 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   4627 
   4628 	gl.genFramebuffers(1, &framebuffer_object_id);
   4629 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   4630 
   4631 	gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   4632 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   4633 
   4634 	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   4635 	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   4636 
   4637 	gl.viewport(0, 0, 1, 1);
   4638 	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   4639 
   4640 	gl.readBuffer(GL_COLOR_ATTACHMENT0);
   4641 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadBuffer() failed.");
   4642 
   4643 	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
   4644 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed.");
   4645 
   4646 	if (buffer[0] != 255)
   4647 	{
   4648 		TCU_FAIL("Invalid array size was returned.");
   4649 	}
   4650 
   4651 	/* Delete generated objects. */
   4652 	gl.deleteTextures(1, &texture_object_id);
   4653 	gl.deleteFramebuffers(1, &framebuffer_object_id);
   4654 	gl.deleteVertexArrays(1, &vao_id);
   4655 	GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   4656 }
   4657 
   4658 /** Executes test for draw program
   4659  *
   4660  * @tparam API                Tested API descriptor
   4661  *
   4662  * @param tested_shader_type  The type of shader that is being tested
   4663  * @param function_definition Definition used to prepare shader
   4664  * @param function_use        Snippet that makes use of defined function
   4665  * @param verification        Snippet that verifies results
   4666  **/
   4667 template <class API>
   4668 void InteractionFunctionCalls1<API>::execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
   4669 													   const std::string&						  function_definition,
   4670 													   const std::string& function_use, const std::string& verification)
   4671 {
   4672 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   4673 
   4674 	if (API::USE_ALL_SHADER_STAGES)
   4675 	{
   4676 		const std::string& compute_shader_source = empty_string;
   4677 		const std::string& fragment_shader_source =
   4678 			this->prepare_fragment_shader(tested_shader_type, function_definition, function_use, verification);
   4679 		const std::string& geometry_shader_source =
   4680 			this->prepare_geometry_shader(tested_shader_type, function_definition, function_use, verification);
   4681 		const std::string& tess_ctrl_shader_source =
   4682 			this->prepare_tess_ctrl_shader(tested_shader_type, function_definition, function_use, verification);
   4683 		const std::string& tess_eval_shader_source =
   4684 			this->prepare_tess_eval_shader(tested_shader_type, function_definition, function_use, verification);
   4685 		const std::string& vertex_shader_source =
   4686 			this->prepare_vertex_shader(tested_shader_type, function_definition, function_use, verification);
   4687 
   4688 		switch (tested_shader_type)
   4689 		{
   4690 		case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   4691 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4692 			this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   4693 			break;
   4694 
   4695 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4696 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4697 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   4698 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4699 			this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   4700 										geometry_shader_source, fragment_shader_source, compute_shader_source, false,
   4701 										false);
   4702 			break;
   4703 
   4704 		default:
   4705 			TCU_FAIL("Invalid enum");
   4706 			break;
   4707 		}
   4708 	}
   4709 	else
   4710 	{
   4711 		const std::string& fragment_shader_source =
   4712 			this->prepare_fragment_shader(tested_shader_type, function_definition, function_use, verification);
   4713 		const std::string& vertex_shader_source =
   4714 			this->prepare_vertex_shader(tested_shader_type, function_definition, function_use, verification);
   4715 
   4716 		this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   4717 	}
   4718 
   4719 	/* We are now ready to verify whether the returned size is correct. */
   4720 	unsigned char buffer[4]				= { 0 };
   4721 	glw::GLuint   framebuffer_object_id = 0;
   4722 	glw::GLuint   texture_object_id		= 0;
   4723 	glw::GLuint   vao_id				= 0;
   4724 
   4725 	gl.useProgram(this->program_object_id);
   4726 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   4727 
   4728 	gl.genTextures(1, &texture_object_id);
   4729 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   4730 
   4731 	gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   4732 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   4733 
   4734 	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   4735 	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   4736 
   4737 	gl.genFramebuffers(1, &framebuffer_object_id);
   4738 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   4739 
   4740 	gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   4741 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   4742 
   4743 	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   4744 	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   4745 
   4746 	gl.viewport(0, 0, 1, 1);
   4747 	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   4748 
   4749 	gl.genVertexArrays(1, &vao_id);
   4750 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   4751 
   4752 	gl.bindVertexArray(vao_id);
   4753 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   4754 
   4755 	switch (tested_shader_type)
   4756 	{
   4757 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE: /* Fall through */
   4758 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4759 		gl.drawArrays(GL_TRIANGLE_FAN, 0, 4);
   4760 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   4761 		break;
   4762 
   4763 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   4764 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4765 		/* Tesselation patch set up */
   4766 		gl.patchParameteri(GL_PATCH_VERTICES, 1);
   4767 		GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
   4768 
   4769 		gl.drawArrays(GL_PATCHES, 0, 1);
   4770 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   4771 		break;
   4772 
   4773 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4774 		gl.drawArrays(GL_POINTS, 0, 1);
   4775 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   4776 		break;
   4777 
   4778 	default:
   4779 		TCU_FAIL("Invalid enum");
   4780 		break;
   4781 	}
   4782 
   4783 	gl.readBuffer(GL_COLOR_ATTACHMENT0);
   4784 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadBuffer() failed.");
   4785 
   4786 	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
   4787 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed.");
   4788 
   4789 	if (buffer[0] != 255)
   4790 	{
   4791 		TCU_FAIL("Invalid array size was returned.");
   4792 	}
   4793 
   4794 	/* Delete generated objects. */
   4795 	gl.bindTexture(GL_TEXTURE_2D, 0);
   4796 	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
   4797 	gl.bindVertexArray(0);
   4798 	gl.deleteTextures(1, &texture_object_id);
   4799 	gl.deleteFramebuffers(1, &framebuffer_object_id);
   4800 	gl.deleteVertexArrays(1, &vao_id);
   4801 	GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   4802 }
   4803 
   4804 /** Prepare shader
   4805  *
   4806  * @tparam API                Tested API descriptor
   4807  *
   4808  * @param tested_shader_type  The type of shader that is being tested
   4809  * @param function_definition Definition used to prepare shader
   4810  * @param function_use        Snippet that makes use of defined function
   4811  * @param verification        Snippet that verifies results
   4812  **/
   4813 template <class API>
   4814 std::string InteractionFunctionCalls1<API>::prepare_compute_shader(
   4815 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   4816 	const std::string& function_use, const std::string& verification)
   4817 {
   4818 	std::string compute_shader_source;
   4819 
   4820 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type)
   4821 	{
   4822 		compute_shader_source = "writeonly uniform image2D uni_image;\n"
   4823 								"\n";
   4824 
   4825 		/* User-defined function definition. */
   4826 		compute_shader_source += function_definition;
   4827 		compute_shader_source += "\n\n";
   4828 
   4829 		/* Main function definition. */
   4830 		compute_shader_source += shader_start;
   4831 		compute_shader_source += function_use;
   4832 		compute_shader_source += "\n\n";
   4833 		compute_shader_source += verification;
   4834 		compute_shader_source += "\n\n";
   4835 		compute_shader_source += "\n"
   4836 								 "    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), vec4(result, 0, 0, 0));\n"
   4837 								 "}\n"
   4838 								 "\n";
   4839 	}
   4840 
   4841 	return compute_shader_source;
   4842 }
   4843 
   4844 /** Prepare shader
   4845  *
   4846  * @tparam API                Tested API descriptor
   4847  *
   4848  * @param tested_shader_type  The type of shader that is being tested
   4849  * @param function_definition Definition used to prepare shader
   4850  * @param function_use        Snippet that makes use of defined function
   4851  * @param verification        Snippet that verifies results
   4852  **/
   4853 template <class API>
   4854 std::string InteractionFunctionCalls1<API>::prepare_fragment_shader(
   4855 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   4856 	const std::string& function_use, const std::string& verification)
   4857 {
   4858 	std::string fragment_shader_source;
   4859 
   4860 	switch (tested_shader_type)
   4861 	{
   4862 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4863 		break;
   4864 
   4865 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4866 		fragment_shader_source = "out vec4 colour;\n\n";
   4867 
   4868 		/* User-defined function definition. */
   4869 		fragment_shader_source += function_definition;
   4870 		fragment_shader_source += "\n\n";
   4871 
   4872 		/* Main function definition. */
   4873 		fragment_shader_source += shader_start;
   4874 		fragment_shader_source += function_use;
   4875 		fragment_shader_source += "\n\n";
   4876 		fragment_shader_source += verification;
   4877 		fragment_shader_source += "\n\n";
   4878 		fragment_shader_source += "    colour = vec4(result);\n";
   4879 		fragment_shader_source += shader_end;
   4880 		break;
   4881 
   4882 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4883 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   4884 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4885 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4886 		fragment_shader_source = "in float fs_result;\n\n"
   4887 								 "out vec4 colour;\n\n"
   4888 								 "void main()\n"
   4889 								 "{\n"
   4890 								 "    colour =  vec4(fs_result);\n"
   4891 								 "}\n"
   4892 								 "\n";
   4893 		break;
   4894 
   4895 	default:
   4896 		TCU_FAIL("Unrecognized shader object type.");
   4897 		break;
   4898 	}
   4899 
   4900 	return fragment_shader_source;
   4901 }
   4902 
   4903 /** Prepare shader
   4904  *
   4905  * @tparam API                Tested API descriptor
   4906  *
   4907  * @param tested_shader_type  The type of shader that is being tested
   4908  * @param function_definition Definition used to prepare shader
   4909  * @param function_use        Snippet that makes use of defined function
   4910  * @param verification        Snippet that verifies results
   4911  **/
   4912 template <class API>
   4913 std::string InteractionFunctionCalls1<API>::prepare_geometry_shader(
   4914 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   4915 	const std::string& function_use, const std::string& verification)
   4916 {
   4917 	std::string geometry_shader_source;
   4918 
   4919 	switch (tested_shader_type)
   4920 	{
   4921 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   4922 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   4923 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   4924 		break;
   4925 
   4926 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   4927 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   4928 		geometry_shader_source = "layout(points)                           in;\n"
   4929 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   4930 								 "\n"
   4931 								 "in  float tes_result[];\n"
   4932 								 "out float fs_result;\n"
   4933 								 "\n"
   4934 								 "void main()\n"
   4935 								 "{\n"
   4936 								 "    gl_Position  = vec4(-1, -1, 0, 1);\n"
   4937 								 "    fs_result    = tes_result[0];\n"
   4938 								 "    EmitVertex();\n"
   4939 								 "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   4940 								 "    fs_result    = tes_result[0];\n"
   4941 								 "    EmitVertex();\n"
   4942 								 "    gl_Position  = vec4(1, -1, 0, 1);\n"
   4943 								 "    fs_result    = tes_result[0];\n"
   4944 								 "    EmitVertex();\n"
   4945 								 "    gl_Position  = vec4(1, 1, 0, 1);\n"
   4946 								 "    fs_result    = tes_result[0];\n"
   4947 								 "    EmitVertex();\n"
   4948 								 "}\n";
   4949 		break;
   4950 
   4951 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   4952 		geometry_shader_source = "layout(points)                           in;\n"
   4953 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   4954 								 "\n"
   4955 								 "out float fs_result;\n"
   4956 								 "\n";
   4957 
   4958 		/* User-defined function definition. */
   4959 		geometry_shader_source += function_definition;
   4960 		geometry_shader_source += "\n\n";
   4961 
   4962 		/* Main function definition. */
   4963 		geometry_shader_source += shader_start;
   4964 		geometry_shader_source += function_use;
   4965 		geometry_shader_source += "\n\n";
   4966 		geometry_shader_source += verification;
   4967 		geometry_shader_source += "\n\n";
   4968 		geometry_shader_source += "\n    gl_Position  = vec4(-1, -1, 0, 1);\n"
   4969 								  "    fs_result    = result;\n"
   4970 								  "    EmitVertex();\n"
   4971 								  "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   4972 								  "    fs_result    = result;\n"
   4973 								  "    EmitVertex();\n"
   4974 								  "    gl_Position  = vec4(1, -1, 0, 1);\n"
   4975 								  "    fs_result    = result;\n"
   4976 								  "    EmitVertex();\n"
   4977 								  "    gl_Position  = vec4(1, 1, 0, 1);\n"
   4978 								  "    fs_result    = result;\n"
   4979 								  "    EmitVertex();\n"
   4980 								  "}\n";
   4981 		break;
   4982 
   4983 	default:
   4984 		TCU_FAIL("Unrecognized shader object type.");
   4985 		break;
   4986 	}
   4987 
   4988 	return geometry_shader_source;
   4989 }
   4990 
   4991 /** Prepare shader
   4992  *
   4993  * @tparam API                Tested API descriptor
   4994  *
   4995  * @param tested_shader_type  The type of shader that is being tested
   4996  * @param function_definition Definition used to prepare shader
   4997  * @param function_use        Snippet that makes use of defined function
   4998  * @param verification        Snippet that verifies results
   4999  **/
   5000 template <class API>
   5001 std::string InteractionFunctionCalls1<API>::prepare_tess_ctrl_shader(
   5002 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   5003 	const std::string& function_use, const std::string& verification)
   5004 {
   5005 	std::string tess_ctrl_shader_source;
   5006 
   5007 	switch (tested_shader_type)
   5008 	{
   5009 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   5010 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   5011 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   5012 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   5013 		break;
   5014 
   5015 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   5016 		tess_ctrl_shader_source = "layout(vertices = 1) out;\n"
   5017 								  "\n"
   5018 								  "out float tcs_result[];\n"
   5019 								  "\n";
   5020 
   5021 		/* User-defined function definition. */
   5022 		tess_ctrl_shader_source += function_definition;
   5023 		tess_ctrl_shader_source += "\n\n";
   5024 
   5025 		/* Main function definition. */
   5026 		tess_ctrl_shader_source += shader_start;
   5027 		tess_ctrl_shader_source += function_use;
   5028 		tess_ctrl_shader_source += "\n\n";
   5029 		tess_ctrl_shader_source += verification;
   5030 		tess_ctrl_shader_source += "\n\n";
   5031 		tess_ctrl_shader_source += "    tcs_result[gl_InvocationID] = result;\n"
   5032 								   "\n"
   5033 								   "    gl_TessLevelOuter[0] = 1.0;\n"
   5034 								   "    gl_TessLevelOuter[1] = 1.0;\n"
   5035 								   "    gl_TessLevelOuter[2] = 1.0;\n"
   5036 								   "    gl_TessLevelOuter[3] = 1.0;\n"
   5037 								   "    gl_TessLevelInner[0] = 1.0;\n"
   5038 								   "    gl_TessLevelInner[1] = 1.0;\n"
   5039 								   "}\n";
   5040 		break;
   5041 
   5042 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   5043 		tess_ctrl_shader_source = default_tc_shader_source;
   5044 		break;
   5045 
   5046 	default:
   5047 		TCU_FAIL("Unrecognized shader object type.");
   5048 		break;
   5049 	}
   5050 
   5051 	return tess_ctrl_shader_source;
   5052 }
   5053 
   5054 /** Prepare shader
   5055  *
   5056  * @tparam API                Tested API descriptor
   5057  *
   5058  * @param tested_shader_type  The type of shader that is being tested
   5059  * @param function_definition Definition used to prepare shader
   5060  * @param function_use        Snippet that makes use of defined function
   5061  * @param verification        Snippet that verifies results
   5062  **/
   5063 template <class API>
   5064 std::string InteractionFunctionCalls1<API>::prepare_tess_eval_shader(
   5065 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   5066 	const std::string& function_use, const std::string& verification)
   5067 {
   5068 	std::string tess_eval_shader_source;
   5069 
   5070 	switch (tested_shader_type)
   5071 	{
   5072 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   5073 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   5074 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   5075 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   5076 		break;
   5077 
   5078 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   5079 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   5080 								  "\n"
   5081 								  "in  float tcs_result[];\n"
   5082 								  "out float tes_result;\n"
   5083 								  "\n"
   5084 								  "void main()\n"
   5085 								  "{\n"
   5086 								  "    tes_result = tcs_result[0];\n"
   5087 								  "}\n";
   5088 		break;
   5089 
   5090 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   5091 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   5092 								  "\n"
   5093 								  "out float tes_result;\n"
   5094 								  "\n";
   5095 
   5096 		/* User-defined function definition. */
   5097 		tess_eval_shader_source += function_definition;
   5098 		tess_eval_shader_source += "\n\n";
   5099 
   5100 		/* Main function definition. */
   5101 		tess_eval_shader_source += shader_start;
   5102 		tess_eval_shader_source += function_use;
   5103 		tess_eval_shader_source += "\n\n";
   5104 		tess_eval_shader_source += verification;
   5105 		tess_eval_shader_source += "\n\n";
   5106 		tess_eval_shader_source += "    tes_result = result;\n"
   5107 								   "}\n";
   5108 		break;
   5109 
   5110 	default:
   5111 		TCU_FAIL("Unrecognized shader object type.");
   5112 		break;
   5113 	}
   5114 
   5115 	return tess_eval_shader_source;
   5116 }
   5117 
   5118 /** Prepare shader
   5119  *
   5120  * @tparam API                Tested API descriptor
   5121  *
   5122  * @param tested_shader_type  The type of shader that is being tested
   5123  * @param function_definition Definition used to prepare shader
   5124  * @param function_use        Snippet that makes use of defined function
   5125  * @param verification        Snippet that verifies results
   5126  **/
   5127 template <class API>
   5128 std::string InteractionFunctionCalls1<API>::prepare_vertex_shader(
   5129 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   5130 	const std::string& function_use, const std::string& verification)
   5131 {
   5132 	std::string vertex_shader_source;
   5133 
   5134 	switch (tested_shader_type)
   5135 	{
   5136 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   5137 		break;
   5138 
   5139 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   5140 		vertex_shader_source = "/** GL_TRIANGLE_FAN-type quad vertex data. */\n"
   5141 							   "const vec4 vertex_positions[4] = vec4[4](vec4( 1.0, -1.0, 0.0, 1.0),\n"
   5142 							   "                                         vec4(-1.0, -1.0, 0.0, 1.0),\n"
   5143 							   "                                         vec4(-1.0,  1.0, 0.0, 1.0),\n"
   5144 							   "                                         vec4( 1.0,  1.0, 0.0, 1.0) );\n"
   5145 							   "\n"
   5146 							   "void main()\n"
   5147 							   "{\n"
   5148 							   "    gl_Position = vertex_positions[gl_VertexID];"
   5149 							   "}\n\n";
   5150 		break;
   5151 
   5152 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   5153 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   5154 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   5155 		vertex_shader_source = default_vertex_shader_source;
   5156 		break;
   5157 
   5158 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   5159 		/* Vertex shader source. */
   5160 		vertex_shader_source = "out float fs_result;\n\n";
   5161 		vertex_shader_source += "/** GL_TRIANGLE_FAN-type quad vertex data. */\n"
   5162 								"const vec4 vertex_positions[4] = vec4[4](vec4( 1.0, -1.0, 0.0, 1.0),\n"
   5163 								"                                         vec4(-1.0, -1.0, 0.0, 1.0),\n"
   5164 								"                                         vec4(-1.0,  1.0, 0.0, 1.0),\n"
   5165 								"                                         vec4( 1.0,  1.0, 0.0, 1.0) );\n\n";
   5166 
   5167 		/* User-defined function definition. */
   5168 		vertex_shader_source += function_definition;
   5169 		vertex_shader_source += "\n\n";
   5170 
   5171 		/* Main function definition. */
   5172 		vertex_shader_source += shader_start;
   5173 		vertex_shader_source += function_use;
   5174 		vertex_shader_source += "\n\n";
   5175 		vertex_shader_source += verification;
   5176 		vertex_shader_source += "\n\n";
   5177 		vertex_shader_source += "    fs_result   = result;\n"
   5178 								"    gl_Position = vertex_positions[gl_VertexID];\n";
   5179 		vertex_shader_source += shader_end;
   5180 		break;
   5181 
   5182 	default:
   5183 		TCU_FAIL("Unrecognized shader object type.");
   5184 		break;
   5185 	}
   5186 
   5187 	return vertex_shader_source;
   5188 }
   5189 
   5190 /* Generates the shader source code for the InteractionFunctionCalls2
   5191  * array tests, and attempts to compile each test shader, for both
   5192  * vertex and fragment shaders.
   5193  *
   5194  * @tparam API               Tested API descriptor
   5195  *
   5196  * @param tested_shader_type The type of shader that is being tested
   5197  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5198  */
   5199 template <class API>
   5200 void InteractionFunctionCalls2<API>::test_shader_compilation(
   5201 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   5202 {
   5203 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   5204 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   5205 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   5206 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   5207 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   5208 
   5209 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   5210 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   5211 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   5212 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   5213 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   5214 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   5215 
   5216 	const std::string iteration_loop_end = "                               }\n"
   5217 										   "                           }\n"
   5218 										   "                        }\n"
   5219 										   "                    }\n"
   5220 										   "                }\n"
   5221 										   "            }\n"
   5222 										   "        }\n"
   5223 										   "    }\n";
   5224 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   5225 											 "    {\n"
   5226 											 "        for (uint b = 0u; b < 2u; b++)\n"
   5227 											 "        {\n"
   5228 											 "            for (uint c = 0u; c < 2u; c++)\n"
   5229 											 "            {\n"
   5230 											 "                for (uint d = 0u; d < 2u; d++)\n"
   5231 											 "                {\n"
   5232 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   5233 											 "                    {\n"
   5234 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   5235 											 "                        {\n"
   5236 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   5237 											 "                           {\n"
   5238 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   5239 											 "                               {\n";
   5240 	const std::string multiplier_array = "const int[] multiplier_array = int[]( 1,  2,  3,  4,  5,  6,  7,  8,\n"
   5241 										 "                                     11, 12, 13, 14, 15, 16, 17, 18,\n"
   5242 										 "                                     21, 22, 23, 24, 25, 26, 27, 28,\n"
   5243 										 "                                     31, 32, 33, 34, 35, 36, 37, 38,\n"
   5244 										 "                                     41, 42, 43, 44, 45, 46, 47, 48,\n"
   5245 										 "                                     51, 52, 53, 54, 55, 56, 57, 58,\n"
   5246 										 "                                     61, 62, 63, 64, 65, 66, 67, 68,\n"
   5247 										 "                                     71, 72, 73, 74, 75, 76, 77, 78,\n"
   5248 										 "                                     81, 82, 83, 84, 85, 86, 87, 88);\n";
   5249 	const glcts::test_var_type* var_types_set = var_types_set_es;
   5250 	size_t						num_var_types = num_var_types_es;
   5251 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   5252 
   5253 	if (API::USE_DOUBLE)
   5254 	{
   5255 		var_types_set = var_types_set_gl;
   5256 		num_var_types = num_var_types_gl;
   5257 	}
   5258 
   5259 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   5260 	{
   5261 		_supported_variable_types_map_const_iterator var_iterator =
   5262 			supported_variable_types_map.find(var_types_set[var_type_index]);
   5263 
   5264 		if (var_iterator != supported_variable_types_map.end())
   5265 		{
   5266 			std::string function_definition;
   5267 			std::string function_use;
   5268 			std::string verification;
   5269 
   5270 			function_definition += multiplier_array;
   5271 			function_definition += "void my_function(inout ";
   5272 			function_definition += var_iterator->second.type;
   5273 			function_definition += " inout_array[2][2][2][2][2][2][2][2]) {\n"
   5274 								   "    uint i = 0u;\n";
   5275 			function_definition += iteration_loop_start;
   5276 			function_definition += "                                   inout_array[a][b][c][d][e][f][g][h] *= " +
   5277 								   var_iterator->second.iterator_type + "(multiplier_array[i % 64u]);\n";
   5278 			function_definition += "                                   i+= 1u;\n";
   5279 			function_definition += iteration_loop_end;
   5280 			function_definition += "}";
   5281 
   5282 			function_use += "    float result = 1.0;\n";
   5283 			function_use += "    uint iterator = 0u;\n";
   5284 			function_use += "    " + var_iterator->second.type + " my_array[2][2][2][2][2][2][2][2];\n";
   5285 			function_use += iteration_loop_start;
   5286 			function_use += "                                   my_array[a][b][c][d][e][f][g][h] = " +
   5287 							var_iterator->second.variable_type_initializer2 + ";\n";
   5288 			function_use += iteration_loop_end;
   5289 			function_use += "    my_function(my_array);";
   5290 
   5291 			verification += iteration_loop_start;
   5292 			verification += "                                   if (my_array[a][b][c][d][e][f][g][h] " +
   5293 							var_iterator->second.specific_element + "!= " + var_iterator->second.iterator_type +
   5294 							"(multiplier_array[iterator % 64u]))\n"
   5295 							"                                   {\n"
   5296 							"                                       result = 0.0;\n"
   5297 							"                                   }\n"
   5298 							"                                   iterator += 1u;\n";
   5299 			verification += iteration_loop_end;
   5300 
   5301 			if (false == test_compute)
   5302 			{
   5303 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   5304 			}
   5305 			else
   5306 			{
   5307 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   5308 			}
   5309 
   5310 			/* Deallocate any resources used. */
   5311 			this->delete_objects();
   5312 		} /* if var_type iterator found */
   5313 		else
   5314 		{
   5315 			TCU_FAIL("Type not found.");
   5316 		}
   5317 	} /* for (int var_type_index = 0; ...) */
   5318 }
   5319 
   5320 /* Generates the shader source code for the InteractionArgumentAliasing1
   5321  * array tests, and attempts to compile each test shader, for both
   5322  * vertex and fragment shaders.
   5323  *
   5324  * @tparam API               Tested API descriptor
   5325  *
   5326  * @param tested_shader_type The type of shader that is being tested
   5327  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5328  */
   5329 template <class API>
   5330 void InteractionArgumentAliasing1<API>::test_shader_compilation(
   5331 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   5332 {
   5333 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   5334 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   5335 
   5336 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   5337 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   5338 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   5339 
   5340 	const std::string iteration_loop_end = "                               }\n"
   5341 										   "                           }\n"
   5342 										   "                        }\n"
   5343 										   "                    }\n"
   5344 										   "                }\n"
   5345 										   "            }\n"
   5346 										   "        }\n"
   5347 										   "    }\n";
   5348 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   5349 											 "    {\n"
   5350 											 "        for (uint b = 0u; b < 2u; b++)\n"
   5351 											 "        {\n"
   5352 											 "            for (uint c = 0u; c < 2u; c++)\n"
   5353 											 "            {\n"
   5354 											 "                for (uint d = 0u; d < 2u; d++)\n"
   5355 											 "                {\n"
   5356 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   5357 											 "                    {\n"
   5358 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   5359 											 "                        {\n"
   5360 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   5361 											 "                           {\n"
   5362 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   5363 											 "                               {\n";
   5364 	const glcts::test_var_type* var_types_set = var_types_set_es;
   5365 	size_t						num_var_types = num_var_types_es;
   5366 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   5367 
   5368 	if (API::USE_DOUBLE)
   5369 	{
   5370 		var_types_set = var_types_set_gl;
   5371 		num_var_types = num_var_types_gl;
   5372 	}
   5373 
   5374 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   5375 	{
   5376 		_supported_variable_types_map_const_iterator var_iterator =
   5377 			supported_variable_types_map.find(var_types_set[var_type_index]);
   5378 
   5379 		if (var_iterator != supported_variable_types_map.end())
   5380 		{
   5381 			std::string array_declaration = var_iterator->second.type + " z[2][2][2][2][2][2][2][2];\n\n";
   5382 
   5383 			std::string function_definition;
   5384 			std::string function_use;
   5385 			std::string verification;
   5386 
   5387 			function_definition += "bool gfunc(" + var_iterator->second.type + " x[2][2][2][2][2][2][2][2], ";
   5388 			function_definition += var_iterator->second.type + " y[2][2][2][2][2][2][2][2])\n";
   5389 			function_definition += "{\n";
   5390 			function_definition += "    " + iteration_loop_start;
   5391 			function_definition +=
   5392 				"                               x[a][b][c][d][e][f][g][h] = " + var_iterator->second.type + "(123);\n";
   5393 			function_definition += "    " + iteration_loop_end;
   5394 			function_definition += "\n";
   5395 			function_definition += "    " + iteration_loop_start;
   5396 			function_definition += "                                   if(y[a][b][c][d][e][f][g][h]";
   5397 			if (var_iterator->second.type == "mat4") // mat4 comparison
   5398 			{
   5399 				function_definition += "[0][0]";
   5400 				function_definition += " != float";
   5401 			}
   5402 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   5403 			{
   5404 				function_definition += "[0][0]";
   5405 				function_definition += " != double";
   5406 			}
   5407 			else
   5408 			{
   5409 				function_definition += " != ";
   5410 				function_definition += var_iterator->second.type;
   5411 			}
   5412 			function_definition += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h))) {return false;}\n";
   5413 			function_definition += "    " + iteration_loop_end;
   5414 			function_definition += "  return true;\n";
   5415 			function_definition += "}";
   5416 
   5417 			function_use += "    " + array_declaration;
   5418 			function_use += "    " + iteration_loop_start;
   5419 			function_use += "                                   z[a][b][c][d][e][f][g][h] = ";
   5420 			function_use += var_iterator->second.type;
   5421 			function_use += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h));\n";
   5422 			function_use += "    " + iteration_loop_end;
   5423 
   5424 			verification += "    float result = 0.0;\n";
   5425 			verification += "    if(gfunc(z, z) == true)\n";
   5426 			verification += "    {\n";
   5427 			verification += "        result = 1.0;\n\n";
   5428 			verification += "    }\n";
   5429 			verification += "    else\n";
   5430 			verification += "    {\n";
   5431 			verification += "        result = 0.0;\n\n";
   5432 			verification += "    }\n";
   5433 
   5434 			if (false == test_compute)
   5435 			{
   5436 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   5437 			}
   5438 			else
   5439 			{
   5440 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   5441 			}
   5442 
   5443 			/* Deallocate any resources used. */
   5444 			this->delete_objects();
   5445 		} /* if var_type iterator found */
   5446 		else
   5447 		{
   5448 			TCU_FAIL("Type not found.");
   5449 		}
   5450 	}
   5451 }
   5452 
   5453 /* Generates the shader source code for the InteractionArgumentAliasing2
   5454  * array tests, and attempts to compile each test shader, for both
   5455  * vertex and fragment shaders.
   5456  *
   5457  * @tparam API               Tested API descriptor
   5458  *
   5459  * @param tested_shader_type The type of shader that is being tested
   5460  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5461  */
   5462 template <class API>
   5463 void InteractionArgumentAliasing2<API>::test_shader_compilation(
   5464 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   5465 {
   5466 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   5467 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   5468 
   5469 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   5470 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   5471 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   5472 
   5473 	const std::string iteration_loop_end = "                               }\n"
   5474 										   "                           }\n"
   5475 										   "                        }\n"
   5476 										   "                    }\n"
   5477 										   "                }\n"
   5478 										   "            }\n"
   5479 										   "        }\n"
   5480 										   "    }\n";
   5481 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   5482 											 "    {\n"
   5483 											 "        for (uint b = 0u; b < 2u; b++)\n"
   5484 											 "        {\n"
   5485 											 "            for (uint c = 0u; c < 2u; c++)\n"
   5486 											 "            {\n"
   5487 											 "                for (uint d = 0u; d < 2u; d++)\n"
   5488 											 "                {\n"
   5489 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   5490 											 "                    {\n"
   5491 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   5492 											 "                        {\n"
   5493 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   5494 											 "                           {\n"
   5495 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   5496 											 "                               {\n";
   5497 	const glcts::test_var_type* var_types_set = var_types_set_es;
   5498 	size_t						num_var_types = num_var_types_es;
   5499 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   5500 
   5501 	if (API::USE_DOUBLE)
   5502 	{
   5503 		var_types_set = var_types_set_gl;
   5504 		num_var_types = num_var_types_gl;
   5505 	}
   5506 
   5507 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   5508 	{
   5509 		_supported_variable_types_map_const_iterator var_iterator =
   5510 			supported_variable_types_map.find(var_types_set[var_type_index]);
   5511 
   5512 		if (var_iterator != supported_variable_types_map.end())
   5513 		{
   5514 			std::string array_declaration = var_iterator->second.type + " z[2][2][2][2][2][2][2][2];\n\n";
   5515 
   5516 			std::string function_definition;
   5517 			std::string function_use;
   5518 			std::string verification;
   5519 
   5520 			function_definition += "bool gfunc(" + var_iterator->second.type + " x[2][2][2][2][2][2][2][2], ";
   5521 			function_definition += var_iterator->second.type + " y[2][2][2][2][2][2][2][2])\n";
   5522 			function_definition += "{\n";
   5523 			function_definition += "    " + iteration_loop_start;
   5524 			function_definition +=
   5525 				"                                   y[a][b][c][d][e][f][g][h] = " + var_iterator->second.type +
   5526 				"(123);\n";
   5527 			function_definition += "    " + iteration_loop_end;
   5528 			function_definition += "\n";
   5529 			function_definition += "    " + iteration_loop_start;
   5530 			function_definition += "                                   if(x[a][b][c][d][e][f][g][h]";
   5531 			if (var_iterator->second.type == "mat4") // mat4 comparison
   5532 			{
   5533 				function_definition += "[0][0]";
   5534 				function_definition += " != float";
   5535 			}
   5536 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   5537 			{
   5538 				function_definition += "[0][0]";
   5539 				function_definition += " != double";
   5540 			}
   5541 			else
   5542 			{
   5543 				function_definition += " != ";
   5544 				function_definition += var_iterator->second.type;
   5545 			}
   5546 			function_definition += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h))) {return false;}\n";
   5547 			function_definition += "    " + iteration_loop_end;
   5548 			function_definition += "  return true;\n";
   5549 			function_definition += "}";
   5550 
   5551 			function_use += "    " + array_declaration;
   5552 			function_use += "    " + iteration_loop_start;
   5553 			function_use += "                                   z[a][b][c][d][e][f][g][h] = ";
   5554 			function_use += var_iterator->second.type;
   5555 			function_use += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h));\n";
   5556 			function_use += "    " + iteration_loop_end;
   5557 
   5558 			verification += "    float result = 0.0;\n";
   5559 			verification += "    if(gfunc(z, z) == true)\n";
   5560 			verification += "    {\n";
   5561 			verification += "        result = 1.0;\n\n";
   5562 			verification += "    }\n";
   5563 			verification += "    else\n";
   5564 			verification += "    {\n";
   5565 			verification += "        result = 0.0;\n\n";
   5566 			verification += "    }\n";
   5567 
   5568 			if (false == test_compute)
   5569 			{
   5570 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   5571 			}
   5572 			else
   5573 			{
   5574 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   5575 			}
   5576 
   5577 			/* Deallocate any resources used. */
   5578 			this->delete_objects();
   5579 		} /* if var_type iterator found */
   5580 		else
   5581 		{
   5582 			TCU_FAIL("Type not found.");
   5583 		}
   5584 	}
   5585 }
   5586 
   5587 /* Generates the shader source code for the InteractionArgumentAliasing3
   5588  * array tests, and attempts to compile each test shader, for both
   5589  * vertex and fragment shaders.
   5590  *
   5591  * @tparam API               Tested API descriptor
   5592  *
   5593  * @param tested_shader_type The type of shader that is being tested
   5594  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5595  */
   5596 template <class API>
   5597 void InteractionArgumentAliasing3<API>::test_shader_compilation(
   5598 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   5599 {
   5600 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   5601 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   5602 
   5603 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   5604 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   5605 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   5606 
   5607 	const std::string iteration_loop_end = "                               }\n"
   5608 										   "                           }\n"
   5609 										   "                        }\n"
   5610 										   "                    }\n"
   5611 										   "                }\n"
   5612 										   "            }\n"
   5613 										   "        }\n"
   5614 										   "    }\n";
   5615 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   5616 											 "    {\n"
   5617 											 "        for (uint b = 0u; b < 2u; b++)\n"
   5618 											 "        {\n"
   5619 											 "            for (uint c = 0u; c < 2u; c++)\n"
   5620 											 "            {\n"
   5621 											 "                for (uint d = 0u; d < 2u; d++)\n"
   5622 											 "                {\n"
   5623 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   5624 											 "                    {\n"
   5625 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   5626 											 "                        {\n"
   5627 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   5628 											 "                           {\n"
   5629 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   5630 											 "                               {\n";
   5631 	const glcts::test_var_type* var_types_set = var_types_set_es;
   5632 	size_t						num_var_types = num_var_types_es;
   5633 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   5634 
   5635 	if (API::USE_DOUBLE)
   5636 	{
   5637 		var_types_set = var_types_set_gl;
   5638 		num_var_types = num_var_types_gl;
   5639 	}
   5640 
   5641 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   5642 	{
   5643 		_supported_variable_types_map_const_iterator var_iterator =
   5644 			supported_variable_types_map.find(var_types_set[var_type_index]);
   5645 
   5646 		if (var_iterator != supported_variable_types_map.end())
   5647 		{
   5648 			std::string array_declaration = var_iterator->second.type + " z[2][2][2][2][2][2][2][2];\n\n";
   5649 
   5650 			std::string function_definition;
   5651 			std::string function_use;
   5652 			std::string verification;
   5653 
   5654 			function_definition += "bool gfunc(out " + var_iterator->second.type + " x[2][2][2][2][2][2][2][2], ";
   5655 			function_definition += var_iterator->second.type + " y[2][2][2][2][2][2][2][2])\n";
   5656 			function_definition += "{\n";
   5657 			function_definition += "    " + iteration_loop_start;
   5658 			function_definition +=
   5659 				"                                   x[a][b][c][d][e][f][g][h] = " + var_iterator->second.type +
   5660 				"(123);\n";
   5661 			function_definition += "    " + iteration_loop_end;
   5662 			function_definition += "\n";
   5663 			function_definition += "    " + iteration_loop_start;
   5664 			function_definition += "                                   if(y[a][b][c][d][e][f][g][h]";
   5665 			if (var_iterator->second.type == "mat4") // mat4 comparison
   5666 			{
   5667 				function_definition += "[0][0]";
   5668 				function_definition += " != float";
   5669 			}
   5670 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   5671 			{
   5672 				function_definition += "[0][0]";
   5673 				function_definition += " != double";
   5674 			}
   5675 			else
   5676 			{
   5677 				function_definition += " != ";
   5678 				function_definition += var_iterator->second.type;
   5679 			}
   5680 			function_definition += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h))) {return false;}\n";
   5681 			function_definition += "    " + iteration_loop_end;
   5682 			function_definition += "  return true;\n";
   5683 			function_definition += "}\n\n";
   5684 
   5685 			function_use += "    " + array_declaration;
   5686 			function_use += "    " + iteration_loop_start;
   5687 			function_use += "                                   z[a][b][c][d][e][f][g][h] = ";
   5688 			function_use += var_iterator->second.type;
   5689 			function_use += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h));\n";
   5690 			function_use += "    " + iteration_loop_end;
   5691 
   5692 			verification += "    float result = 0.0;\n";
   5693 			verification += "    if(gfunc(z, z) == true)\n";
   5694 			verification += "    {\n";
   5695 			verification += "        result = 1.0;\n\n";
   5696 			verification += "    }\n";
   5697 			verification += "    else\n";
   5698 			verification += "    {\n";
   5699 			verification += "        result = 0.0;\n\n";
   5700 			verification += "    }\n";
   5701 
   5702 			if (false == test_compute)
   5703 			{
   5704 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   5705 			}
   5706 			else
   5707 			{
   5708 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   5709 			}
   5710 
   5711 			/* Deallocate any resources used. */
   5712 			this->delete_objects();
   5713 		} /* if var_type iterator found */
   5714 		else
   5715 		{
   5716 			TCU_FAIL("Type not found.");
   5717 		}
   5718 	}
   5719 }
   5720 
   5721 /* Generates the shader source code for the InteractionArgumentAliasing4
   5722  * array tests, and attempts to compile each test shader, for both
   5723  * vertex and fragment shaders.
   5724  *
   5725  * @tparam API               Tested API descriptor
   5726  *
   5727  * @param tested_shader_type The type of shader that is being tested
   5728  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5729  */
   5730 template <class API>
   5731 void InteractionArgumentAliasing4<API>::test_shader_compilation(
   5732 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   5733 {
   5734 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   5735 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   5736 
   5737 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   5738 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   5739 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   5740 
   5741 	const std::string iteration_loop_end = "                               }\n"
   5742 										   "                           }\n"
   5743 										   "                        }\n"
   5744 										   "                    }\n"
   5745 										   "                }\n"
   5746 										   "            }\n"
   5747 										   "        }\n"
   5748 										   "    }\n";
   5749 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   5750 											 "    {\n"
   5751 											 "        for (uint b = 0u; b < 2u; b++)\n"
   5752 											 "        {\n"
   5753 											 "            for (uint c = 0u; c < 2u; c++)\n"
   5754 											 "            {\n"
   5755 											 "                for (uint d = 0u; d < 2u; d++)\n"
   5756 											 "                {\n"
   5757 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   5758 											 "                    {\n"
   5759 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   5760 											 "                        {\n"
   5761 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   5762 											 "                           {\n"
   5763 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   5764 											 "                               {\n";
   5765 	const glcts::test_var_type* var_types_set = var_types_set_es;
   5766 	size_t						num_var_types = num_var_types_es;
   5767 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   5768 
   5769 	if (API::USE_DOUBLE)
   5770 	{
   5771 		var_types_set = var_types_set_gl;
   5772 		num_var_types = num_var_types_gl;
   5773 	}
   5774 
   5775 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   5776 	{
   5777 		_supported_variable_types_map_const_iterator var_iterator =
   5778 			supported_variable_types_map.find(var_types_set[var_type_index]);
   5779 
   5780 		if (var_iterator != supported_variable_types_map.end())
   5781 		{
   5782 			std::string array_declaration = var_iterator->second.type + "[2][2][2][2][2][2][2][2] z;\n\n";
   5783 
   5784 			std::string function_definition;
   5785 			std::string function_use;
   5786 			std::string verification;
   5787 
   5788 			function_definition += "bool gfunc(" + var_iterator->second.type + " x[2][2][2][2][2][2][2][2], ";
   5789 			function_definition += "out " + var_iterator->second.type + " y[2][2][2][2][2][2][2][2])\n";
   5790 			function_definition += "{\n";
   5791 			function_definition += "    " + iteration_loop_start;
   5792 			function_definition +=
   5793 				"                                   y[a][b][c][d][e][f][g][h] = " + var_iterator->second.type +
   5794 				"(123);\n";
   5795 			function_definition += "    " + iteration_loop_end;
   5796 			function_definition += "\n";
   5797 			function_definition += "    " + iteration_loop_start;
   5798 			function_definition += "                                   if(x[a][b][c][d][e][f][g][h]";
   5799 			if (var_iterator->second.type == "mat4") // mat4 comparison
   5800 			{
   5801 				function_definition += "[0][0]";
   5802 				function_definition += " != float";
   5803 			}
   5804 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   5805 			{
   5806 				function_definition += "[0][0]";
   5807 				function_definition += " != double";
   5808 			}
   5809 			else
   5810 			{
   5811 				function_definition += " != ";
   5812 				function_definition += var_iterator->second.type;
   5813 			}
   5814 			function_definition += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h))) {return false;}\n";
   5815 			function_definition += "    " + iteration_loop_end;
   5816 			function_definition += "  return true;\n";
   5817 			function_definition += "}\n\n";
   5818 
   5819 			function_use += "    " + array_declaration;
   5820 			function_use += "    " + iteration_loop_start;
   5821 			function_use += "                                   z[a][b][c][d][e][f][g][h] = ";
   5822 			function_use += var_iterator->second.type;
   5823 			function_use += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h));\n";
   5824 			function_use += "    " + iteration_loop_end;
   5825 
   5826 			verification += "    float result = 0.0;\n";
   5827 			verification += "    if(gfunc(z, z) == true)\n";
   5828 			verification += "    {\n";
   5829 			verification += "        result = 1.0;\n\n";
   5830 			verification += "    }\n";
   5831 			verification += "    else\n";
   5832 			verification += "    {\n";
   5833 			verification += "        result = 0.0;\n\n";
   5834 			verification += "    }\n";
   5835 
   5836 			if (false == test_compute)
   5837 			{
   5838 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   5839 			}
   5840 			else
   5841 			{
   5842 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   5843 			}
   5844 
   5845 			/* Deallocate any resources used. */
   5846 			this->delete_objects();
   5847 		} /* if var_type iterator found */
   5848 		else
   5849 		{
   5850 			TCU_FAIL("Type not found.");
   5851 		}
   5852 	}
   5853 }
   5854 
   5855 /* Generates the shader source code for the InteractionArgumentAliasing3
   5856  * array tests, and attempts to compile each test shader, for both
   5857  * vertex and fragment shaders.
   5858  *
   5859  * @tparam API               Tested API descriptor
   5860  *
   5861  * @param tested_shader_type The type of shader that is being tested
   5862  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5863  */
   5864 template <class API>
   5865 void InteractionArgumentAliasing5<API>::test_shader_compilation(
   5866 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   5867 {
   5868 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   5869 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   5870 
   5871 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   5872 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   5873 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   5874 
   5875 	const std::string iteration_loop_end = "                               }\n"
   5876 										   "                           }\n"
   5877 										   "                        }\n"
   5878 										   "                    }\n"
   5879 										   "                }\n"
   5880 										   "            }\n"
   5881 										   "        }\n"
   5882 										   "    }\n";
   5883 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   5884 											 "    {\n"
   5885 											 "        for (uint b = 0u; b < 2u; b++)\n"
   5886 											 "        {\n"
   5887 											 "            for (uint c = 0u; c < 2u; c++)\n"
   5888 											 "            {\n"
   5889 											 "                for (uint d = 0u; d < 2u; d++)\n"
   5890 											 "                {\n"
   5891 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   5892 											 "                    {\n"
   5893 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   5894 											 "                        {\n"
   5895 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   5896 											 "                           {\n"
   5897 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   5898 											 "                               {\n";
   5899 	const glcts::test_var_type* var_types_set = var_types_set_es;
   5900 	size_t						num_var_types = num_var_types_es;
   5901 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   5902 
   5903 	if (API::USE_DOUBLE)
   5904 	{
   5905 		var_types_set = var_types_set_gl;
   5906 		num_var_types = num_var_types_gl;
   5907 	}
   5908 
   5909 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   5910 	{
   5911 		_supported_variable_types_map_const_iterator var_iterator =
   5912 			supported_variable_types_map.find(var_types_set[var_type_index]);
   5913 
   5914 		if (var_iterator != supported_variable_types_map.end())
   5915 		{
   5916 			std::string array_declaration = var_iterator->second.type + "[2][2][2][2][2][2][2][2] z;\n\n";
   5917 
   5918 			std::string function_definition;
   5919 			std::string function_use;
   5920 			std::string verification;
   5921 
   5922 			function_definition += "bool gfunc(inout " + var_iterator->second.type + " x[2][2][2][2][2][2][2][2], ";
   5923 			function_definition += var_iterator->second.type + " y[2][2][2][2][2][2][2][2])\n";
   5924 			function_definition += "{\n";
   5925 			function_definition += "    " + iteration_loop_start;
   5926 			function_definition +=
   5927 				"                                   x[a][b][c][d][e][f][g][h] = " + var_iterator->second.type +
   5928 				"(123);\n";
   5929 			function_definition += "    " + iteration_loop_end;
   5930 			function_definition += "\n";
   5931 			function_definition += "    " + iteration_loop_start;
   5932 			function_definition += "                                   if(y[a][b][c][d][e][f][g][h]";
   5933 			if (var_iterator->second.type == "mat4") // mat4 comparison
   5934 			{
   5935 				function_definition += "[0][0]";
   5936 				function_definition += " != float";
   5937 			}
   5938 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   5939 			{
   5940 				function_definition += "[0][0]";
   5941 				function_definition += " != double";
   5942 			}
   5943 			else
   5944 			{
   5945 				function_definition += " != ";
   5946 				function_definition += var_iterator->second.type;
   5947 			}
   5948 			function_definition += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h))) {return false;}\n";
   5949 			function_definition += "    " + iteration_loop_end;
   5950 			function_definition += "  return true;\n";
   5951 			function_definition += "}\n\n";
   5952 
   5953 			function_use += "    " + array_declaration;
   5954 			function_use += "    " + iteration_loop_start;
   5955 			function_use += "                                   z[a][b][c][d][e][f][g][h] = ";
   5956 			function_use += var_iterator->second.type;
   5957 			function_use += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h));\n";
   5958 			function_use += "    " + iteration_loop_end;
   5959 
   5960 			verification += "    float result = 0.0;\n";
   5961 			verification += "    if(gfunc(z, z) == true)\n";
   5962 			verification += "    {\n";
   5963 			verification += "        result = 1.0;\n\n";
   5964 			verification += "    }\n";
   5965 			verification += "    else\n";
   5966 			verification += "    {\n";
   5967 			verification += "        result = 0.0;\n\n";
   5968 			verification += "    }\n";
   5969 
   5970 			if (false == test_compute)
   5971 			{
   5972 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   5973 			}
   5974 			else
   5975 			{
   5976 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   5977 			}
   5978 
   5979 			/* Deallocate any resources used. */
   5980 			this->delete_objects();
   5981 		} /* if var_type iterator found */
   5982 		else
   5983 		{
   5984 			TCU_FAIL("Type not found.");
   5985 		}
   5986 	}
   5987 }
   5988 
   5989 /* Generates the shader source code for the InteractionArgumentAliasing4
   5990  * array tests, and attempts to compile each test shader, for both
   5991  * vertex and fragment shaders.
   5992  *
   5993  * @tparam API               Tested API descriptor
   5994  *
   5995  * @param tested_shader_type The type of shader that is being tested
   5996  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   5997  */
   5998 template <class API>
   5999 void InteractionArgumentAliasing6<API>::test_shader_compilation(
   6000 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   6001 {
   6002 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   6003 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   6004 
   6005 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   6006 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   6007 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   6008 
   6009 	const std::string iteration_loop_end = "                               }\n"
   6010 										   "                           }\n"
   6011 										   "                        }\n"
   6012 										   "                    }\n"
   6013 										   "                }\n"
   6014 										   "            }\n"
   6015 										   "        }\n"
   6016 										   "    }\n";
   6017 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   6018 											 "    {\n"
   6019 											 "        for (uint b = 0u; b < 2u; b++)\n"
   6020 											 "        {\n"
   6021 											 "            for (uint c = 0u; c < 2u; c++)\n"
   6022 											 "            {\n"
   6023 											 "                for (uint d = 0u; d < 2u; d++)\n"
   6024 											 "                {\n"
   6025 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   6026 											 "                    {\n"
   6027 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   6028 											 "                        {\n"
   6029 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   6030 											 "                           {\n"
   6031 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   6032 											 "                               {\n";
   6033 	const glcts::test_var_type* var_types_set = var_types_set_es;
   6034 	size_t						num_var_types = num_var_types_es;
   6035 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   6036 
   6037 	if (API::USE_DOUBLE)
   6038 	{
   6039 		var_types_set = var_types_set_gl;
   6040 		num_var_types = num_var_types_gl;
   6041 	}
   6042 
   6043 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   6044 	{
   6045 		_supported_variable_types_map_const_iterator var_iterator =
   6046 			supported_variable_types_map.find(var_types_set[var_type_index]);
   6047 
   6048 		if (var_iterator != supported_variable_types_map.end())
   6049 		{
   6050 			std::string array_declaration = var_iterator->second.type + "[2][2][2][2][2][2][2][2] z;\n\n";
   6051 
   6052 			std::string function_definition;
   6053 			std::string function_use;
   6054 			std::string verification;
   6055 
   6056 			function_definition += "bool gfunc(" + var_iterator->second.type + " x[2][2][2][2][2][2][2][2], ";
   6057 			function_definition += "inout " + var_iterator->second.type + " y[2][2][2][2][2][2][2][2])\n";
   6058 			function_definition += "{\n";
   6059 			function_definition += "    " + iteration_loop_start;
   6060 			function_definition +=
   6061 				"                                   y[a][b][c][d][e][f][g][h] = " + var_iterator->second.type +
   6062 				"(123);\n";
   6063 			function_definition += "    " + iteration_loop_end;
   6064 			function_definition += "\n";
   6065 			function_definition += "    " + iteration_loop_start;
   6066 			function_definition += "                                   if(x[a][b][c][d][e][f][g][h]";
   6067 			if (var_iterator->second.type == "mat4") // mat4 comparison
   6068 			{
   6069 				function_definition += "[0][0]";
   6070 				function_definition += " != float";
   6071 			}
   6072 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   6073 			{
   6074 				function_definition += "[0][0]";
   6075 				function_definition += " != double";
   6076 			}
   6077 			else
   6078 			{
   6079 				function_definition += " != ";
   6080 				function_definition += var_iterator->second.type;
   6081 			}
   6082 			function_definition += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h))) {return false;}\n";
   6083 			function_definition += "    " + iteration_loop_end;
   6084 			function_definition += "  return true;\n";
   6085 			function_definition += "}\n\n";
   6086 
   6087 			function_use += "    " + array_declaration;
   6088 			function_use += "    " + iteration_loop_start;
   6089 			function_use += "                                   z[a][b][c][d][e][f][g][h] = ";
   6090 			function_use += var_iterator->second.type;
   6091 			function_use += "(((a*128u)+(b*64u)+(c*32u)+(d*16u)+(e*8u)+(f*4u)+(g*2u)+h));\n";
   6092 			function_use += "    " + iteration_loop_end;
   6093 
   6094 			verification += "    float result = 0.0;\n";
   6095 			verification += "    if(gfunc(z, z) == true)\n";
   6096 			verification += "    {\n";
   6097 			verification += "        result = 1.0;\n\n";
   6098 			verification += "    }\n";
   6099 			verification += "    else\n";
   6100 			verification += "    {\n";
   6101 			verification += "        result = 0.0;\n\n";
   6102 			verification += "    }\n";
   6103 
   6104 			if (false == test_compute)
   6105 			{
   6106 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification);
   6107 			}
   6108 			else
   6109 			{
   6110 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification);
   6111 			}
   6112 
   6113 			/* Deallocate any resources used. */
   6114 			this->delete_objects();
   6115 		} /* if var_type iterator found */
   6116 		else
   6117 		{
   6118 			TCU_FAIL("Type not found.");
   6119 		}
   6120 	}
   6121 }
   6122 
   6123 /* Generates the shader source code for the InteractionUniforms1
   6124  * array tests, and attempts to compile each test shader, for both
   6125  * vertex and fragment shaders.
   6126  *
   6127  * @tparam API               Tested API descriptor
   6128  *
   6129  * @param tested_shader_type The type of shader that is being tested
   6130  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   6131  */
   6132 template <class API>
   6133 void InteractionUniforms1<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   6134 {
   6135 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   6136 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   6137 
   6138 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   6139 															 VAR_TYPE_DOUBLE };
   6140 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   6141 
   6142 	const glw::Functions&		gl			  = this->context_id.getRenderContext().getFunctions();
   6143 	const glcts::test_var_type* var_types_set = var_types_set_es;
   6144 	size_t						num_var_types = num_var_types_es;
   6145 
   6146 	if (API::USE_DOUBLE)
   6147 	{
   6148 		var_types_set = var_types_set_gl;
   6149 		num_var_types = num_var_types_gl;
   6150 	}
   6151 
   6152 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   6153 	{
   6154 		_supported_variable_types_map_const_iterator var_iterator =
   6155 			supported_variable_types_map.find(var_types_set[var_type_index]);
   6156 
   6157 		if (var_iterator != supported_variable_types_map.end())
   6158 		{
   6159 			std::string uniform_definition;
   6160 			std::string uniform_use;
   6161 
   6162 			uniform_definition += "uniform ";
   6163 			uniform_definition += var_iterator->second.precision;
   6164 			uniform_definition += " ";
   6165 			uniform_definition += var_iterator->second.type;
   6166 			uniform_definition += " my_uniform_1[1][1][1][1];\n\n";
   6167 
   6168 			uniform_use = "    float result = float(my_uniform_1[0][0][0][0]);\n";
   6169 
   6170 			if (API::USE_ALL_SHADER_STAGES)
   6171 			{
   6172 				const std::string& compute_shader_source =
   6173 					this->prepare_compute_shader(tested_shader_type, uniform_definition, uniform_use);
   6174 				const std::string& fragment_shader_source =
   6175 					this->prepare_fragment_shader(tested_shader_type, uniform_definition, uniform_use);
   6176 				const std::string& geometry_shader_source =
   6177 					this->prepare_geometry_shader(tested_shader_type, uniform_definition, uniform_use);
   6178 				const std::string& tess_ctrl_shader_source =
   6179 					this->prepare_tess_ctrl_shader(tested_shader_type, uniform_definition, uniform_use);
   6180 				const std::string& tess_eval_shader_source =
   6181 					this->prepare_tess_eval_shader(tested_shader_type, uniform_definition, uniform_use);
   6182 				const std::string& vertex_shader_source =
   6183 					this->prepare_vertex_shader(tested_shader_type, uniform_definition, uniform_use);
   6184 
   6185 				switch (tested_shader_type)
   6186 				{
   6187 				case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   6188 				case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6189 					this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   6190 					break;
   6191 
   6192 				case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6193 				case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6194 				case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   6195 				case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6196 					this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   6197 												geometry_shader_source, fragment_shader_source, compute_shader_source,
   6198 												false, false);
   6199 					break;
   6200 
   6201 				default:
   6202 					TCU_FAIL("Invalid enum");
   6203 					break;
   6204 				}
   6205 			}
   6206 			else
   6207 			{
   6208 				const std::string& fragment_shader_source =
   6209 					this->prepare_fragment_shader(tested_shader_type, uniform_definition, uniform_use);
   6210 				const std::string& vertex_shader_source =
   6211 					this->prepare_vertex_shader(tested_shader_type, uniform_definition, uniform_use);
   6212 
   6213 				this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   6214 			}
   6215 
   6216 			glw::GLint uniform_location = -1;
   6217 
   6218 			/* Make program object active. */
   6219 			gl.useProgram(this->program_object_id);
   6220 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   6221 
   6222 			/* Get uniform location. */
   6223 			uniform_location = gl.getUniformLocation(this->program_object_id, "my_uniform_1[0][0][0][0]");
   6224 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() failed.");
   6225 
   6226 			if (uniform_location == -1)
   6227 			{
   6228 				TCU_FAIL("Uniform is not found or is considered as not active.");
   6229 			}
   6230 
   6231 			switch (var_type_index)
   6232 			{
   6233 			case 0: //float type of uniform is considered
   6234 			{
   6235 				glw::GLfloat uniform_value = 1.0f;
   6236 
   6237 				gl.uniform1f(uniform_location, uniform_value);
   6238 				GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1f() failed.");
   6239 
   6240 				break;
   6241 			}
   6242 			case 1: //int type of uniform is considered
   6243 			{
   6244 				glw::GLint uniform_value = 1;
   6245 
   6246 				gl.uniform1i(uniform_location, uniform_value);
   6247 				GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i() failed.");
   6248 
   6249 				break;
   6250 			}
   6251 			case 2: //uint type of uniform is considered
   6252 			{
   6253 				glw::GLuint uniform_value = 1;
   6254 
   6255 				gl.uniform1ui(uniform_location, uniform_value);
   6256 				GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1ui() failed.");
   6257 
   6258 				break;
   6259 			}
   6260 			case 3: //double type of uniform is considered
   6261 			{
   6262 				glw::GLdouble uniform_value = 1.0;
   6263 
   6264 				gl.uniform1d(uniform_location, uniform_value);
   6265 				GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1d() failed.");
   6266 
   6267 				break;
   6268 			}
   6269 			default:
   6270 			{
   6271 				TCU_FAIL("Invalid variable-type index.");
   6272 
   6273 				break;
   6274 			}
   6275 			} /* switch (var_type_index) */
   6276 
   6277 			/* Deallocate any resources used. */
   6278 			this->delete_objects();
   6279 		} /* if var_type iterator found */
   6280 		else
   6281 		{
   6282 			TCU_FAIL("Type not found.");
   6283 		}
   6284 	} /* for (int var_type_index = 0; ...) */
   6285 }
   6286 
   6287 /** Prepare shader
   6288  *
   6289  * @tparam API               Tested API descriptor
   6290  *
   6291  * @param tested_shader_type The type of shader that is being tested
   6292  * @param uniform_definition Definition used to prepare shader
   6293  * @param uniform_use        Snippet that use defined uniform
   6294  **/
   6295 template <class API>
   6296 std::string InteractionUniforms1<API>::prepare_compute_shader(
   6297 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& uniform_definition,
   6298 	const std::string& uniform_use)
   6299 {
   6300 	std::string compute_shader_source;
   6301 
   6302 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type)
   6303 	{
   6304 		compute_shader_source = "writeonly uniform image2D uni_image;\n"
   6305 								"\n";
   6306 
   6307 		/* User-defined function definition. */
   6308 		compute_shader_source += uniform_definition;
   6309 		compute_shader_source += "\n\n";
   6310 
   6311 		/* Main function definition. */
   6312 		compute_shader_source += shader_start;
   6313 		compute_shader_source += uniform_use;
   6314 		compute_shader_source += "\n\n";
   6315 		compute_shader_source += "\n"
   6316 								 "    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), vec4(result, 0, 0, 0));\n"
   6317 								 "}\n"
   6318 								 "\n";
   6319 	}
   6320 
   6321 	return compute_shader_source;
   6322 }
   6323 
   6324 /** Prepare shader
   6325  *
   6326  * @tparam API               Tested API descriptor
   6327  *
   6328  * @param tested_shader_type The type of shader that is being tested
   6329  * @param uniform_definition Definition used to prepare shader
   6330  * @param uniform_use        Snippet that use defined uniform
   6331  **/
   6332 template <class API>
   6333 std::string InteractionUniforms1<API>::prepare_fragment_shader(
   6334 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& uniform_definition,
   6335 	const std::string& uniform_use)
   6336 {
   6337 	std::string fragment_shader_source;
   6338 
   6339 	switch (tested_shader_type)
   6340 	{
   6341 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6342 		break;
   6343 
   6344 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6345 		fragment_shader_source = "out vec4 colour;\n\n";
   6346 
   6347 		/* User-defined function definition. */
   6348 		fragment_shader_source += uniform_definition;
   6349 		fragment_shader_source += "\n\n";
   6350 
   6351 		/* Main function definition. */
   6352 		fragment_shader_source += shader_start;
   6353 		fragment_shader_source += uniform_use;
   6354 		fragment_shader_source += "\n\n";
   6355 		fragment_shader_source += "    colour = vec4(result);\n";
   6356 		fragment_shader_source += shader_end;
   6357 		break;
   6358 
   6359 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6360 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   6361 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6362 		fragment_shader_source = "in float fs_result;\n\n"
   6363 								 "out vec4 colour;\n\n"
   6364 								 "void main()\n"
   6365 								 "{\n"
   6366 								 "    colour =  vec4(fs_result);\n"
   6367 								 "}\n"
   6368 								 "\n";
   6369 		break;
   6370 
   6371 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   6372 		fragment_shader_source = default_fragment_shader_source;
   6373 		break;
   6374 
   6375 	default:
   6376 		TCU_FAIL("Unrecognized shader object type.");
   6377 		break;
   6378 	}
   6379 
   6380 	return fragment_shader_source;
   6381 }
   6382 
   6383 /** Prepare shader
   6384  *
   6385  * @tparam API               Tested API descriptor
   6386  *
   6387  * @param tested_shader_type The type of shader that is being tested
   6388  * @param uniform_definition Definition used to prepare shader
   6389  * @param uniform_use        Snippet that use defined uniform
   6390  **/
   6391 template <class API>
   6392 std::string InteractionUniforms1<API>::prepare_geometry_shader(
   6393 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& uniform_definition,
   6394 	const std::string& uniform_use)
   6395 {
   6396 	std::string geometry_shader_source;
   6397 
   6398 	switch (tested_shader_type)
   6399 	{
   6400 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6401 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6402 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   6403 		break;
   6404 
   6405 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   6406 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6407 		geometry_shader_source = "layout(points)                           in;\n"
   6408 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   6409 								 "\n"
   6410 								 "in  float tes_result[];\n"
   6411 								 "out float fs_result;\n"
   6412 								 "\n"
   6413 								 "void main()\n"
   6414 								 "{\n"
   6415 								 "    gl_Position  = vec4(-1, -1, 0, 1);\n"
   6416 								 "    fs_result    = tes_result[0];\n"
   6417 								 "    EmitVertex();\n"
   6418 								 "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   6419 								 "    fs_result    = tes_result[0];\n"
   6420 								 "    EmitVertex();\n"
   6421 								 "    gl_Position  = vec4(1, -1, 0, 1);\n"
   6422 								 "    fs_result    = tes_result[0];\n"
   6423 								 "    EmitVertex();\n"
   6424 								 "    gl_Position  = vec4(1, 1, 0, 1);\n"
   6425 								 "    fs_result    = tes_result[0];\n"
   6426 								 "    EmitVertex();\n"
   6427 								 "}\n";
   6428 		break;
   6429 
   6430 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6431 		geometry_shader_source = "layout(points)                           in;\n"
   6432 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   6433 								 "\n"
   6434 								 "out float fs_result;\n"
   6435 								 "\n";
   6436 
   6437 		/* User-defined function definition. */
   6438 		geometry_shader_source += uniform_definition;
   6439 		geometry_shader_source += "\n\n";
   6440 
   6441 		/* Main function definition. */
   6442 		geometry_shader_source += shader_start;
   6443 		geometry_shader_source += uniform_use;
   6444 		geometry_shader_source += "\n\n";
   6445 		geometry_shader_source += "\n    gl_Position  = vec4(-1, -1, 0, 1);\n"
   6446 								  "    fs_result    = result;\n"
   6447 								  "    EmitVertex();\n"
   6448 								  "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   6449 								  "    fs_result    = result;\n"
   6450 								  "    EmitVertex();\n"
   6451 								  "    gl_Position  = vec4(1, -1, 0, 1);\n"
   6452 								  "    fs_result    = result;\n"
   6453 								  "    EmitVertex();\n"
   6454 								  "    gl_Position  = vec4(1, 1, 0, 1);\n"
   6455 								  "    fs_result    = result;\n"
   6456 								  "    EmitVertex();\n"
   6457 								  "}\n";
   6458 		break;
   6459 
   6460 	default:
   6461 		TCU_FAIL("Unrecognized shader object type.");
   6462 		break;
   6463 	}
   6464 
   6465 	return geometry_shader_source;
   6466 }
   6467 
   6468 /** Prepare shader
   6469  *
   6470  * @tparam API               Tested API descriptor
   6471  *
   6472  * @param tested_shader_type The type of shader that is being tested
   6473  * @param uniform_definition Definition used to prepare shader
   6474  * @param uniform_use        Snippet that use defined uniform
   6475  **/
   6476 template <class API>
   6477 std::string InteractionUniforms1<API>::prepare_tess_ctrl_shader(
   6478 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& uniform_definition,
   6479 	const std::string& uniform_use)
   6480 {
   6481 	std::string tess_ctrl_shader_source;
   6482 
   6483 	switch (tested_shader_type)
   6484 	{
   6485 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6486 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6487 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6488 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   6489 		break;
   6490 
   6491 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   6492 		tess_ctrl_shader_source = "layout(vertices = 1) out;\n"
   6493 								  "\n"
   6494 								  "out float tcs_result[];\n"
   6495 								  "\n";
   6496 
   6497 		/* User-defined function definition. */
   6498 		tess_ctrl_shader_source += uniform_definition;
   6499 		tess_ctrl_shader_source += "\n\n";
   6500 
   6501 		/* Main function definition. */
   6502 		tess_ctrl_shader_source += shader_start;
   6503 		tess_ctrl_shader_source += uniform_use;
   6504 		tess_ctrl_shader_source += "\n\n";
   6505 		tess_ctrl_shader_source += "    tcs_result[gl_InvocationID] = result;\n"
   6506 								   "\n"
   6507 								   "    gl_TessLevelOuter[0] = 1.0;\n"
   6508 								   "    gl_TessLevelOuter[1] = 1.0;\n"
   6509 								   "    gl_TessLevelOuter[2] = 1.0;\n"
   6510 								   "    gl_TessLevelOuter[3] = 1.0;\n"
   6511 								   "    gl_TessLevelInner[0] = 1.0;\n"
   6512 								   "    gl_TessLevelInner[1] = 1.0;\n"
   6513 								   "}\n";
   6514 		break;
   6515 
   6516 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6517 		tess_ctrl_shader_source = default_tc_shader_source;
   6518 		break;
   6519 
   6520 	default:
   6521 		TCU_FAIL("Unrecognized shader object type.");
   6522 		break;
   6523 	}
   6524 
   6525 	return tess_ctrl_shader_source;
   6526 }
   6527 
   6528 /** Prepare shader
   6529  *
   6530  * @tparam API               Tested API descriptor
   6531  *
   6532  * @param tested_shader_type The type of shader that is being tested
   6533  * @param uniform_definition Definition used to prepare shader
   6534  * @param uniform_use        Snippet that use defined uniform
   6535  **/
   6536 template <class API>
   6537 std::string InteractionUniforms1<API>::prepare_tess_eval_shader(
   6538 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& uniform_definition,
   6539 	const std::string& uniform_use)
   6540 {
   6541 	std::string tess_eval_shader_source;
   6542 
   6543 	switch (tested_shader_type)
   6544 	{
   6545 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6546 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6547 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6548 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   6549 		break;
   6550 
   6551 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   6552 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   6553 								  "\n"
   6554 								  "in  float tcs_result[];\n"
   6555 								  "out float tes_result;\n"
   6556 								  "\n"
   6557 								  "void main()\n"
   6558 								  "{\n"
   6559 								  "    tes_result = tcs_result[0];\n"
   6560 								  "}\n";
   6561 		break;
   6562 
   6563 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6564 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   6565 								  "\n"
   6566 								  "out float tes_result;\n"
   6567 								  "\n";
   6568 
   6569 		/* User-defined function definition. */
   6570 		tess_eval_shader_source += uniform_definition;
   6571 		tess_eval_shader_source += "\n\n";
   6572 
   6573 		/* Main function definition. */
   6574 		tess_eval_shader_source += shader_start;
   6575 		tess_eval_shader_source += uniform_use;
   6576 		tess_eval_shader_source += "\n\n";
   6577 		tess_eval_shader_source += "    tes_result = result;\n"
   6578 								   "}\n";
   6579 		break;
   6580 
   6581 	default:
   6582 		TCU_FAIL("Unrecognized shader object type.");
   6583 		break;
   6584 	}
   6585 
   6586 	return tess_eval_shader_source;
   6587 }
   6588 
   6589 /** Prepare shader
   6590  *
   6591  * @tparam API               Tested API descriptor
   6592  *
   6593  * @param tested_shader_type The type of shader that is being tested
   6594  * @param uniform_definition Definition used to prepare shader
   6595  * @param uniform_use        Snippet that use defined uniform
   6596  **/
   6597 template <class API>
   6598 std::string InteractionUniforms1<API>::prepare_vertex_shader(
   6599 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& uniform_definition,
   6600 	const std::string& uniform_use)
   6601 {
   6602 	std::string vertex_shader_source;
   6603 
   6604 	switch (tested_shader_type)
   6605 	{
   6606 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6607 		break;
   6608 
   6609 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6610 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6611 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   6612 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6613 		vertex_shader_source = default_vertex_shader_source;
   6614 		break;
   6615 
   6616 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   6617 		/* User-defined function definition. */
   6618 		vertex_shader_source += uniform_definition;
   6619 
   6620 		/* Main function definition. */
   6621 		vertex_shader_source += shader_start;
   6622 		vertex_shader_source += uniform_use;
   6623 		vertex_shader_source += "    gl_Position = vec4(result);\n";
   6624 		vertex_shader_source += shader_end;
   6625 		break;
   6626 
   6627 	default:
   6628 		TCU_FAIL("Unrecognized shader object type.");
   6629 		break;
   6630 	}
   6631 
   6632 	return vertex_shader_source;
   6633 }
   6634 
   6635 /* Generates the shader source code for the InteractionUniforms2
   6636  * array tests, and attempts to compile each test shader, for both
   6637  * vertex and fragment shaders.
   6638  *
   6639  * @tparam API               Tested API descriptor
   6640  *
   6641  * @param tested_shader_type The type of shader that is being tested
   6642  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   6643  */
   6644 template <class API>
   6645 void InteractionUniforms2<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   6646 {
   6647 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4 };
   6648 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   6649 
   6650 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT, VAR_TYPE_FLOAT, VAR_TYPE_MAT4,
   6651 															 VAR_TYPE_DOUBLE, VAR_TYPE_DMAT4 };
   6652 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   6653 
   6654 	const std::string array_initializers[] = { "int[2][2][2][2](\n"
   6655 											   "    int[2][2][2](\n"
   6656 											   "        int[2][2](\n"
   6657 											   "            int[2]( 1,  2),\n"
   6658 											   "            int[2]( 3,  4)\n"
   6659 											   "        ),\n"
   6660 											   "        int[2][2](\n"
   6661 											   "            int[2]( 5,  6),\n"
   6662 											   "            int[2]( 7,  8)\n"
   6663 											   "        )\n"
   6664 											   "    ),\n"
   6665 											   "    int[2][2][2](\n"
   6666 											   "        int[2][2](\n"
   6667 											   "            int[2](11, 12),\n"
   6668 											   "            int[2](13, 14)\n"
   6669 											   "        ),\n"
   6670 											   "        int[2][2](\n"
   6671 											   "            int[2](15, 16),\n"
   6672 											   "            int[2](17, 18)\n"
   6673 											   "        )\n"
   6674 											   "    )\n"
   6675 											   ")",
   6676 
   6677 											   "float[2][2][2][2](\n"
   6678 											   "    float[2][2][2](\n"
   6679 											   "        float[2][2](\n"
   6680 											   "            float[2](1.0, 2.0),\n"
   6681 											   "            float[2](3.0, 4.0)),\n"
   6682 											   "        float[2][2](\n"
   6683 											   "            float[2](5.0, 6.0),\n"
   6684 											   "            float[2](7.0, 8.0))),\n"
   6685 											   "    float[2][2][2](\n"
   6686 											   "        float[2][2](\n"
   6687 											   "            float[2](1.1, 2.1),\n"
   6688 											   "            float[2](3.1, 4.1)\n"
   6689 											   "        ),\n"
   6690 											   "        float[2][2](\n"
   6691 											   "            float[2](5.1, 6.1),\n"
   6692 											   "            float[2](7.1, 8.1)\n"
   6693 											   "        )\n"
   6694 											   "    )\n"
   6695 											   ")",
   6696 
   6697 											   "mat4[2][2][2][2](\n"
   6698 											   "    mat4[2][2][2](\n"
   6699 											   "        mat4[2][2](\n"
   6700 											   "            mat4[2]( mat4(1),  mat4(2)),\n"
   6701 											   "            mat4[2]( mat4(3),  mat4(4))\n"
   6702 											   "        ),\n"
   6703 											   "        mat4[2][2](\n"
   6704 											   "            mat4[2](mat4(5),  mat4(6)),\n"
   6705 											   "            mat4[2](mat4(7),  mat4(8))\n"
   6706 											   "        )\n"
   6707 											   "    ),\n"
   6708 											   "    mat4[2][2][2](\n"
   6709 											   "        mat4[2][2](\n"
   6710 											   "            mat4[2](mat4(9),  mat4(10)),\n"
   6711 											   "            mat4[2](mat4(11),  mat4(12))\n"
   6712 											   "        ),\n"
   6713 											   "        mat4[2][2](\n"
   6714 											   "            mat4[2](mat4(13),  mat4(14)),\n"
   6715 											   "            mat4[2](mat4(15),  mat4(16))\n"
   6716 											   "        )\n"
   6717 											   "    )\n"
   6718 											   ")",
   6719 
   6720 											   "double[2][2][2][2](\n"
   6721 											   "    double[2][2][2](\n"
   6722 											   "        double[2][2](\n"
   6723 											   "            double[2](1.0, 2.0),\n"
   6724 											   "            double[2](3.0, 4.0)),\n"
   6725 											   "        double[2][2](\n"
   6726 											   "            double[2](5.0, 6.0),\n"
   6727 											   "            double[2](7.0, 8.0))),\n"
   6728 											   "    double[2][2][2](\n"
   6729 											   "        double[2][2](\n"
   6730 											   "            double[2](1.1, 2.1),\n"
   6731 											   "            double[2](3.1, 4.1)\n"
   6732 											   "        ),\n"
   6733 											   "        double[2][2](\n"
   6734 											   "            double[2](5.1, 6.1),\n"
   6735 											   "            double[2](7.1, 8.1)\n"
   6736 											   "        )\n"
   6737 											   "    )\n"
   6738 											   ")",
   6739 
   6740 											   "dmat4[2][2][2][2](\n"
   6741 											   "    dmat4[2][2][2](\n"
   6742 											   "        dmat4[2][2](\n"
   6743 											   "            dmat4[2]( dmat4(1),  dmat4(2)),\n"
   6744 											   "            dmat4[2]( dmat4(3),  dmat4(4))\n"
   6745 											   "        ),\n"
   6746 											   "        dmat4[2][2](\n"
   6747 											   "            dmat4[2](dmat4(5),  dmat4(6)),\n"
   6748 											   "            dmat4[2](dmat4(7),  dmat4(8))\n"
   6749 											   "        )\n"
   6750 											   "    ),\n"
   6751 											   "    dmat4[2][2][2](\n"
   6752 											   "        dmat4[2][2](\n"
   6753 											   "            dmat4[2](dmat4(9),   dmat4(10)),\n"
   6754 											   "            dmat4[2](dmat4(11),  dmat4(12))\n"
   6755 											   "        ),\n"
   6756 											   "        dmat4[2][2](\n"
   6757 											   "            dmat4[2](dmat4(13),  dmat4(14)),\n"
   6758 											   "            dmat4[2](dmat4(15),  dmat4(16))\n"
   6759 											   "        )\n"
   6760 											   "    )\n"
   6761 											   ")" };
   6762 
   6763 	const glcts::test_var_type* var_types_set = var_types_set_es;
   6764 	size_t						num_var_types = num_var_types_es;
   6765 
   6766 	if (API::USE_DOUBLE)
   6767 	{
   6768 		var_types_set = var_types_set_gl;
   6769 		num_var_types = num_var_types_gl;
   6770 	}
   6771 
   6772 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   6773 	{
   6774 		_supported_variable_types_map_const_iterator var_iterator =
   6775 			supported_variable_types_map.find(var_types_set[var_type_index]);
   6776 
   6777 		if (var_iterator != supported_variable_types_map.end())
   6778 		{
   6779 			std::string base_variable_string;
   6780 
   6781 			for (int initialiser_selector = 1; initialiser_selector >= 0; initialiser_selector--)
   6782 			{
   6783 				// We normally do all 16 possible permutations of [4][4][4][4] items (15..0).
   6784 				// However, in this case we will skip the case that will work,
   6785 				// so we'll merely process permutations 14..0
   6786 				for (int permutation_index = 14; permutation_index >= 0; permutation_index--)
   6787 				{
   6788 					base_variable_string =
   6789 						"uniform " + var_iterator->second.precision + " " + var_iterator->second.type + " x";
   6790 
   6791 					// for all 4 possible sub_script entries
   6792 					for (int sub_script_entry_index = 3; sub_script_entry_index >= 0; sub_script_entry_index--)
   6793 					{
   6794 						if (permutation_index & (1 << sub_script_entry_index))
   6795 						{
   6796 							// In this case, we'll use a valid sub_script
   6797 							base_variable_string += "[2]";
   6798 						}
   6799 						else
   6800 						{
   6801 							// In this case, we'll use an invalid sub_script
   6802 							base_variable_string += "[]";
   6803 						}
   6804 					}
   6805 
   6806 					if (initialiser_selector == 0)
   6807 					{
   6808 						// We'll use an initialiser
   6809 						base_variable_string += " = " + array_initializers[var_type_index];
   6810 					}
   6811 
   6812 					base_variable_string += ";\n\n";
   6813 
   6814 					std::string shader_source = base_variable_string + shader_start;
   6815 
   6816 					/* End main */
   6817 					DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   6818 
   6819 					/* Execute test:
   6820 					 *
   6821 					 * This will succeed in case of allowed unsized
   6822 					 * declarations and when at least one of these is
   6823 					 * true:
   6824 					 *   1. There is an initialiser.
   6825 					 *   2. Only the outermost dimension is unsized,
   6826 					 *      as in [][2][2][2].
   6827 					 */
   6828 					EXECUTE_SHADER_TEST(API::ALLOW_UNSIZED_DECLARATION &&
   6829 											(initialiser_selector == 0 || permutation_index == 7),
   6830 										tested_shader_type, shader_source);
   6831 				} /* for (int permutation_index = 14; ...) */
   6832 			}	 /* for (int initialiser_selector  = 1; ...) */
   6833 		}		  /* if var_type iterator found */
   6834 		else
   6835 		{
   6836 			TCU_FAIL("Type not found.");
   6837 		}
   6838 	} /* for (int var_type_index = 0; ...) */
   6839 }
   6840 
   6841 /* Generates the shader source code for the InteractionUniformBuffers1
   6842  * array tests, and attempts to compile each test shader, for both
   6843  * vertex and fragment shaders.
   6844  *
   6845  * @tparam API               Tested API descriptor
   6846  *
   6847  * @param tested_shader_type The type of shader that is being tested
   6848  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   6849  */
   6850 template <class API>
   6851 void InteractionUniformBuffers1<API>::test_shader_compilation(
   6852 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   6853 {
   6854 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   6855 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   6856 
   6857 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   6858 															 VAR_TYPE_DOUBLE };
   6859 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   6860 
   6861 	const glcts::test_var_type* var_types_set = var_types_set_es;
   6862 	size_t						num_var_types = num_var_types_es;
   6863 
   6864 	if (API::USE_DOUBLE)
   6865 	{
   6866 		var_types_set = var_types_set_gl;
   6867 		num_var_types = num_var_types_gl;
   6868 	}
   6869 
   6870 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   6871 	{
   6872 		_supported_variable_types_map_const_iterator var_iterator =
   6873 			supported_variable_types_map.find(var_types_set[var_type_index]);
   6874 
   6875 		if (var_iterator != supported_variable_types_map.end())
   6876 		{
   6877 			std::string shader_source;
   6878 
   6879 			shader_source += "uniform uBlocka {\n";
   6880 			shader_source += "    " + var_iterator->second.type + " x[1][1][1][1][1][1];\n";
   6881 			shader_source += "};\n\n";
   6882 			shader_source += shader_start;
   6883 
   6884 			/* End main */
   6885 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   6886 
   6887 			/* Execute test */
   6888 			EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   6889 		} /* if var_type iterator found */
   6890 		else
   6891 		{
   6892 			TCU_FAIL("Type not found.");
   6893 		}
   6894 	}
   6895 }
   6896 
   6897 /* Generates the shader source code for the InteractionUniformBuffers2
   6898  * array tests, and attempts to compile each test shader, for both
   6899  * vertex and fragment shaders.
   6900  *
   6901  * @tparam API               Tested API descriptor
   6902  *
   6903  * @param tested_shader_type The type of shader that is being tested
   6904  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   6905  */
   6906 template <class API>
   6907 void InteractionUniformBuffers2<API>::test_shader_compilation(
   6908 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   6909 {
   6910 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   6911 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   6912 
   6913 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   6914 															 VAR_TYPE_DOUBLE };
   6915 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   6916 
   6917 	const glw::Functions&		gl			  = this->context_id.getRenderContext().getFunctions();
   6918 	const glcts::test_var_type* var_types_set = var_types_set_es;
   6919 	size_t						num_var_types = num_var_types_es;
   6920 
   6921 	if (API::USE_DOUBLE)
   6922 	{
   6923 		var_types_set = var_types_set_gl;
   6924 		num_var_types = num_var_types_gl;
   6925 	}
   6926 
   6927 	/* Iterate through float / int / uint values. */
   6928 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   6929 	{
   6930 		_supported_variable_types_map_const_iterator var_iterator =
   6931 			supported_variable_types_map.find(var_types_set[var_type_index]);
   6932 
   6933 		if (var_iterator != supported_variable_types_map.end())
   6934 		{
   6935 			std::string uniform_definition;
   6936 			std::string uniform_use;
   6937 
   6938 			uniform_definition += "layout (std140) uniform uniform_block_name\n"
   6939 								  "{\n";
   6940 			uniform_definition += "    ";
   6941 			uniform_definition += var_iterator->second.type;
   6942 			uniform_definition += " my_uniform_1[1][1][1][1];\n"
   6943 								  "};\n";
   6944 
   6945 			uniform_use = "    float result = float(my_uniform_1[0][0][0][0]);\n";
   6946 
   6947 			if (API::USE_ALL_SHADER_STAGES)
   6948 			{
   6949 				const std::string& compute_shader_source =
   6950 					this->prepare_compute_shader(tested_shader_type, uniform_definition, uniform_use);
   6951 				const std::string& fragment_shader_source =
   6952 					this->prepare_fragment_shader(tested_shader_type, uniform_definition, uniform_use);
   6953 				const std::string& geometry_shader_source =
   6954 					this->prepare_geometry_shader(tested_shader_type, uniform_definition, uniform_use);
   6955 				const std::string& tess_ctrl_shader_source =
   6956 					this->prepare_tess_ctrl_shader(tested_shader_type, uniform_definition, uniform_use);
   6957 				const std::string& tess_eval_shader_source =
   6958 					this->prepare_tess_eval_shader(tested_shader_type, uniform_definition, uniform_use);
   6959 				const std::string& vertex_shader_source =
   6960 					this->prepare_vertex_shader(tested_shader_type, uniform_definition, uniform_use);
   6961 
   6962 				switch (tested_shader_type)
   6963 				{
   6964 				case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   6965 				case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   6966 					this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   6967 					break;
   6968 
   6969 				case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   6970 				case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   6971 				case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   6972 				case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   6973 					this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   6974 												geometry_shader_source, fragment_shader_source, compute_shader_source,
   6975 												false, false);
   6976 					break;
   6977 
   6978 				default:
   6979 					TCU_FAIL("Invalid enum");
   6980 					break;
   6981 				}
   6982 			}
   6983 			else
   6984 			{
   6985 				const std::string& fragment_shader_source =
   6986 					this->prepare_fragment_shader(tested_shader_type, uniform_definition, uniform_use);
   6987 				const std::string& vertex_shader_source =
   6988 					this->prepare_vertex_shader(tested_shader_type, uniform_definition, uniform_use);
   6989 
   6990 				this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   6991 			}
   6992 
   6993 			glw::GLuint buffer_object_id	   = 0;
   6994 			glw::GLint  my_uniform_block_index = GL_INVALID_INDEX;
   6995 
   6996 			gl.useProgram(this->program_object_id);
   6997 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   6998 
   6999 			my_uniform_block_index = gl.getUniformBlockIndex(this->program_object_id, "uniform_block_name");
   7000 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformBlockIndex() failed.");
   7001 
   7002 			if ((unsigned)my_uniform_block_index == GL_INVALID_INDEX)
   7003 			{
   7004 				TCU_FAIL("Uniform block not found or is considered as not active.");
   7005 			}
   7006 
   7007 			gl.genBuffers(1, &buffer_object_id);
   7008 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() failed.");
   7009 
   7010 			gl.bindBuffer(GL_UNIFORM_BUFFER, buffer_object_id);
   7011 			GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() failed.");
   7012 
   7013 			switch (var_type_index)
   7014 			{
   7015 			case 0: //float type of uniform is considered
   7016 			{
   7017 				glw::GLfloat buffer_data[] = { 0.0f, 1.0f, 2.0f,  3.0f,  4.0f,  5.0f,  6.0f,  7.0f,
   7018 											   8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f };
   7019 
   7020 				gl.bufferData(GL_UNIFORM_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7021 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7022 
   7023 				break;
   7024 			}		/* float case */
   7025 			case 1: //int type of uniform is considered
   7026 			{
   7027 
   7028 				glw::GLint buffer_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
   7029 
   7030 				gl.bufferData(GL_UNIFORM_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7031 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7032 
   7033 				break;
   7034 			}		/* int case */
   7035 			case 2: //uint type of uniform is considered
   7036 			{
   7037 				glw::GLuint buffer_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
   7038 
   7039 				gl.bufferData(GL_UNIFORM_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7040 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7041 
   7042 				break;
   7043 			}		/* uint case */
   7044 			case 3: //double type of uniform is considered
   7045 			{
   7046 				glw::GLdouble buffer_data[] = { 0.0, 1.0, 2.0,  3.0,  4.0,  5.0,  6.0,  7.0,
   7047 												8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0 };
   7048 
   7049 				gl.bufferData(GL_UNIFORM_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7050 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7051 
   7052 				break;
   7053 			} /* double case */
   7054 			default:
   7055 			{
   7056 				TCU_FAIL("Invalid variable-type index.");
   7057 
   7058 				break;
   7059 			}
   7060 			} /* switch (var_type_index) */
   7061 
   7062 			gl.uniformBlockBinding(this->program_object_id, my_uniform_block_index, 0);
   7063 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformBlockBinding() failed.");
   7064 
   7065 			gl.bindBufferBase(GL_UNIFORM_BUFFER, 0, buffer_object_id);
   7066 			GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase() failed.");
   7067 
   7068 			if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type)
   7069 			{
   7070 				execute_draw_test(tested_shader_type);
   7071 			}
   7072 			else
   7073 			{
   7074 				execute_dispatch_test();
   7075 			}
   7076 
   7077 			/* Deallocate any resources used. */
   7078 			gl.deleteBuffers(1, &buffer_object_id);
   7079 			this->delete_objects();
   7080 		} /* if var_type iterator found */
   7081 		else
   7082 		{
   7083 			TCU_FAIL("Type not found.");
   7084 		}
   7085 	} /* for (int var_type_index = 0; ...) */
   7086 }
   7087 
   7088 /** Executes test for compute program
   7089  *
   7090  * @tparam API Tested API descriptor
   7091  **/
   7092 template <class API>
   7093 void InteractionUniformBuffers2<API>::execute_dispatch_test()
   7094 {
   7095 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   7096 
   7097 	gl.dispatchCompute(1, 1, 1);
   7098 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   7099 }
   7100 
   7101 /** Executes test for draw program
   7102  *
   7103  * @tparam API               Tested API descriptor
   7104  *
   7105  * @param tested_shader_type The type of shader that is being tested
   7106  **/
   7107 template <class API>
   7108 void InteractionUniformBuffers2<API>::execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7109 {
   7110 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   7111 
   7112 	glw::GLuint vao_id = 0;
   7113 
   7114 	gl.genVertexArrays(1, &vao_id);
   7115 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   7116 
   7117 	gl.bindVertexArray(vao_id);
   7118 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   7119 
   7120 	switch (tested_shader_type)
   7121 	{
   7122 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7123 	case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   7124 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   7125 		gl.drawArrays(GL_POINTS, 0, 1);
   7126 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   7127 		break;
   7128 
   7129 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   7130 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   7131 		/* Tesselation patch set up */
   7132 		gl.patchParameteri(GL_PATCH_VERTICES, 1);
   7133 		GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
   7134 
   7135 		gl.drawArrays(GL_PATCHES, 0, 1);
   7136 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   7137 		break;
   7138 
   7139 	default:
   7140 		TCU_FAIL("Invalid enum");
   7141 		break;
   7142 	}
   7143 
   7144 	gl.deleteVertexArrays(1, &vao_id);
   7145 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteVertexArrays() failed.");
   7146 }
   7147 
   7148 /* Generates the shader source code for the InteractionUniformBuffers3
   7149  * array tests, and attempts to compile each test shader, for both
   7150  * vertex and fragment shaders.
   7151  *
   7152  * @tparam API               Tested API descriptor
   7153  *
   7154  * @param tested_shader_type The type of shader that is being tested
   7155  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   7156  */
   7157 template <class API>
   7158 void InteractionUniformBuffers3<API>::test_shader_compilation(
   7159 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7160 {
   7161 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   7162 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   7163 
   7164 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   7165 															 VAR_TYPE_DOUBLE };
   7166 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   7167 
   7168 	const std::string invalid_size_declarations[] = { "[2][2][2][]", "[2][2][][2]", "[2][][2][2]", "[][2][2][2]",
   7169 													  "[2][2][][]",  "[2][][2][]",  "[][2][2][]",  "[2][][][2]",
   7170 													  "[][2][][2]",  "[][][2][2]",  "[2][][][]",   "[][2][][]",
   7171 													  "[][][2][]",   "[][][][2]",   "[][][][]" };
   7172 
   7173 	const std::string array_initializers[] = { "float[2][2][2][2](float[2][2][2](float[2][2](float[2](1.0, 2.0),"
   7174 											   "float[2](3.0, 4.0)),"
   7175 											   "float[2][2](float[2](5.0, 6.0),"
   7176 											   "float[2](7.0, 8.0))),"
   7177 											   "float[2][2][2](float[2][2](float[2](1.1, 2.1),"
   7178 											   "float[2](3.1, 4.1)),"
   7179 											   "float[2][2](float[2](5.1, 6.1),"
   7180 											   "float[2](7.1, 8.1))));\n",
   7181 
   7182 											   "int[2][2][2][2](int[2][2][2](int[2][2](int[2]( 1,  2),"
   7183 											   "int[2]( 3,  4)),"
   7184 											   "int[2][2](int[2]( 5,  6),"
   7185 											   "int[2]( 7,  8))),"
   7186 											   "int[2][2][2](int[2][2](int[2](11, 12),"
   7187 											   "int[2](13, 14)),"
   7188 											   "int[2][2](int[2](15, 16),"
   7189 											   "int[2](17, 18))));\n",
   7190 
   7191 											   "uint[2][2][2][2](uint[2][2][2](uint[2][2](uint[2]( 1u,  2u),"
   7192 											   "uint[2]( 3u,  4u)),"
   7193 											   "uint[2][2](uint[2]( 5u,  6u),"
   7194 											   "uint[2]( 7u,  8u))),"
   7195 											   "uint[2][2][2](uint[2][2](uint[2](11u, 12u),"
   7196 											   "uint[2](13u, 14u)),"
   7197 											   "uint[2][2](uint[2](15u, 16u),"
   7198 											   "uint[2](17u, 18u))));\n",
   7199 
   7200 											   "double[2][2][2][2](double[2][2][2](double[2][2](double[2](1.0, 2.0),"
   7201 											   "double[2](3.0, 4.0)),"
   7202 											   "double[2][2](double[2](5.0, 6.0),"
   7203 											   "double[2](7.0, 8.0))),"
   7204 											   "double[2][2][2](double[2][2](double[2](1.1, 2.1),"
   7205 											   "double[2](3.1, 4.1)),"
   7206 											   "double[2][2](double[2](5.1, 6.1),"
   7207 											   "double[2](7.1, 8.1))));\n" };
   7208 	const glcts::test_var_type* var_types_set = var_types_set_es;
   7209 	size_t						num_var_types = num_var_types_es;
   7210 
   7211 	if (API::USE_DOUBLE)
   7212 	{
   7213 		var_types_set = var_types_set_gl;
   7214 		num_var_types = num_var_types_gl;
   7215 	}
   7216 
   7217 	/* Iterate through float/ int/ uint types.
   7218 	 * Case: without initializer.
   7219 	 */
   7220 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   7221 	{
   7222 		_supported_variable_types_map_const_iterator var_iterator =
   7223 			supported_variable_types_map.find(var_types_set[var_type_index]);
   7224 
   7225 		if (var_iterator != supported_variable_types_map.end())
   7226 		{
   7227 			for (size_t invalid_size_declarations_index = 0;
   7228 				 invalid_size_declarations_index <
   7229 				 sizeof(invalid_size_declarations) / sizeof(invalid_size_declarations[0]);
   7230 				 invalid_size_declarations_index++)
   7231 			{
   7232 				std::string shader_source;
   7233 
   7234 				shader_source = "layout (std140) uniform MyUniform {\n";
   7235 				shader_source += "    " + var_iterator->second.type +
   7236 								 invalid_size_declarations[invalid_size_declarations_index] + " my_variable;\n";
   7237 				shader_source += "};\n\n";
   7238 				shader_source += shader_start;
   7239 
   7240 				/* End main */
   7241 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   7242 
   7243 				/* Execute test */
   7244 				EXECUTE_SHADER_TEST(API::ALLOW_UNSIZED_DECLARATION && invalid_size_declarations_index == 3,
   7245 									tested_shader_type, shader_source);
   7246 			} /* for (int invalid_size_declarations_index = 0; ...) */
   7247 		}
   7248 		else
   7249 		{
   7250 			TCU_FAIL("Type not found.");
   7251 		}
   7252 	} /* for (int var_type_index = 0; ...) */
   7253 
   7254 	/* Iterate through float/ int/ uint types.
   7255 	 * Case: with initializer.
   7256 	 */
   7257 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   7258 	{
   7259 		_supported_variable_types_map_const_iterator var_iterator =
   7260 			supported_variable_types_map.find(var_types_set[var_type_index]);
   7261 
   7262 		if (var_iterator != supported_variable_types_map.end())
   7263 		{
   7264 			for (size_t invalid_size_declarations_index = 0;
   7265 				 invalid_size_declarations_index <
   7266 				 sizeof(invalid_size_declarations) / sizeof(invalid_size_declarations[0]);
   7267 				 invalid_size_declarations_index++)
   7268 			{
   7269 				std::string shader_source;
   7270 
   7271 				shader_source = "layout (std140) uniform MyUniform {\n";
   7272 				shader_source += "    " + var_iterator->second.type +
   7273 								 invalid_size_declarations[invalid_size_declarations_index] +
   7274 								 " my_variable = " + array_initializers[var_type_index];
   7275 
   7276 				var_iterator->second.type + invalid_size_declarations[invalid_size_declarations_index] +
   7277 					" my_variable = " + array_initializers[var_type_index];
   7278 				shader_source += "};\n\n";
   7279 				shader_source += shader_start;
   7280 
   7281 				/* End main */
   7282 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   7283 
   7284 				/* Execute test */
   7285 				this->execute_negative_test(tested_shader_type, shader_source);
   7286 			} /* for (int invalid_size_declarations_index = 0; ...) */
   7287 		}	 /* if var_type iterator found */
   7288 		else
   7289 		{
   7290 			TCU_FAIL("Type not found.");
   7291 		}
   7292 	} /* for (int var_type_index = 0; ...) */
   7293 }
   7294 
   7295 /* Generates the shader source code for the InteractionStorageBuffers1
   7296  * array tests, and attempts to compile each test shader, for both
   7297  * vertex and fragment shaders.
   7298  *
   7299  * @tparam API               Tested API descriptor
   7300  *
   7301  * @param tested_shader_type The type of shader that is being tested
   7302  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   7303  */
   7304 template <class API>
   7305 void InteractionStorageBuffers1<API>::test_shader_compilation(
   7306 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7307 {
   7308 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   7309 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   7310 
   7311 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   7312 															 VAR_TYPE_DOUBLE };
   7313 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   7314 
   7315 	const glcts::test_var_type* var_types_set = var_types_set_es;
   7316 	size_t						num_var_types = num_var_types_es;
   7317 
   7318 	if (API::USE_DOUBLE)
   7319 	{
   7320 		var_types_set = var_types_set_gl;
   7321 		num_var_types = num_var_types_gl;
   7322 	}
   7323 
   7324 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   7325 	{
   7326 		_supported_variable_types_map_const_iterator var_iterator =
   7327 			supported_variable_types_map.find(var_types_set[var_type_index]);
   7328 
   7329 		if (var_iterator != supported_variable_types_map.end())
   7330 		{
   7331 			std::string shader_source;
   7332 
   7333 			shader_source += "buffer uBlocka {\n";
   7334 			shader_source += "    " + var_iterator->second.type + " x[1][1][1][1][1][1];\n";
   7335 			shader_source += "};\n\n";
   7336 			shader_source += shader_start;
   7337 
   7338 			/* End main */
   7339 			DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   7340 
   7341 			/* Execute test */
   7342 			EXECUTE_POSITIVE_TEST(tested_shader_type, shader_source, true, false);
   7343 		} /* if var_type iterator found */
   7344 		else
   7345 		{
   7346 			TCU_FAIL("Type not found.");
   7347 		}
   7348 	}
   7349 }
   7350 
   7351 /* Generates the shader source code for the InteractionUniformBuffers2
   7352  * array tests, and attempts to compile each test shader, for both
   7353  * vertex and fragment shaders.
   7354  *
   7355  * @tparam API               Tested API descriptor
   7356  *
   7357  * @param tested_shader_type The type of shader that is being tested
   7358  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   7359  */
   7360 template <class API>
   7361 void InteractionStorageBuffers2<API>::test_shader_compilation(
   7362 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7363 {
   7364 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   7365 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   7366 
   7367 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   7368 															 VAR_TYPE_DOUBLE };
   7369 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   7370 
   7371 	const glw::Functions&		gl			  = this->context_id.getRenderContext().getFunctions();
   7372 	const glcts::test_var_type* var_types_set = var_types_set_es;
   7373 	size_t						num_var_types = num_var_types_es;
   7374 
   7375 	if (API::USE_DOUBLE)
   7376 	{
   7377 		var_types_set = var_types_set_gl;
   7378 		num_var_types = num_var_types_gl;
   7379 	}
   7380 
   7381 	/* Iterate through float / int / uint values. */
   7382 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   7383 	{
   7384 		_supported_variable_types_map_const_iterator var_iterator =
   7385 			supported_variable_types_map.find(var_types_set[var_type_index]);
   7386 
   7387 		if (var_iterator != supported_variable_types_map.end())
   7388 		{
   7389 			std::string uniform_definition;
   7390 			std::string uniform_use;
   7391 
   7392 			uniform_definition += "layout (std140) buffer storage_block_name\n"
   7393 								  "{\n";
   7394 			uniform_definition += "    ";
   7395 			uniform_definition += var_iterator->second.type;
   7396 			uniform_definition += " my_storage_1[1][1][1][1];\n"
   7397 								  "};\n";
   7398 
   7399 			uniform_use = "    float result = float(my_storage_1[0][0][0][0]);\n";
   7400 
   7401 			if (API::USE_ALL_SHADER_STAGES)
   7402 			{
   7403 				const std::string& compute_shader_source =
   7404 					this->prepare_compute_shader(tested_shader_type, uniform_definition, uniform_use);
   7405 				const std::string& fragment_shader_source =
   7406 					this->prepare_fragment_shader(tested_shader_type, uniform_definition, uniform_use);
   7407 				const std::string& geometry_shader_source =
   7408 					this->prepare_geometry_shader(tested_shader_type, uniform_definition, uniform_use);
   7409 				const std::string& tess_ctrl_shader_source =
   7410 					this->prepare_tess_ctrl_shader(tested_shader_type, uniform_definition, uniform_use);
   7411 				const std::string& tess_eval_shader_source =
   7412 					this->prepare_tess_eval_shader(tested_shader_type, uniform_definition, uniform_use);
   7413 				const std::string& vertex_shader_source =
   7414 					this->prepare_vertex_shader(tested_shader_type, uniform_definition, uniform_use);
   7415 
   7416 				switch (tested_shader_type)
   7417 				{
   7418 				case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   7419 				case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7420 					this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   7421 					break;
   7422 
   7423 				case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   7424 				case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   7425 				case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   7426 				case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   7427 					this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   7428 												geometry_shader_source, fragment_shader_source, compute_shader_source,
   7429 												false, false);
   7430 					break;
   7431 
   7432 				default:
   7433 					TCU_FAIL("Invalid enum");
   7434 					break;
   7435 				}
   7436 			}
   7437 			else
   7438 			{
   7439 				const std::string& fragment_shader_source =
   7440 					this->prepare_fragment_shader(tested_shader_type, uniform_definition, uniform_use);
   7441 				const std::string& vertex_shader_source =
   7442 					this->prepare_vertex_shader(tested_shader_type, uniform_definition, uniform_use);
   7443 
   7444 				this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   7445 			}
   7446 
   7447 			glw::GLuint buffer_object_id	   = 0;
   7448 			glw::GLint  my_storage_block_index = GL_INVALID_INDEX;
   7449 
   7450 			gl.useProgram(this->program_object_id);
   7451 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   7452 
   7453 			my_storage_block_index =
   7454 				gl.getProgramResourceIndex(this->program_object_id, GL_SHADER_STORAGE_BLOCK, "storage_block_name");
   7455 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramResourceIndex() failed.");
   7456 
   7457 			if ((unsigned)my_storage_block_index == GL_INVALID_INDEX)
   7458 			{
   7459 				TCU_FAIL("Uniform block not found or is considered as not active.");
   7460 			}
   7461 
   7462 			gl.genBuffers(1, &buffer_object_id);
   7463 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() failed.");
   7464 
   7465 			gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, buffer_object_id);
   7466 			GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() failed.");
   7467 
   7468 			switch (var_type_index)
   7469 			{
   7470 			case 0: //float type of uniform is considered
   7471 			{
   7472 				glw::GLfloat buffer_data[] = { 0.0f, 1.0f, 2.0f,  3.0f,  4.0f,  5.0f,  6.0f,  7.0f,
   7473 											   8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f };
   7474 
   7475 				gl.bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7476 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7477 
   7478 				break;
   7479 			}		/* float case */
   7480 			case 1: //int type of uniform is considered
   7481 			{
   7482 
   7483 				glw::GLint buffer_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
   7484 
   7485 				gl.bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7486 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7487 
   7488 				break;
   7489 			}		/* int case */
   7490 			case 2: //uint type of uniform is considered
   7491 			{
   7492 				glw::GLuint buffer_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
   7493 
   7494 				gl.bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7495 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7496 
   7497 				break;
   7498 			}		/* uint case */
   7499 			case 3: //double type of uniform is considered
   7500 			{
   7501 				glw::GLdouble buffer_data[] = { 0.0, 1.0, 2.0,  3.0,  4.0,  5.0,  6.0,  7.0,
   7502 												8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0 };
   7503 
   7504 				gl.bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(buffer_data), buffer_data, GL_STATIC_DRAW);
   7505 				GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   7506 
   7507 				break;
   7508 			} /* double case */
   7509 			default:
   7510 			{
   7511 				TCU_FAIL("Invalid variable-type index.");
   7512 
   7513 				break;
   7514 			}
   7515 			} /* switch (var_type_index) */
   7516 
   7517 			gl.shaderStorageBlockBinding(this->program_object_id, my_storage_block_index, 0);
   7518 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformBlockBinding() failed.");
   7519 
   7520 			gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer_object_id);
   7521 			GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase() failed.");
   7522 
   7523 			if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type)
   7524 			{
   7525 				execute_draw_test(tested_shader_type);
   7526 			}
   7527 			else
   7528 			{
   7529 				execute_dispatch_test();
   7530 			}
   7531 
   7532 			/* Deallocate any resources used. */
   7533 			gl.deleteBuffers(1, &buffer_object_id);
   7534 			this->delete_objects();
   7535 		} /* if var_type iterator found */
   7536 		else
   7537 		{
   7538 			TCU_FAIL("Type not found.");
   7539 		}
   7540 	} /* for (int var_type_index = 0; ...) */
   7541 }
   7542 
   7543 /** Executes test for compute program
   7544  *
   7545  * @tparam API               Tested API descriptor
   7546  **/
   7547 template <class API>
   7548 void InteractionStorageBuffers2<API>::execute_dispatch_test()
   7549 {
   7550 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   7551 
   7552 	gl.dispatchCompute(1, 1, 1);
   7553 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   7554 }
   7555 
   7556 /** Executes test for draw program
   7557  *
   7558  * @tparam API               Tested API descriptor
   7559  *
   7560  * @param tested_shader_type The type of shader that is being tested
   7561  **/
   7562 template <class API>
   7563 void InteractionStorageBuffers2<API>::execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7564 {
   7565 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   7566 
   7567 	glw::GLuint vao_id = 0;
   7568 
   7569 	gl.genVertexArrays(1, &vao_id);
   7570 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   7571 
   7572 	gl.bindVertexArray(vao_id);
   7573 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   7574 
   7575 	switch (tested_shader_type)
   7576 	{
   7577 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7578 	case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   7579 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   7580 		gl.drawArrays(GL_POINTS, 0, 1);
   7581 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   7582 		break;
   7583 
   7584 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   7585 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   7586 		/* Tesselation patch set up */
   7587 		gl.patchParameteri(GL_PATCH_VERTICES, 1);
   7588 		GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
   7589 
   7590 		gl.drawArrays(GL_PATCHES, 0, 1);
   7591 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   7592 		break;
   7593 
   7594 	default:
   7595 		TCU_FAIL("Invalid enum");
   7596 		break;
   7597 	}
   7598 
   7599 	gl.deleteVertexArrays(1, &vao_id);
   7600 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteVertexArrays() failed.");
   7601 }
   7602 
   7603 /* Generates the shader source code for the InteractionUniformBuffers3
   7604  * array tests, and attempts to compile each test shader, for both
   7605  * vertex and fragment shaders.
   7606  *
   7607  * @tparam API               Tested API descriptor
   7608  *
   7609  * @param tested_shader_type The type of shader that is being tested
   7610  *                           (either TestCaseBase<API>::VERTEX_SHADER_TYPE or TestCaseBase<API>::FRAGMENT_SHADER_TYPE).
   7611  */
   7612 template <class API>
   7613 void InteractionStorageBuffers3<API>::test_shader_compilation(
   7614 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7615 {
   7616 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT };
   7617 	static const size_t				  num_var_types_es   = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   7618 
   7619 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_FLOAT, VAR_TYPE_INT, VAR_TYPE_UINT,
   7620 															 VAR_TYPE_DOUBLE };
   7621 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   7622 
   7623 	const std::string invalid_size_declarations[] = { "[2][2][2][]", "[2][2][][2]", "[2][][2][2]", "[][2][2][2]",
   7624 													  "[2][2][][]",  "[2][][2][]",  "[][2][2][]",  "[2][][][2]",
   7625 													  "[][2][][2]",  "[][][2][2]",  "[2][][][]",   "[][2][][]",
   7626 													  "[][][2][]",   "[][][][2]",   "[][][][]" };
   7627 	const std::string array_initializers[] = { "float[2][2][2][2](float[2][2][2](float[2][2](float[2](1.0, 2.0),"
   7628 											   "float[2](3.0, 4.0)),"
   7629 											   "float[2][2](float[2](5.0, 6.0),"
   7630 											   "float[2](7.0, 8.0))),"
   7631 											   "float[2][2][2](float[2][2](float[2](1.1, 2.1),"
   7632 											   "float[2](3.1, 4.1)),"
   7633 											   "float[2][2](float[2](5.1, 6.1),"
   7634 											   "float[2](7.1, 8.1))));\n",
   7635 
   7636 											   "int[2][2][2][2](int[2][2][2](int[2][2](int[2]( 1,  2),"
   7637 											   "int[2]( 3,  4)),"
   7638 											   "int[2][2](int[2]( 5,  6),"
   7639 											   "int[2]( 7,  8))),"
   7640 											   "int[2][2][2](int[2][2](int[2](11, 12),"
   7641 											   "int[2](13, 14)),"
   7642 											   "int[2][2](int[2](15, 16),"
   7643 											   "int[2](17, 18))));\n",
   7644 
   7645 											   "uint[2][2][2][2](uint[2][2][2](uint[2][2](uint[2]( 1u,  2u),"
   7646 											   "uint[2]( 3u,  4u)),"
   7647 											   "uint[2][2](uint[2]( 5u,  6u),"
   7648 											   "uint[2]( 7u,  8u))),"
   7649 											   "uint[2][2][2](uint[2][2](uint[2](11u, 12u),"
   7650 											   "uint[2](13u, 14u)),"
   7651 											   "uint[2][2](uint[2](15u, 16u),"
   7652 											   "uint[2](17u, 18u))));\n",
   7653 
   7654 											   "double[2][2][2][2](double[2][2][2](double[2][2](double[2](1.0, 2.0),"
   7655 											   "double[2](3.0, 4.0)),"
   7656 											   "double[2][2](double[2](5.0, 6.0),"
   7657 											   "double[2](7.0, 8.0))),"
   7658 											   "double[2][2][2](double[2][2](double[2](1.1, 2.1),"
   7659 											   "double[2](3.1, 4.1)),"
   7660 											   "double[2][2](double[2](5.1, 6.1),"
   7661 											   "double[2](7.1, 8.1))));\n" };
   7662 	const glcts::test_var_type* var_types_set = var_types_set_es;
   7663 	size_t						num_var_types = num_var_types_es;
   7664 
   7665 	if (API::USE_DOUBLE)
   7666 	{
   7667 		var_types_set = var_types_set_gl;
   7668 		num_var_types = num_var_types_gl;
   7669 	}
   7670 
   7671 	/* Iterate through float/ int/ uint types.
   7672 	 * Case: without initializer.
   7673 	 */
   7674 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   7675 	{
   7676 		_supported_variable_types_map_const_iterator var_iterator =
   7677 			supported_variable_types_map.find(var_types_set[var_type_index]);
   7678 
   7679 		if (var_iterator != supported_variable_types_map.end())
   7680 		{
   7681 			for (size_t invalid_size_declarations_index = 0;
   7682 				 invalid_size_declarations_index <
   7683 				 sizeof(invalid_size_declarations) / sizeof(invalid_size_declarations[0]);
   7684 				 invalid_size_declarations_index++)
   7685 			{
   7686 				std::string shader_source;
   7687 
   7688 				shader_source = "layout (std140) buffer MyStorage {\n";
   7689 				shader_source += "    " + var_iterator->second.type +
   7690 								 invalid_size_declarations[invalid_size_declarations_index] + " my_variable;\n";
   7691 				shader_source += "};\n\n";
   7692 				shader_source += shader_start;
   7693 
   7694 				/* End main */
   7695 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   7696 
   7697 				/* Execute test */
   7698 				EXECUTE_SHADER_TEST(API::ALLOW_UNSIZED_DECLARATION && invalid_size_declarations_index == 3,
   7699 									tested_shader_type, shader_source);
   7700 			} /* for (int invalid_size_declarations_index = 0; ...) */
   7701 		}
   7702 		else
   7703 		{
   7704 			TCU_FAIL("Type not found.");
   7705 		}
   7706 	} /* for (int var_type_index = 0; ...) */
   7707 
   7708 	/* Iterate through float/ int/ uint types.
   7709 	 * Case: with initializer.
   7710 	 */
   7711 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   7712 	{
   7713 		_supported_variable_types_map_const_iterator var_iterator =
   7714 			supported_variable_types_map.find(var_types_set[var_type_index]);
   7715 
   7716 		if (var_iterator != supported_variable_types_map.end())
   7717 		{
   7718 			for (size_t invalid_size_declarations_index = 0;
   7719 				 invalid_size_declarations_index <
   7720 				 sizeof(invalid_size_declarations) / sizeof(invalid_size_declarations[0]);
   7721 				 invalid_size_declarations_index++)
   7722 			{
   7723 				std::string shader_source;
   7724 
   7725 				shader_source = "layout (std140) buffer MyStorage {\n";
   7726 				shader_source += "    " + var_iterator->second.type +
   7727 								 invalid_size_declarations[invalid_size_declarations_index] +
   7728 								 " my_variable = " + array_initializers[var_type_index];
   7729 
   7730 				var_iterator->second.type + invalid_size_declarations[invalid_size_declarations_index] +
   7731 					" my_variable = " + array_initializers[var_type_index];
   7732 				shader_source += "};\n\n";
   7733 				shader_source += shader_start;
   7734 
   7735 				/* End main */
   7736 				DEFAULT_MAIN_ENDING(tested_shader_type, shader_source);
   7737 
   7738 				/* Execute test */
   7739 				this->execute_negative_test(tested_shader_type, shader_source);
   7740 			} /* for (int invalid_size_declarations_index = 0; ...) */
   7741 		}	 /* if var_type iterator found */
   7742 		else
   7743 		{
   7744 			TCU_FAIL("Type not found.");
   7745 		}
   7746 	} /* for (int var_type_index = 0; ...) */
   7747 }
   7748 
   7749 /* Generates the shader source code for the InteractionInterfaceArrays1
   7750  * array test, and attempts to compile the test shader.
   7751  *
   7752  * @tparam API               Tested API descriptor
   7753  *
   7754  * @param tested_shader_type The type of shader that is being tested.
   7755  */
   7756 template <class API>
   7757 void InteractionInterfaceArrays1<API>::test_shader_compilation(
   7758 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   7759 {
   7760 	/* Shader source with invalid buffer (buffer cannot be of arrays of arrays type). */
   7761 	const std::string invalid_buffer_shader_source = "layout(std140) buffer MyBuffer\n"
   7762 													 "{\n"
   7763 													 "    float f;\n"
   7764 													 "    int   i;\n"
   7765 													 "    uint  ui;\n"
   7766 													 "} myBuffers[2][2];\n\n"
   7767 													 "void main()\n"
   7768 													 "{\n";
   7769 
   7770 	/* Verify that buffer arrays of arrays type is rejected. */
   7771 	{
   7772 		std::string source = invalid_buffer_shader_source;
   7773 
   7774 		DEFAULT_MAIN_ENDING(tested_shader_type, source);
   7775 
   7776 		EXECUTE_SHADER_TEST(API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS, tested_shader_type, source);
   7777 	}
   7778 }
   7779 
   7780 /* Generates the shader source code for the InteractionInterfaceArrays2
   7781  * array test, and attempts to compile the test shader.
   7782  *
   7783  * @tparam API              Tested API descriptor
   7784  *
   7785  * @param input_shader_type The type of shader that is being tested.
   7786  */
   7787 template <class API>
   7788 void InteractionInterfaceArrays2<API>::test_shader_compilation(
   7789 	typename TestCaseBase<API>::TestShaderType input_shader_type)
   7790 {
   7791 	/* Shader source with invalid input (input cannot be of arrays of arrays type). */
   7792 	const std::string input_variable_shader_source[] = { "in  float inout_variable", "[2][2];\n"
   7793 																					 "out float result",
   7794 														 ";\n\n"
   7795 														 "void main()\n"
   7796 														 "{\n"
   7797 														 "    result",
   7798 														 " = inout_variable", "[0][0];\n" };
   7799 	/* Shader source with invalid output (output cannot be of arrays of arrays type). */
   7800 	const std::string output_variable_shader_source[] = { "out float inout_variable",
   7801 														  "[2][2];\n\n"
   7802 														  "void main()\n"
   7803 														  "{\n"
   7804 														  "    inout_variable",
   7805 														  "[0][0] = 0.0;\n"
   7806 														  "    inout_variable",
   7807 														  "[0][1] = 1.0;\n"
   7808 														  "    inout_variable",
   7809 														  "[1][0] = 2.0;\n"
   7810 														  "    inout_variable",
   7811 														  "[1][1] = 3.0;\n" };
   7812 
   7813 	const typename TestCaseBase<API>::TestShaderType& output_shader_type =
   7814 		this->get_output_shader_type(input_shader_type);
   7815 	std::string input_source;
   7816 	std::string output_source;
   7817 
   7818 	this->prepare_sources(input_shader_type, output_shader_type, input_variable_shader_source,
   7819 						  output_variable_shader_source, input_source, output_source);
   7820 
   7821 	/* Verify that INPUTs and OUTPUTs arrays of arrays type is rejected. */
   7822 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != input_shader_type)
   7823 	{
   7824 		if (API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS)
   7825 		{
   7826 
   7827 			if (API::USE_ALL_SHADER_STAGES)
   7828 			{
   7829 				const std::string& compute_shader_source = empty_string;
   7830 				const std::string& fragment_shader_source =
   7831 					this->prepare_fragment_shader(input_shader_type, input_source, output_source);
   7832 				const std::string& geometry_shader_source =
   7833 					this->prepare_geometry_shader(input_shader_type, input_source, output_source);
   7834 				const std::string& tess_ctrl_shader_source =
   7835 					this->prepare_tess_ctrl_shader_source(input_shader_type, input_source, output_source);
   7836 				const std::string& tess_eval_shader_source =
   7837 					this->prepare_tess_eval_shader_source(input_shader_type, input_source, output_source);
   7838 				const std::string& vertex_shader_source =
   7839 					this->prepare_vertex_shader(input_shader_type, input_source, output_source);
   7840 
   7841 				this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   7842 											geometry_shader_source, fragment_shader_source, compute_shader_source, true,
   7843 											false);
   7844 			}
   7845 			else
   7846 			{
   7847 				const std::string& fragment_shader_source =
   7848 					this->prepare_fragment_shader(input_shader_type, input_source, output_source);
   7849 				const std::string& vertex_shader_source =
   7850 					this->prepare_vertex_shader(input_shader_type, input_source, output_source);
   7851 
   7852 				this->execute_positive_test(vertex_shader_source, fragment_shader_source, true, false);
   7853 			}
   7854 		}
   7855 		else
   7856 		{
   7857 			this->execute_negative_test(input_shader_type, input_source);
   7858 			this->execute_negative_test(output_shader_type, output_source);
   7859 		}
   7860 	}
   7861 }
   7862 
   7863 /** Gets the shader type to test for the outputs
   7864  *
   7865  * @tparam API              Tested API descriptor
   7866  *
   7867  * @param input_shader_type The type of input shader that is being tested
   7868  **/
   7869 template <class API>
   7870 const typename TestCaseBase<API>::TestShaderType InteractionInterfaceArrays2<API>::get_output_shader_type(
   7871 	const typename TestCaseBase<API>::TestShaderType& input_shader_type)
   7872 {
   7873 	switch (input_shader_type)
   7874 	{
   7875 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   7876 		return TestCaseBase<API>::FRAGMENT_SHADER_TYPE;
   7877 
   7878 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7879 		if (API::USE_ALL_SHADER_STAGES)
   7880 		{
   7881 			return TestCaseBase<API>::GEOMETRY_SHADER_TYPE;
   7882 		}
   7883 		else
   7884 		{
   7885 			return TestCaseBase<API>::VERTEX_SHADER_TYPE;
   7886 		}
   7887 
   7888 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   7889 		break;
   7890 
   7891 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   7892 		return TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE;
   7893 
   7894 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   7895 		return TestCaseBase<API>::VERTEX_SHADER_TYPE;
   7896 
   7897 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   7898 		return TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE;
   7899 
   7900 	default:
   7901 		TCU_FAIL("Unrecognized shader type.");
   7902 		break;
   7903 	}
   7904 
   7905 	return input_shader_type;
   7906 }
   7907 
   7908 /** Prepare fragment shader
   7909  *
   7910  * @tparam API              Tested API descriptor
   7911  *
   7912  * @param input_shader_type The type of input shader that is being tested
   7913  * @param input_source      Shader in case we want to test inputs for this shader
   7914  * @param output_source     Shader in case we want to test outputs for this shader
   7915  **/
   7916 template <class API>
   7917 const std::string InteractionInterfaceArrays2<API>::prepare_fragment_shader(
   7918 	const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
   7919 	const std::string& output_source)
   7920 {
   7921 	switch (input_shader_type)
   7922 	{
   7923 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   7924 		return output_source;
   7925 
   7926 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7927 		return input_source;
   7928 
   7929 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   7930 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   7931 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   7932 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   7933 		break;
   7934 
   7935 	default:
   7936 		TCU_FAIL("Unrecognized shader type.");
   7937 		break;
   7938 	}
   7939 
   7940 	return default_fragment_shader_source;
   7941 }
   7942 
   7943 /** Prepare geometry shader
   7944  *
   7945  * @tparam API              Tested API descriptor
   7946  *
   7947  * @param input_shader_type The type of input shader that is being tested
   7948  * @param input_source      Shader in case we want to test inputs for this shader
   7949  * @param output_source     Shader in case we want to test outputs for this shader
   7950  **/
   7951 template <class API>
   7952 const std::string InteractionInterfaceArrays2<API>::prepare_geometry_shader(
   7953 	const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
   7954 	const std::string& output_source)
   7955 {
   7956 	switch (input_shader_type)
   7957 	{
   7958 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7959 		if (API::USE_ALL_SHADER_STAGES)
   7960 		{
   7961 			return output_source;
   7962 		}
   7963 		break;
   7964 
   7965 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   7966 		return input_source;
   7967 
   7968 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   7969 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   7970 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   7971 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   7972 		break;
   7973 
   7974 	default:
   7975 		TCU_FAIL("Unrecognized shader type.");
   7976 		break;
   7977 	}
   7978 
   7979 	return default_geometry_shader_source;
   7980 }
   7981 
   7982 /** Prepare tessellation control shader
   7983  *
   7984  * @tparam API              Tested API descriptor
   7985  *
   7986  * @param input_shader_type The type of input shader that is being tested
   7987  * @param input_source      Shader in case we want to test inputs for this shader
   7988  * @param output_source     Shader in case we want to test outputs for this shader
   7989  **/
   7990 template <class API>
   7991 const std::string InteractionInterfaceArrays2<API>::prepare_tess_ctrl_shader_source(
   7992 	const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
   7993 	const std::string& output_source)
   7994 {
   7995 	switch (input_shader_type)
   7996 	{
   7997 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   7998 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   7999 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8000 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8001 		break;
   8002 
   8003 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8004 		return input_source;
   8005 
   8006 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8007 		return output_source;
   8008 
   8009 	default:
   8010 		TCU_FAIL("Unrecognized shader type.");
   8011 		break;
   8012 	}
   8013 
   8014 	return default_tc_shader_source;
   8015 }
   8016 
   8017 /** Prepare tessellation evaluation shader
   8018  *
   8019  * @tparam API              Tested API descriptor
   8020  *
   8021  * @param input_shader_type The type of input shader that is being tested
   8022  * @param input_source      Shader in case we want to test inputs for this shader
   8023  * @param output_source     Shader in case we want to test outputs for this shader
   8024  **/
   8025 template <class API>
   8026 const std::string InteractionInterfaceArrays2<API>::prepare_tess_eval_shader_source(
   8027 	const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
   8028 	const std::string& output_source)
   8029 {
   8030 	switch (input_shader_type)
   8031 	{
   8032 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   8033 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8034 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8035 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8036 		break;
   8037 
   8038 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8039 		return output_source;
   8040 
   8041 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8042 		return input_source;
   8043 
   8044 	default:
   8045 		TCU_FAIL("Unrecognized shader type.");
   8046 		break;
   8047 	}
   8048 
   8049 	return default_te_shader_source;
   8050 }
   8051 
   8052 /** Prepare vertex shader
   8053  *
   8054  * @tparam API              Tested API descriptor
   8055  *
   8056  * @param input_shader_type The type of input shader that is being tested
   8057  * @param input_source      Shader in case we want to test inputs for this shader
   8058  * @param output_source     Shader in case we want to test outputs for this shader
   8059  **/
   8060 template <class API>
   8061 const std::string InteractionInterfaceArrays2<API>::prepare_vertex_shader(
   8062 	const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
   8063 	const std::string& output_source)
   8064 {
   8065 	switch (input_shader_type)
   8066 	{
   8067 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   8068 		return input_source;
   8069 
   8070 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8071 		if (!API::USE_ALL_SHADER_STAGES)
   8072 		{
   8073 			return output_source;
   8074 		}
   8075 		break;
   8076 
   8077 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8078 		return output_source;
   8079 
   8080 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8081 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8082 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8083 		break;
   8084 
   8085 	default:
   8086 		TCU_FAIL("Unrecognized shader type.");
   8087 		break;
   8088 	}
   8089 
   8090 	return default_vertex_shader_source;
   8091 }
   8092 
   8093 /** Prepare the inputs and outputs shaders
   8094  *
   8095  * @tparam API                 Tested API descriptor
   8096  *
   8097  * @param input_shader_type    The type of input shader that is being tested
   8098  * @param output_shader_type   The type of output shader that is being tested
   8099  * @param input_shader_source  Snippet used to prepare the input shader
   8100  * @param output_shader_source Snippet used to prepare the output shader
   8101  * @param input_source         Resulting input shader
   8102  * @param output_source        Resulting output shader
   8103  **/
   8104 template <class API>
   8105 void InteractionInterfaceArrays2<API>::prepare_sources(
   8106 	const typename TestCaseBase<API>::TestShaderType& input_shader_type,
   8107 	const typename TestCaseBase<API>::TestShaderType& output_shader_type, const std::string* input_shader_source,
   8108 	const std::string* output_shader_source, std::string& input_source, std::string& output_source)
   8109 {
   8110 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != input_shader_type)
   8111 	{
   8112 		input_source += input_shader_source[0];
   8113 		output_source += output_shader_source[0];
   8114 
   8115 		if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == input_shader_type) ||
   8116 			(TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type) ||
   8117 			(TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == input_shader_type))
   8118 		{
   8119 			input_source += "[]";
   8120 		}
   8121 
   8122 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
   8123 		{
   8124 			output_source += "[]";
   8125 		}
   8126 
   8127 		input_source += input_shader_source[1];
   8128 		output_source += output_shader_source[1];
   8129 
   8130 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type)
   8131 		{
   8132 			input_source += "[]";
   8133 		}
   8134 
   8135 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
   8136 		{
   8137 			output_source += "[gl_InvocationID]";
   8138 		}
   8139 
   8140 		input_source += input_shader_source[2];
   8141 		output_source += output_shader_source[2];
   8142 
   8143 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type)
   8144 		{
   8145 			input_source += "[gl_InvocationID]";
   8146 		}
   8147 
   8148 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
   8149 		{
   8150 			output_source += "[gl_InvocationID]";
   8151 		}
   8152 
   8153 		input_source += input_shader_source[3];
   8154 		output_source += output_shader_source[3];
   8155 
   8156 		if ((TestCaseBase<API>::GEOMETRY_SHADER_TYPE == input_shader_type) ||
   8157 			(TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE == input_shader_type))
   8158 		{
   8159 			input_source += "[0]";
   8160 		}
   8161 
   8162 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == input_shader_type)
   8163 		{
   8164 			input_source += "[gl_InvocationID]";
   8165 		}
   8166 
   8167 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
   8168 		{
   8169 			output_source += "[gl_InvocationID]";
   8170 		}
   8171 
   8172 		input_source += input_shader_source[4];
   8173 		output_source += output_shader_source[4];
   8174 
   8175 		if (TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE == output_shader_type)
   8176 		{
   8177 			output_source += "[gl_InvocationID]";
   8178 		}
   8179 
   8180 		output_source += output_shader_source[5];
   8181 
   8182 		DEFAULT_MAIN_ENDING(input_shader_type, input_source);
   8183 		DEFAULT_MAIN_ENDING(output_shader_type, output_source);
   8184 	}
   8185 }
   8186 
   8187 /* Generates the shader source code for the InteractionInterfaceArrays3
   8188  * array test, and attempts to compile the test shader.
   8189  *
   8190  * @tparam API               Tested API descriptor
   8191  *
   8192  * @param tested_shader_type The type of shader that is being tested.
   8193  */
   8194 template <class API>
   8195 void InteractionInterfaceArrays3<API>::test_shader_compilation(
   8196 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   8197 {
   8198 	/* Shader source with invalid uniform block (uniform block cannot be of arrays of arrays type). */
   8199 	const std::string invalid_uniform_block_shader_source = "layout(std140) uniform MyUniformBlock\n"
   8200 															"{\n"
   8201 															"    float f;\n"
   8202 															"    int   i;\n"
   8203 															"    uint  ui;\n"
   8204 															"} myUniformBlocks[2][2];\n\n"
   8205 															"void main()\n"
   8206 															"{\n";
   8207 
   8208 	/* Verify that uniform block arrays of arrays type is rejected. */
   8209 	{
   8210 		std::string source = invalid_uniform_block_shader_source;
   8211 
   8212 		DEFAULT_MAIN_ENDING(tested_shader_type, source);
   8213 
   8214 		EXECUTE_SHADER_TEST(API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS, tested_shader_type, source);
   8215 	}
   8216 }
   8217 
   8218 /* Generates the shader source code for the InteractionInterfaceArrays4
   8219  * array test, and attempts to compile the test shader.
   8220  *
   8221  * @tparam API              Tested API descriptor
   8222  *
   8223  * @param input_shader_type The type of shader that is being tested.
   8224  */
   8225 template <class API>
   8226 void InteractionInterfaceArrays4<API>::test_shader_compilation(
   8227 	typename TestCaseBase<API>::TestShaderType input_shader_type)
   8228 {
   8229 	/* Shader source with invalid input (input cannot be of arrays of arrays type). */
   8230 	const std::string input_block_shader_source[] = { "in  InOutBlock {\n"
   8231 													  "    float inout_variable;\n"
   8232 													  "} inout_block",
   8233 													  "[2][2];\n"
   8234 													  "out float result",
   8235 													  ";\n\n"
   8236 													  "void main()\n"
   8237 													  "{\n"
   8238 													  "    result",
   8239 													  " = inout_block", "[0][0].inout_variable;\n" };
   8240 	/* Shader source with invalid output (output cannot be of arrays of arrays type). */
   8241 	const std::string output_block_shader_source[] = { "out InOutBlock {\n"
   8242 													   "    float inout_variable;\n"
   8243 													   "} inout_block",
   8244 													   "[2][2];\n"
   8245 													   "\n"
   8246 													   "void main()\n"
   8247 													   "{\n"
   8248 													   "    inout_block",
   8249 													   "[0][0].inout_variable = 0.0;\n"
   8250 													   "    inout_block",
   8251 													   "[0][1].inout_variable = 1.0;\n"
   8252 													   "    inout_block",
   8253 													   "[1][0].inout_variable = 2.0;\n"
   8254 													   "    inout_block",
   8255 													   "[1][1].inout_variable = 3.0;\n" };
   8256 
   8257 	const typename TestCaseBase<API>::TestShaderType& output_shader_type =
   8258 		this->get_output_shader_type(input_shader_type);
   8259 	std::string input_source;
   8260 	std::string output_source;
   8261 
   8262 	this->prepare_sources(input_shader_type, output_shader_type, input_block_shader_source, output_block_shader_source,
   8263 						  input_source, output_source);
   8264 
   8265 	/* Verify that INPUTs and OUTPUTs arrays of arrays type is rejected. */
   8266 	if ((TestCaseBase<API>::VERTEX_SHADER_TYPE != input_shader_type) &&
   8267 		(TestCaseBase<API>::COMPUTE_SHADER_TYPE != input_shader_type))
   8268 	{
   8269 		if (API::ALLOW_A_OF_A_ON_INTERFACE_BLOCKS && API::ALLOW_IN_OUT_INTERFACE_BLOCKS)
   8270 		{
   8271 
   8272 			if (API::USE_ALL_SHADER_STAGES)
   8273 			{
   8274 				const std::string& compute_shader_source = empty_string;
   8275 				const std::string& fragment_shader_source =
   8276 					this->prepare_fragment_shader(input_shader_type, input_source, output_source);
   8277 				const std::string& geometry_shader_source =
   8278 					this->prepare_geometry_shader(input_shader_type, input_source, output_source);
   8279 				const std::string& tess_ctrl_shader_source =
   8280 					this->prepare_tess_ctrl_shader_source(input_shader_type, input_source, output_source);
   8281 				const std::string& tess_eval_shader_source =
   8282 					this->prepare_tess_eval_shader_source(input_shader_type, input_source, output_source);
   8283 				const std::string& vertex_shader_source =
   8284 					this->prepare_vertex_shader(input_shader_type, input_source, output_source);
   8285 
   8286 				this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   8287 											geometry_shader_source, fragment_shader_source, compute_shader_source, true,
   8288 											false);
   8289 			}
   8290 			else
   8291 			{
   8292 				const std::string& fragment_shader_source =
   8293 					this->prepare_fragment_shader(input_shader_type, input_source, output_source);
   8294 				const std::string& vertex_shader_source =
   8295 					this->prepare_vertex_shader(input_shader_type, input_source, output_source);
   8296 
   8297 				this->execute_positive_test(vertex_shader_source, fragment_shader_source, true, false);
   8298 			}
   8299 		}
   8300 		else
   8301 		{
   8302 			this->execute_negative_test(input_shader_type, input_source);
   8303 			this->execute_negative_test(output_shader_type, output_source);
   8304 		}
   8305 	}
   8306 }
   8307 
   8308 /** Calulate smallest denominator for values over 1
   8309  *
   8310  * @param value Value in question
   8311  *
   8312  * @return Smallest denominator
   8313  **/
   8314 size_t findSmallestDenominator(const size_t value)
   8315 {
   8316 	/* Skip 0 and 1 */
   8317 	for (size_t i = 2; i < value; ++i)
   8318 	{
   8319 		if (0 == value % i)
   8320 		{
   8321 			return i;
   8322 		}
   8323 	}
   8324 
   8325 	return value;
   8326 }
   8327 
   8328 /** Check if left is bigger than right
   8329  *
   8330  * @tparam T Type of values
   8331 
   8332  * @param l  Left value
   8333  * @param r  Right value
   8334  *
   8335  * @return true if l > r, false otherwise
   8336  **/
   8337 template <class T>
   8338 bool more(const T& l, const T& r)
   8339 {
   8340 	return l > r;
   8341 }
   8342 
   8343 /** Prepare dimensions of array with given number of entries
   8344  *
   8345  * @tparam API       Tested API descriptor
   8346  *
   8347  * @param n_entries  Number of entries
   8348  * @param dimensions Storage for dimesnions
   8349  **/
   8350 template <class API>
   8351 void prepareDimensions(size_t n_entries, std::vector<size_t>& dimensions)
   8352 {
   8353 	if (dimensions.empty())
   8354 		return;
   8355 
   8356 	const size_t last = dimensions.size() - 1;
   8357 
   8358 	/* Calculate */
   8359 	for (size_t i = 0; i < last; ++i)
   8360 	{
   8361 		const size_t denom = findSmallestDenominator(n_entries);
   8362 
   8363 		n_entries /= denom;
   8364 
   8365 		dimensions[i] = denom;
   8366 	}
   8367 
   8368 	dimensions[last] = n_entries;
   8369 
   8370 	/* Sort */
   8371 	std::sort(dimensions.begin(), dimensions.end(), more<size_t>);
   8372 }
   8373 
   8374 /* Generates the shader source code for the AtomicDeclarationTest
   8375  * and attempts to compile each shader
   8376  *
   8377  * @tparam API               Tested API descriptor
   8378  *
   8379  * @param tested_shader_type The type of shader that is being tested
   8380  */
   8381 template <class API>
   8382 void AtomicDeclarationTest<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   8383 {
   8384 	static const char* indent_step		   = "    ";
   8385 	static const char* uniform_atomic_uint = "layout(binding = 0) uniform atomic_uint";
   8386 
   8387 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   8388 
   8389 	std::string			comment;
   8390 	std::vector<size_t> dimensions;
   8391 	std::string			indent;
   8392 	std::string			indexing;
   8393 	std::string			invalid_definition = uniform_atomic_uint;
   8394 	std::string			invalid_iteration;
   8395 	std::string			invalid_shader_source;
   8396 	std::string			loop_end;
   8397 	glw::GLint			max_atomics = 0;
   8398 	glw::GLenum			pname		= 0;
   8399 	std::string			valid_shader_source;
   8400 	std::string			valid_definition = uniform_atomic_uint;
   8401 	std::string			valid_iteration;
   8402 
   8403 	/* Select pname of max for stage */
   8404 	switch (tested_shader_type)
   8405 	{
   8406 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8407 		pname = GL_MAX_COMPUTE_ATOMIC_COUNTERS;
   8408 		break;
   8409 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8410 		pname = GL_MAX_FRAGMENT_ATOMIC_COUNTERS;
   8411 		break;
   8412 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8413 		pname = GL_MAX_GEOMETRY_ATOMIC_COUNTERS;
   8414 		break;
   8415 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8416 		pname = GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS;
   8417 		break;
   8418 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8419 		pname = GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS;
   8420 		break;
   8421 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   8422 		pname = GL_MAX_VERTEX_ATOMIC_COUNTERS;
   8423 		break;
   8424 	default:
   8425 		TCU_FAIL("Invalid enum");
   8426 		break;
   8427 	}
   8428 
   8429 	/* Get maximum */
   8430 	gl.getIntegerv(pname, &max_atomics);
   8431 	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
   8432 
   8433 	if (0 == max_atomics)
   8434 	{
   8435 		/* Not supported - skip */
   8436 		return;
   8437 	}
   8438 	else
   8439 	{
   8440 		dimensions.resize(API::MAX_ARRAY_DIMENSIONS);
   8441 		prepareDimensions<API>(max_atomics, dimensions);
   8442 	}
   8443 
   8444 	/* Prepare parts of shader */
   8445 	for (size_t i = API::MAX_ARRAY_DIMENSIONS; i != 0; --i)
   8446 	{
   8447 		char it[16];
   8448 		char max[16];
   8449 
   8450 		indent += indent_step;
   8451 
   8452 		loop_end.insert(0, "}\n");
   8453 		loop_end.insert(0, indent);
   8454 
   8455 		sprintf(it, "i%u", (unsigned int)(API::MAX_ARRAY_DIMENSIONS - i));
   8456 
   8457 		indexing += "[";
   8458 		indexing += it;
   8459 		indexing += "]";
   8460 
   8461 		sprintf(max, "%u", (unsigned int)(dimensions[i - 1]));
   8462 
   8463 		valid_definition += "[";
   8464 		valid_definition += max;
   8465 		valid_definition += "]";
   8466 
   8467 		valid_iteration += indent;
   8468 		valid_iteration += "for (uint ";
   8469 		valid_iteration += it;
   8470 		valid_iteration += " = 0; ";
   8471 		valid_iteration += it;
   8472 		valid_iteration += " < ";
   8473 		valid_iteration += max;
   8474 		valid_iteration += "; ++";
   8475 		valid_iteration += it;
   8476 		valid_iteration += ")\n";
   8477 		valid_iteration += indent;
   8478 		valid_iteration += "{\n";
   8479 
   8480 		if (1 == i)
   8481 		{
   8482 			sprintf(max, "%u", (unsigned int)(dimensions[i - 1] + 1));
   8483 		}
   8484 		invalid_definition += "[";
   8485 		invalid_definition += max;
   8486 		invalid_definition += "]";
   8487 
   8488 		invalid_iteration += indent;
   8489 		invalid_iteration += "for (uint ";
   8490 		invalid_iteration += it;
   8491 		invalid_iteration += " = 0; ";
   8492 		invalid_iteration += it;
   8493 		invalid_iteration += " < ";
   8494 		invalid_iteration += max;
   8495 		invalid_iteration += "; ++";
   8496 		invalid_iteration += it;
   8497 		invalid_iteration += ")\n";
   8498 		invalid_iteration += indent;
   8499 		invalid_iteration += "{\n";
   8500 	}
   8501 
   8502 	{
   8503 		char max[16];
   8504 
   8505 		sprintf(max, "%u", (unsigned int)(max_atomics));
   8506 		comment += "/* MAX_*_ATOMIC_COUNTERS = ";
   8507 		comment += max;
   8508 		comment += " */\n";
   8509 	}
   8510 
   8511 	/* Prepare invalid source */
   8512 	invalid_shader_source += comment;
   8513 	invalid_shader_source += invalid_definition;
   8514 	invalid_shader_source += " a;\n\nvoid main()\n{\n";
   8515 	invalid_shader_source += invalid_iteration;
   8516 	invalid_shader_source += indent;
   8517 	invalid_shader_source += indent_step;
   8518 	invalid_shader_source += "atomicCounterIncrement( a";
   8519 	invalid_shader_source += indexing;
   8520 	invalid_shader_source += " );\n";
   8521 	invalid_shader_source += loop_end;
   8522 
   8523 	/* Prepare valid source */
   8524 	valid_shader_source += comment;
   8525 	valid_shader_source += valid_definition;
   8526 	valid_shader_source += " a;\n\nvoid main()\n{\n";
   8527 	valid_shader_source += valid_iteration;
   8528 	valid_shader_source += indent;
   8529 	valid_shader_source += indent_step;
   8530 	valid_shader_source += "atomicCounterIncrement( a";
   8531 	valid_shader_source += indexing;
   8532 	valid_shader_source += " );\n";
   8533 	valid_shader_source += loop_end;
   8534 
   8535 	/* End main */
   8536 	DEFAULT_MAIN_ENDING(tested_shader_type, invalid_shader_source);
   8537 	DEFAULT_MAIN_ENDING(tested_shader_type, valid_shader_source);
   8538 
   8539 	/* Execute test */
   8540 	EXECUTE_POSITIVE_TEST(tested_shader_type, valid_shader_source, true, false);
   8541 
   8542 	/* Expect build failure for invalid shader source */
   8543 	{
   8544 		bool negative_build_test_result = false;
   8545 
   8546 		try
   8547 		{
   8548 			EXECUTE_POSITIVE_TEST(tested_shader_type, invalid_shader_source, true, false);
   8549 		}
   8550 		catch (...)
   8551 		{
   8552 			negative_build_test_result = true;
   8553 		}
   8554 
   8555 		if (false == negative_build_test_result)
   8556 		{
   8557 			TCU_FAIL("It was expected that build process will fail");
   8558 		}
   8559 	}
   8560 }
   8561 
   8562 /* Generates the shader source code for the AtomicUsageTest
   8563  * and attempts to compile each shader
   8564  *
   8565  * @tparam API               Tested API descriptor
   8566  *
   8567  * @param tested_shader_type The type of shader that is being tested
   8568  */
   8569 template <class API>
   8570 void AtomicUsageTest<API>::test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type)
   8571 {
   8572 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   8573 
   8574 	glw::GLint  max_atomics  = 0;
   8575 	glw::GLint  max_bindings = 0;
   8576 	glw::GLint  max_size	 = 0;
   8577 	glw::GLenum pname		 = 0;
   8578 
   8579 	/* Select pname of max for stage */
   8580 	switch (tested_shader_type)
   8581 	{
   8582 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8583 		pname = GL_MAX_COMPUTE_ATOMIC_COUNTERS;
   8584 		break;
   8585 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8586 		pname = GL_MAX_FRAGMENT_ATOMIC_COUNTERS;
   8587 		break;
   8588 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8589 		pname = GL_MAX_GEOMETRY_ATOMIC_COUNTERS;
   8590 		break;
   8591 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8592 		pname = GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS;
   8593 		break;
   8594 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8595 		pname = GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS;
   8596 		break;
   8597 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   8598 		pname = GL_MAX_VERTEX_ATOMIC_COUNTERS;
   8599 		break;
   8600 	default:
   8601 		TCU_FAIL("Invalid enum");
   8602 		break;
   8603 	}
   8604 
   8605 	/* Get limits */
   8606 	gl.getIntegerv(pname, &max_atomics);
   8607 	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
   8608 
   8609 	gl.getIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &max_bindings);
   8610 	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
   8611 
   8612 	gl.getIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE, &max_size);
   8613 	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
   8614 
   8615 	if (0 == max_atomics)
   8616 	{
   8617 		/* Not supported - skip */
   8618 		return;
   8619 	}
   8620 
   8621 	const glw::GLuint last_binding = (glw::GLuint)max_bindings - 1;
   8622 	const glw::GLuint offset	   = (glw::GLuint)max_size / 2;
   8623 	glw::GLuint		  n_entries =
   8624 		std::min((glw::GLuint)(max_size - offset) / (glw::GLuint)sizeof(glw::GLuint), (glw::GLuint)max_atomics);
   8625 
   8626 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type)
   8627 	{
   8628 		glw::GLint max_uniform_locations = 0;
   8629 
   8630 		gl.getIntegerv(GL_MAX_UNIFORM_LOCATIONS, &max_uniform_locations);
   8631 		GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
   8632 
   8633 		max_atomics = std::min(max_atomics, (max_uniform_locations - 1));
   8634 		n_entries   = (glw::GLuint)std::min((glw::GLint)n_entries, (max_uniform_locations - 1));
   8635 	}
   8636 
   8637 	execute(tested_shader_type, last_binding, 0 /* offset */, max_atomics);
   8638 	execute(tested_shader_type, last_binding, offset, n_entries);
   8639 }
   8640 
   8641 /* Generates the shader source code for the AtomicUsageTest
   8642  * and attempts to compile each shader
   8643  *
   8644  * @tparam API               Tested API descriptor
   8645  *
   8646  * @param tested_shader_type The type of shader that is being tested
   8647  * @param binding            Binding index
   8648  * @param offset             Offset of data
   8649  * @param n_entries          Number of entries in array
   8650  */
   8651 template <class API>
   8652 void AtomicUsageTest<API>::execute(typename TestCaseBase<API>::TestShaderType tested_shader_type, glw::GLuint binding,
   8653 								   glw::GLuint offset, glw::GLuint n_entries)
   8654 {
   8655 	static const char* indent_step		   = "    ";
   8656 	static const char* layout_binding	  = "layout(binding = ";
   8657 	static const char* layout_offset	   = ", offset = ";
   8658 	static const char* uniform_atomic_uint = ") uniform atomic_uint";
   8659 
   8660 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   8661 
   8662 	std::string			comment;
   8663 	std::vector<size_t> dimensions;
   8664 	std::string			indent;
   8665 	std::string			indexing;
   8666 	std::string			loop_end;
   8667 	std::string			result;
   8668 	std::string			valid_shader_source;
   8669 	std::string			valid_definition = layout_binding;
   8670 	std::string			valid_iteration;
   8671 	std::string			varying_definition;
   8672 
   8673 	dimensions.resize(API::MAX_ARRAY_DIMENSIONS);
   8674 	prepareDimensions<API>(n_entries, dimensions);
   8675 
   8676 	/* Prepare parts of shader */
   8677 
   8678 	/* Append binding */
   8679 	{
   8680 		char buffer[16];
   8681 		sprintf(buffer, "%u", static_cast<unsigned int>(binding));
   8682 		valid_definition += buffer;
   8683 		valid_definition += layout_offset;
   8684 		sprintf(buffer, "%u", static_cast<unsigned int>(offset));
   8685 		valid_definition += buffer;
   8686 		valid_definition += uniform_atomic_uint;
   8687 	}
   8688 
   8689 	for (size_t i = API::MAX_ARRAY_DIMENSIONS; i != 0; --i)
   8690 	{
   8691 		char it[16];
   8692 		char max[16];
   8693 
   8694 		indent += indent_step;
   8695 
   8696 		loop_end.insert(0, "}\n");
   8697 		loop_end.insert(0, indent);
   8698 
   8699 		sprintf(it, "i%u", (unsigned int)(API::MAX_ARRAY_DIMENSIONS - i));
   8700 
   8701 		indexing += "[";
   8702 		indexing += it;
   8703 		indexing += "]";
   8704 
   8705 		sprintf(max, "%u", (unsigned int)(dimensions[i - 1]));
   8706 		valid_definition += "[";
   8707 		valid_definition += max;
   8708 		valid_definition += "]";
   8709 
   8710 		valid_iteration += indent;
   8711 		valid_iteration += "for (uint ";
   8712 		valid_iteration += it;
   8713 		valid_iteration += " = 0; ";
   8714 		valid_iteration += it;
   8715 		valid_iteration += " < ";
   8716 		valid_iteration += max;
   8717 		valid_iteration += "; ++";
   8718 		valid_iteration += it;
   8719 		valid_iteration += ")\n";
   8720 		valid_iteration += indent;
   8721 		valid_iteration += "{\n";
   8722 	}
   8723 
   8724 	{
   8725 		char max[16];
   8726 
   8727 		sprintf(max, "%u", (unsigned int)(n_entries));
   8728 		comment += "/* Number of atomic counters = ";
   8729 		comment += max;
   8730 		comment += " */\n";
   8731 	}
   8732 
   8733 	/* Select varyings and result */
   8734 	switch (tested_shader_type)
   8735 	{
   8736 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8737 		result			   = "    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), vec4(result, 0, 0, 0));\n";
   8738 		varying_definition = "writeonly uniform image2D uni_image;\n"
   8739 							 "\n";
   8740 		break;
   8741 
   8742 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8743 		result			   = "    color = vec4(result);\n";
   8744 		varying_definition = "out vec4 color;\n"
   8745 							 "\n";
   8746 		break;
   8747 
   8748 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8749 		result = "    gl_Position  = vec4(-1, -1, 0, 1);\n"
   8750 				 "    fs_result = result;\n"
   8751 				 "    EmitVertex();\n"
   8752 				 "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   8753 				 "    fs_result = result;\n"
   8754 				 "    EmitVertex();\n"
   8755 				 "    gl_Position  = vec4(1, -1, 0, 1);\n"
   8756 				 "    fs_result = result;\n"
   8757 				 "    EmitVertex();\n"
   8758 				 "    gl_Position  = vec4(1, 1, 0, 1);\n"
   8759 				 "    fs_result = result;\n"
   8760 				 "    EmitVertex();\n";
   8761 		varying_definition = "out float fs_result;\n"
   8762 							 "\n";
   8763 		break;
   8764 
   8765 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8766 		result = "    tcs_result[gl_InvocationID] = result;\n"
   8767 				 "\n"
   8768 				 "    gl_TessLevelOuter[0] = 1.0;\n"
   8769 				 "    gl_TessLevelOuter[1] = 1.0;\n"
   8770 				 "    gl_TessLevelOuter[2] = 1.0;\n"
   8771 				 "    gl_TessLevelOuter[3] = 1.0;\n"
   8772 				 "    gl_TessLevelInner[0] = 1.0;\n"
   8773 				 "    gl_TessLevelInner[1] = 1.0;\n";
   8774 		varying_definition = "out float tcs_result[];\n"
   8775 							 "\n";
   8776 		break;
   8777 
   8778 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8779 		result			   = "    fs_result = result;\n";
   8780 		varying_definition = "out float fs_result;\n"
   8781 							 "\n";
   8782 		break;
   8783 
   8784 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   8785 		result			   = "    fs_result = result;\n";
   8786 		varying_definition = "out float fs_result;\n"
   8787 							 "\n";
   8788 		break;
   8789 
   8790 	default:
   8791 		TCU_FAIL("Invalid enum");
   8792 		break;
   8793 	};
   8794 
   8795 	/* Prepare valid source */
   8796 	valid_shader_source += varying_definition;
   8797 	valid_shader_source += comment;
   8798 	valid_shader_source += valid_definition;
   8799 	valid_shader_source += " a;\n\nvoid main()\n{\n    uint sum = 0u;\n";
   8800 	valid_shader_source += valid_iteration;
   8801 	valid_shader_source += indent;
   8802 	valid_shader_source += indent_step;
   8803 	valid_shader_source += "sum += atomicCounterIncrement( a";
   8804 	valid_shader_source += indexing;
   8805 	valid_shader_source += " );\n";
   8806 	valid_shader_source += loop_end;
   8807 	valid_shader_source += "\n"
   8808 						   "    float result = 0.0;\n"
   8809 						   "\n"
   8810 						   "    if (16u < sum)\n"
   8811 						   "    {\n"
   8812 						   "         result = 1.0;\n"
   8813 						   "    }\n";
   8814 	valid_shader_source += result;
   8815 	valid_shader_source += shader_end;
   8816 
   8817 	/* Build program */
   8818 	{
   8819 		const std::string* cs  = &empty_string;
   8820 		const std::string* vs  = &default_vertex_shader_source;
   8821 		const std::string* tcs = &empty_string;
   8822 		const std::string* tes = &empty_string;
   8823 		const std::string* gs  = &empty_string;
   8824 		const std::string* fs  = &pass_fragment_shader_source;
   8825 
   8826 		switch (tested_shader_type)
   8827 		{
   8828 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   8829 			cs = &valid_shader_source;
   8830 			vs = &empty_string;
   8831 			fs = &empty_string;
   8832 			break;
   8833 
   8834 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8835 			fs = &valid_shader_source;
   8836 			break;
   8837 
   8838 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8839 			gs = &valid_shader_source;
   8840 			break;
   8841 
   8842 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   8843 			tcs = &valid_shader_source;
   8844 			tes = &pass_te_shader_source;
   8845 			break;
   8846 
   8847 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8848 			tcs = &default_tc_shader_source;
   8849 			tes = &valid_shader_source;
   8850 			break;
   8851 
   8852 		case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   8853 			vs = &valid_shader_source;
   8854 			break;
   8855 
   8856 		default:
   8857 			TCU_FAIL("Invalid enum");
   8858 			break;
   8859 		};
   8860 
   8861 		if (API::USE_ALL_SHADER_STAGES)
   8862 		{
   8863 			this->execute_positive_test(*vs, *tcs, *tes, *gs, *fs, *cs, false, false);
   8864 		}
   8865 		else
   8866 		{
   8867 			this->execute_positive_test(*vs, *fs, false, false);
   8868 		}
   8869 	}
   8870 
   8871 	gl.useProgram(this->program_object_id);
   8872 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   8873 
   8874 	/* Prepare buffer */
   8875 	glw::GLuint				 buffer_object_id = 0;
   8876 	std::vector<glw::GLuint> buffer_data;
   8877 	const size_t			 start_pos		  = offset / 4;
   8878 	const size_t			 last_pos		  = start_pos + n_entries;
   8879 	const size_t			 buffer_data_size = last_pos * sizeof(glw::GLuint);
   8880 
   8881 	gl.genBuffers(1, &buffer_object_id);
   8882 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() failed.");
   8883 
   8884 	gl.bindBuffer(GL_ATOMIC_COUNTER_BUFFER, buffer_object_id);
   8885 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() failed.");
   8886 
   8887 	buffer_data.resize(start_pos + n_entries);
   8888 	for (size_t i = 0; i < n_entries; ++i)
   8889 	{
   8890 		buffer_data[start_pos + i] = (glw::GLuint)i;
   8891 	}
   8892 
   8893 	gl.bufferData(GL_ATOMIC_COUNTER_BUFFER, buffer_data_size, &buffer_data[0], GL_STATIC_DRAW);
   8894 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed.");
   8895 
   8896 	gl.bindBufferBase(GL_ATOMIC_COUNTER_BUFFER, binding, buffer_object_id);
   8897 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase() failed.");
   8898 
   8899 	/* Run program */
   8900 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE != tested_shader_type)
   8901 	{
   8902 		glw::GLuint framebuffer_object_id = 0;
   8903 		glw::GLuint texture_object_id	 = 0;
   8904 		glw::GLuint vao_id				  = 0;
   8905 
   8906 		gl.genTextures(1, &texture_object_id);
   8907 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   8908 
   8909 		gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   8910 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   8911 
   8912 		gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   8913 		GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   8914 
   8915 		gl.genFramebuffers(1, &framebuffer_object_id);
   8916 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   8917 
   8918 		gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   8919 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   8920 
   8921 		gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   8922 		GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   8923 
   8924 		gl.viewport(0, 0, 1, 1);
   8925 		GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   8926 
   8927 		gl.genVertexArrays(1, &vao_id);
   8928 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   8929 
   8930 		gl.bindVertexArray(vao_id);
   8931 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   8932 
   8933 		switch (tested_shader_type)
   8934 		{
   8935 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   8936 		case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   8937 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   8938 			gl.drawArrays(GL_POINTS, 0, 1);
   8939 			GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   8940 			break;
   8941 
   8942 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   8943 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   8944 			/* Tesselation patch set up */
   8945 			gl.patchParameteri(GL_PATCH_VERTICES, 1);
   8946 			GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
   8947 
   8948 			gl.drawArrays(GL_PATCHES, 0, 1);
   8949 			GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   8950 			break;
   8951 
   8952 		default:
   8953 			TCU_FAIL("Invalid enum");
   8954 			break;
   8955 		}
   8956 
   8957 		gl.memoryBarrier(GL_ALL_BARRIER_BITS);
   8958 		GLU_EXPECT_NO_ERROR(gl.getError(), "MemoryBarrier.");
   8959 
   8960 		gl.bindTexture(GL_TEXTURE_2D, 0);
   8961 		gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
   8962 		gl.bindVertexArray(0);
   8963 		gl.deleteTextures(1, &texture_object_id);
   8964 		gl.deleteFramebuffers(1, &framebuffer_object_id);
   8965 		gl.deleteVertexArrays(1, &vao_id);
   8966 		GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   8967 	}
   8968 	else
   8969 	{
   8970 		gl.dispatchCompute(1, 1, 1);
   8971 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   8972 
   8973 		gl.memoryBarrier(GL_ALL_BARRIER_BITS);
   8974 		GLU_EXPECT_NO_ERROR(gl.getError(), "MemoryBarrier.");
   8975 	}
   8976 
   8977 	/* Verify results */
   8978 	bool test_result = true;
   8979 
   8980 	const glw::GLuint* results =
   8981 		(glw::GLuint*)gl.mapBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0 /* offset */, buffer_data_size, GL_MAP_READ_BIT);
   8982 	GLU_EXPECT_NO_ERROR(gl.getError(), "MapBufferRange");
   8983 
   8984 	/* Anything before start position should be 0 */
   8985 	for (size_t i = 0; i < start_pos; ++i)
   8986 	{
   8987 		if (0 != results[i])
   8988 		{
   8989 			test_result = false;
   8990 			break;
   8991 		}
   8992 	}
   8993 
   8994 	/* Anything from start_pos should be incremented by 1 */
   8995 	int diff = 0;
   8996 	for (size_t i = 0; i < n_entries; ++i)
   8997 	{
   8998 		/* Tesselation evaluation can be called several times
   8999 		 In here, check the increment is consistent over all results.
   9000 		 */
   9001 		if (tested_shader_type == TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE)
   9002 		{
   9003 			if (i == 0)
   9004 			{
   9005 				diff = static_cast<int>(results[i + start_pos]) - static_cast<int>(i);
   9006 				if (diff <= 0)
   9007 				{
   9008 					test_result = false;
   9009 					break;
   9010 				}
   9011 			}
   9012 			else if ((static_cast<int>(results[i + start_pos]) - static_cast<int>(i)) != diff)
   9013 			{
   9014 				test_result = false;
   9015 				break;
   9016 			}
   9017 		}
   9018 		else
   9019 		{
   9020 			if (i + 1 != results[i + start_pos])
   9021 			{
   9022 				test_result = false;
   9023 				break;
   9024 			}
   9025 		}
   9026 	}
   9027 
   9028 	gl.unmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
   9029 	GLU_EXPECT_NO_ERROR(gl.getError(), "UnmapBuffer");
   9030 
   9031 	/* Deallocate any resources used. */
   9032 	gl.deleteBuffers(1, &buffer_object_id);
   9033 	this->delete_objects();
   9034 
   9035 	if (false == test_result)
   9036 	{
   9037 		TCU_FAIL("Invalid results.");
   9038 	}
   9039 }
   9040 
   9041 /* Generates the shader source code for the SubroutineFunctionCalls1
   9042  * array tests, attempts to build and execute test program
   9043  *
   9044  * @tparam API               Tested API descriptor
   9045  *
   9046  * @param tested_shader_type The type of shader that is being tested
   9047  */
   9048 template <class API>
   9049 void SubroutineFunctionCalls1<API>::test_shader_compilation(
   9050 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   9051 {
   9052 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   9053 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   9054 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   9055 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   9056 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   9057 
   9058 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   9059 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   9060 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   9061 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   9062 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   9063 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   9064 
   9065 	const std::string iteration_loop_end = "                               }\n"
   9066 										   "                           }\n"
   9067 										   "                        }\n"
   9068 										   "                    }\n"
   9069 										   "                }\n"
   9070 										   "            }\n"
   9071 										   "        }\n"
   9072 										   "    }\n";
   9073 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   9074 											 "    {\n"
   9075 											 "        for (uint b = 0u; b < 2u; b++)\n"
   9076 											 "        {\n"
   9077 											 "            for (uint c = 0u; c < 2u; c++)\n"
   9078 											 "            {\n"
   9079 											 "                for (uint d = 0u; d < 2u; d++)\n"
   9080 											 "                {\n"
   9081 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   9082 											 "                    {\n"
   9083 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   9084 											 "                        {\n"
   9085 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   9086 											 "                           {\n"
   9087 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   9088 											 "                               {\n";
   9089 	const glcts::test_var_type* var_types_set = var_types_set_es;
   9090 	size_t						num_var_types = num_var_types_es;
   9091 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   9092 
   9093 	if (API::USE_DOUBLE)
   9094 	{
   9095 		var_types_set = var_types_set_gl;
   9096 		num_var_types = num_var_types_gl;
   9097 	}
   9098 
   9099 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   9100 	{
   9101 		_supported_variable_types_map_const_iterator var_iterator =
   9102 			supported_variable_types_map.find(var_types_set[var_type_index]);
   9103 
   9104 		if (var_iterator != supported_variable_types_map.end())
   9105 		{
   9106 			std::string iterator_declaration = "    " + var_iterator->second.iterator_type +
   9107 											   " iterator = " + var_iterator->second.iterator_initialization + ";\n";
   9108 
   9109 			std::string function_definition;
   9110 			std::string function_use;
   9111 			std::string verification;
   9112 
   9113 			function_definition += "// Subroutine types\n"
   9114 								   "subroutine void out_routine_type(out ";
   9115 			function_definition += var_iterator->second.type;
   9116 			function_definition += " output_array[2][2][2][2][2][2][2][2]);\n\n"
   9117 								   "// Subroutine definitions\n"
   9118 								   "subroutine(out_routine_type) void original_routine(out ";
   9119 			function_definition += var_iterator->second.type;
   9120 			function_definition += " output_array[2][2][2][2][2][2][2][2]) {\n";
   9121 			function_definition += iterator_declaration;
   9122 			function_definition += iteration_loop_start;
   9123 			function_definition += "                                   output_array[a][b][c][d][e][f][g][h] = " +
   9124 								   var_iterator->second.variable_type_initializer1 + ";\n";
   9125 			function_definition +=
   9126 				"                                   iterator += " + var_iterator->second.iterator_type + "(1);\n";
   9127 			function_definition += iteration_loop_end;
   9128 			function_definition += "}\n\n";
   9129 			function_definition += "subroutine(out_routine_type) void new_routine(out ";
   9130 			function_definition += var_iterator->second.type;
   9131 			function_definition += " output_array[2][2][2][2][2][2][2][2]) {\n";
   9132 			function_definition += iterator_declaration;
   9133 			function_definition += iteration_loop_start;
   9134 			function_definition += "                                   output_array[a][b][c][d][e][f][g][h] = " +
   9135 								   var_iterator->second.variable_type_initializer1 + ";\n";
   9136 			function_definition +=
   9137 				"                                   iterator -= " + var_iterator->second.iterator_type + "(1);\n";
   9138 			function_definition += iteration_loop_end;
   9139 			function_definition += "}\n\n"
   9140 								   "// Subroutine uniform\n"
   9141 								   "subroutine uniform out_routine_type routine;\n";
   9142 
   9143 			function_use = "    " + var_iterator->second.type + " my_array[2][2][2][2][2][2][2][2];\n";
   9144 			function_use += "    routine(my_array);";
   9145 
   9146 			verification = iterator_declaration;
   9147 			verification += "    float result = 1.0;\n";
   9148 			verification += iteration_loop_start;
   9149 			verification += "                                   if (my_array[a][b][c][d][e][f][g][h] " +
   9150 							var_iterator->second.specific_element +
   9151 							" != iterator)\n"
   9152 							"                                   {\n"
   9153 							"                                       result = 0.0;\n"
   9154 							"                                   }\n"
   9155 							"                                   iterator += " +
   9156 							var_iterator->second.iterator_type + "(1);\n";
   9157 			verification += iteration_loop_end;
   9158 
   9159 			if (false == test_compute)
   9160 			{
   9161 				execute_draw_test(tested_shader_type, function_definition, function_use, verification, false, true);
   9162 				execute_draw_test(tested_shader_type, function_definition, function_use, verification, true, false);
   9163 			}
   9164 			else
   9165 			{
   9166 				execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, false, true);
   9167 				execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, true, false);
   9168 			}
   9169 
   9170 			/* Deallocate any resources used. */
   9171 			this->delete_objects();
   9172 		} /* if var_type iterator found */
   9173 		else
   9174 		{
   9175 			TCU_FAIL("Type not found.");
   9176 		}
   9177 	} /* for (int var_type_index = 0; ...) */
   9178 }
   9179 
   9180 /** Executes test for compute program
   9181  *
   9182  * @tparam API                  Tested API descriptor
   9183  *
   9184  * @param tested_shader_type    The type of shader that is being tested
   9185  * @param function_definition   Definition used to prepare shader
   9186  * @param function_use          Use of definition
   9187  * @param verification          Result verification
   9188  * @param use_original          Selects if "original_routine" - true or "new_routine" is choosen
   9189  * @param expect_invalid_result Does test expects invalid results
   9190  **/
   9191 template <class API>
   9192 void SubroutineFunctionCalls1<API>::execute_dispatch_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
   9193 														  const std::string& function_definition,
   9194 														  const std::string& function_use,
   9195 														  const std::string& verification, bool use_original,
   9196 														  bool expect_invalid_result)
   9197 {
   9198 	const std::string& compute_shader_source =
   9199 		prepare_compute_shader(tested_shader_type, function_definition, function_use, verification);
   9200 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   9201 
   9202 	this->execute_positive_test(empty_string, empty_string, empty_string, empty_string, empty_string,
   9203 								compute_shader_source, false, false);
   9204 
   9205 	/* We are now ready to verify whether the returned size is correct. */
   9206 	unsigned char	  buffer[4]			 = { 0 };
   9207 	glw::GLuint		   framebuffer_object_id = 0;
   9208 	glw::GLint		   location				 = -1;
   9209 	glw::GLuint		   routine_index		 = -1;
   9210 	glw::GLuint		   routine_location		 = -1;
   9211 	const glw::GLchar* routine_name			 = "original_routine";
   9212 	const glw::GLenum  shader_type			 = GL_COMPUTE_SHADER;
   9213 	glw::GLuint		   texture_object_id	 = 0;
   9214 
   9215 	if (false == use_original)
   9216 	{
   9217 		routine_name = "new_routine";
   9218 	}
   9219 
   9220 	gl.useProgram(this->program_object_id);
   9221 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   9222 
   9223 	/* Select subroutine */
   9224 	routine_index = gl.getSubroutineIndex(this->program_object_id, shader_type, routine_name);
   9225 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetSubroutineIndex() failed.");
   9226 
   9227 	routine_location = gl.getSubroutineUniformLocation(this->program_object_id, shader_type, "routine");
   9228 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetSubroutineUniformLocation() failed.");
   9229 
   9230 	if (0 != routine_location)
   9231 	{
   9232 		TCU_FAIL("Subroutine location is invalid");
   9233 	}
   9234 
   9235 	gl.uniformSubroutinesuiv(shader_type, 1, &routine_index);
   9236 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformSubroutinesuiv() failed.");
   9237 
   9238 	/* Prepare texture */
   9239 	gl.genTextures(1, &texture_object_id);
   9240 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   9241 
   9242 	gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   9243 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   9244 
   9245 	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   9246 	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   9247 
   9248 	gl.bindImageTexture(0 /* image unit */, texture_object_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */,
   9249 						GL_WRITE_ONLY, GL_RGBA8);
   9250 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture() failed.");
   9251 
   9252 	location = gl.getUniformLocation(this->program_object_id, "uni_image");
   9253 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() failed.");
   9254 
   9255 	if (-1 == location)
   9256 	{
   9257 		TCU_FAIL("Uniform is inactive");
   9258 	}
   9259 
   9260 	gl.uniform1i(location, 0 /* image unit */);
   9261 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i() failed.");
   9262 
   9263 	/* Execute */
   9264 	gl.dispatchCompute(1, 1, 1);
   9265 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   9266 
   9267 	/* Verify */
   9268 	gl.genFramebuffers(1, &framebuffer_object_id);
   9269 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   9270 
   9271 	gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   9272 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   9273 
   9274 	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   9275 	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   9276 
   9277 	gl.viewport(0, 0, 1, 1);
   9278 	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   9279 
   9280 	gl.readBuffer(GL_COLOR_ATTACHMENT0);
   9281 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadBuffer() failed.");
   9282 
   9283 	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
   9284 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed.");
   9285 
   9286 	if ((buffer[0] != 255) != expect_invalid_result)
   9287 	{
   9288 		TCU_FAIL("Invalid result was returned.");
   9289 	}
   9290 
   9291 	/* Delete generated objects. */
   9292 	gl.deleteTextures(1, &texture_object_id);
   9293 	gl.deleteFramebuffers(1, &framebuffer_object_id);
   9294 	GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   9295 }
   9296 
   9297 /** Executes test for draw program
   9298  *
   9299  * @tparam API                  Tested API descriptor
   9300  *
   9301  * @param tested_shader_type    The type of shader that is being tested
   9302  * @param function_definition   Definition used to prepare shader
   9303  * @param function_use          Use of definition
   9304  * @param verification          Result verification
   9305  * @param use_original          Selects if "original_routine" - true or "new_routine" is choosen
   9306  * @param expect_invalid_result Does test expects invalid results
   9307  **/
   9308 template <class API>
   9309 void SubroutineFunctionCalls1<API>::execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
   9310 													  const std::string&						 function_definition,
   9311 													  const std::string& function_use, const std::string& verification,
   9312 													  bool use_original, bool expect_invalid_result)
   9313 {
   9314 	const glw::Functions& gl = this->context_id.getRenderContext().getFunctions();
   9315 
   9316 	if (API::USE_ALL_SHADER_STAGES)
   9317 	{
   9318 		const std::string& compute_shader_source = empty_string;
   9319 		const std::string& fragment_shader_source =
   9320 			this->prepare_fragment_shader(tested_shader_type, function_definition, function_use, verification);
   9321 		const std::string& geometry_shader_source =
   9322 			this->prepare_geometry_shader(tested_shader_type, function_definition, function_use, verification);
   9323 		const std::string& tess_ctrl_shader_source =
   9324 			this->prepare_tess_ctrl_shader(tested_shader_type, function_definition, function_use, verification);
   9325 		const std::string& tess_eval_shader_source =
   9326 			this->prepare_tess_eval_shader(tested_shader_type, function_definition, function_use, verification);
   9327 		const std::string& vertex_shader_source =
   9328 			this->prepare_vertex_shader(tested_shader_type, function_definition, function_use, verification);
   9329 
   9330 		switch (tested_shader_type)
   9331 		{
   9332 		case TestCaseBase<API>::VERTEX_SHADER_TYPE: /* Fall through */
   9333 		case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   9334 			this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   9335 			break;
   9336 
   9337 		case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9338 		case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9339 		case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   9340 		case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9341 			this->execute_positive_test(vertex_shader_source, tess_ctrl_shader_source, tess_eval_shader_source,
   9342 										geometry_shader_source, fragment_shader_source, compute_shader_source, false,
   9343 										false);
   9344 			break;
   9345 
   9346 		default:
   9347 			TCU_FAIL("Invalid enum");
   9348 			break;
   9349 		}
   9350 	}
   9351 	else
   9352 	{
   9353 		const std::string& fragment_shader_source =
   9354 			this->prepare_fragment_shader(tested_shader_type, function_definition, function_use, verification);
   9355 		const std::string& vertex_shader_source =
   9356 			this->prepare_vertex_shader(tested_shader_type, function_definition, function_use, verification);
   9357 
   9358 		this->execute_positive_test(vertex_shader_source, fragment_shader_source, false, false);
   9359 	}
   9360 
   9361 	/* We are now ready to verify whether the returned size is correct. */
   9362 	unsigned char	  buffer[4]			 = { 0 };
   9363 	glw::GLuint		   framebuffer_object_id = 0;
   9364 	glw::GLuint		   routine_index		 = -1;
   9365 	glw::GLuint		   routine_location		 = -1;
   9366 	const glw::GLchar* routine_name			 = "original_routine";
   9367 	glw::GLenum		   shader_type			 = 0;
   9368 	glw::GLuint		   texture_object_id	 = 0;
   9369 	glw::GLuint		   vao_id				 = 0;
   9370 
   9371 	switch (tested_shader_type)
   9372 	{
   9373 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   9374 		shader_type = GL_FRAGMENT_SHADER;
   9375 		break;
   9376 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9377 		shader_type = GL_VERTEX_SHADER;
   9378 		break;
   9379 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9380 		shader_type = GL_COMPUTE_SHADER;
   9381 		break;
   9382 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9383 		shader_type = GL_GEOMETRY_SHADER;
   9384 		break;
   9385 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   9386 		shader_type = GL_TESS_CONTROL_SHADER;
   9387 		break;
   9388 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9389 		shader_type = GL_TESS_EVALUATION_SHADER;
   9390 		break;
   9391 	default:
   9392 		TCU_FAIL("Invalid shader type");
   9393 		break;
   9394 	}
   9395 
   9396 	if (false == use_original)
   9397 	{
   9398 		routine_name = "new_routine";
   9399 	}
   9400 
   9401 	gl.useProgram(this->program_object_id);
   9402 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");
   9403 
   9404 	/* Select subroutine */
   9405 	routine_index = gl.getSubroutineIndex(this->program_object_id, shader_type, routine_name);
   9406 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetSubroutineIndex() failed.");
   9407 
   9408 	routine_location = gl.getSubroutineUniformLocation(this->program_object_id, shader_type, "routine");
   9409 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetSubroutineUniformLocation() failed.");
   9410 
   9411 	if (0 != routine_location)
   9412 	{
   9413 		TCU_FAIL("Subroutine location is invalid");
   9414 	}
   9415 
   9416 	gl.uniformSubroutinesuiv(shader_type, 1, &routine_index);
   9417 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformSubroutinesuiv() failed.");
   9418 
   9419 	/* Prepre texture */
   9420 	assert(0 == texture_object_id);
   9421 	gl.genTextures(1, &texture_object_id);
   9422 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed.");
   9423 
   9424 	gl.bindTexture(GL_TEXTURE_2D, texture_object_id);
   9425 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed.");
   9426 
   9427 	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
   9428 	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed.");
   9429 
   9430 	/* Prepare framebuffer */
   9431 	assert(0 == framebuffer_object_id);
   9432 	gl.genFramebuffers(1, &framebuffer_object_id);
   9433 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed.");
   9434 
   9435 	gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer_object_id);
   9436 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed.");
   9437 
   9438 	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_object_id, 0);
   9439 	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed.");
   9440 
   9441 	gl.viewport(0, 0, 1, 1);
   9442 	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport() failed.");
   9443 
   9444 	/* Set VAO */
   9445 	assert(0 == vao_id);
   9446 	gl.genVertexArrays(1, &vao_id);
   9447 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() failed.");
   9448 
   9449 	gl.bindVertexArray(vao_id);
   9450 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() failed.");
   9451 
   9452 	switch (tested_shader_type)
   9453 	{
   9454 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE: /* Fall through */
   9455 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9456 		gl.drawArrays(GL_TRIANGLE_FAN, 0, 4);
   9457 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   9458 		break;
   9459 
   9460 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   9461 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9462 		/* Tesselation patch set up */
   9463 		gl.patchParameteri(GL_PATCH_VERTICES, 1);
   9464 		GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
   9465 
   9466 		gl.drawArrays(GL_PATCHES, 0, 1);
   9467 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   9468 		break;
   9469 
   9470 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9471 		gl.drawArrays(GL_POINTS, 0, 1);
   9472 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() failed.");
   9473 		break;
   9474 
   9475 	default:
   9476 		TCU_FAIL("Invalid enum");
   9477 		break;
   9478 	}
   9479 
   9480 	/* Verify */
   9481 	gl.readBuffer(GL_COLOR_ATTACHMENT0);
   9482 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadBuffer() failed.");
   9483 
   9484 	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
   9485 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed.");
   9486 
   9487 	const bool result = ((buffer[0] != 255) == expect_invalid_result);
   9488 
   9489 	/* Delete generated objects. */
   9490 	gl.useProgram(0);
   9491 	gl.bindTexture(GL_TEXTURE_2D, 0);
   9492 	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
   9493 	gl.bindVertexArray(0);
   9494 
   9495 	gl.deleteProgram(this->program_object_id);
   9496 	this->program_object_id = 0;
   9497 
   9498 	gl.deleteTextures(1, &texture_object_id);
   9499 	texture_object_id = 0;
   9500 
   9501 	gl.deleteFramebuffers(1, &framebuffer_object_id);
   9502 	framebuffer_object_id = 0;
   9503 
   9504 	gl.deleteVertexArrays(1, &vao_id);
   9505 	vao_id = 0;
   9506 
   9507 	GLU_EXPECT_NO_ERROR(gl.getError(), "An error ocurred while deleting generated objects.");
   9508 
   9509 	if (!result)
   9510 	{
   9511 		TCU_FAIL("Invalid result was returned.");
   9512 	}
   9513 }
   9514 
   9515 /** Prepare shader
   9516  *
   9517  * @tparam API               Tested API descriptor
   9518  *
   9519  * @param tested_shader_type    The type of shader that is being tested
   9520  * @param function_definition   Definition used to prepare shader
   9521  * @param function_use          Use of definition
   9522  * @param verification          Result verification
   9523  **/
   9524 template <class API>
   9525 std::string SubroutineFunctionCalls1<API>::prepare_compute_shader(
   9526 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   9527 	const std::string& function_use, const std::string& verification)
   9528 {
   9529 	std::string compute_shader_source;
   9530 
   9531 	if (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type)
   9532 	{
   9533 		compute_shader_source = "writeonly uniform image2D uni_image;\n"
   9534 								"\n";
   9535 
   9536 		/* User-defined function definition. */
   9537 		compute_shader_source += function_definition;
   9538 		compute_shader_source += "\n\n";
   9539 
   9540 		/* Main function definition. */
   9541 		compute_shader_source += shader_start;
   9542 		compute_shader_source += function_use;
   9543 		compute_shader_source += "\n\n";
   9544 		compute_shader_source += verification;
   9545 		compute_shader_source += "\n\n";
   9546 		compute_shader_source += "\n"
   9547 								 "    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), vec4(result, 0, 0, 0));\n"
   9548 								 "}\n"
   9549 								 "\n";
   9550 	}
   9551 
   9552 	return compute_shader_source;
   9553 }
   9554 
   9555 /** Prepare shader
   9556  *
   9557  * @tparam API               Tested API descriptor
   9558  *
   9559  * @param tested_shader_type    The type of shader that is being tested
   9560  * @param function_definition   Definition used to prepare shader
   9561  * @param function_use          Use of definition
   9562  * @param verification          Result verification
   9563  **/
   9564 template <class API>
   9565 std::string SubroutineFunctionCalls1<API>::prepare_fragment_shader(
   9566 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   9567 	const std::string& function_use, const std::string& verification)
   9568 {
   9569 	std::string fragment_shader_source;
   9570 
   9571 	switch (tested_shader_type)
   9572 	{
   9573 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9574 		break;
   9575 
   9576 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   9577 		fragment_shader_source = "out vec4 colour;\n\n";
   9578 
   9579 		/* User-defined function definition. */
   9580 		fragment_shader_source += function_definition;
   9581 		fragment_shader_source += "\n\n";
   9582 
   9583 		/* Main function definition. */
   9584 		fragment_shader_source += shader_start;
   9585 		fragment_shader_source += function_use;
   9586 		fragment_shader_source += "\n\n";
   9587 		fragment_shader_source += verification;
   9588 		fragment_shader_source += "\n\n";
   9589 		fragment_shader_source += "    colour = vec4(result);\n";
   9590 		fragment_shader_source += shader_end;
   9591 		break;
   9592 
   9593 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9594 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   9595 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE: /* Fall through */
   9596 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9597 		fragment_shader_source = "in float fs_result;\n\n"
   9598 								 "out vec4 colour;\n\n"
   9599 								 "void main()\n"
   9600 								 "{\n"
   9601 								 "    colour =  vec4(fs_result);\n"
   9602 								 "}\n"
   9603 								 "\n";
   9604 		break;
   9605 
   9606 	default:
   9607 		TCU_FAIL("Unrecognized shader object type.");
   9608 		break;
   9609 	}
   9610 
   9611 	return fragment_shader_source;
   9612 }
   9613 
   9614 /** Prepare shader
   9615  *
   9616  * @tparam API               Tested API descriptor
   9617  *
   9618  * @param tested_shader_type    The type of shader that is being tested
   9619  * @param function_definition   Definition used to prepare shader
   9620  * @param function_use          Use of definition
   9621  * @param verification          Result verification
   9622  **/
   9623 template <class API>
   9624 std::string SubroutineFunctionCalls1<API>::prepare_geometry_shader(
   9625 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   9626 	const std::string& function_use, const std::string& verification)
   9627 {
   9628 	std::string geometry_shader_source;
   9629 
   9630 	switch (tested_shader_type)
   9631 	{
   9632 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9633 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE: /* Fall through */
   9634 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9635 		break;
   9636 
   9637 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE: /* Fall through */
   9638 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9639 		geometry_shader_source = "layout(points)                           in;\n"
   9640 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   9641 								 "\n"
   9642 								 "in  float tes_result[];\n"
   9643 								 "out float fs_result;\n"
   9644 								 "\n"
   9645 								 "void main()\n"
   9646 								 "{\n"
   9647 								 "    gl_Position  = vec4(-1, -1, 0, 1);\n"
   9648 								 "    fs_result    = tes_result[0];\n"
   9649 								 "    EmitVertex();\n"
   9650 								 "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   9651 								 "    fs_result    = tes_result[0];\n"
   9652 								 "    EmitVertex();\n"
   9653 								 "    gl_Position  = vec4(1, -1, 0, 1);\n"
   9654 								 "    fs_result    = tes_result[0];\n"
   9655 								 "    EmitVertex();\n"
   9656 								 "    gl_Position  = vec4(1, 1, 0, 1);\n"
   9657 								 "    fs_result    = tes_result[0];\n"
   9658 								 "    EmitVertex();\n"
   9659 								 "}\n";
   9660 		break;
   9661 
   9662 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9663 		geometry_shader_source = "layout(points)                           in;\n"
   9664 								 "layout(triangle_strip, max_vertices = 4) out;\n"
   9665 								 "\n"
   9666 								 "out float fs_result;\n"
   9667 								 "\n";
   9668 
   9669 		/* User-defined function definition. */
   9670 		geometry_shader_source += function_definition;
   9671 		geometry_shader_source += "\n\n";
   9672 
   9673 		/* Main function definition. */
   9674 		geometry_shader_source += shader_start;
   9675 		geometry_shader_source += function_use;
   9676 		geometry_shader_source += "\n\n";
   9677 		geometry_shader_source += verification;
   9678 		geometry_shader_source += "\n\n";
   9679 		geometry_shader_source += "\n    gl_Position  = vec4(-1, -1, 0, 1);\n"
   9680 								  "    fs_result    = result;\n"
   9681 								  "    EmitVertex();\n"
   9682 								  "    gl_Position  = vec4(-1, 1, 0, 1);\n"
   9683 								  "    fs_result    = result;\n"
   9684 								  "    EmitVertex();\n"
   9685 								  "    gl_Position  = vec4(1, -1, 0, 1);\n"
   9686 								  "    fs_result    = result;\n"
   9687 								  "    EmitVertex();\n"
   9688 								  "    gl_Position  = vec4(1, 1, 0, 1);\n"
   9689 								  "    fs_result    = result;\n"
   9690 								  "    EmitVertex();\n"
   9691 								  "}\n";
   9692 		break;
   9693 
   9694 	default:
   9695 		TCU_FAIL("Unrecognized shader object type.");
   9696 		break;
   9697 	}
   9698 
   9699 	return geometry_shader_source;
   9700 }
   9701 
   9702 /** Prepare shader
   9703  *
   9704  * @tparam API               Tested API descriptor
   9705  *
   9706  * @param tested_shader_type    The type of shader that is being tested
   9707  * @param function_definition   Definition used to prepare shader
   9708  * @param function_use          Use of definition
   9709  * @param verification          Result verification
   9710  **/
   9711 template <class API>
   9712 std::string SubroutineFunctionCalls1<API>::prepare_tess_ctrl_shader(
   9713 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   9714 	const std::string& function_use, const std::string& verification)
   9715 {
   9716 	std::string tess_ctrl_shader_source;
   9717 
   9718 	switch (tested_shader_type)
   9719 	{
   9720 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9721 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   9722 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9723 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9724 		break;
   9725 
   9726 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   9727 		tess_ctrl_shader_source = "layout(vertices = 1) out;\n"
   9728 								  "\n"
   9729 								  "out float tcs_result[];\n"
   9730 								  "\n";
   9731 
   9732 		/* User-defined function definition. */
   9733 		tess_ctrl_shader_source += function_definition;
   9734 		tess_ctrl_shader_source += "\n\n";
   9735 
   9736 		/* Main function definition. */
   9737 		tess_ctrl_shader_source += shader_start;
   9738 		tess_ctrl_shader_source += function_use;
   9739 		tess_ctrl_shader_source += "\n\n";
   9740 		tess_ctrl_shader_source += verification;
   9741 		tess_ctrl_shader_source += "\n\n";
   9742 		tess_ctrl_shader_source += "    tcs_result[gl_InvocationID] = result;\n"
   9743 								   "\n"
   9744 								   "    gl_TessLevelOuter[0] = 1.0;\n"
   9745 								   "    gl_TessLevelOuter[1] = 1.0;\n"
   9746 								   "    gl_TessLevelOuter[2] = 1.0;\n"
   9747 								   "    gl_TessLevelOuter[3] = 1.0;\n"
   9748 								   "    gl_TessLevelInner[0] = 1.0;\n"
   9749 								   "    gl_TessLevelInner[1] = 1.0;\n"
   9750 								   "}\n";
   9751 		break;
   9752 
   9753 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9754 		tess_ctrl_shader_source = default_tc_shader_source;
   9755 		break;
   9756 
   9757 	default:
   9758 		TCU_FAIL("Unrecognized shader object type.");
   9759 		break;
   9760 	}
   9761 
   9762 	return tess_ctrl_shader_source;
   9763 }
   9764 
   9765 /** Prepare shader
   9766  *
   9767  * @tparam API               Tested API descriptor
   9768  *
   9769  * @param tested_shader_type    The type of shader that is being tested
   9770  * @param function_definition   Definition used to prepare shader
   9771  * @param function_use          Use of definition
   9772  * @param verification          Result verification
   9773  **/
   9774 template <class API>
   9775 std::string SubroutineFunctionCalls1<API>::prepare_tess_eval_shader(
   9776 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   9777 	const std::string& function_use, const std::string& verification)
   9778 {
   9779 	std::string tess_eval_shader_source;
   9780 
   9781 	switch (tested_shader_type)
   9782 	{
   9783 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9784 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   9785 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9786 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9787 		break;
   9788 
   9789 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   9790 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   9791 								  "\n"
   9792 								  "in  float tcs_result[];\n"
   9793 								  "out float tes_result;\n"
   9794 								  "\n"
   9795 								  "void main()\n"
   9796 								  "{\n"
   9797 								  "    tes_result = tcs_result[0];\n"
   9798 								  "}\n";
   9799 		break;
   9800 
   9801 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9802 		tess_eval_shader_source = "layout(isolines, point_mode) in;\n"
   9803 								  "\n"
   9804 								  "out float tes_result;\n"
   9805 								  "\n";
   9806 
   9807 		/* User-defined function definition. */
   9808 		tess_eval_shader_source += function_definition;
   9809 		tess_eval_shader_source += "\n\n";
   9810 
   9811 		/* Main function definition. */
   9812 		tess_eval_shader_source += shader_start;
   9813 		tess_eval_shader_source += function_use;
   9814 		tess_eval_shader_source += "\n\n";
   9815 		tess_eval_shader_source += verification;
   9816 		tess_eval_shader_source += "\n\n";
   9817 		tess_eval_shader_source += "    tes_result = result;\n"
   9818 								   "}\n";
   9819 		break;
   9820 
   9821 	default:
   9822 		TCU_FAIL("Unrecognized shader object type.");
   9823 		break;
   9824 	}
   9825 
   9826 	return tess_eval_shader_source;
   9827 }
   9828 
   9829 /** Prepare shader
   9830  *
   9831  * @tparam API               Tested API descriptor
   9832  *
   9833  * @param tested_shader_type    The type of shader that is being tested
   9834  * @param function_definition   Definition used to prepare shader
   9835  * @param function_use          Use of definition
   9836  * @param verification          Result verification
   9837  **/
   9838 template <class API>
   9839 std::string SubroutineFunctionCalls1<API>::prepare_vertex_shader(
   9840 	typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& function_definition,
   9841 	const std::string& function_use, const std::string& verification)
   9842 {
   9843 	std::string vertex_shader_source;
   9844 
   9845 	switch (tested_shader_type)
   9846 	{
   9847 	case TestCaseBase<API>::COMPUTE_SHADER_TYPE:
   9848 		break;
   9849 
   9850 	case TestCaseBase<API>::FRAGMENT_SHADER_TYPE:
   9851 		vertex_shader_source = "/** GL_TRIANGLE_FAN-type quad vertex data. */\n"
   9852 							   "const vec4 vertex_positions[4] = vec4[4](vec4( 1.0, -1.0, 0.0, 1.0),\n"
   9853 							   "                                         vec4(-1.0, -1.0, 0.0, 1.0),\n"
   9854 							   "                                         vec4(-1.0,  1.0, 0.0, 1.0),\n"
   9855 							   "                                         vec4( 1.0,  1.0, 0.0, 1.0) );\n"
   9856 							   "\n"
   9857 							   "void main()\n"
   9858 							   "{\n"
   9859 							   "    gl_Position = vertex_positions[gl_VertexID];"
   9860 							   "}\n\n";
   9861 		break;
   9862 
   9863 	case TestCaseBase<API>::GEOMETRY_SHADER_TYPE:
   9864 	case TestCaseBase<API>::TESSELATION_CONTROL_SHADER_TYPE:
   9865 	case TestCaseBase<API>::TESSELATION_EVALUATION_SHADER_TYPE:
   9866 		vertex_shader_source = default_vertex_shader_source;
   9867 		break;
   9868 
   9869 	case TestCaseBase<API>::VERTEX_SHADER_TYPE:
   9870 		/* Vertex shader source. */
   9871 		vertex_shader_source = "out float fs_result;\n\n";
   9872 		vertex_shader_source += "/** GL_TRIANGLE_FAN-type quad vertex data. */\n"
   9873 								"const vec4 vertex_positions[4] = vec4[4](vec4( 1.0, -1.0, 0.0, 1.0),\n"
   9874 								"                                         vec4(-1.0, -1.0, 0.0, 1.0),\n"
   9875 								"                                         vec4(-1.0,  1.0, 0.0, 1.0),\n"
   9876 								"                                         vec4( 1.0,  1.0, 0.0, 1.0) );\n\n";
   9877 
   9878 		/* User-defined function definition. */
   9879 		vertex_shader_source += function_definition;
   9880 		vertex_shader_source += "\n\n";
   9881 
   9882 		/* Main function definition. */
   9883 		vertex_shader_source += shader_start;
   9884 		vertex_shader_source += function_use;
   9885 		vertex_shader_source += "\n\n";
   9886 		vertex_shader_source += verification;
   9887 		vertex_shader_source += "\n\n";
   9888 		vertex_shader_source += "    fs_result   = result;\n"
   9889 								"    gl_Position = vertex_positions[gl_VertexID];\n";
   9890 		vertex_shader_source += shader_end;
   9891 		break;
   9892 
   9893 	default:
   9894 		TCU_FAIL("Unrecognized shader object type.");
   9895 		break;
   9896 	}
   9897 
   9898 	return vertex_shader_source;
   9899 }
   9900 
   9901 /* Generates the shader source code for the InteractionFunctionCalls2
   9902  * array tests, and attempts to build and execute test program.
   9903  *
   9904  * @tparam API               Tested API descriptor
   9905  *
   9906  * @param tested_shader_type The type of shader that is being tested
   9907  */
   9908 template <class API>
   9909 void SubroutineFunctionCalls2<API>::test_shader_compilation(
   9910 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   9911 {
   9912 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   9913 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   9914 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   9915 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   9916 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   9917 
   9918 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   9919 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   9920 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   9921 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   9922 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   9923 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   9924 
   9925 	const std::string iteration_loop_end = "                               }\n"
   9926 										   "                           }\n"
   9927 										   "                        }\n"
   9928 										   "                    }\n"
   9929 										   "                }\n"
   9930 										   "            }\n"
   9931 										   "        }\n"
   9932 										   "    }\n";
   9933 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   9934 											 "    {\n"
   9935 											 "        for (uint b = 0u; b < 2u; b++)\n"
   9936 											 "        {\n"
   9937 											 "            for (uint c = 0u; c < 2u; c++)\n"
   9938 											 "            {\n"
   9939 											 "                for (uint d = 0u; d < 2u; d++)\n"
   9940 											 "                {\n"
   9941 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   9942 											 "                    {\n"
   9943 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   9944 											 "                        {\n"
   9945 											 "                           for (uint g = 0u; g < 2u; g++)\n"
   9946 											 "                           {\n"
   9947 											 "                               for (uint h = 0u; h < 2u; h++)\n"
   9948 											 "                               {\n";
   9949 	const std::string multiplier_array = "const int[] multiplier_array = int[]( 1,  2,  3,  4,  5,  6,  7,  8,\n"
   9950 										 "                                     11, 12, 13, 14, 15, 16, 17, 18,\n"
   9951 										 "                                     21, 22, 23, 24, 25, 26, 27, 28,\n"
   9952 										 "                                     31, 32, 33, 34, 35, 36, 37, 38,\n"
   9953 										 "                                     41, 42, 43, 44, 45, 46, 47, 48,\n"
   9954 										 "                                     51, 52, 53, 54, 55, 56, 57, 58,\n"
   9955 										 "                                     61, 62, 63, 64, 65, 66, 67, 68,\n"
   9956 										 "                                     71, 72, 73, 74, 75, 76, 77, 78,\n"
   9957 										 "                                     81, 82, 83, 84, 85, 86, 87, 88);\n";
   9958 	const glcts::test_var_type* var_types_set = var_types_set_es;
   9959 	size_t						num_var_types = num_var_types_es;
   9960 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   9961 
   9962 	if (API::USE_DOUBLE)
   9963 	{
   9964 		var_types_set = var_types_set_gl;
   9965 		num_var_types = num_var_types_gl;
   9966 	}
   9967 
   9968 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   9969 	{
   9970 		_supported_variable_types_map_const_iterator var_iterator =
   9971 			supported_variable_types_map.find(var_types_set[var_type_index]);
   9972 
   9973 		if (var_iterator != supported_variable_types_map.end())
   9974 		{
   9975 			std::string function_definition;
   9976 			std::string function_use;
   9977 			std::string verification;
   9978 
   9979 			function_definition += multiplier_array;
   9980 
   9981 			function_definition += "// Subroutine types\n"
   9982 								   "subroutine void inout_routine_type(inout ";
   9983 			function_definition += var_iterator->second.type;
   9984 			function_definition += " inout_array[2][2][2][2][2][2][2][2]);\n\n"
   9985 								   "// Subroutine definitions\n"
   9986 								   "subroutine(inout_routine_type) void original_routine(inout ";
   9987 			function_definition += var_iterator->second.type;
   9988 			function_definition += " inout_array[2][2][2][2][2][2][2][2]) {\n"
   9989 								   "    uint i = 0u;\n";
   9990 			function_definition += iteration_loop_start;
   9991 			function_definition += "                                   inout_array[a][b][c][d][e][f][g][h] *= " +
   9992 								   var_iterator->second.iterator_type + "(multiplier_array[i % 64u]);\n";
   9993 			function_definition += "                                   i+= 1u;\n";
   9994 			function_definition += iteration_loop_end;
   9995 			function_definition += "}\n\n"
   9996 								   "subroutine(inout_routine_type) void new_routine(inout ";
   9997 			function_definition += var_iterator->second.type;
   9998 			function_definition += " inout_array[2][2][2][2][2][2][2][2]) {\n"
   9999 								   "    uint i = 0u;\n";
   10000 			function_definition += iteration_loop_start;
   10001 			function_definition += "                                   inout_array[a][b][c][d][e][f][g][h] /= " +
   10002 								   var_iterator->second.iterator_type + "(multiplier_array[i % 64u]);\n";
   10003 			function_definition += "                                   i+= 1u;\n";
   10004 			function_definition += iteration_loop_end;
   10005 			function_definition += "}\n\n"
   10006 								   "// Subroutine uniform\n"
   10007 								   "subroutine uniform inout_routine_type routine;\n";
   10008 
   10009 			function_use += "    float result = 1.0;\n";
   10010 			function_use += "    uint iterator = 0u;\n";
   10011 			function_use += "    " + var_iterator->second.type + " my_array[2][2][2][2][2][2][2][2];\n";
   10012 			function_use += iteration_loop_start;
   10013 			function_use += "                                   my_array[a][b][c][d][e][f][g][h] = " +
   10014 							var_iterator->second.variable_type_initializer2 + ";\n";
   10015 			function_use += iteration_loop_end;
   10016 			function_use += "    routine(my_array);";
   10017 
   10018 			verification += iteration_loop_start;
   10019 			verification += "                                   if (my_array[a][b][c][d][e][f][g][h] " +
   10020 							var_iterator->second.specific_element + "!= " + var_iterator->second.iterator_type +
   10021 							"(multiplier_array[iterator % 64u]))\n"
   10022 							"                                   {\n"
   10023 							"                                       result = 0.0;\n"
   10024 							"                                   }\n"
   10025 							"                                   iterator += 1u;\n";
   10026 			verification += iteration_loop_end;
   10027 
   10028 			if (false == test_compute)
   10029 			{
   10030 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, false,
   10031 										true);
   10032 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, true,
   10033 										false);
   10034 			}
   10035 			else
   10036 			{
   10037 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, false,
   10038 											true);
   10039 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, true,
   10040 											false);
   10041 			}
   10042 
   10043 			/* Deallocate any resources used. */
   10044 			this->delete_objects();
   10045 		} /* if var_type iterator found */
   10046 		else
   10047 		{
   10048 			TCU_FAIL("Type not found.");
   10049 		}
   10050 	} /* for (int var_type_index = 0; ...) */
   10051 }
   10052 
   10053 /* Generates the shader source code for the SubroutineArgumentAliasing1
   10054  * array tests, attempts to build and execute test program
   10055  *
   10056  * @tparam API               Tested API descriptor
   10057  *
   10058  * @param tested_shader_type The type of shader that is being tested
   10059  */
   10060 template <class API>
   10061 void SubroutineArgumentAliasing1<API>::test_shader_compilation(
   10062 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   10063 {
   10064 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10065 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10066 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10067 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   10068 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   10069 
   10070 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10071 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10072 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10073 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   10074 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   10075 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   10076 
   10077 	const std::string iteration_loop_end = "                        }\n"
   10078 										   "                    }\n"
   10079 										   "                }\n"
   10080 										   "            }\n"
   10081 										   "        }\n"
   10082 										   "    }\n";
   10083 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   10084 											 "    {\n"
   10085 											 "        for (uint b = 0u; b < 2u; b++)\n"
   10086 											 "        {\n"
   10087 											 "            for (uint c = 0u; c < 2u; c++)\n"
   10088 											 "            {\n"
   10089 											 "                for (uint d = 0u; d < 2u; d++)\n"
   10090 											 "                {\n"
   10091 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   10092 											 "                    {\n"
   10093 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   10094 											 "                        {\n";
   10095 	const glcts::test_var_type* var_types_set = var_types_set_es;
   10096 	size_t						num_var_types = num_var_types_es;
   10097 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   10098 
   10099 	if (API::USE_DOUBLE)
   10100 	{
   10101 		var_types_set = var_types_set_gl;
   10102 		num_var_types = num_var_types_gl;
   10103 	}
   10104 
   10105 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   10106 	{
   10107 		_supported_variable_types_map_const_iterator var_iterator =
   10108 			supported_variable_types_map.find(var_types_set[var_type_index]);
   10109 
   10110 		if (var_iterator != supported_variable_types_map.end())
   10111 		{
   10112 			std::string function_definition;
   10113 			std::string function_use;
   10114 			std::string verification;
   10115 
   10116 			function_definition += "// Subroutine types\n"
   10117 								   "subroutine bool in_routine_type(";
   10118 			function_definition += var_iterator->second.type;
   10119 			function_definition += " x[2][2][2][2][2][2], ";
   10120 			function_definition += var_iterator->second.type;
   10121 			function_definition += " y[2][2][2][2][2][2]);\n\n"
   10122 								   "// Subroutine definitions\n"
   10123 								   "subroutine(in_routine_type) bool original_routine(";
   10124 			function_definition += var_iterator->second.type;
   10125 			function_definition += " x[2][2][2][2][2][2], ";
   10126 			function_definition += var_iterator->second.type;
   10127 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10128 			function_definition += iteration_loop_start;
   10129 			function_definition +=
   10130 				"                                   x[a][b][c][d][e][f] = " + var_iterator->second.type + "(123);\n";
   10131 			function_definition += iteration_loop_end;
   10132 			function_definition += "\n";
   10133 			function_definition += iteration_loop_start;
   10134 			function_definition += "                                   if(y[a][b][c][d][e][f]";
   10135 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10136 			{
   10137 				function_definition += "[0][0]";
   10138 				function_definition += " != float";
   10139 			}
   10140 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10141 			{
   10142 				function_definition += "[0][0]";
   10143 				function_definition += " != double";
   10144 			}
   10145 			else
   10146 			{
   10147 				function_definition += " != ";
   10148 				function_definition += var_iterator->second.type;
   10149 			}
   10150 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10151 			function_definition += iteration_loop_end;
   10152 			function_definition += "\n    return true;\n";
   10153 			function_definition += "}\n\n"
   10154 								   "subroutine(in_routine_type) bool new_routine(";
   10155 			function_definition += var_iterator->second.type;
   10156 			function_definition += " x[2][2][2][2][2][2], ";
   10157 			function_definition += var_iterator->second.type;
   10158 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10159 			function_definition += iteration_loop_start;
   10160 			function_definition +=
   10161 				"                                   y[a][b][c][d][e][f] = " + var_iterator->second.type + "(123);\n";
   10162 			function_definition += iteration_loop_end;
   10163 			function_definition += "\n";
   10164 			function_definition += iteration_loop_start;
   10165 			function_definition += "                                   if(x[a][b][c][d][e][f]";
   10166 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10167 			{
   10168 				function_definition += "[0][0]";
   10169 				function_definition += " != float";
   10170 			}
   10171 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10172 			{
   10173 				function_definition += "[0][0]";
   10174 				function_definition += " != double";
   10175 			}
   10176 			else
   10177 			{
   10178 				function_definition += " != ";
   10179 				function_definition += var_iterator->second.type;
   10180 			}
   10181 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10182 			function_definition += iteration_loop_end;
   10183 			function_definition += "\n    return true;\n";
   10184 			function_definition += "}\n\n"
   10185 								   "// Subroutine uniform\n"
   10186 								   "subroutine uniform in_routine_type routine;\n";
   10187 
   10188 			function_use += "    " + var_iterator->second.type + " z[2][2][2][2][2][2];\n";
   10189 			function_use += iteration_loop_start;
   10190 			function_use += "                                   z[a][b][c][d][e][f] = ";
   10191 			function_use += var_iterator->second.type;
   10192 			function_use += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f));\n";
   10193 			function_use += iteration_loop_end;
   10194 
   10195 			verification = "    float result = 0.0;\n"
   10196 						   "    if(routine(z, z) == true)\n"
   10197 						   "    {\n"
   10198 						   "        result = 1.0;\n"
   10199 						   "    }\n"
   10200 						   "    else\n"
   10201 						   "    {\n"
   10202 						   "        result = 0.5;\n"
   10203 						   "    }\n";
   10204 
   10205 			if (false == test_compute)
   10206 			{
   10207 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, false,
   10208 										false);
   10209 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, true,
   10210 										false);
   10211 			}
   10212 			else
   10213 			{
   10214 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, false,
   10215 											false);
   10216 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, true,
   10217 											false);
   10218 			}
   10219 
   10220 			/* Deallocate any resources used. */
   10221 			this->delete_objects();
   10222 		} /* if var_type iterator found */
   10223 		else
   10224 		{
   10225 			TCU_FAIL("Type not found.");
   10226 		}
   10227 	} /* for (int var_type_index = 0; ...) */
   10228 }
   10229 
   10230 /* Generates the shader source code for the SubroutineArgumentAliasing1
   10231  * array tests, attempts to build and execute test program
   10232  *
   10233  * @tparam API               Tested API descriptor
   10234  *
   10235  * @param tested_shader_type The type of shader that is being tested
   10236  */
   10237 template <class API>
   10238 void SubroutineArgumentAliasing2<API>::test_shader_compilation(
   10239 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   10240 {
   10241 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10242 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10243 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10244 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   10245 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   10246 
   10247 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10248 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10249 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10250 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   10251 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   10252 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   10253 
   10254 	const std::string iteration_loop_end = "                        }\n"
   10255 										   "                    }\n"
   10256 										   "                }\n"
   10257 										   "            }\n"
   10258 										   "        }\n"
   10259 										   "    }\n";
   10260 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   10261 											 "    {\n"
   10262 											 "        for (uint b = 0u; b < 2u; b++)\n"
   10263 											 "        {\n"
   10264 											 "            for (uint c = 0u; c < 2u; c++)\n"
   10265 											 "            {\n"
   10266 											 "                for (uint d = 0u; d < 2u; d++)\n"
   10267 											 "                {\n"
   10268 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   10269 											 "                    {\n"
   10270 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   10271 											 "                        {\n";
   10272 	const glcts::test_var_type* var_types_set = var_types_set_es;
   10273 	size_t						num_var_types = num_var_types_es;
   10274 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   10275 
   10276 	if (API::USE_DOUBLE)
   10277 	{
   10278 		var_types_set = var_types_set_gl;
   10279 		num_var_types = num_var_types_gl;
   10280 	}
   10281 
   10282 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   10283 	{
   10284 		_supported_variable_types_map_const_iterator var_iterator =
   10285 			supported_variable_types_map.find(var_types_set[var_type_index]);
   10286 
   10287 		if (var_iterator != supported_variable_types_map.end())
   10288 		{
   10289 			std::string function_definition;
   10290 			std::string function_use;
   10291 			std::string verification;
   10292 
   10293 			function_definition += "// Subroutine types\n"
   10294 								   "subroutine bool inout_routine_type(inout ";
   10295 			function_definition += var_iterator->second.type;
   10296 			function_definition += " x[2][2][2][2][2][2], inout ";
   10297 			function_definition += var_iterator->second.type;
   10298 			function_definition += " y[2][2][2][2][2][2]);\n\n"
   10299 								   "// Subroutine definitions\n"
   10300 								   "subroutine(inout_routine_type) bool original_routine(inout ";
   10301 			function_definition += var_iterator->second.type;
   10302 			function_definition += " x[2][2][2][2][2][2], inout ";
   10303 			function_definition += var_iterator->second.type;
   10304 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10305 			function_definition += iteration_loop_start;
   10306 			function_definition +=
   10307 				"                                   x[a][b][c][d][e][f] = " + var_iterator->second.type + "(123);\n";
   10308 			function_definition += iteration_loop_end;
   10309 			function_definition += "\n";
   10310 			function_definition += iteration_loop_start;
   10311 			function_definition += "                                   if(y[a][b][c][d][e][f]";
   10312 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10313 			{
   10314 				function_definition += "[0][0]";
   10315 				function_definition += " != float";
   10316 			}
   10317 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10318 			{
   10319 				function_definition += "[0][0]";
   10320 				function_definition += " != double";
   10321 			}
   10322 			else
   10323 			{
   10324 				function_definition += " != ";
   10325 				function_definition += var_iterator->second.type;
   10326 			}
   10327 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10328 			function_definition += iteration_loop_end;
   10329 			function_definition += "\n    return true;\n";
   10330 			function_definition += "}\n\n"
   10331 								   "subroutine(inout_routine_type) bool new_routine(inout ";
   10332 			function_definition += var_iterator->second.type;
   10333 			function_definition += " x[2][2][2][2][2][2], inout ";
   10334 			function_definition += var_iterator->second.type;
   10335 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10336 			function_definition += iteration_loop_start;
   10337 			function_definition +=
   10338 				"                                   y[a][b][c][d][e][f] = " + var_iterator->second.type + "(123);\n";
   10339 			function_definition += iteration_loop_end;
   10340 			function_definition += "\n";
   10341 			function_definition += iteration_loop_start;
   10342 			function_definition += "                                   if(x[a][b][c][d][e][f]";
   10343 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10344 			{
   10345 				function_definition += "[0][0]";
   10346 				function_definition += " != float";
   10347 			}
   10348 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10349 			{
   10350 				function_definition += "[0][0]";
   10351 				function_definition += " != double";
   10352 			}
   10353 			else
   10354 			{
   10355 				function_definition += " != ";
   10356 				function_definition += var_iterator->second.type;
   10357 			}
   10358 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10359 			function_definition += iteration_loop_end;
   10360 			function_definition += "\n    return true;\n";
   10361 			function_definition += "}\n\n"
   10362 								   "// Subroutine uniform\n"
   10363 								   "subroutine uniform inout_routine_type routine;\n";
   10364 
   10365 			function_use += "    " + var_iterator->second.type + " z[2][2][2][2][2][2];\n";
   10366 			function_use += iteration_loop_start;
   10367 			function_use += "                                   z[a][b][c][d][e][f] = ";
   10368 			function_use += var_iterator->second.type;
   10369 			function_use += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f));\n";
   10370 			function_use += iteration_loop_end;
   10371 
   10372 			verification = "    float result = 0.0;\n"
   10373 						   "    if(routine(z, z) == true)\n"
   10374 						   "    {\n"
   10375 						   "        result = 1.0;\n"
   10376 						   "    }\n"
   10377 						   "    else\n"
   10378 						   "    {\n"
   10379 						   "        result = 0.5;\n"
   10380 						   "    }\n";
   10381 
   10382 			if (false == test_compute)
   10383 			{
   10384 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, false,
   10385 										false);
   10386 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, true,
   10387 										false);
   10388 			}
   10389 			else
   10390 			{
   10391 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, false,
   10392 											false);
   10393 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, true,
   10394 											false);
   10395 			}
   10396 
   10397 			/* Deallocate any resources used. */
   10398 			this->delete_objects();
   10399 		} /* if var_type iterator found */
   10400 		else
   10401 		{
   10402 			TCU_FAIL("Type not found.");
   10403 		}
   10404 	} /* for (int var_type_index = 0; ...) */
   10405 }
   10406 
   10407 /* Generates the shader source code for the SubroutineArgumentAliasing1
   10408  * array tests, attempts to build and execute test program
   10409  *
   10410  * @tparam API               Tested API descriptor
   10411  *
   10412  * @param tested_shader_type The type of shader that is being tested
   10413  */
   10414 template <class API>
   10415 void SubroutineArgumentAliasing3<API>::test_shader_compilation(
   10416 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   10417 {
   10418 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10419 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10420 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10421 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   10422 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   10423 
   10424 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10425 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10426 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10427 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   10428 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   10429 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   10430 
   10431 	const std::string iteration_loop_end = "                        }\n"
   10432 										   "                    }\n"
   10433 										   "                }\n"
   10434 										   "            }\n"
   10435 										   "        }\n"
   10436 										   "    }\n";
   10437 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   10438 											 "    {\n"
   10439 											 "        for (uint b = 0u; b < 2u; b++)\n"
   10440 											 "        {\n"
   10441 											 "            for (uint c = 0u; c < 2u; c++)\n"
   10442 											 "            {\n"
   10443 											 "                for (uint d = 0u; d < 2u; d++)\n"
   10444 											 "                {\n"
   10445 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   10446 											 "                    {\n"
   10447 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   10448 											 "                        {\n";
   10449 	const glcts::test_var_type* var_types_set = var_types_set_es;
   10450 	size_t						num_var_types = num_var_types_es;
   10451 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   10452 
   10453 	if (API::USE_DOUBLE)
   10454 	{
   10455 		var_types_set = var_types_set_gl;
   10456 		num_var_types = num_var_types_gl;
   10457 	}
   10458 
   10459 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   10460 	{
   10461 		_supported_variable_types_map_const_iterator var_iterator =
   10462 			supported_variable_types_map.find(var_types_set[var_type_index]);
   10463 
   10464 		if (var_iterator != supported_variable_types_map.end())
   10465 		{
   10466 			std::string function_definition;
   10467 			std::string function_use;
   10468 			std::string verification;
   10469 
   10470 			function_definition += "// Subroutine types\n"
   10471 								   "subroutine bool out_routine_type(out ";
   10472 			function_definition += var_iterator->second.type;
   10473 			function_definition += " x[2][2][2][2][2][2], ";
   10474 			function_definition += var_iterator->second.type;
   10475 			function_definition += " y[2][2][2][2][2][2]);\n\n"
   10476 								   "// Subroutine definitions\n"
   10477 								   "subroutine(out_routine_type) bool original_routine(out ";
   10478 			function_definition += var_iterator->second.type;
   10479 			function_definition += " x[2][2][2][2][2][2], ";
   10480 			function_definition += var_iterator->second.type;
   10481 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10482 			function_definition += iteration_loop_start;
   10483 			function_definition +=
   10484 				"                                   x[a][b][c][d][e][f] = " + var_iterator->second.type + "(123);\n";
   10485 			function_definition += iteration_loop_end;
   10486 			function_definition += "\n";
   10487 			function_definition += iteration_loop_start;
   10488 			function_definition += "                                   if(y[a][b][c][d][e][f]";
   10489 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10490 			{
   10491 				function_definition += "[0][0]";
   10492 				function_definition += " != float";
   10493 			}
   10494 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10495 			{
   10496 				function_definition += "[0][0]";
   10497 				function_definition += " != double";
   10498 			}
   10499 			else
   10500 			{
   10501 				function_definition += " != ";
   10502 				function_definition += var_iterator->second.type;
   10503 			}
   10504 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10505 			function_definition += iteration_loop_end;
   10506 			function_definition += "\n    return true;\n";
   10507 			function_definition += "}\n\n"
   10508 								   "subroutine(out_routine_type) bool new_routine(out ";
   10509 			function_definition += var_iterator->second.type;
   10510 			function_definition += " x[2][2][2][2][2][2], ";
   10511 			function_definition += var_iterator->second.type;
   10512 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10513 			function_definition += iteration_loop_start;
   10514 			function_definition +=
   10515 				"                                   x[a][b][c][d][e][f] = " + var_iterator->second.type + "(321);\n";
   10516 			function_definition += iteration_loop_end;
   10517 			function_definition += "\n";
   10518 			function_definition += iteration_loop_start;
   10519 			function_definition += "                                   if(y[a][b][c][d][e][f]";
   10520 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10521 			{
   10522 				function_definition += "[0][0]";
   10523 				function_definition += " != float";
   10524 			}
   10525 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10526 			{
   10527 				function_definition += "[0][0]";
   10528 				function_definition += " != double";
   10529 			}
   10530 			else
   10531 			{
   10532 				function_definition += " != ";
   10533 				function_definition += var_iterator->second.type;
   10534 			}
   10535 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10536 			function_definition += iteration_loop_end;
   10537 			function_definition += "\n    return true;\n";
   10538 			function_definition += "}\n\n"
   10539 								   "// Subroutine uniform\n"
   10540 								   "subroutine uniform out_routine_type routine;\n";
   10541 
   10542 			function_use += "    " + var_iterator->second.type + " z[2][2][2][2][2][2];\n";
   10543 			function_use += iteration_loop_start;
   10544 			function_use += "                                   z[a][b][c][d][e][f] = ";
   10545 			function_use += var_iterator->second.type;
   10546 			function_use += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f));\n";
   10547 			function_use += iteration_loop_end;
   10548 
   10549 			verification = "    float result = 0.0;\n"
   10550 						   "    if(routine(z, z) == true)\n"
   10551 						   "    {\n"
   10552 						   "        result = 1.0;\n"
   10553 						   "    }\n"
   10554 						   "    else\n"
   10555 						   "    {\n"
   10556 						   "        result = 0.5;\n"
   10557 						   "    }\n";
   10558 
   10559 			if (false == test_compute)
   10560 			{
   10561 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, false,
   10562 										false);
   10563 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, true,
   10564 										false);
   10565 			}
   10566 			else
   10567 			{
   10568 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, false,
   10569 											false);
   10570 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, true,
   10571 											false);
   10572 			}
   10573 
   10574 			/* Deallocate any resources used. */
   10575 			this->delete_objects();
   10576 		} /* if var_type iterator found */
   10577 		else
   10578 		{
   10579 			TCU_FAIL("Type not found.");
   10580 		}
   10581 	} /* for (int var_type_index = 0; ...) */
   10582 }
   10583 
   10584 /* Generates the shader source code for the SubroutineArgumentAliasing1
   10585  * array tests, attempts to build and execute test program
   10586  *
   10587  * @tparam API               Tested API descriptor
   10588  *
   10589  * @param tested_shader_type The type of shader that is being tested
   10590  */
   10591 template <class API>
   10592 void SubroutineArgumentAliasing4<API>::test_shader_compilation(
   10593 	typename TestCaseBase<API>::TestShaderType tested_shader_type)
   10594 {
   10595 	static const glcts::test_var_type var_types_set_es[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10596 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10597 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10598 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4 };
   10599 	static const size_t num_var_types_es = sizeof(var_types_set_es) / sizeof(var_types_set_es[0]);
   10600 
   10601 	static const glcts::test_var_type var_types_set_gl[] = { VAR_TYPE_INT,   VAR_TYPE_FLOAT, VAR_TYPE_IVEC2,
   10602 															 VAR_TYPE_IVEC3, VAR_TYPE_IVEC4, VAR_TYPE_VEC2,
   10603 															 VAR_TYPE_VEC3,  VAR_TYPE_VEC4,  VAR_TYPE_MAT2,
   10604 															 VAR_TYPE_MAT3,  VAR_TYPE_MAT4,  VAR_TYPE_DOUBLE,
   10605 															 VAR_TYPE_DMAT2, VAR_TYPE_DMAT3, VAR_TYPE_DMAT4 };
   10606 	static const size_t num_var_types_gl = sizeof(var_types_set_gl) / sizeof(var_types_set_gl[0]);
   10607 
   10608 	const std::string iteration_loop_end = "                        }\n"
   10609 										   "                    }\n"
   10610 										   "                }\n"
   10611 										   "            }\n"
   10612 										   "        }\n"
   10613 										   "    }\n";
   10614 	const std::string iteration_loop_start = "    for (uint a = 0u; a < 2u; a++)\n"
   10615 											 "    {\n"
   10616 											 "        for (uint b = 0u; b < 2u; b++)\n"
   10617 											 "        {\n"
   10618 											 "            for (uint c = 0u; c < 2u; c++)\n"
   10619 											 "            {\n"
   10620 											 "                for (uint d = 0u; d < 2u; d++)\n"
   10621 											 "                {\n"
   10622 											 "                    for (uint e = 0u; e < 2u; e++)\n"
   10623 											 "                    {\n"
   10624 											 "                        for (uint f = 0u; f < 2u; f++)\n"
   10625 											 "                        {\n";
   10626 	const glcts::test_var_type* var_types_set = var_types_set_es;
   10627 	size_t						num_var_types = num_var_types_es;
   10628 	const bool					test_compute  = (TestCaseBase<API>::COMPUTE_SHADER_TYPE == tested_shader_type);
   10629 
   10630 	if (API::USE_DOUBLE)
   10631 	{
   10632 		var_types_set = var_types_set_gl;
   10633 		num_var_types = num_var_types_gl;
   10634 	}
   10635 
   10636 	for (size_t var_type_index = 0; var_type_index < num_var_types; var_type_index++)
   10637 	{
   10638 		_supported_variable_types_map_const_iterator var_iterator =
   10639 			supported_variable_types_map.find(var_types_set[var_type_index]);
   10640 
   10641 		if (var_iterator != supported_variable_types_map.end())
   10642 		{
   10643 			std::string function_definition;
   10644 			std::string function_use;
   10645 			std::string verification;
   10646 
   10647 			function_definition += "// Subroutine types\n"
   10648 								   "subroutine bool out_routine_type(";
   10649 			function_definition += var_iterator->second.type;
   10650 			function_definition += " x[2][2][2][2][2][2], out ";
   10651 			function_definition += var_iterator->second.type;
   10652 			function_definition += " y[2][2][2][2][2][2]);\n\n"
   10653 								   "// Subroutine definitions\n"
   10654 								   "subroutine(out_routine_type) bool original_routine(";
   10655 			function_definition += var_iterator->second.type;
   10656 			function_definition += " x[2][2][2][2][2][2], out ";
   10657 			function_definition += var_iterator->second.type;
   10658 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10659 			function_definition += iteration_loop_start;
   10660 			function_definition +=
   10661 				"                                   y[a][b][c][d][e][f] = " + var_iterator->second.type + "(123);\n";
   10662 			function_definition += iteration_loop_end;
   10663 			function_definition += "\n";
   10664 			function_definition += iteration_loop_start;
   10665 			function_definition += "                                   if(x[a][b][c][d][e][f]";
   10666 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10667 			{
   10668 				function_definition += "[0][0]";
   10669 				function_definition += " != float";
   10670 			}
   10671 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10672 			{
   10673 				function_definition += "[0][0]";
   10674 				function_definition += " != double";
   10675 			}
   10676 			else
   10677 			{
   10678 				function_definition += " != ";
   10679 				function_definition += var_iterator->second.type;
   10680 			}
   10681 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10682 			function_definition += iteration_loop_end;
   10683 			function_definition += "\n    return true;\n";
   10684 			function_definition += "}\n\n"
   10685 								   "subroutine(out_routine_type) bool new_routine(";
   10686 			function_definition += var_iterator->second.type;
   10687 			function_definition += " x[2][2][2][2][2][2], out ";
   10688 			function_definition += var_iterator->second.type;
   10689 			function_definition += " y[2][2][2][2][2][2])\n{\n";
   10690 			function_definition += iteration_loop_start;
   10691 			function_definition +=
   10692 				"                                   y[a][b][c][d][e][f] = " + var_iterator->second.type + "(321);\n";
   10693 			function_definition += iteration_loop_end;
   10694 			function_definition += "\n";
   10695 			function_definition += iteration_loop_start;
   10696 			function_definition += "                                   if(x[a][b][c][d][e][f]";
   10697 			if (var_iterator->second.type == "mat4") // mat4 comparison
   10698 			{
   10699 				function_definition += "[0][0]";
   10700 				function_definition += " != float";
   10701 			}
   10702 			else if (var_iterator->second.type == "dmat4") // dmat4 comparison
   10703 			{
   10704 				function_definition += "[0][0]";
   10705 				function_definition += " != double";
   10706 			}
   10707 			else
   10708 			{
   10709 				function_definition += " != ";
   10710 				function_definition += var_iterator->second.type;
   10711 			}
   10712 			function_definition += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f))) {return false;}\n";
   10713 			function_definition += iteration_loop_end;
   10714 			function_definition += "\n    return true;\n";
   10715 			function_definition += "}\n\n"
   10716 								   "// Subroutine uniform\n"
   10717 								   "subroutine uniform out_routine_type routine;\n";
   10718 
   10719 			function_use += "    " + var_iterator->second.type + " z[2][2][2][2][2][2];\n";
   10720 			function_use += iteration_loop_start;
   10721 			function_use += "                                   z[a][b][c][d][e][f] = ";
   10722 			function_use += var_iterator->second.type;
   10723 			function_use += "(((a*32u)+(b*16u)+(c*8u)+(d*4u)+(e*2u)+f));\n";
   10724 			function_use += iteration_loop_end;
   10725 
   10726 			verification = "    float result = 0.0;\n"
   10727 						   "    if(routine(z, z) == true)\n"
   10728 						   "    {\n"
   10729 						   "        result = 1.0;\n"
   10730 						   "    }\n"
   10731 						   "    else\n"
   10732 						   "    {\n"
   10733 						   "        result = 0.5;\n"
   10734 						   "    }\n";
   10735 
   10736 			if (false == test_compute)
   10737 			{
   10738 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, false,
   10739 										false);
   10740 				this->execute_draw_test(tested_shader_type, function_definition, function_use, verification, true,
   10741 										false);
   10742 			}
   10743 			else
   10744 			{
   10745 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, false,
   10746 											false);
   10747 				this->execute_dispatch_test(tested_shader_type, function_definition, function_use, verification, true,
   10748 											false);
   10749 			}
   10750 
   10751 			/* Deallocate any resources used. */
   10752 			this->delete_objects();
   10753 		} /* if var_type iterator found */
   10754 		else
   10755 		{
   10756 			TCU_FAIL("Type not found.");
   10757 		}
   10758 	} /* for (int var_type_index = 0; ...) */
   10759 }
   10760 
   10761 /** Instantiates all tests and adds them as children to the node
   10762  *
   10763  * @tparam API    Tested API descriptor
   10764  *
   10765  * @param context CTS context
   10766  **/
   10767 template <class API>
   10768 void initTests(TestCaseGroup& group, glcts::Context& context)
   10769 {
   10770 	// Set up the map
   10771 	ArraysOfArrays::initializeMap<API>();
   10772 
   10773 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsPrimitive<API>(context));
   10774 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsStructTypes1<API>(context));
   10775 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsStructTypes2<API>(context));
   10776 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsStructTypes3<API>(context));
   10777 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsStructTypes4<API>(context));
   10778 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsTypenameStyle1<API>(context));
   10779 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsTypenameStyle2<API>(context));
   10780 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsTypenameStyle3<API>(context));
   10781 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsTypenameStyle4<API>(context));
   10782 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsTypenameStyle5<API>(context));
   10783 	group.addChild(new glcts::ArraysOfArrays::SizedDeclarationsFunctionParams<API>(context));
   10784 	group.addChild(new glcts::ArraysOfArrays::sized_declarations_invalid_sizes1<API>(context));
   10785 	group.addChild(new glcts::ArraysOfArrays::sized_declarations_invalid_sizes2<API>(context));
   10786 	group.addChild(new glcts::ArraysOfArrays::sized_declarations_invalid_sizes3<API>(context));
   10787 	group.addChild(new glcts::ArraysOfArrays::sized_declarations_invalid_sizes4<API>(context));
   10788 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclConstructors1<API>(context));
   10789 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclConstructors2<API>(context));
   10790 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclUnsizedConstructors<API>(context));
   10791 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclConst<API>(context));
   10792 
   10793 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclInvalidConstructors1<API>(context));
   10794 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclInvalidConstructors2<API>(context));
   10795 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclInvalidConstructors3<API>(context));
   10796 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclInvalidConstructors4<API>(context));
   10797 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclConstructorSizing1<API>(context));
   10798 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclConstructorSizing2<API>(context));
   10799 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclStructConstructors<API>(context));
   10800 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclUnsizedArrays1<API>(context));
   10801 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclUnsizedArrays2<API>(context));
   10802 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclUnsizedArrays3<API>(context));
   10803 	group.addChild(new glcts::ArraysOfArrays::ConstructorsAndUnsizedDeclUnsizedArrays4<API>(context));
   10804 	group.addChild(new glcts::ArraysOfArrays::ExpressionsAssignment1<API>(context));
   10805 	group.addChild(new glcts::ArraysOfArrays::ExpressionsAssignment2<API>(context));
   10806 	group.addChild(new glcts::ArraysOfArrays::ExpressionsAssignment3<API>(context));
   10807 	group.addChild(new glcts::ArraysOfArrays::ExpressionsTypeRestrictions1<API>(context));
   10808 	group.addChild(new glcts::ArraysOfArrays::ExpressionsTypeRestrictions2<API>(context));
   10809 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingScalar1<API>(context));
   10810 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingScalar2<API>(context));
   10811 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingScalar3<API>(context));
   10812 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingScalar4<API>(context));
   10813 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingArray1<API>(context));
   10814 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingArray2<API>(context));
   10815 	group.addChild(new glcts::ArraysOfArrays::ExpressionsIndexingArray3<API>(context));
   10816 	group.addChild(new glcts::ArraysOfArrays::ExpressionsDynamicIndexing1<API>(context));
   10817 	group.addChild(new glcts::ArraysOfArrays::ExpressionsDynamicIndexing2<API>(context));
   10818 	group.addChild(new glcts::ArraysOfArrays::ExpressionsEquality1<API>(context));
   10819 	group.addChild(new glcts::ArraysOfArrays::ExpressionsEquality2<API>(context));
   10820 	group.addChild(new glcts::ArraysOfArrays::ExpressionsLength1<API>(context));
   10821 	group.addChild(new glcts::ArraysOfArrays::ExpressionsLength2<API>(context));
   10822 	group.addChild(new glcts::ArraysOfArrays::ExpressionsLength3<API>(context));
   10823 	group.addChild(new glcts::ArraysOfArrays::ExpressionsInvalid1<API>(context));
   10824 	group.addChild(new glcts::ArraysOfArrays::ExpressionsInvalid2<API>(context));
   10825 
   10826 	group.addChild(new glcts::ArraysOfArrays::InteractionFunctionCalls1<API>(context));
   10827 	group.addChild(new glcts::ArraysOfArrays::InteractionFunctionCalls2<API>(context));
   10828 	group.addChild(new glcts::ArraysOfArrays::InteractionArgumentAliasing1<API>(context));
   10829 	group.addChild(new glcts::ArraysOfArrays::InteractionArgumentAliasing2<API>(context));
   10830 	group.addChild(new glcts::ArraysOfArrays::InteractionArgumentAliasing3<API>(context));
   10831 	group.addChild(new glcts::ArraysOfArrays::InteractionArgumentAliasing4<API>(context));
   10832 	group.addChild(new glcts::ArraysOfArrays::InteractionArgumentAliasing5<API>(context));
   10833 	group.addChild(new glcts::ArraysOfArrays::InteractionArgumentAliasing6<API>(context));
   10834 
   10835 	group.addChild(new glcts::ArraysOfArrays::InteractionUniforms1<API>(context));
   10836 	group.addChild(new glcts::ArraysOfArrays::InteractionUniforms2<API>(context));
   10837 	group.addChild(new glcts::ArraysOfArrays::InteractionUniformBuffers1<API>(context));
   10838 	group.addChild(new glcts::ArraysOfArrays::InteractionUniformBuffers2<API>(context));
   10839 	group.addChild(new glcts::ArraysOfArrays::InteractionUniformBuffers3<API>(context));
   10840 	group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays1<API>(context));
   10841 	group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays2<API>(context));
   10842 	group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays3<API>(context));
   10843 	group.addChild(new glcts::ArraysOfArrays::InteractionInterfaceArrays4<API>(context));
   10844 
   10845 	if (API::USE_STORAGE_BLOCK)
   10846 	{
   10847 		group.addChild(new glcts::ArraysOfArrays::InteractionStorageBuffers1<API>(context));
   10848 		group.addChild(new glcts::ArraysOfArrays::InteractionStorageBuffers2<API>(context));
   10849 		group.addChild(new glcts::ArraysOfArrays::InteractionStorageBuffers3<API>(context));
   10850 	}
   10851 
   10852 	if (API::USE_ATOMIC)
   10853 	{
   10854 		group.addChild(new glcts::ArraysOfArrays::AtomicDeclarationTest<API>(context));
   10855 		group.addChild(new glcts::ArraysOfArrays::AtomicUsageTest<API>(context));
   10856 	}
   10857 
   10858 	if (API::USE_SUBROUTINE)
   10859 	{
   10860 		group.addChild(new glcts::ArraysOfArrays::SubroutineFunctionCalls1<API>(context));
   10861 		group.addChild(new glcts::ArraysOfArrays::SubroutineFunctionCalls2<API>(context));
   10862 		group.addChild(new glcts::ArraysOfArrays::SubroutineArgumentAliasing1<API>(context));
   10863 		group.addChild(new glcts::ArraysOfArrays::SubroutineArgumentAliasing2<API>(context));
   10864 		group.addChild(new glcts::ArraysOfArrays::SubroutineArgumentAliasing3<API>(context));
   10865 		group.addChild(new glcts::ArraysOfArrays::SubroutineArgumentAliasing4<API>(context));
   10866 	}
   10867 }
   10868 } /* namespace ArraysOfArrays */
   10869 
   10870 /** Constructor
   10871  *
   10872  * @param context CTS context
   10873  **/
   10874 ArrayOfArraysTestGroup::ArrayOfArraysTestGroup(Context& context)
   10875 	: TestCaseGroup(context, "arrays_of_arrays", "Groups all tests that verify 'arrays of arrays' functionality.")
   10876 {
   10877 	/* Left blank on purpose */
   10878 }
   10879 
   10880 /* Instantiates all tests and adds them as children to the node */
   10881 void ArrayOfArraysTestGroup::init(void)
   10882 {
   10883 	ArraysOfArrays::initTests<ArraysOfArrays::Interface::ES>(*this, m_context);
   10884 }
   10885 
   10886 /** Constructor
   10887  *
   10888  * @param context CTS context
   10889  **/
   10890 ArrayOfArraysTestGroupGL::ArrayOfArraysTestGroupGL(Context& context)
   10891 	: TestCaseGroup(context, "arrays_of_arrays_gl", "Groups all tests that verify 'arrays of arrays' functionality.")
   10892 {
   10893 	/* Left blank on purpose */
   10894 }
   10895 
   10896 /* Instantiates all tests and adds them as children to the node */
   10897 void ArrayOfArraysTestGroupGL::init(void)
   10898 {
   10899 	ArraysOfArrays::initTests<ArraysOfArrays::Interface::GL>(*this, m_context);
   10900 }
   10901 } /* namespace glcts */
   10902