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/**
25 * \file  gl4cShadingLanguage420PackTests.cpp
26 * \brief Implements conformance tests for "Shading Language 420Pack" functionality.
27 */ /*-------------------------------------------------------------------*/
28
29#include "gl4cShadingLanguage420PackTests.hpp"
30
31#include "gluContextInfo.hpp"
32#include "gluDefs.hpp"
33#include "glwEnums.hpp"
34#include "glwFunctions.hpp"
35#include "tcuTestLog.hpp"
36
37#include <algorithm>
38#include <iomanip>
39#include <stdio.h>
40#include <string.h>
41#include <string>
42#include <vector>
43
44#define IS_DEBUG 0
45
46using namespace glw;
47
48namespace gl4cts
49{
50
51namespace GLSL420Pack
52{
53/** Check binding of uniform
54 *
55 * @param program          Program object
56 * @param name             Array name
57 * @param expected_binding Expected binding value
58 *
59 * @return true if binding is as expected, false otherwise
60 **/
61bool Utils::checkUniformBinding(Utils::program& program, const glw::GLchar* name, glw::GLint expected_binding)
62{
63	const GLint uniform_location = program.getUniformLocation(name);
64	if (-1 == uniform_location)
65	{
66		TCU_FAIL("Uniform is inactive");
67	}
68
69	GLint binding = program.getUniform1i(uniform_location);
70
71	return (expected_binding == binding);
72}
73/** Check binding of uniform array element at <index>
74 *
75 * @param program          Program object
76 * @param name             Array name
77 * @param index            Index
78 * @param expected_binding Expected binding value
79 *
80 * @return true if binding is as expected, false otherwise
81 **/
82bool Utils::checkUniformArrayBinding(Utils::program& program, const glw::GLchar* name, glw::GLuint index,
83									 glw::GLint expected_binding)
84{
85	GLchar buffer[64];
86	sprintf(buffer, "%s[%d]", name, index);
87
88	const GLint uniform_location = program.getUniformLocation(buffer);
89	if (-1 == uniform_location)
90	{
91		TCU_FAIL("Uniform is inactive");
92	}
93
94	GLint binding = program.getUniform1i(uniform_location);
95
96	return (expected_binding == binding);
97}
98
99/** Check if given qualifier is present in set
100 *
101 * @param qualifier  Specific qualifier
102 * @param qualifiers Qualifiers' set
103 *
104 * @return true if qualifier is present, false otherwise
105 **/
106bool Utils::doesContainQualifier(Utils::QUALIFIERS qualifier, const Utils::qualifierSet& qualifiers)
107{
108	for (GLuint i = 0; i < qualifiers.size(); ++i)
109	{
110		if (qualifiers[i] == qualifier)
111		{
112			return true;
113		}
114	}
115
116	return false;
117}
118
119/** Check if given stage supports specific qualifier
120 *
121 * @param stage     Shader stage
122 * @param storage   Storage of variable
123 * @param qualifier Qualifier
124 *
125 * @return true if qualifier can be used in given stage, false otherwise
126 **/
127bool Utils::doesStageSupportQualifier(Utils::SHADER_STAGES stage, Utils::VARIABLE_STORAGE storage,
128									  Utils::QUALIFIERS qualifier)
129{
130	bool result = true;
131
132	switch (stage)
133	{
134	case COMPUTE_SHADER:
135		switch (qualifier)
136		{
137		case QUAL_NONE:
138		case QUAL_UNIFORM:
139		case QUAL_LOWP:
140		case QUAL_MEDIUMP:
141		case QUAL_HIGHP:
142		case QUAL_INVARIANT:
143			result = true;
144			break;
145		default:
146			result = false;
147			break;
148		}
149		break;
150	case FRAGMENT_SHADER:
151		if (QUAL_PATCH == qualifier)
152		{
153			result = false;
154		}
155		else if ((OUTPUT == storage) &&
156				 ((QUAL_SMOOTH == qualifier) || (QUAL_NOPERSPECTIVE == qualifier) || (QUAL_FLAT == qualifier)))
157		{
158			result = false;
159		}
160		break;
161	case VERTEX_SHADER:
162		if (QUAL_PATCH == qualifier)
163		{
164			result = false;
165		}
166		else if ((INPUT == storage) &&
167				 ((QUAL_SMOOTH == qualifier) || (QUAL_NOPERSPECTIVE == qualifier) || (QUAL_FLAT == qualifier) ||
168				  (QUAL_INVARIANT == qualifier) || (QUAL_CENTROID == qualifier) || (QUAL_SAMPLE == qualifier)))
169		{
170			result = false;
171		}
172		break;
173	case GEOMETRY_SHADER:
174		if (QUAL_PATCH == qualifier)
175		{
176			result = false;
177		}
178		break;
179	case TESS_CTRL_SHADER:
180		if ((INPUT == storage) && (QUAL_PATCH == qualifier))
181		{
182			result = false;
183		}
184		break;
185	case TESS_EVAL_SHADER:
186		if ((OUTPUT == storage) && (QUAL_PATCH == qualifier))
187		{
188			result = false;
189		}
190		break;
191	default:
192		break;
193	}
194
195	return result;
196}
197
198/** Get string for qualifier
199 *
200 * @param qualifier Qualifier
201 *
202 * @return A string for given qualifier
203 **/
204const GLchar* Utils::getQualifierString(Utils::QUALIFIERS qualifier)
205{
206	const GLchar* result = 0;
207	switch (qualifier)
208	{
209	case QUAL_NONE:
210		result = "";
211		break;
212	case QUAL_CONST:
213		result = "const";
214		break;
215	case QUAL_IN:
216		result = "in";
217		break;
218	case QUAL_OUT:
219		result = "out";
220		break;
221	case QUAL_INOUT:
222		result = "inout";
223		break;
224	case QUAL_UNIFORM:
225		result = "uniform";
226		break;
227	case QUAL_PATCH:
228		result = "patch";
229		break;
230	case QUAL_CENTROID:
231		result = "centroid";
232		break;
233	case QUAL_SAMPLE:
234		result = "sample";
235		break;
236	case QUAL_FLAT:
237		result = "flat";
238		break;
239	case QUAL_NOPERSPECTIVE:
240		result = "noperspective";
241		break;
242	case QUAL_SMOOTH:
243		result = "smooth";
244		break;
245	case QUAL_LOCATION:
246		result = "layout (location = LOC_VALUE)";
247		break;
248	case QUAL_LOWP:
249		result = "lowp";
250		break;
251	case QUAL_MEDIUMP:
252		result = "mediump";
253		break;
254	case QUAL_HIGHP:
255		result = "highp";
256		break;
257	case QUAL_PRECISE:
258		result = "precise";
259		break;
260	case QUAL_INVARIANT:
261		result = "invariant";
262		break;
263	default:
264		TCU_FAIL("Invalid enum");
265	}
266
267	return result;
268}
269
270/** Returns a string with set of qualifiers.
271 *
272 * @param qualifiers Set of qualifiers
273 *
274 * @return String
275 **/
276std::string Utils::getQualifiersListString(const qualifierSet& qualifiers)
277{
278	static const GLchar* qualifier_list		   = "QUALIFIER QUALIFIER_LIST";
279	const GLuint		 qualifier_list_length = static_cast<GLuint>(strlen(qualifier_list));
280
281	/* Tokens */
282	static const GLchar* token_qualifier = "QUALIFIER";
283	static const GLchar* token_qual_list = "QUALIFIER_LIST";
284
285	/* Variables */
286	std::string list	 = token_qual_list;
287	size_t		position = 0;
288
289	/* Replace tokens */
290	for (GLuint i = 0; i < qualifiers.size(); ++i)
291	{
292		Utils::replaceToken(token_qual_list, position, qualifier_list, list);
293		position -= qualifier_list_length;
294
295		const GLchar* qualifier_str = getQualifierString(qualifiers[i]);
296
297		Utils::replaceToken(token_qualifier, position, qualifier_str, list);
298	}
299
300	Utils::replaceToken(token_qual_list, position, "", list);
301
302	return list;
303}
304
305/** Prepare a set of qualifiers for given shader stage and variable storage.
306 * Filters out not supported qualifiers from in_qualifiers
307 *
308 * @param in_qualifiers Origiranl set of qualifiers
309 * @param stage         Shader stage
310 * @param storage       Variable storage
311 *
312 * @return Set of qualifiers
313 **/
314Utils::qualifierSet Utils::prepareQualifiersSet(const qualifierSet& in_qualifiers, SHADER_STAGES stage,
315												VARIABLE_STORAGE storage)
316{
317	qualifierSet result;
318
319	for (GLuint i = 0; i < in_qualifiers.size(); ++i)
320	{
321		Utils::QUALIFIERS qualifier = in_qualifiers[i];
322
323		if (false == doesStageSupportQualifier(stage, storage, qualifier))
324		{
325			continue;
326		}
327
328		/* Replace wrong storage qualifiers */
329		if ((Utils::INPUT == storage) && ((Utils::QUAL_UNIFORM == qualifier) || (Utils::QUAL_OUT == qualifier)))
330		{
331			qualifier = QUAL_IN;
332		}
333		else if ((Utils::OUTPUT == storage) && ((Utils::QUAL_IN == qualifier) || (Utils::QUAL_UNIFORM == qualifier)))
334		{
335			qualifier = QUAL_OUT;
336		}
337		else if ((Utils::UNIFORM == storage) && ((Utils::QUAL_IN == qualifier) || (Utils::QUAL_OUT == qualifier)))
338		{
339			qualifier = QUAL_UNIFORM;
340		}
341
342		result.push_back(qualifier);
343	}
344
345	return result;
346}
347
348/** Get image type for given texture type
349 *
350 * @param type Texture type
351 *
352 * @return String representing sampler type
353 **/
354const GLchar* Utils::getImageType(Utils::TEXTURE_TYPES type)
355{
356	const GLchar* result = 0;
357
358	switch (type)
359	{
360	case TEX_BUFFER:
361		result = "imageBuffer";
362		break;
363	case TEX_2D:
364		result = "image2D";
365		break;
366	case TEX_2D_RECT:
367		result = "image2DRect";
368		break;
369	case TEX_2D_ARRAY:
370		result = "image2DArray";
371		break;
372	case TEX_3D:
373		result = "image3D";
374		break;
375	case TEX_CUBE:
376		result = "imageCube";
377		break;
378	case TEX_1D:
379		result = "image1D";
380		break;
381	case TEX_1D_ARRAY:
382		result = "image1DArray";
383		break;
384	default:
385		TCU_FAIL("Invalid enum");
386	}
387
388	return result;
389}
390
391/** Get number of coordinates required to address texture of given type
392 *
393 * @param type Type of texture
394 *
395 * @return Number of coordinates
396 **/
397GLuint Utils::getNumberOfCoordinates(Utils::TEXTURE_TYPES type)
398{
399	GLuint result = 0;
400
401	switch (type)
402	{
403	case TEX_BUFFER:
404		result = 1;
405		break;
406	case TEX_2D:
407		result = 2;
408		break;
409	case TEX_2D_RECT:
410		result = 2;
411		break;
412	case TEX_2D_ARRAY:
413		result = 3;
414		break;
415	case TEX_3D:
416		result = 3;
417		break;
418	case TEX_CUBE:
419		result = 3;
420		break;
421	case TEX_1D:
422		result = 1;
423		break;
424	case TEX_1D_ARRAY:
425		result = 2;
426		break;
427	default:
428		TCU_FAIL("Invalid enum");
429	}
430
431	return result;
432}
433
434/** Get sampler type for given texture type
435 *
436 * @param type Texture type
437 *
438 * @return String representing sampler type
439 **/
440const GLchar* Utils::getSamplerType(Utils::TEXTURE_TYPES type)
441{
442	const GLchar* result = 0;
443
444	switch (type)
445	{
446	case TEX_BUFFER:
447		result = "samplerBuffer";
448		break;
449	case TEX_2D:
450		result = "sampler2D";
451		break;
452	case TEX_2D_RECT:
453		result = "sampler2DRect";
454		break;
455	case TEX_2D_ARRAY:
456		result = "sampler2DArray";
457		break;
458	case TEX_3D:
459		result = "sampler3D";
460		break;
461	case TEX_CUBE:
462		result = "samplerCube";
463		break;
464	case TEX_1D:
465		result = "sampler1D";
466		break;
467	case TEX_1D_ARRAY:
468		result = "sampler1DArray";
469		break;
470	default:
471		TCU_FAIL("Invalid enum");
472	}
473
474	return result;
475}
476
477/** Get target for given texture type
478 *
479 * @param type Type of texture
480 *
481 * @return Target
482 **/
483GLenum Utils::getTextureTartet(Utils::TEXTURE_TYPES type)
484{
485	GLenum result = 0;
486
487	switch (type)
488	{
489	case TEX_BUFFER:
490		result = GL_TEXTURE_BUFFER;
491		break;
492	case TEX_2D:
493		result = GL_TEXTURE_2D;
494		break;
495	case TEX_2D_RECT:
496		result = GL_TEXTURE_RECTANGLE;
497		break;
498	case TEX_2D_ARRAY:
499		result = GL_TEXTURE_2D_ARRAY;
500		break;
501	case TEX_3D:
502		result = GL_TEXTURE_3D;
503		break;
504	case TEX_CUBE:
505		result = GL_TEXTURE_CUBE_MAP;
506		break;
507	case TEX_1D:
508		result = GL_TEXTURE_1D;
509		break;
510	case TEX_1D_ARRAY:
511		result = GL_TEXTURE_1D_ARRAY;
512		break;
513	default:
514		TCU_FAIL("Invalid enum");
515	}
516
517	return result;
518}
519
520/** Get name of given texture type
521 *
522 * @param type Texture type
523 *
524 * @return String representing name of texture type
525 **/
526const GLchar* Utils::getTextureTypeName(Utils::TEXTURE_TYPES type)
527{
528	const GLchar* result = 0;
529
530	switch (type)
531	{
532	case TEX_BUFFER:
533		result = "buffer";
534		break;
535	case TEX_2D:
536		result = "2D";
537		break;
538	case TEX_2D_RECT:
539		result = "2D rectangle";
540		break;
541	case TEX_2D_ARRAY:
542		result = "2D array";
543		break;
544	case TEX_3D:
545		result = "3D";
546		break;
547	case TEX_CUBE:
548		result = "cube";
549		break;
550	case TEX_1D:
551		result = "1D";
552		break;
553	case TEX_1D_ARRAY:
554		result = "1D array";
555		break;
556	default:
557		TCU_FAIL("Invalid enum");
558	}
559
560	return result;
561}
562
563/** Check if glsl support matrices for specific basic type
564 *
565 * @param type Basic type
566 *
567 * @return true if matrices of <type> are supported, false otherwise
568 **/
569bool Utils::doesTypeSupportMatrix(TYPES type)
570{
571	bool result = false;
572
573	switch (type)
574	{
575	case FLOAT:
576	case DOUBLE:
577		result = true;
578		break;
579	case INT:
580	case UINT:
581		result = false;
582		break;
583	default:
584		TCU_FAIL("Invliad enum");
585	}
586
587	return result;
588}
589
590/** Get string representing name of shader stage
591 *
592 * @param stage Shader stage
593 *
594 * @return String with name of shader stage
595 **/
596const glw::GLchar* Utils::getShaderStageName(Utils::SHADER_STAGES stage)
597{
598	const GLchar* result = 0;
599
600	switch (stage)
601	{
602	case COMPUTE_SHADER:
603		result = "compute";
604		break;
605	case VERTEX_SHADER:
606		result = "vertex";
607		break;
608	case TESS_CTRL_SHADER:
609		result = "tesselation control";
610		break;
611	case TESS_EVAL_SHADER:
612		result = "tesselation evaluation";
613		break;
614	case GEOMETRY_SHADER:
615		result = "geomtery";
616		break;
617	case FRAGMENT_SHADER:
618		result = "fragment";
619		break;
620	default:
621		TCU_FAIL("Invalid enum");
622	}
623
624	return result;
625}
626
627/** Get glsl name of specified type
628 *
629 * @param type      Basic type
630 * @param n_columns Number of columns
631 * @param n_rows    Number of rows
632 *
633 * @return Name of glsl type
634 **/
635const glw::GLchar* Utils::getTypeName(TYPES type, glw::GLuint n_columns, glw::GLuint n_rows)
636{
637	static const GLchar* float_lut[4][4] = {
638		{ "float", "vec2", "vec3", "vec4" },
639		{ 0, "mat2", "mat2x3", "mat2x4" },
640		{ 0, "mat3x2", "mat3", "mat3x4" },
641		{ 0, "mat4x2", "mat4x3", "mat4" },
642	};
643
644	static const GLchar* double_lut[4][4] = {
645		{ "double", "dvec2", "dvec3", "dvec4" },
646		{ 0, "dmat2", "dmat2x3", "dmat2x4" },
647		{ 0, "dmat3x2", "dmat3", "dmat3x4" },
648		{ 0, "dmat4x2", "dmat4x3", "dmat4" },
649	};
650
651	static const GLchar* int_lut[4] = { "int", "ivec2", "ivec3", "ivec4" };
652
653	static const GLchar* uint_lut[4] = { "uint", "uvec2", "uvec3", "uvec4" };
654
655	const GLchar* result = 0;
656
657	if ((1 > n_columns) || (1 > n_rows) || (4 < n_columns) || (4 < n_rows))
658	{
659		return 0;
660	}
661
662	switch (type)
663	{
664	case FLOAT:
665		result = float_lut[n_columns - 1][n_rows - 1];
666		break;
667	case DOUBLE:
668		result = double_lut[n_columns - 1][n_rows - 1];
669		break;
670	case INT:
671		result = int_lut[n_rows - 1];
672		break;
673	case UINT:
674		result = uint_lut[n_rows - 1];
675		break;
676	default:
677		TCU_FAIL("Invliad enum");
678	}
679
680	return result;
681}
682
683/** Get proper glUniformNdv routine for vectors with specified number of rows
684 *
685 * @param gl     GL functions
686 * @param n_rows Number of rows
687 *
688 * @return Function address
689 **/
690Utils::uniformNdv Utils::getUniformNdv(const glw::Functions& gl, glw::GLuint n_rows)
691{
692	uniformNdv result = 0;
693
694	switch (n_rows)
695	{
696	case 1:
697		result = gl.uniform1dv;
698		break;
699	case 2:
700		result = gl.uniform2dv;
701		break;
702	case 3:
703		result = gl.uniform3dv;
704		break;
705	case 4:
706		result = gl.uniform4dv;
707		break;
708	default:
709		TCU_FAIL("Invalid number of rows");
710	}
711
712	return result;
713}
714
715/** Get proper glUniformNfv routine for vectors with specified number of rows
716 *
717 * @param gl     GL functions
718 * @param n_rows Number of rows
719 *
720 * @return Function address
721 **/
722Utils::uniformNfv Utils::getUniformNfv(const glw::Functions& gl, glw::GLuint n_rows)
723{
724	uniformNfv result = 0;
725
726	switch (n_rows)
727	{
728	case 1:
729		result = gl.uniform1fv;
730		break;
731	case 2:
732		result = gl.uniform2fv;
733		break;
734	case 3:
735		result = gl.uniform3fv;
736		break;
737	case 4:
738		result = gl.uniform4fv;
739		break;
740	default:
741		TCU_FAIL("Invalid number of rows");
742	}
743
744	return result;
745}
746
747/** Get proper glUniformNiv routine for vectors with specified number of rows
748 *
749 * @param gl     GL functions
750 * @param n_rows Number of rows
751 *
752 * @return Function address
753 **/
754Utils::uniformNiv Utils::getUniformNiv(const glw::Functions& gl, glw::GLuint n_rows)
755{
756	uniformNiv result = 0;
757
758	switch (n_rows)
759	{
760	case 1:
761		result = gl.uniform1iv;
762		break;
763	case 2:
764		result = gl.uniform2iv;
765		break;
766	case 3:
767		result = gl.uniform3iv;
768		break;
769	case 4:
770		result = gl.uniform4iv;
771		break;
772	default:
773		TCU_FAIL("Invalid number of rows");
774	}
775
776	return result;
777}
778
779/** Get proper glUniformNuiv routine for vectors with specified number of rows
780 *
781 * @param gl     GL functions
782 * @param n_rows Number of rows
783 *
784 * @return Function address
785 **/
786Utils::uniformNuiv Utils::getUniformNuiv(const glw::Functions& gl, glw::GLuint n_rows)
787{
788	uniformNuiv result = 0;
789
790	switch (n_rows)
791	{
792	case 1:
793		result = gl.uniform1uiv;
794		break;
795	case 2:
796		result = gl.uniform2uiv;
797		break;
798	case 3:
799		result = gl.uniform3uiv;
800		break;
801	case 4:
802		result = gl.uniform4uiv;
803		break;
804	default:
805		TCU_FAIL("Invalid number of rows");
806	}
807
808	return result;
809}
810
811/** Get proper glUniformMatrixNdv routine for matrix with specified number of columns and rows
812 *
813 * @param gl     GL functions
814 * @param n_rows Number of rows
815 *
816 * @return Function address
817 **/
818Utils::uniformMatrixNdv Utils::getUniformMatrixNdv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows)
819{
820	uniformMatrixNdv result = 0;
821
822	switch (n_columns)
823	{
824	case 2:
825		switch (n_rows)
826		{
827		case 2:
828			result = gl.uniformMatrix2dv;
829			break;
830		case 3:
831			result = gl.uniformMatrix2x3dv;
832			break;
833		case 4:
834			result = gl.uniformMatrix2x4dv;
835			break;
836		default:
837			TCU_FAIL("Invalid number of rows");
838		}
839		break;
840	case 3:
841		switch (n_rows)
842		{
843		case 2:
844			result = gl.uniformMatrix3x2dv;
845			break;
846		case 3:
847			result = gl.uniformMatrix3dv;
848			break;
849		case 4:
850			result = gl.uniformMatrix3x4dv;
851			break;
852		default:
853			TCU_FAIL("Invalid number of rows");
854		}
855		break;
856	case 4:
857		switch (n_rows)
858		{
859		case 2:
860			result = gl.uniformMatrix4x2dv;
861			break;
862		case 3:
863			result = gl.uniformMatrix4x3dv;
864			break;
865		case 4:
866			result = gl.uniformMatrix4dv;
867			break;
868		default:
869			TCU_FAIL("Invalid number of rows");
870		}
871		break;
872	default:
873		TCU_FAIL("Invalid number of columns");
874	}
875
876	return result;
877}
878
879/** Get proper glUniformMatrixNfv routine for vectors with specified number of columns and rows
880 *
881 * @param gl     GL functions
882 * @param n_rows Number of rows
883 *
884 * @return Function address
885 **/
886Utils::uniformMatrixNfv Utils::getUniformMatrixNfv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows)
887{
888	uniformMatrixNfv result = 0;
889
890	switch (n_columns)
891	{
892	case 2:
893		switch (n_rows)
894		{
895		case 2:
896			result = gl.uniformMatrix2fv;
897			break;
898		case 3:
899			result = gl.uniformMatrix2x3fv;
900			break;
901		case 4:
902			result = gl.uniformMatrix2x4fv;
903			break;
904		default:
905			TCU_FAIL("Invalid number of rows");
906		}
907		break;
908	case 3:
909		switch (n_rows)
910		{
911		case 2:
912			result = gl.uniformMatrix3x2fv;
913			break;
914		case 3:
915			result = gl.uniformMatrix3fv;
916			break;
917		case 4:
918			result = gl.uniformMatrix3x4fv;
919			break;
920		default:
921			TCU_FAIL("Invalid number of rows");
922		}
923		break;
924	case 4:
925		switch (n_rows)
926		{
927		case 2:
928			result = gl.uniformMatrix4x2fv;
929			break;
930		case 3:
931			result = gl.uniformMatrix4x3fv;
932			break;
933		case 4:
934			result = gl.uniformMatrix4fv;
935			break;
936		default:
937			TCU_FAIL("Invalid number of rows");
938		}
939		break;
940	default:
941		TCU_FAIL("Invalid number of columns");
942	}
943
944	return result;
945}
946
947/** Prepare definition of input or output block's variable
948 *
949 * @param qualifiers    Set of qualifiers
950 * @param type_name     Name of type
951 * @param variable_name Meaningful part of variable name, eg. tex_coord
952 *
953 * @return Definition of variable
954 **/
955std::string Utils::getBlockVariableDefinition(const qualifierSet& qualifiers, const glw::GLchar* type_name,
956											  const glw::GLchar* variable_name)
957{
958	/* Templates */
959	static const GLchar* def_template = "QUALIFIER_LISTTYPE VARIABLE_NAME";
960
961	/* Tokens */
962	static const GLchar* token_type			 = "TYPE";
963	static const GLchar* token_variable_name = "VARIABLE_NAME";
964	static const GLchar* token_qual_list	 = "QUALIFIER_LIST";
965
966	/* Variables */
967	std::string variable_definition = def_template;
968	size_t		position			= 0;
969
970	/* Get qualifiers list */
971	const std::string& list = getQualifiersListString(qualifiers);
972
973	/* Replace tokens */
974	Utils::replaceToken(token_qual_list, position, list.c_str(), variable_definition);
975	Utils::replaceToken(token_type, position, type_name, variable_definition);
976	Utils::replaceToken(token_variable_name, position, variable_name, variable_definition);
977
978	/* Done */
979	return variable_definition;
980}
981
982/** Prepare reference to input or output variable
983 *
984 * @param flavour       "Flavour" of variable
985 * @param variable_name Meaningful part of variable name, eg. tex_coord
986 * @param block_name    Name of block
987 *
988 * @return Reference to variable
989 **/
990std::string Utils::getBlockVariableReference(VARIABLE_FLAVOUR flavour, const glw::GLchar* variable_name,
991											 const glw::GLchar* block_name)
992{
993	/* Templates */
994	static const GLchar* ref_template		= "BLOCK_NAME.VARIABLE_NAME";
995	static const GLchar* array_ref_template = "BLOCK_NAME[0].VARIABLE_NAME";
996	static const GLchar* tcs_ref_template   = "BLOCK_NAME[gl_InvocationID].VARIABLE_NAME";
997
998	/* Token */
999	static const GLchar* token_block_name	= "BLOCK_NAME";
1000	static const GLchar* token_variable_name = "VARIABLE_NAME";
1001
1002	/* Variables */
1003	std::string variable_definition;
1004	size_t		position = 0;
1005
1006	/* Select variable reference template */
1007	switch (flavour)
1008	{
1009	case BASIC:
1010		variable_definition = ref_template;
1011		break;
1012	case ARRAY:
1013		variable_definition = array_ref_template;
1014		break;
1015	case INDEXED_BY_INVOCATION_ID:
1016		variable_definition = tcs_ref_template;
1017		break;
1018	default:
1019		variable_definition = ref_template;
1020		break;
1021	}
1022
1023	/* Replace tokens */
1024	replaceAllTokens(token_block_name, block_name, variable_definition);
1025	replaceToken(token_variable_name, position, variable_name, variable_definition);
1026
1027	/* Done */
1028	return variable_definition;
1029}
1030
1031/** Prepare definition of input or output variable
1032 *
1033 * @param flavour       "Flavour" of variable
1034 * @param qualifiers    Set of qualifiers
1035 * @param type_name     Name of type
1036 * @param variable_name Meaningful part of variable name, eg. tex_coord
1037 *
1038 * @return Definition of variable
1039 **/
1040std::string Utils::getVariableDefinition(VARIABLE_FLAVOUR flavour, const qualifierSet& qualifiers,
1041										 const glw::GLchar* type_name, const glw::GLchar* variable_name)
1042{
1043	/* Templates */
1044	static const GLchar* def_template		= "QUALIFIER_LISTTYPE VARIABLE_NAME";
1045	static const GLchar* def_array_template = "QUALIFIER_LISTTYPE VARIABLE_NAME[]";
1046
1047	/* Tokens */
1048	static const GLchar* token_type			 = "TYPE";
1049	static const GLchar* token_variable_name = "VARIABLE_NAME";
1050	static const GLchar* token_qual_list	 = "QUALIFIER_LIST";
1051
1052	/* Variables */
1053	std::string variable_definition;
1054	size_t		position = 0;
1055
1056	/* Select variable definition template */
1057	switch (flavour)
1058	{
1059	case BASIC:
1060		variable_definition = def_template;
1061		break;
1062	case ARRAY:
1063	case INDEXED_BY_INVOCATION_ID:
1064		variable_definition = def_array_template;
1065		break;
1066	default:
1067		TCU_FAIL("Invliad enum");
1068	}
1069
1070	/* Get qualifiers list */
1071	const std::string& list = getQualifiersListString(qualifiers);
1072
1073	/* Replace tokens */
1074	replaceToken(token_qual_list, position, list.c_str(), variable_definition);
1075	replaceToken(token_type, position, type_name, variable_definition);
1076	replaceToken(token_variable_name, position, variable_name, variable_definition);
1077
1078	/* Done */
1079	return variable_definition;
1080}
1081
1082/** Get "flavour" of variable
1083 *
1084 * @param stage      Shader stage
1085 * @param storage    Storage of variable
1086 * @param qualifiers Set of qualifiers for variable
1087 *
1088 * @return "Flavour" of variable
1089 **/
1090Utils::VARIABLE_FLAVOUR Utils::getVariableFlavour(SHADER_STAGES stage, VARIABLE_STORAGE storage,
1091												  const qualifierSet& qualifiers)
1092{
1093	VARIABLE_FLAVOUR result;
1094
1095	if (UNIFORM == storage)
1096	{
1097		result = BASIC;
1098	}
1099	else
1100	{
1101		switch (stage)
1102		{
1103		case Utils::GEOMETRY_SHADER:
1104			if (Utils::INPUT == storage)
1105			{
1106				result = ARRAY;
1107			}
1108			else /* OUTPUT */
1109			{
1110				result = BASIC;
1111			}
1112			break;
1113		case Utils::TESS_EVAL_SHADER:
1114			if ((false == Utils::doesContainQualifier(Utils::QUAL_PATCH, qualifiers)) && (Utils::INPUT == storage))
1115			{
1116				result = ARRAY;
1117			}
1118			else /* OUTPUT */
1119			{
1120				result = BASIC;
1121			}
1122			break;
1123		case Utils::TESS_CTRL_SHADER:
1124			if ((true == Utils::doesContainQualifier(Utils::QUAL_PATCH, qualifiers)) && (Utils::OUTPUT == storage))
1125			{
1126				result = BASIC;
1127			}
1128			else
1129			{
1130				result = INDEXED_BY_INVOCATION_ID;
1131			}
1132			break;
1133		case Utils::VERTEX_SHADER:
1134		case Utils::FRAGMENT_SHADER:
1135			result = BASIC;
1136			break;
1137		default:
1138			TCU_FAIL("Invliad enum");
1139		}
1140	}
1141
1142	return result;
1143}
1144
1145/** Prepare name of input or output variable
1146 *
1147 * @param stage         Shader stage
1148 * @param storage       Storage of variable
1149 * @param variable_name Meaningful part of variable name, eg. tex_coord
1150 *
1151 * @return Name of variable
1152 **/
1153std::string Utils::getVariableName(SHADER_STAGES stage, VARIABLE_STORAGE storage, const glw::GLchar* variable_name)
1154{
1155	/* Variable name template */
1156	static const GLchar* variable_name_template = "PRECEEDING_PREFIX_VARIABLE_NAME";
1157
1158	/* Tokens */
1159	static const GLchar* token_preceeding	= "PRECEEDING";
1160	static const GLchar* token_prefix		 = "PREFIX";
1161	static const GLchar* token_variable_name = "VARIABLE_NAME";
1162
1163	static const GLchar* prefixes[Utils::STORAGE_MAX][Utils::SHADER_STAGES_MAX][2] = {
1164		/* COMPUTE,					VERTEX,				TCS,				TES,				GEOMETRY,			FRAGMENT					*/
1165		{ { "", "" },
1166		  { "in", "vs" },
1167		  { "vs", "tcs" },
1168		  { "tcs", "tes" },
1169		  { "tes", "gs" },
1170		  { "gs", "fs" } }, /* INPUT	*/
1171		{ { "", "" },
1172		  { "vs", "tcs" },
1173		  { "tcs", "tes" },
1174		  { "tes", "gs" },
1175		  { "gs", "fs" },
1176		  { "fs", "out" } }, /* OUTPUT	*/
1177		{ { "uni", "comp" },
1178		  { "uni", "vs" },
1179		  { "uni", "tcs" },
1180		  { "uni", "tes" },
1181		  { "uni", "gs" },
1182		  { "uni", "fs" } } /* UNIFORM	*/
1183	};
1184
1185	/* Variables */
1186	const GLchar* preceeding = prefixes[storage][stage][0];
1187	const GLchar* prefix	 = prefixes[storage][stage][1];
1188	std::string   name		 = variable_name_template;
1189	size_t		  position   = 0;
1190
1191	/* Replace tokens */
1192	Utils::replaceToken(token_preceeding, position, preceeding, name);
1193	Utils::replaceToken(token_prefix, position, prefix, name);
1194	Utils::replaceToken(token_variable_name, position, variable_name, name);
1195
1196	/* Done */
1197	return name;
1198}
1199
1200/** Prepare reference to input or output variable
1201 *
1202 * @param flavour       "Flavour" of variable
1203 * @param variable_name Meaningful part of variable name, eg. tex_coord
1204 *
1205 * @return Reference to variable
1206 **/
1207std::string Utils::getVariableReference(VARIABLE_FLAVOUR flavour, const glw::GLchar* variable_name)
1208{
1209	/* Templates */
1210	static const GLchar* ref_template		= "VARIABLE_NAME";
1211	static const GLchar* array_ref_template = "VARIABLE_NAME[0]";
1212	static const GLchar* tcs_ref_template   = "VARIABLE_NAME[gl_InvocationID]";
1213
1214	/* Token */
1215	static const GLchar* token_variable_name = "VARIABLE_NAME";
1216
1217	/* Variables */
1218	std::string variable_definition;
1219	size_t		position = 0;
1220
1221	/* Select variable reference template */
1222	switch (flavour)
1223	{
1224	case BASIC:
1225		variable_definition = ref_template;
1226		break;
1227	case ARRAY:
1228		variable_definition = array_ref_template;
1229		break;
1230	case INDEXED_BY_INVOCATION_ID:
1231		variable_definition = tcs_ref_template;
1232		break;
1233	default:
1234		variable_definition = ref_template;
1235		break;
1236	}
1237
1238	/* Replace token */
1239	Utils::replaceToken(token_variable_name, position, variable_name, variable_definition);
1240
1241	/* Done */
1242	return variable_definition;
1243}
1244
1245/** Prepare definition and reference string for block varaible
1246 *
1247 * @param in_stage         Shader stage
1248 * @param in_storage       Storage of variable
1249 * @param in_qualifiers    Set of qualifiers
1250 * @param in_type_name     Type name
1251 * @param in_variable_name Meaningful part of variable name, like "color"
1252 * @param in_block_name    Name of block, like "input"
1253 * @param out_definition   Definition string
1254 * @param out_reference    Reference string
1255 **/
1256void Utils::prepareBlockVariableStrings(Utils::SHADER_STAGES in_stage, Utils::VARIABLE_STORAGE in_storage,
1257										const Utils::qualifierSet& in_qualifiers, const glw::GLchar* in_type_name,
1258										const glw::GLchar* in_variable_name, const glw::GLchar* in_block_name,
1259										std::string& out_definition, std::string& out_reference)
1260{
1261	VARIABLE_FLAVOUR	flavour	= getVariableFlavour(in_stage, in_storage, in_qualifiers);
1262	const qualifierSet& qualifiers = prepareQualifiersSet(in_qualifiers, in_stage, in_storage);
1263	const std::string&  name	   = getVariableName(in_stage, in_storage, in_variable_name);
1264
1265	out_definition = getBlockVariableDefinition(qualifiers, in_type_name, name.c_str());
1266	out_reference  = getBlockVariableReference(flavour, name.c_str(), in_block_name);
1267}
1268
1269/** Prepare definition and reference string for block varaible
1270 *
1271 * @param in_stage         Shader stage
1272 * @param in_storage       Storage of variable
1273 * @param in_qualifiers    Set of qualifiers
1274 * @param in_type_name     Type name
1275 * @param in_variable_name Meaningful part of variable name, like "color"
1276 * @param out_definition   Definition string
1277 * @param out_reference    Reference string
1278 **/
1279void Utils::prepareVariableStrings(Utils::SHADER_STAGES in_stage, Utils::VARIABLE_STORAGE in_storage,
1280								   const Utils::qualifierSet& in_qualifiers, const glw::GLchar* in_type_name,
1281								   const glw::GLchar* in_variable_name, std::string& out_definition,
1282								   std::string& out_reference)
1283{
1284	VARIABLE_FLAVOUR	flavour	= getVariableFlavour(in_stage, in_storage, in_qualifiers);
1285	const qualifierSet& qualifiers = prepareQualifiersSet(in_qualifiers, in_stage, in_storage);
1286	const std::string&  name	   = getVariableName(in_stage, in_storage, in_variable_name);
1287
1288	out_definition = getVariableDefinition(flavour, qualifiers, in_type_name, name.c_str());
1289	out_reference  = getVariableReference(flavour, name.c_str());
1290}
1291
1292/** Returns string with UTF8 character for current test case
1293 *
1294 * @return String with UTF8 character
1295 **/
1296const GLchar* Utils::getUtf8Character(Utils::UTF8_CHARACTERS character)
1297{
1298	static const unsigned char two_bytes[]		 = { 0xd7, 0x84, 0x00 };
1299	static const unsigned char three_bytes[]	 = { 0xe3, 0x82, 0x81, 0x00 };
1300	static const unsigned char four_bytes[]		 = { 0xf0, 0x93, 0x83, 0x93, 0x00 };
1301	static const unsigned char five_bytes[]		 = { 0xfa, 0x82, 0x82, 0x82, 0x82, 0x00 };
1302	static const unsigned char six_bytes[]		 = { 0xfd, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00 };
1303	static const unsigned char redundant_bytes[] = { 0xf2, 0x80, 0x80, 0x5e, 0x00 };
1304
1305	const GLchar* result = 0;
1306
1307	switch (character)
1308	{
1309	case TWO_BYTES:
1310		result = (const GLchar*)two_bytes;
1311		break;
1312	case THREE_BYTES:
1313		result = (const GLchar*)three_bytes;
1314		break;
1315	case FOUR_BYTES:
1316		result = (const GLchar*)four_bytes;
1317		break;
1318	case FIVE_BYTES:
1319		result = (const GLchar*)five_bytes;
1320		break;
1321	case SIX_BYTES:
1322		result = (const GLchar*)six_bytes;
1323		break;
1324	case REDUNDANT_ASCII:
1325		result = (const GLchar*)redundant_bytes;
1326		break;
1327	case EMPTY:
1328		result = "";
1329		break;
1330	default:
1331		TCU_FAIL("Invalid enum");
1332	}
1333
1334	return result;
1335}
1336/** Check if extension is supported
1337 *
1338 * @param context        Test context
1339 * @param extension_name Name of extension
1340 *
1341 * @return true if extension is supported, false otherwise
1342 **/
1343bool Utils::isExtensionSupported(deqp::Context& context, const GLchar* extension_name)
1344{
1345	const std::vector<std::string>& extensions = context.getContextInfo().getExtensions();
1346
1347	if (std::find(extensions.begin(), extensions.end(), extension_name) == extensions.end())
1348	{
1349		return false;
1350	}
1351
1352	return true;
1353}
1354
1355/** Check if GL context meets version requirements
1356 *
1357 * @param gl             Functions
1358 * @param required_major Minimum required MAJOR_VERSION
1359 * @param required_minor Minimum required MINOR_VERSION
1360 *
1361 * @return true if GL context version is at least as requested, false otherwise
1362 **/
1363bool Utils::isGLVersionAtLeast(const glw::Functions& gl, glw::GLint required_major, glw::GLint required_minor)
1364{
1365	glw::GLint major = 0;
1366	glw::GLint minor = 0;
1367
1368	gl.getIntegerv(GL_MAJOR_VERSION, &major);
1369	gl.getIntegerv(GL_MINOR_VERSION, &minor);
1370
1371	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
1372
1373	if (major > required_major)
1374	{
1375		/* Major is higher than required one */
1376		return true;
1377	}
1378	else if (major == required_major)
1379	{
1380		if (minor >= required_minor)
1381		{
1382			/* Major is equal to required one */
1383			/* Minor is higher than or equal to required one */
1384			return true;
1385		}
1386		else
1387		{
1388			/* Major is equal to required one */
1389			/* Minor is lower than required one */
1390			return false;
1391		}
1392	}
1393	else
1394	{
1395		/* Major is lower than required one */
1396		return false;
1397	}
1398}
1399
1400/** Replace first occurance of <token> with <text> in <string> starting at <search_posistion>
1401 *
1402 * @param token           Token string
1403 * @param search_position Position at which find will start, it is updated to position at which replaced text ends
1404 * @param text            String that will be used as replacement for <token>
1405 * @param string          String to work on
1406 **/
1407void Utils::replaceToken(const glw::GLchar* token, size_t& search_position, const glw::GLchar* text,
1408						 std::string& string)
1409{
1410	const size_t text_length	= strlen(text);
1411	const size_t token_length   = strlen(token);
1412	const size_t token_position = string.find(token, search_position);
1413
1414	string.replace(token_position, token_length, text, text_length);
1415
1416	search_position = token_position + text_length;
1417}
1418
1419/** Replace all occurances of <token> with <text> in <string>
1420 *
1421 * @param token           Token string
1422 * @param text            String that will be used as replacement for <token>
1423 * @param string          String to work on
1424 **/
1425void Utils::replaceAllTokens(const glw::GLchar* token, const glw::GLchar* text, std::string& string)
1426{
1427	const size_t text_length  = strlen(text);
1428	const size_t token_length = strlen(token);
1429
1430	size_t search_position = 0;
1431
1432	while (1)
1433	{
1434		const size_t token_position = string.find(token, search_position);
1435
1436		if (std::string::npos == token_position)
1437		{
1438			break;
1439		}
1440
1441		search_position = token_position + text_length;
1442
1443		string.replace(token_position, token_length, text, text_length);
1444	}
1445}
1446
1447/** Constructor
1448 *
1449 * @param context          Test context
1450 * @param test_name        Test name
1451 * @param test_description Test description
1452 **/
1453TestBase::TestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description)
1454	: TestCase(context, test_name, test_description)
1455	, m_is_compute_shader_supported(false)
1456	, m_is_explicit_uniform_location(false)
1457	, m_is_shader_language_420pack(false)
1458{
1459	/* Nothing to be done here */
1460}
1461
1462/** Execute test
1463 *
1464 * @return tcu::TestNode::CONTINUE after executing test case, tcu::TestNode::STOP otherwise
1465 **/
1466tcu::TestNode::IterateResult TestBase::iterate()
1467{
1468	/* GL entry points */
1469	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1470
1471	/* Check extension support and version */
1472	m_is_explicit_uniform_location = Utils::isExtensionSupported(m_context, "GL_ARB_explicit_uniform_location");
1473	m_is_shader_language_420pack   = Utils::isExtensionSupported(m_context, "GL_ARB_shading_language_420pack");
1474	m_is_compute_shader_supported  = Utils::isGLVersionAtLeast(gl, 4, 3);
1475
1476	/* Execute test */
1477	bool test_result = test();
1478
1479	/* Set result */
1480	if (true == test_result)
1481	{
1482		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
1483	}
1484	else
1485	{
1486		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1487	}
1488
1489	/* Done */
1490	return tcu::TestNode::STOP;
1491}
1492
1493/** Basic implementation of getShaderSourceConfig method.
1494 *
1495 * @param out_n_parts     Number of source parts used by this test case
1496 * @param out_use_lengths If source lengths shall be provided to compiler
1497 **/
1498void TestBase::getShaderSourceConfig(glw::GLuint& out_n_parts, bool& out_use_lengths)
1499{
1500	out_n_parts		= 1;
1501	out_use_lengths = false;
1502}
1503
1504/** Basic implementation of prepareNextTestCase method.
1505 *
1506 * @param test_case_index Index of test case
1507 *
1508 * @return true if index is -1 or 0, false otherwise
1509 **/
1510bool TestBase::prepareNextTestCase(GLuint test_case_index)
1511{
1512	if (((GLuint)-1 == test_case_index) || (0 == test_case_index))
1513	{
1514		return true;
1515	}
1516	else
1517	{
1518		return false;
1519	}
1520}
1521
1522/** Basic implementation of prepareUniforms method
1523 *
1524 * @param ignored
1525 **/
1526void TestBase::prepareUniforms(Utils::program& /* program */)
1527{
1528	/* Nothing to be done */
1529}
1530
1531/** Basic implementation of testInit method
1532 *
1533 * @return true if test can be executed, false otherwise
1534 **/
1535bool TestBase::testInit()
1536{
1537	return true;
1538}
1539
1540/** Get layout specific for given stage
1541 *
1542 * @param stage Shader stage
1543 *
1544 * @return Stage specific part
1545 **/
1546const GLchar* TestBase::getStageSpecificLayout(Utils::SHADER_STAGES stage) const
1547{
1548	static const GLchar* stage_layout_geometry = "layout(points)                           in;\n"
1549												 "layout(triangle_strip, max_vertices = 4) out;\n";
1550	static const GLchar* stage_layout_tess_ctrl = "layout(vertices = 1)                     out;\n";
1551	static const GLchar* stage_layout_tess_eval = "layout(isolines, point_mode)             in;\n";
1552
1553	const GLchar* result = "";
1554
1555	switch (stage)
1556	{
1557	case Utils::GEOMETRY_SHADER:
1558		result = stage_layout_geometry;
1559		break;
1560	case Utils::TESS_CTRL_SHADER:
1561		result = stage_layout_tess_ctrl;
1562		break;
1563	case Utils::TESS_EVAL_SHADER:
1564		result = stage_layout_tess_eval;
1565		break;
1566	case Utils::VERTEX_SHADER:
1567	case Utils::FRAGMENT_SHADER:
1568	default:
1569		break;
1570	}
1571
1572	return result;
1573}
1574
1575/** Get "version" string
1576 *
1577 * @param stage           Shader stage, compute shader will use 430
1578 * @param use_version_400 Select if 400 or 420 should be used
1579 *
1580 * @return Version string
1581 **/
1582const GLchar* TestBase::getVersionString(Utils::SHADER_STAGES stage, bool use_version_400) const
1583{
1584	static const GLchar* version_400 = "#version 400\n"
1585									   "#extension GL_ARB_shading_language_420pack : require\n"
1586									   "#extension GL_ARB_separate_shader_objects : enable";
1587	static const GLchar* version_420 = "#version 420";
1588	static const GLchar* version_430 = "#version 430";
1589
1590	const GLchar* result = "";
1591
1592	if (Utils::COMPUTE_SHADER == stage)
1593	{
1594		result = version_430;
1595	}
1596	else if (true == use_version_400)
1597	{
1598		result = version_400;
1599	}
1600	else
1601	{
1602		result = version_420;
1603	}
1604
1605	return result;
1606}
1607
1608/** Initialize shaderSource instance, reserve storage and prepare shader source
1609 *
1610 * @param in_stage           Shader stage
1611 * @param in_use_version_400 If version 400 or 420 should be used
1612 * @param out_source         Shader source instance
1613 **/
1614void TestBase::initShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, Utils::shaderSource& out_source)
1615{
1616	/* Shader source configuration */
1617	glw::GLuint n_parts		= 0;
1618	bool		use_lengths = false;
1619
1620	getShaderSourceConfig(n_parts, use_lengths);
1621
1622	out_source.m_parts.resize(n_parts);
1623	out_source.m_use_lengths = use_lengths;
1624
1625	/* Request child class to prepare shader sources */
1626	prepareShaderSource(in_stage, in_use_version_400, out_source);
1627
1628	/* Prepare source lengths */
1629	if (true == use_lengths)
1630	{
1631		for (GLuint i = 0; i < n_parts; ++i)
1632		{
1633			out_source.m_parts[i].m_length = static_cast<glw::GLint>(out_source.m_parts[i].m_code.length());
1634
1635			out_source.m_parts[i].m_code.append("This should be ignored by compiler, as source length is provided");
1636		}
1637	}
1638	else
1639	{
1640		for (GLuint i = 0; i < n_parts; ++i)
1641		{
1642			out_source.m_parts[i].m_length = 0;
1643		}
1644	}
1645}
1646
1647/** Execute test
1648 *
1649 * @return true if test pass, false otherwise
1650 **/
1651bool TestBase::test()
1652{
1653	bool   result		   = true;
1654	GLuint test_case_index = 0;
1655
1656	/* Prepare test cases */
1657	testInit();
1658
1659	/* GL entry points */
1660	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1661
1662	/* Tesselation patch set up */
1663	gl.patchParameteri(GL_PATCH_VERTICES, 1);
1664	GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri");
1665
1666	while (true == prepareNextTestCase(test_case_index))
1667	{
1668		bool case_result = true;
1669
1670		/* Execute drawing case */
1671		if (false == testDrawArray(false))
1672		{
1673			case_result = false;
1674		}
1675
1676		if (true == m_is_shader_language_420pack)
1677		{
1678			if (false == testDrawArray(true))
1679			{
1680				case_result = false;
1681			}
1682		}
1683
1684		/* Execute compute shader case */
1685		if (true == m_is_compute_shader_supported)
1686		{
1687			if (false == testCompute())
1688			{
1689				case_result = false;
1690			}
1691		}
1692
1693		/* Log failure */
1694		if (false == case_result)
1695		{
1696			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Test case failed."
1697												<< tcu::TestLog::EndMessage;
1698
1699			result = false;
1700		}
1701
1702		/* Go to next test case */
1703		test_case_index += 1;
1704	}
1705
1706	/* Done */
1707	return result;
1708}
1709
1710int TestBase::maxImageUniforms(Utils::SHADER_STAGES stage) const
1711{
1712	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1713	GLint max_image_uniforms;
1714
1715	switch (stage)
1716	{
1717	case Utils::COMPUTE_SHADER:
1718		gl.getIntegerv(GL_MAX_COMPUTE_IMAGE_UNIFORMS, &max_image_uniforms);
1719		break;
1720	case Utils::FRAGMENT_SHADER:
1721		gl.getIntegerv(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, &max_image_uniforms);
1722		break;
1723	case Utils::GEOMETRY_SHADER:
1724		gl.getIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, &max_image_uniforms);
1725		break;
1726	case Utils::TESS_CTRL_SHADER:
1727		gl.getIntegerv(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, &max_image_uniforms);
1728		break;
1729	case Utils::TESS_EVAL_SHADER:
1730		gl.getIntegerv(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, &max_image_uniforms);
1731		break;
1732	case Utils::VERTEX_SHADER:
1733		gl.getIntegerv(GL_MAX_VERTEX_IMAGE_UNIFORMS, &max_image_uniforms);
1734		break;
1735	default:
1736		TCU_FAIL("Invalid enum");
1737	}
1738	return max_image_uniforms;
1739}
1740
1741/** Constructor
1742 *
1743 * @param context          Test context
1744 * @param test_name        Name of test
1745 * @param test_description Description of test
1746 **/
1747APITestBase::APITestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description)
1748	: TestBase(context, test_name, test_description)
1749{
1750	/* Nothing to be done here */
1751}
1752
1753/** Execute test with compute shader
1754 *
1755 * @return true if test pass, false otherwise
1756 **/
1757bool APITestBase::testCompute()
1758{
1759	/* GL objects */
1760	Utils::program program(m_context);
1761
1762	/* Shaders */
1763	Utils::shaderSource compute_shader;
1764	initShaderSource(Utils::COMPUTE_SHADER, false, compute_shader);
1765
1766	/* Check if test support compute shaders */
1767	if (true == compute_shader.m_parts[0].m_code.empty())
1768	{
1769		return true;
1770	}
1771
1772	/* Build program */
1773	try
1774	{
1775		program.build(compute_shader, 0 /* fragment shader */, 0 /* geometry shader */,
1776					  0 /* tesselation control shader */, 0 /* tesselation evaluation shader */, 0 /* vertex shader */,
1777					  0 /* varying names */, 0 /* n varying names */, false);
1778	}
1779	catch (Utils::shaderCompilationException& exc)
1780	{
1781		/* Something wrong with compilation, test case failed */
1782		tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
1783
1784		message << "Shader compilation failed. Error message: " << exc.m_error_message;
1785
1786		Utils::program::printShaderSource(exc.m_shader_source, message);
1787
1788		message << tcu::TestLog::EndMessage;
1789
1790		return false;
1791	}
1792	catch (Utils::programLinkageException& exc)
1793	{
1794		/* Something wrong with linking, test case failed */
1795		m_context.getTestContext().getLog() << tcu::TestLog::Message
1796											<< "Program linking failed. Error message: " << exc.m_error_message
1797											<< tcu::TestLog::EndMessage;
1798		return false;
1799	}
1800
1801	/* Set current program */
1802	program.use();
1803
1804	/* Return result of verification */
1805	return checkResults(program);
1806}
1807
1808/** Execute test with VS, TCS, TES, GS and FS
1809 *
1810 * @param use_version_400 Select if 400 or 420 should be used
1811 *
1812 * @return true if test pass, false otherwise
1813 **/
1814bool APITestBase::testDrawArray(bool use_version_400)
1815{
1816	/* GL objects */
1817	Utils::program program(m_context);
1818
1819	/* Shaders */
1820	Utils::shaderSource fragment_data;
1821	Utils::shaderSource geometry_data;
1822	Utils::shaderSource tess_ctrl_data;
1823	Utils::shaderSource tess_eval_data;
1824	Utils::shaderSource vertex_data;
1825
1826	initShaderSource(Utils::FRAGMENT_SHADER, use_version_400, fragment_data);
1827	initShaderSource(Utils::GEOMETRY_SHADER, use_version_400, geometry_data);
1828	initShaderSource(Utils::TESS_CTRL_SHADER, use_version_400, tess_ctrl_data);
1829	initShaderSource(Utils::TESS_EVAL_SHADER, use_version_400, tess_eval_data);
1830	initShaderSource(Utils::VERTEX_SHADER, use_version_400, vertex_data);
1831
1832	/* Build program */
1833	try
1834	{
1835		program.build(0 /* compute shader */, fragment_data, geometry_data, tess_ctrl_data, tess_eval_data, vertex_data,
1836					  0 /* varying names */, 0 /* n varying names */, false);
1837	}
1838	catch (Utils::shaderCompilationException& exc)
1839	{
1840		/* Something wrong with compilation, test case failed */
1841		tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
1842
1843		message << "Shader compilation failed. Error message: " << exc.m_error_message;
1844
1845		Utils::program::printShaderSource(exc.m_shader_source, message);
1846
1847		message << tcu::TestLog::EndMessage;
1848
1849		return false;
1850	}
1851	catch (Utils::programLinkageException& exc)
1852	{
1853		/* Something wrong with linking, test case failed */
1854		m_context.getTestContext().getLog() << tcu::TestLog::Message
1855											<< "Program linking failed. Error message: " << exc.m_error_message
1856											<< tcu::TestLog::EndMessage;
1857		return false;
1858	}
1859
1860	/* Set current program */
1861	program.use();
1862
1863	/* Return result of verification */
1864	return checkResults(program);
1865}
1866
1867/* Constants used by GLSLTestBase */
1868const glw::GLenum GLSLTestBase::m_color_texture_internal_format = GL_RGBA8;
1869const glw::GLenum GLSLTestBase::m_color_texture_format			= GL_RGBA;
1870const glw::GLenum GLSLTestBase::m_color_texture_type			= GL_UNSIGNED_BYTE;
1871const glw::GLuint GLSLTestBase::m_color_texture_width			= 16;
1872const glw::GLuint GLSLTestBase::m_color_texture_height			= 16;
1873
1874/** Constructor
1875 *
1876 * @param context          Test context
1877 * @param test_name        Test name
1878 * @param test_description Test description
1879 **/
1880GLSLTestBase::GLSLTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description)
1881	: TestBase(context, test_name, test_description)
1882{
1883	/* Nothing to be done here */
1884}
1885
1886/** Basic implementation of prepareSourceTexture method.
1887 *
1888 * @param ignored Texture instance
1889 *
1890 * @return 0
1891 **/
1892const GLchar* GLSLTestBase::prepareSourceTexture(Utils::texture&)
1893{
1894	return 0;
1895}
1896
1897/** Basic implementation of prepareVertexBuffer method.
1898 *
1899 * @param ignored Program instance
1900 * @param ignored Buffer instance
1901 * @param vao     VertexArray instance
1902 *
1903 * @return 0
1904 **/
1905void GLSLTestBase::prepareVertexBuffer(const Utils::program&, Utils::buffer&, Utils::vertexArray& vao)
1906{
1907	vao.generate();
1908	vao.bind();
1909}
1910
1911/** Basic implementation of verifyAdditionalResults
1912 *
1913 * @return true
1914 **/
1915bool GLSLTestBase::verifyAdditionalResults() const
1916{
1917	return true;
1918}
1919
1920/** Basic implementation of releaseResource method
1921 *
1922 * @param ignored
1923 **/
1924void GLSLTestBase::releaseResource()
1925{
1926	/* Nothing to be done */
1927}
1928
1929/** Bind texture to first image unit and set image uniform to that unit
1930 *
1931 * @param program      Program object
1932 * @param texture      Texture object
1933 * @param uniform_name Name of image uniform
1934 **/
1935void GLSLTestBase::bindTextureToimage(Utils::program& program, Utils::texture& texture,
1936									  const glw::GLchar* uniform_name) const
1937{
1938	/* GL entry points */
1939	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1940
1941	gl.bindImageTexture(0 /* unit */, texture.m_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */, GL_WRITE_ONLY,
1942						GL_RGBA8);
1943	GLU_EXPECT_NO_ERROR(gl.getError(), "BindImageTexture");
1944
1945	GLint location = program.getUniformLocation(uniform_name);
1946	gl.uniform1i(location, 0);
1947	GLU_EXPECT_NO_ERROR(gl.getError(), "Uniform1i");
1948}
1949
1950/** Bind texture to first texture unit and set sampler uniform to that unit
1951 *
1952 * @param program      Program object
1953 * @param texture      Texture object
1954 * @param uniform_name Name of sampler uniform
1955 **/
1956void GLSLTestBase::bindTextureToSampler(Utils::program& program, Utils::texture& texture,
1957										const glw::GLchar* uniform_name) const
1958{
1959	/* GL entry points */
1960	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1961
1962	gl.activeTexture(GL_TEXTURE0);
1963	GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
1964
1965	texture.bind();
1966
1967	GLint location = program.getUniformLocation(uniform_name);
1968	gl.uniform1i(location, 0);
1969	GLU_EXPECT_NO_ERROR(gl.getError(), "Uniform1i");
1970}
1971
1972/** Check contents of texture. It is expected that it will be filled with green color
1973 *
1974 * @param color_texture Texture that will be verified
1975 *
1976 * @return true if texture is all green, false otherwise
1977 **/
1978bool GLSLTestBase::checkResults(Utils::texture& color_texture) const
1979{
1980	static const GLuint		 green_color	   = 0xff00ff00;
1981	const GLuint			 texture_data_size = m_color_texture_width * m_color_texture_height;
1982	std::vector<glw::GLuint> texture_data;
1983
1984	texture_data.resize(texture_data_size);
1985
1986	color_texture.get(m_color_texture_format, m_color_texture_type, &texture_data[0]);
1987
1988	for (GLuint i = 0; i < texture_data_size; ++i)
1989	{
1990		if (green_color != texture_data[i])
1991		{
1992			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Invalid texel: " << std::setbase(16)
1993												<< std::setfill('0') << std::setw(8) << texture_data[i]
1994												<< " at index: " << i << tcu::TestLog::EndMessage;
1995
1996			return false;
1997		}
1998	}
1999
2000	return verifyAdditionalResults();
2001}
2002
2003/** Prepare framebuffer with texture used as attachment
2004 *
2005 * @param framebuffer   Framebuffer
2006 * @param color_texture Textue used as color attachment 0
2007 **/
2008void GLSLTestBase::prepareFramebuffer(Utils::framebuffer& framebuffer, Utils::texture& color_texture) const
2009{
2010	framebuffer.generate();
2011
2012	color_texture.create(m_color_texture_width, m_color_texture_height, m_color_texture_internal_format);
2013
2014	framebuffer.attachTexture(GL_COLOR_ATTACHMENT0, color_texture.m_id, m_color_texture_width, m_color_texture_height);
2015
2016	framebuffer.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
2017	framebuffer.clear(GL_COLOR_BUFFER_BIT);
2018}
2019
2020/** Prepare texture and bind it to image uniform
2021 *
2022 * @param framebuffer   Framebuffer
2023 * @param color_texture Textue used as color attachment 0
2024 **/
2025void GLSLTestBase::prepareImage(Utils::program& program, Utils::texture& color_texture) const
2026{
2027	color_texture.create(m_color_texture_width, m_color_texture_height, m_color_texture_internal_format);
2028
2029	bindTextureToimage(program, color_texture, "uni_image");
2030}
2031
2032/** Execute test with compute shader
2033 *
2034 * @return true if test pass, false otherwise
2035 **/
2036bool GLSLTestBase::testCompute()
2037{
2038	/* Test Result */
2039	bool result = true;
2040
2041	/* GL objects */
2042	Utils::texture color_tex(m_context);
2043	Utils::program program(m_context);
2044	Utils::texture source_tex(m_context);
2045
2046	/* Shaders */
2047	Utils::shaderSource compute_shader;
2048	initShaderSource(Utils::COMPUTE_SHADER, false, compute_shader);
2049
2050	/* Check if test support compute shaders */
2051	if (true == compute_shader.m_parts[0].m_code.empty())
2052	{
2053		return true;
2054	}
2055
2056	/* Build program */
2057	try
2058	{
2059		program.build(compute_shader, 0 /* fragment shader */, 0 /* geometry shader */,
2060					  0 /* tesselation control shader */, 0 /* tesselation evaluation shader */, 0 /* vertex shader */,
2061					  0 /* varying names */, 0 /* n varying names */, false);
2062	}
2063	catch (Utils::shaderCompilationException& exc)
2064	{
2065		/* Something wrong with compilation, test case failed */
2066		tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
2067
2068		message << "Shader compilation failed. Error message: " << exc.m_error_message;
2069
2070		Utils::program::printShaderSource(exc.m_shader_source, message);
2071
2072		message << tcu::TestLog::EndMessage;
2073
2074		return false;
2075	}
2076	catch (Utils::programLinkageException& exc)
2077	{
2078		/* Something wrong with linking, test case failed */
2079		m_context.getTestContext().getLog() << tcu::TestLog::Message
2080											<< "Program linking failed. Error message: " << exc.m_error_message
2081											<< tcu::TestLog::EndMessage;
2082		return false;
2083	}
2084
2085/* Log shaders, for debugging */
2086#if IS_DEBUG
2087	{
2088		tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
2089
2090		Utils::program::printShaderSource(compute_shader, message);
2091
2092		message << tcu::TestLog::EndMessage;
2093	}
2094#endif /* IS_DEBUG */
2095
2096	/* Set current program */
2097	program.use();
2098
2099	/* Prepare image unit */
2100	prepareImage(program, color_tex);
2101
2102	/* Test specific preparation of source texture */
2103	const GLchar* sampler_name = prepareSourceTexture(source_tex);
2104	if (0 != sampler_name)
2105	{
2106		bindTextureToSampler(program, source_tex, sampler_name);
2107	}
2108
2109	/* Set up uniforms */
2110	prepareUniforms(program);
2111
2112	/* GL entry points */
2113	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
2114
2115	/* Draw */
2116	gl.dispatchCompute(m_color_texture_width, m_color_texture_height, 1);
2117	GLU_EXPECT_NO_ERROR(gl.getError(), "DispatchCompute");
2118
2119	/* Return result of verification */
2120	result = checkResults(color_tex);
2121
2122	/* Release extra resource for the test */
2123	releaseResource();
2124
2125	return result;
2126}
2127
2128/** Execute test with draw array operation
2129 *
2130 * @param use_version_400 Select if 400 or 420 should be used
2131 *
2132 * @return true if test pass, false otherwise
2133 **/
2134bool GLSLTestBase::testDrawArray(bool use_version_400)
2135{
2136	/* Test Result */
2137	bool result = true;
2138
2139	/* GL objects */
2140	Utils::texture	 color_tex(m_context);
2141	Utils::framebuffer framebuffer(m_context);
2142	Utils::program	 program(m_context);
2143	Utils::texture	 source_tex(m_context);
2144	Utils::vertexArray vao(m_context);
2145	Utils::buffer	  vertex_buffer(m_context);
2146
2147	/* Shaders */
2148	Utils::shaderSource fragment_data;
2149	Utils::shaderSource geometry_data;
2150	Utils::shaderSource tess_ctrl_data;
2151	Utils::shaderSource tess_eval_data;
2152	Utils::shaderSource vertex_data;
2153
2154	initShaderSource(Utils::FRAGMENT_SHADER, use_version_400, fragment_data);
2155	initShaderSource(Utils::GEOMETRY_SHADER, use_version_400, geometry_data);
2156	initShaderSource(Utils::TESS_CTRL_SHADER, use_version_400, tess_ctrl_data);
2157	initShaderSource(Utils::TESS_EVAL_SHADER, use_version_400, tess_eval_data);
2158	initShaderSource(Utils::VERTEX_SHADER, use_version_400, vertex_data);
2159
2160	/* Build program */
2161	try
2162	{
2163		program.build(0 /* compute shader */, fragment_data, geometry_data, tess_ctrl_data, tess_eval_data, vertex_data,
2164					  0 /* varying names */, 0 /* n varying names */, false);
2165	}
2166	catch (Utils::shaderCompilationException& exc)
2167	{
2168		/* Something wrong with compilation, test case failed */
2169		tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
2170
2171		message << "Shader compilation failed. Error message: " << exc.m_error_message;
2172
2173		Utils::program::printShaderSource(exc.m_shader_source, message);
2174
2175		message << tcu::TestLog::EndMessage;
2176
2177		return false;
2178	}
2179	catch (Utils::programLinkageException& exc)
2180	{
2181		/* Something wrong with linking, test case failed */
2182		m_context.getTestContext().getLog() << tcu::TestLog::Message
2183											<< "Program linking failed. Error message: " << exc.m_error_message
2184											<< tcu::TestLog::EndMessage;
2185		return false;
2186	}
2187
2188/* Log shaders, for debugging */
2189#if IS_DEBUG
2190	{
2191		const Utils::shaderSource* data[] = { &vertex_data, &tess_ctrl_data, &tess_eval_data, &geometry_data,
2192											  &fragment_data };
2193
2194		tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
2195
2196		for (GLuint i = 0; i < 5; ++i)
2197		{
2198			Utils::program::printShaderSource(*data[i], message);
2199		}
2200
2201		message << tcu::TestLog::EndMessage;
2202	}
2203#endif /* IS_DEBUG */
2204
2205	/* Test specific preparation of vertex buffer and vao*/
2206	prepareVertexBuffer(program, vertex_buffer, vao);
2207
2208	/* Set current program */
2209	program.use();
2210
2211	/* Prepare framebuffer */
2212	prepareFramebuffer(framebuffer, color_tex);
2213
2214	/* Test specific preparation of source texture */
2215	const GLchar* sampler_name = prepareSourceTexture(source_tex);
2216	if (0 != sampler_name)
2217	{
2218		bindTextureToSampler(program, source_tex, sampler_name);
2219	}
2220
2221	/* Set up uniforms */
2222	prepareUniforms(program);
2223
2224	/* GL entry points */
2225	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
2226
2227	/* Draw */
2228	gl.drawArrays(GL_PATCHES, 0 /* first */, 1 /* count */);
2229	GLU_EXPECT_NO_ERROR(gl.getError(), "DrawArrays");
2230
2231	/* Return result of verification */
2232	result = checkResults(color_tex);
2233
2234	/* Release extra resource for the test */
2235	releaseResource();
2236
2237	return result;
2238}
2239
2240/** Constructor
2241 *
2242 * @param context          Test context
2243 * @param test_name        Test name
2244 * @param test_description Test description
2245 **/
2246NegativeTestBase::NegativeTestBase(deqp::Context& context, const glw::GLchar* test_name,
2247								   const glw::GLchar* test_description)
2248	: TestBase(context, test_name, test_description)
2249{
2250	/* Nothing to be done here */
2251}
2252
2253/** Execute test with compute shader
2254 *
2255 * @return true if test pass, false otherwise
2256 **/
2257bool NegativeTestBase::testCompute()
2258{
2259	/* GL objects */
2260	Utils::program program(m_context);
2261
2262	/* Shaders */
2263	Utils::shaderSource conmpute_data;
2264	initShaderSource(Utils::COMPUTE_SHADER, false, conmpute_data);
2265
2266	/* Build program */
2267	try
2268	{
2269		program.build(conmpute_data /* compute shader */, 0 /* fragment shader */, 0 /* geometry shader */,
2270					  0 /* tesselation control shader */, 0 /* tesselation evaluation shader */, 0 /* vertex shader */,
2271					  0 /* varying names */, 0 /* n varying names */, false);
2272	}
2273	catch (Utils::shaderCompilationException& exc)
2274	{
2275		/* Compilation failed, as expected. Verify that reason of failure is as expected */
2276		m_context.getTestContext().getLog() << tcu::TestLog::Message
2277											<< "Shader compilation error message: " << exc.m_error_message
2278											<< tcu::TestLog::EndMessage;
2279		return true;
2280	}
2281	catch (Utils::programLinkageException& exc)
2282	{
2283		/* Something wrong with linking, test case failed */
2284		m_context.getTestContext().getLog() << tcu::TestLog::Message
2285											<< "Program linking failed. Error message: " << exc.m_error_message
2286											<< tcu::TestLog::EndMessage;
2287		return true;
2288	}
2289
2290	/* Build process succeded */
2291	return false;
2292}
2293
2294/** Execute test with draw array operation
2295 *
2296 * @param use_version_400 Select if 400 or 420 should be used
2297 *
2298 * @return true if test pass, false otherwise
2299 **/
2300bool NegativeTestBase::testDrawArray(bool use_version_400)
2301{
2302	/* GL objects */
2303	Utils::program program(m_context);
2304
2305	/* Shaders */
2306	Utils::shaderSource fragment_data;
2307	Utils::shaderSource geometry_data;
2308	Utils::shaderSource tess_ctrl_data;
2309	Utils::shaderSource tess_eval_data;
2310	Utils::shaderSource vertex_data;
2311
2312	initShaderSource(Utils::FRAGMENT_SHADER, use_version_400, fragment_data);
2313	initShaderSource(Utils::GEOMETRY_SHADER, use_version_400, geometry_data);
2314	initShaderSource(Utils::TESS_CTRL_SHADER, use_version_400, tess_ctrl_data);
2315	initShaderSource(Utils::TESS_EVAL_SHADER, use_version_400, tess_eval_data);
2316	initShaderSource(Utils::VERTEX_SHADER, use_version_400, vertex_data);
2317
2318	/* Build program */
2319	try
2320	{
2321		program.build(0 /* compute shader */, fragment_data, geometry_data, tess_ctrl_data, tess_eval_data, vertex_data,
2322					  0 /* varying names */, 0 /* n varying names */, false);
2323	}
2324	catch (Utils::shaderCompilationException& exc)
2325	{
2326		/* Compilation failed, as expected. Verify that reason of failure is as expected */
2327		m_context.getTestContext().getLog() << tcu::TestLog::Message
2328											<< "Shader compilation error message: " << exc.m_error_message
2329											<< tcu::TestLog::EndMessage;
2330		return true;
2331	}
2332	catch (Utils::programLinkageException& exc)
2333	{
2334		/* Something wrong with linking, test case failed */
2335		m_context.getTestContext().getLog() << tcu::TestLog::Message
2336											<< "Program linking failed. Error message: " << exc.m_error_message
2337											<< tcu::TestLog::EndMessage;
2338		return true;
2339	}
2340
2341	/* Build process succeded */
2342	return false;
2343}
2344
2345/* Constants used by BindingImageTest */
2346const GLuint BindingImageTest::m_width		 = 16;
2347const GLuint BindingImageTest::m_green_color = 0xff00ff00;
2348const GLuint BindingImageTest::m_height		 = 16;
2349const GLuint BindingImageTest::m_depth		 = 6;
2350
2351/** Constructor
2352 *
2353 * @param context Test context
2354 **/
2355BindingImageTest::BindingImageTest(deqp::Context& context, const glw::GLchar* test_name,
2356								   const glw::GLchar* test_description)
2357	: GLSLTestBase(context, test_name, test_description)
2358{
2359	/* Nothing to be done */
2360}
2361
2362/** Prepare buffer, filled with given color
2363 *
2364 * @param buffer Buffer object
2365 * @param color  Color
2366 **/
2367void BindingImageTest::prepareBuffer(Utils::buffer& buffer, GLuint color)
2368{
2369	std::vector<GLuint> texture_data;
2370	texture_data.resize(m_width);
2371
2372	buffer.generate(GL_TEXTURE_BUFFER);
2373
2374	for (GLuint i = 0; i < texture_data.size(); ++i)
2375	{
2376		texture_data[i] = color;
2377	}
2378
2379	buffer.update(m_width * sizeof(GLuint), &texture_data[0], GL_STATIC_DRAW);
2380}
2381
2382/** Prepare texture of given type filled with given color and bind to specified image unit
2383 *
2384 * @param texture      Texture
2385 * @param buffer       Buffer
2386 * @param texture_type Type of texture
2387 * @param color        Color
2388 **/
2389void BindingImageTest::prepareTexture(Utils::texture& texture, const Utils::buffer& buffer,
2390									  Utils::TEXTURE_TYPES texture_type, GLuint color, GLuint unit)
2391{
2392	std::vector<GLuint> texture_data;
2393	texture_data.resize(m_width * m_height * m_depth);
2394
2395	GLboolean is_layered = GL_FALSE;
2396
2397	for (GLuint i = 0; i < texture_data.size(); ++i)
2398	{
2399		texture_data[i] = color;
2400	}
2401
2402	if (Utils::TEX_BUFFER != texture_type)
2403	{
2404		texture.create(m_width, m_height, m_depth, GL_RGBA8, texture_type);
2405
2406		texture.update(m_width, m_height, m_depth, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
2407	}
2408	else
2409	{
2410		buffer.bind();
2411
2412		texture.createBuffer(GL_RGBA8, buffer.m_id);
2413	}
2414
2415	switch (texture_type)
2416	{
2417	case Utils::TEX_1D_ARRAY:
2418	case Utils::TEX_2D_ARRAY:
2419	case Utils::TEX_3D:
2420	case Utils::TEX_CUBE:
2421		is_layered = GL_TRUE;
2422		break;
2423	default:
2424		break;
2425	}
2426
2427	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
2428
2429	gl.bindImageTexture(unit, texture.m_id, 0 /* level */, is_layered /* layered */, 0 /* layer */, GL_READ_WRITE,
2430						GL_RGBA8);
2431	GLU_EXPECT_NO_ERROR(gl.getError(), "BindImageTexture");
2432}
2433
2434/** Verifies that texel at offset 0 is green
2435 *
2436 * @param buffer Buffer object
2437 *
2438 * @return true if texel at offset 0 is green, false otherwise
2439 **/
2440bool BindingImageTest::verifyBuffer(const Utils::buffer& buffer) const
2441{
2442	GLuint* data = (GLuint*)buffer.map(GL_READ_ONLY);
2443
2444	GLuint color = data[0];
2445
2446	buffer.unmap();
2447
2448	return (m_green_color == color);
2449}
2450
2451/** Verifies that texel at offset 0 is green
2452 *
2453 * @param buffer Buffer object
2454 *
2455 * @return true if texel at offset 0 is green, false otherwise
2456 **/
2457bool BindingImageTest::verifyTexture(const Utils::texture& texture) const
2458{
2459	static const GLuint texture_data_size = m_width * m_height * m_depth;
2460
2461	std::vector<glw::GLuint> texture_data;
2462	texture_data.resize(texture_data_size);
2463
2464	texture.get(GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
2465
2466	GLuint color = texture_data[0];
2467
2468	return (m_green_color == color);
2469}
2470
2471/* Constants used by LineContinuationTest */
2472const GLuint  LineContinuationTest::m_n_repetitions			   = 20;
2473const GLchar* LineContinuationTest::m_texture_coordinates_name = "texture_coordinates";
2474
2475/** Constructor
2476 *
2477 * @param context Test context
2478 **/
2479LineContinuationTest::LineContinuationTest(deqp::Context& context) : GLSLTestBase(context, "line_continuation", "desc")
2480{
2481	/* Nothing to be done here */
2482}
2483
2484/** Overwrite getShaderSourceConfig method
2485 *
2486 * @param out_n_parts     Number of source parts used by this test case
2487 * @param out_use_lengths If source lengths shall be provided to compiler
2488 **/
2489void LineContinuationTest::getShaderSourceConfig(GLuint& out_n_parts, bool& out_use_lengths)
2490{
2491	out_n_parts		= (true == isShaderMultipart()) ? 2 : 1;
2492	out_use_lengths = useSourceLengths();
2493}
2494
2495/** Set up next test case
2496 *
2497 * @param test_case_index Index of next test case
2498 *
2499 * @return false if there is no more test cases, true otherwise
2500 **/
2501bool LineContinuationTest::prepareNextTestCase(glw::GLuint test_case_index)
2502{
2503	static const testCase test_cases[] = { { ASSIGNMENT_BEFORE_OPERATOR, ONCE, UNIX },
2504										   { ASSIGNMENT_BEFORE_OPERATOR, ONCE, DOS },
2505										   { ASSIGNMENT_BEFORE_OPERATOR, MULTIPLE_TIMES, UNIX },
2506										   { ASSIGNMENT_BEFORE_OPERATOR, MULTIPLE_TIMES, DOS },
2507										   { ASSIGNMENT_AFTER_OPERATOR, ONCE, UNIX },
2508										   { ASSIGNMENT_AFTER_OPERATOR, ONCE, DOS },
2509										   { ASSIGNMENT_AFTER_OPERATOR, MULTIPLE_TIMES, UNIX },
2510										   { ASSIGNMENT_AFTER_OPERATOR, MULTIPLE_TIMES, DOS },
2511										   { VECTOR_VARIABLE_INITIALIZER, ONCE, UNIX },
2512										   { VECTOR_VARIABLE_INITIALIZER, ONCE, DOS },
2513										   { VECTOR_VARIABLE_INITIALIZER, MULTIPLE_TIMES, UNIX },
2514										   { VECTOR_VARIABLE_INITIALIZER, MULTIPLE_TIMES, DOS },
2515										   { TOKEN_INSIDE_FUNCTION_NAME, ONCE, UNIX },
2516										   { TOKEN_INSIDE_FUNCTION_NAME, ONCE, DOS },
2517										   { TOKEN_INSIDE_FUNCTION_NAME, MULTIPLE_TIMES, UNIX },
2518										   { TOKEN_INSIDE_FUNCTION_NAME, MULTIPLE_TIMES, DOS },
2519										   { TOKEN_INSIDE_TYPE_NAME, ONCE, UNIX },
2520										   { TOKEN_INSIDE_TYPE_NAME, ONCE, DOS },
2521										   { TOKEN_INSIDE_TYPE_NAME, MULTIPLE_TIMES, UNIX },
2522										   { TOKEN_INSIDE_TYPE_NAME, MULTIPLE_TIMES, DOS },
2523										   { TOKEN_INSIDE_VARIABLE_NAME, ONCE, UNIX },
2524										   { TOKEN_INSIDE_VARIABLE_NAME, ONCE, DOS },
2525										   { TOKEN_INSIDE_VARIABLE_NAME, MULTIPLE_TIMES, UNIX },
2526										   { TOKEN_INSIDE_VARIABLE_NAME, MULTIPLE_TIMES, DOS },
2527										   { PREPROCESSOR_TOKEN_INSIDE, ONCE, UNIX },
2528										   { PREPROCESSOR_TOKEN_INSIDE, ONCE, DOS },
2529										   { PREPROCESSOR_TOKEN_INSIDE, MULTIPLE_TIMES, UNIX },
2530										   { PREPROCESSOR_TOKEN_INSIDE, MULTIPLE_TIMES, DOS },
2531										   { PREPROCESSOR_TOKEN_BETWEEN, ONCE, UNIX },
2532										   { PREPROCESSOR_TOKEN_BETWEEN, ONCE, DOS },
2533										   { PREPROCESSOR_TOKEN_BETWEEN, MULTIPLE_TIMES, UNIX },
2534										   { PREPROCESSOR_TOKEN_BETWEEN, MULTIPLE_TIMES, DOS },
2535										   { COMMENT, ONCE, UNIX },
2536										   { COMMENT, ONCE, DOS },
2537										   { COMMENT, MULTIPLE_TIMES, UNIX },
2538										   { COMMENT, MULTIPLE_TIMES, DOS },
2539										   { SOURCE_TERMINATION_NULL, ONCE, UNIX },
2540										   { SOURCE_TERMINATION_NULL, ONCE, DOS },
2541										   { SOURCE_TERMINATION_NULL, MULTIPLE_TIMES, UNIX },
2542										   { SOURCE_TERMINATION_NULL, MULTIPLE_TIMES, DOS },
2543										   { SOURCE_TERMINATION_NON_NULL, ONCE, UNIX },
2544										   { SOURCE_TERMINATION_NON_NULL, ONCE, DOS },
2545										   { SOURCE_TERMINATION_NON_NULL, MULTIPLE_TIMES, UNIX },
2546										   { SOURCE_TERMINATION_NON_NULL, MULTIPLE_TIMES, DOS },
2547										   { PART_TERMINATION_NULL, ONCE, UNIX },
2548										   { PART_TERMINATION_NULL, ONCE, DOS },
2549										   { PART_TERMINATION_NULL, MULTIPLE_TIMES, UNIX },
2550										   { PART_TERMINATION_NULL, MULTIPLE_TIMES, DOS },
2551										   { PART_NEXT_TO_TERMINATION_NULL, ONCE, UNIX },
2552										   { PART_NEXT_TO_TERMINATION_NULL, ONCE, DOS },
2553										   { PART_NEXT_TO_TERMINATION_NULL, MULTIPLE_TIMES, UNIX },
2554										   { PART_NEXT_TO_TERMINATION_NULL, MULTIPLE_TIMES, DOS },
2555										   { PART_TERMINATION_NON_NULL, ONCE, UNIX },
2556										   { PART_TERMINATION_NON_NULL, ONCE, DOS },
2557										   { PART_TERMINATION_NON_NULL, MULTIPLE_TIMES, UNIX },
2558										   { PART_TERMINATION_NON_NULL, MULTIPLE_TIMES, DOS },
2559										   { PART_NEXT_TO_TERMINATION_NON_NULL, ONCE, UNIX },
2560										   { PART_NEXT_TO_TERMINATION_NON_NULL, ONCE, DOS },
2561										   { PART_NEXT_TO_TERMINATION_NON_NULL, MULTIPLE_TIMES, UNIX },
2562										   { PART_NEXT_TO_TERMINATION_NON_NULL, MULTIPLE_TIMES, DOS } };
2563
2564	static const GLuint max_test_cases = sizeof(test_cases) / sizeof(testCase);
2565
2566	if ((GLuint)-1 == test_case_index)
2567	{
2568		m_test_case.m_case = DEBUG_CASE;
2569	}
2570	else if (max_test_cases <= test_case_index)
2571	{
2572		return false;
2573	}
2574	else
2575	{
2576		m_test_case = test_cases[test_case_index];
2577	}
2578
2579	m_context.getTestContext().getLog() << tcu::TestLog::Message
2580										<< "Test case: " << repetitionsToStr((REPETITIONS)m_test_case.m_repetitions)
2581										<< " line continuation, with "
2582										<< lineEndingsToStr((LINE_ENDINGS)m_test_case.m_line_endings)
2583										<< " line endings, is placed " << casesToStr((CASES)m_test_case.m_case)
2584										<< tcu::TestLog::EndMessage;
2585
2586	return true;
2587}
2588
2589/** Prepare source for given shader stage
2590 *
2591 * @param in_stage           Shader stage, compute shader will use 430
2592 * @param in_use_version_400 Select if 400 or 420 should be used
2593 * @param out_source         Prepared shader source instance
2594 **/
2595void LineContinuationTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2596											   Utils::shaderSource& out_source)
2597{
2598	if (Utils::COMPUTE_SHADER == in_stage)
2599	{
2600		prepareComputShaderSource(out_source);
2601	}
2602	else
2603	{
2604		prepareShaderSourceForDraw(in_stage, in_use_version_400, out_source);
2605	}
2606}
2607
2608/** Prepare compute shader source
2609 *
2610 * @param source Result shader source
2611 **/
2612void LineContinuationTest::prepareComputShaderSource(Utils::shaderSource& source)
2613{
2614	static const GLchar* shader_template_part_0 =
2615		"#version 430\n"
2616		"\n"
2617		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
2618		"\n"
2619		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
2620		"\n"
2621		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
2622		"\n"
2623		"writeonly uniform image2D   uni_image;\n"
2624		"          uniform sampler2D uni_sampler;\n"
2625		"\n"
2626		"void funFUNCTION_CASEction(in veTYPE_CASEc4 in_vVARIABLE_CASEalue)\n"
2627		"{\n"
2628		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), inVARIABLE_CASE_value);\n"
2629		"}\n"
2630		"\n"
2631		"#define SET_PREPROCESSOR_INSIDE_CASERESULT(XX) "
2632		"PREPROCESSOR_BETWEEN_CASEfuncFUNCTION_CASEtion(XPREPROCESSOR_INSIDE_CASEX)\n"
2633		"NEXT_TO_TERMINATION_CASE\nTERMINATION_CASE";
2634
2635	static const GLchar* shader_template_part_1 =
2636		"void main()\n"
2637		"{\n"
2638		"    ivec2 coordinates   ASSIGNMENT_BEFORE_OPERATOR_CASE=ASSIGNMENT_AFTER_OPERATOR_CASE "
2639		"ivec2(gl_GlobalInvocationID.xy + ivec2(16, 16));\n"
2640		"    vec4 sampled_color = texelFetch(uni_sampler, coordinates, 0 /* lod */);\n"
2641		"    vec4 result        = vec4(0, 0VECTOR_VARIABLE_INITIALIZER_CASE, 0, 1);\n"
2642		"\n"
2643		"    if (vec4(0, 0, 1, 1) == sampled_color)\n"
2644		"    {\n"
2645		"        result = vecTYPE_CASE4(VECTOR_VARIABLE_INITIALIZER_CASE0, 1, 0, 1);\n"
2646		"    }\n"
2647		"    else\n"
2648		"    {\n"
2649		"        result = vec4(coordinates.xy, sampled_color.rg);\n"
2650		"    }\n"
2651		"\n"
2652		"    SET_RESULT(result);"
2653		"}\n";
2654
2655	/* Init strings with templates and replace all CASE tokens */
2656	if (true == isShaderMultipart())
2657	{
2658		source.m_parts[0].m_code = shader_template_part_0;
2659		source.m_parts[1].m_code = shader_template_part_1;
2660
2661		replaceAllCaseTokens(source.m_parts[0].m_code);
2662		replaceAllCaseTokens(source.m_parts[1].m_code);
2663	}
2664	else
2665	{
2666		source.m_parts[0].m_code = shader_template_part_0;
2667		source.m_parts[0].m_code.append(shader_template_part_1);
2668
2669		replaceAllCaseTokens(source.m_parts[0].m_code);
2670	}
2671}
2672
2673/** Prepare source for given shader stage
2674 *
2675 * @param stage           Shader stage, compute shader will use 430
2676 * @param use_version_400 Select if 400 or 420 should be used
2677 * @param source          Result shader sources
2678 **/
2679void LineContinuationTest::prepareShaderSourceForDraw(Utils::SHADER_STAGES stage, bool use_version_400,
2680													  Utils::shaderSource& source)
2681{
2682	/* Templates */
2683	static const GLchar* shader_template_part_0 =
2684		"VERSION\n"
2685		"\n"
2686		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
2687		"\n"
2688		"STAGE_SPECIFIC\n"
2689		"\n"
2690		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
2691		"\n"
2692		"IN_COLOR_DEFINITION\n"
2693		"IN_TEXTURE_COORDINATES_DEFINITION\n"
2694		"OUT_COLOR_DEFINITION\n"
2695		"OUT_TEXTURE_COORDINATES_DEFINITION\n"
2696		"uniform sampler2D uni_sampler;\n"
2697		"\n"
2698		"void funFUNCTION_CASEction(in veTYPE_CASEc4 in_vVARIABLE_CASEalue)\n"
2699		"{\n"
2700		"    OUT_COLOR ASSIGNMENT_BEFORE_OPERATOR_CASE=ASSIGNMENT_AFTER_OPERATOR_CASE inVARIABLE_CASE_value;\n"
2701		"}\n"
2702		"\n"
2703		"#define SET_PREPROCESSOR_INSIDE_CASERESULT(XX) "
2704		"PREPROCESSOR_BETWEEN_CASEfuncFUNCTION_CASEtion(XPREPROCESSOR_INSIDE_CASEX)\n"
2705		"NEXT_TO_TERMINATION_CASE\nTERMINATION_CASE";
2706
2707	static const GLchar* shader_template_part_1 =
2708		"void main()\n"
2709		"{\n"
2710		"    vec2 coordinates   = TEXTURE_COORDINATES;\n"
2711		"    vec4 sampled_color = texture(uni_sampler, coordinates);\n"
2712		"    vec4 result        = vec4(0, 0VECTOR_VARIABLE_INITIALIZER_CASE, 0, 1);\n"
2713		"\n"
2714		"    if (PASS_CONDITION)\n"
2715		"    {\n"
2716		"        result = vecTYPE_CASE4(VECTOR_VARIABLE_INITIALIZER_CASE0, 1, 0, 1);\n"
2717		"    }\n"
2718		"    else\n"
2719		"    {\n"
2720		"        result = vec4(coordinates.xy, sampled_color.rg);\n"
2721		"    }\n"
2722		"\n"
2723		"STORE_RESULTS"
2724		"}\n"
2725		"NEXT_TO_TERMINATION_CASE\nTERMINATION_CASE";
2726
2727	static const GLchar* store_results_template = "    SET_RESULT(result);\n"
2728												  "    TEXTURE_COORDINATES = coordinates;\n";
2729
2730	static const GLchar* store_results_tcs_template = "    SET_RESULT(result);\n"
2731													  "    TEXTURE_COORDINATES = coordinates;\n"
2732													  "    gl_TessLevelOuter[0] = 1.0;\n"
2733													  "    gl_TessLevelOuter[1] = 1.0;\n"
2734													  "    gl_TessLevelOuter[2] = 1.0;\n"
2735													  "    gl_TessLevelOuter[3] = 1.0;\n"
2736													  "    gl_TessLevelInner[0] = 1.0;\n"
2737													  "    gl_TessLevelInner[1] = 1.0;\n";
2738
2739	static const GLchar* store_results_fs_template = "    SET_RESULT(result);\n";
2740
2741	static const GLchar* store_results_gs_template = "    gl_Position = vec4(-1, -1, 0, 1);\n"
2742													 "    SET_RESULT(result);\n"
2743													 "    TEXTURE_COORDINATES = coordinates + vec2(-0.25, -0.25);\n"
2744													 "    EmitVertex();\n"
2745													 "    gl_Position = vec4(-1, 1, 0, 1);\n"
2746													 "    SET_RESULT(result);\n"
2747													 "    TEXTURE_COORDINATES = coordinates + vec2(-0.25, 0.25);\n"
2748													 "    EmitVertex();\n"
2749													 "    gl_Position = vec4(1, -1, 0, 1);\n"
2750													 "    SET_RESULT(result);\n"
2751													 "    TEXTURE_COORDINATES = coordinates + vec2(0.25, -0.25);\n"
2752													 "    EmitVertex();\n"
2753													 "    gl_Position = vec4(1, 1, 0, 1);\n"
2754													 "    SET_RESULT(result);\n"
2755													 "    TEXTURE_COORDINATES = coordinates + vec2(0.25, 0.25);\n"
2756													 "    EmitVertex();\n";
2757
2758	static const GLchar* pass_condition_template = "(EXPECTED_VALUE == sampled_color) &&\n"
2759												   "        (vec4(0, 1, 0, 1) == IN_COLOR) ";
2760
2761	static const GLchar* pass_condition_vs_template = "EXPECTED_VALUE == sampled_color";
2762
2763	/* Tokens to be replaced with GLSL stuff */
2764	static const GLchar* token_version		  = "VERSION";
2765	static const GLchar* token_stage_specific = "STAGE_SPECIFIC";
2766
2767	static const GLchar* token_in_color_definition		= "IN_COLOR_DEFINITION";
2768	static const GLchar* token_in_tex_coord_definition  = "IN_TEXTURE_COORDINATES_DEFINITION";
2769	static const GLchar* token_out_color_definition		= "OUT_COLOR_DEFINITION";
2770	static const GLchar* token_out_tex_coord_definition = "OUT_TEXTURE_COORDINATES_DEFINITION";
2771
2772	static const GLchar* token_expected_value	  = "EXPECTED_VALUE";
2773	static const GLchar* token_texture_coordinates = "TEXTURE_COORDINATES";
2774	static const GLchar* token_in_color			   = "IN_COLOR";
2775	static const GLchar* token_out_color		   = "OUT_COLOR";
2776
2777	static const GLchar* token_store_results  = "STORE_RESULTS";
2778	static const GLchar* token_pass_condition = "PASS_CONDITION";
2779
2780	/* Name of variable and empty string*/
2781	static const GLchar* color_name = "color";
2782	static const GLchar* empty		= "";
2783
2784	/* GLSL stuff */
2785	const GLchar* version				= getVersionString(stage, use_version_400);
2786	const GLchar* stage_specific_layout = getStageSpecificLayout(stage);
2787	const GLchar* expected_value		= getExpectedValueString();
2788
2789	/* Qualifiers */
2790	Utils::qualifierSet in;
2791	Utils::qualifierSet out;
2792	in.push_back(Utils::QUAL_IN);
2793	out.push_back(Utils::QUAL_OUT);
2794
2795	/* In/Out variables definitions and references */
2796	std::string in_tex_coord_reference;
2797	std::string out_tex_coord_reference;
2798	std::string in_color_reference;
2799	std::string out_color_reference;
2800	std::string in_tex_coord_definition;
2801	std::string out_tex_coord_definition;
2802	std::string in_color_definition;
2803	std::string out_color_definition;
2804
2805	Utils::prepareVariableStrings(stage, Utils::INPUT, in, "vec2", m_texture_coordinates_name, in_tex_coord_definition,
2806								  in_tex_coord_reference);
2807	Utils::prepareVariableStrings(stage, Utils::OUTPUT, out, "vec2", m_texture_coordinates_name,
2808								  out_tex_coord_definition, out_tex_coord_reference);
2809	Utils::prepareVariableStrings(stage, Utils::INPUT, in, "vec4", color_name, in_color_definition, in_color_reference);
2810	Utils::prepareVariableStrings(stage, Utils::OUTPUT, out, "vec4", color_name, out_color_definition,
2811								  out_color_reference);
2812
2813	in_tex_coord_definition.append(";");
2814	out_tex_coord_definition.append(";");
2815	in_color_definition.append(";");
2816	out_color_definition.append(";");
2817
2818	/* Select pass condition and store results tempaltes */
2819	const GLchar* store_results  = store_results_template;
2820	const GLchar* pass_condition = pass_condition_template;
2821
2822	switch (stage)
2823	{
2824	case Utils::FRAGMENT_SHADER:
2825		store_results = store_results_fs_template;
2826		break;
2827	case Utils::GEOMETRY_SHADER:
2828		store_results = store_results_gs_template;
2829		break;
2830	case Utils::TESS_CTRL_SHADER:
2831		store_results = store_results_tcs_template;
2832		break;
2833	case Utils::VERTEX_SHADER:
2834		pass_condition = pass_condition_vs_template;
2835		break;
2836	default:
2837		break;
2838	}
2839	const GLuint store_results_length  = static_cast<GLuint>(strlen(store_results));
2840	const GLuint pass_condition_length = static_cast<GLuint>(strlen(pass_condition));
2841
2842	/* Init strings with templates and replace all CASE tokens */
2843	if (true == isShaderMultipart())
2844	{
2845		source.m_parts[0].m_code = shader_template_part_0;
2846		source.m_parts[1].m_code = shader_template_part_1;
2847
2848		replaceAllCaseTokens(source.m_parts[0].m_code);
2849		replaceAllCaseTokens(source.m_parts[1].m_code);
2850	}
2851	else
2852	{
2853		source.m_parts[0].m_code = shader_template_part_0;
2854		source.m_parts[0].m_code.append(shader_template_part_1);
2855
2856		replaceAllCaseTokens(source.m_parts[0].m_code);
2857	}
2858
2859	/* Get memory for shader source parts */
2860	const bool   is_multipart		  = isShaderMultipart();
2861	size_t		 position			  = 0;
2862	std::string& shader_source_part_0 = source.m_parts[0].m_code;
2863	std::string& shader_source_part_1 = (true == is_multipart) ? source.m_parts[1].m_code : source.m_parts[0].m_code;
2864
2865	/* Replace tokens */
2866	/* Part 0 */
2867	Utils::replaceToken(token_version, position, version, shader_source_part_0);
2868
2869	Utils::replaceToken(token_stage_specific, position, stage_specific_layout, shader_source_part_0);
2870
2871	if (Utils::VERTEX_SHADER != stage)
2872	{
2873		Utils::replaceToken(token_in_color_definition, position, in_color_definition.c_str(), shader_source_part_0);
2874	}
2875	else
2876	{
2877		Utils::replaceToken(token_in_color_definition, position, empty, shader_source_part_0);
2878	}
2879	Utils::replaceToken(token_in_tex_coord_definition, position, in_tex_coord_definition.c_str(), shader_source_part_0);
2880	Utils::replaceToken(token_out_color_definition, position, out_color_definition.c_str(), shader_source_part_0);
2881	if (Utils::FRAGMENT_SHADER == stage)
2882	{
2883		Utils::replaceToken(token_out_tex_coord_definition, position, empty, shader_source_part_0);
2884	}
2885	else
2886	{
2887		Utils::replaceToken(token_out_tex_coord_definition, position, out_tex_coord_definition.c_str(),
2888							shader_source_part_0);
2889	}
2890
2891	Utils::replaceToken(token_out_color, position, out_color_reference.c_str(), shader_source_part_0);
2892
2893	/* Part 1 */
2894	if (true == is_multipart)
2895	{
2896		position = 0;
2897	}
2898
2899	Utils::replaceToken(token_texture_coordinates, position, in_tex_coord_reference.c_str(), shader_source_part_1);
2900
2901	Utils::replaceToken(token_pass_condition, position, pass_condition, shader_source_part_1);
2902	position -= pass_condition_length;
2903
2904	Utils::replaceToken(token_expected_value, position, expected_value, shader_source_part_1);
2905	if (Utils::VERTEX_SHADER != stage)
2906	{
2907		Utils::replaceToken(token_in_color, position, in_color_reference.c_str(), shader_source_part_1);
2908	}
2909
2910	Utils::replaceToken(token_store_results, position, store_results, shader_source_part_1);
2911	position -= store_results_length;
2912
2913	if (Utils::GEOMETRY_SHADER == stage)
2914	{
2915		for (GLuint i = 0; i < 4; ++i)
2916		{
2917			Utils::replaceToken(token_texture_coordinates, position, out_tex_coord_reference.c_str(),
2918								shader_source_part_1);
2919		}
2920	}
2921	else if (Utils::FRAGMENT_SHADER == stage)
2922	{
2923		/* Nothing to be done */
2924	}
2925	else
2926	{
2927		Utils::replaceToken(token_texture_coordinates, position, out_tex_coord_reference.c_str(), shader_source_part_1);
2928	}
2929}
2930
2931/** Prepare texture
2932 *
2933 * @param texture Texutre to be created and filled with content
2934 *
2935 * @return Name of sampler uniform that should be used for the texture
2936 **/
2937const GLchar* LineContinuationTest::prepareSourceTexture(Utils::texture& texture)
2938{
2939	std::vector<GLuint> data;
2940	static const GLuint width	  = 64;
2941	static const GLuint height	 = 64;
2942	static const GLuint data_size  = width * height;
2943	static const GLuint blue_color = 0xffff0000;
2944	static const GLuint grey_color = 0xaaaaaaaa;
2945
2946	data.resize(data_size);
2947
2948	for (GLuint i = 0; i < data_size; ++i)
2949	{
2950		data[i] = grey_color;
2951	}
2952
2953	for (GLuint y = 16; y < 48; ++y)
2954	{
2955		const GLuint line_offset = y * 64;
2956
2957		for (GLuint x = 16; x < 48; ++x)
2958		{
2959			const GLuint pixel_offset = x + line_offset;
2960
2961			data[pixel_offset] = blue_color;
2962		}
2963	}
2964
2965	texture.create(width, height, GL_RGBA8);
2966
2967	texture.update(width, height, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
2968
2969	return "uni_sampler";
2970}
2971
2972/** Prepare vertex buffer, vec2 tex_coord
2973 *
2974 * @param program Program object
2975 * @param buffer  Vertex buffer
2976 * @param vao     Vertex array object
2977 **/
2978void LineContinuationTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer,
2979											   Utils::vertexArray& vao)
2980{
2981	std::string tex_coord_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, m_texture_coordinates_name);
2982	GLint		tex_coord_loc  = program.getAttribLocation(tex_coord_name.c_str());
2983
2984	if (-1 == tex_coord_loc)
2985	{
2986		TCU_FAIL("Vertex attribute location is invalid");
2987	}
2988
2989	vao.generate();
2990	vao.bind();
2991
2992	buffer.generate(GL_ARRAY_BUFFER);
2993
2994	GLfloat	data[]	= { 0.5f, 0.5f, 0.5f, 0.5f };
2995	GLsizeiptr data_size = sizeof(data);
2996
2997	buffer.update(data_size, data, GL_STATIC_DRAW);
2998
2999	/* GL entry points */
3000	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
3001
3002	/* Set up vao */
3003	gl.vertexAttribPointer(tex_coord_loc, 2 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */,
3004						   0 /* offset */);
3005	GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer");
3006
3007	/* Enable attribute */
3008	gl.enableVertexAttribArray(tex_coord_loc);
3009	GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray");
3010}
3011
3012/** Get string describing test cases
3013 *
3014 * @param cases Test case
3015 *
3016 * @return String describing current test case
3017 **/
3018const GLchar* LineContinuationTest::casesToStr(CASES cases) const
3019{
3020	const GLchar* result = 0;
3021	switch (cases)
3022	{
3023	case ASSIGNMENT_BEFORE_OPERATOR:
3024		result = "just before assignment operator";
3025		break;
3026	case ASSIGNMENT_AFTER_OPERATOR:
3027		result = "just after assignment operator";
3028		break;
3029	case VECTOR_VARIABLE_INITIALIZER:
3030		result = "inside vector variable initializer";
3031		break;
3032	case TOKEN_INSIDE_FUNCTION_NAME:
3033		result = "inside function name";
3034		break;
3035	case TOKEN_INSIDE_TYPE_NAME:
3036		result = "inside type name";
3037		break;
3038	case TOKEN_INSIDE_VARIABLE_NAME:
3039		result = "inside variable name";
3040		break;
3041	case PREPROCESSOR_TOKEN_INSIDE:
3042		result = "inside preprocessor token";
3043		break;
3044	case PREPROCESSOR_TOKEN_BETWEEN:
3045		result = "between preprocessor token";
3046		break;
3047	case COMMENT:
3048		result = "inside comment";
3049		break;
3050	case SOURCE_TERMINATION_NULL:
3051		result = "just before null terminating source";
3052		break;
3053	case SOURCE_TERMINATION_NON_NULL:
3054		result = "as last character in source string, without null termination";
3055		break;
3056	case PART_TERMINATION_NULL:
3057		result = "just before null terminating part of source";
3058		break;
3059	case PART_NEXT_TO_TERMINATION_NULL:
3060		result = "just before last character in part of source";
3061		break;
3062	case PART_TERMINATION_NON_NULL:
3063		result = "as last character in part string, without null termination";
3064		break;
3065	case PART_NEXT_TO_TERMINATION_NON_NULL:
3066		result = "just before last character in part string, without null termination";
3067		break;
3068	case DEBUG_CASE: /* intended fall through */
3069	default:
3070		result = "nowhere at all. This is debug!";
3071		break;
3072	}
3073
3074	return result;
3075}
3076
3077/** Get expected value, blue color as vec4
3078 *
3079 * @return blue color
3080 **/
3081const GLchar* LineContinuationTest::getExpectedValueString() const
3082{
3083	return "vec4(0, 0, 1, 1)";
3084}
3085
3086/** Get line continuation string, single or multiple \
3087         *
3088 * @return String
3089 **/
3090std::string LineContinuationTest::getLineContinuationString() const
3091{
3092	static const GLchar line_continuation_ending_dos[]  = { '\\', 0x0d, 0x0a, 0x00 };
3093	static const GLchar line_continuation_ending_unix[] = { '\\', 0x0a, 0x00 };
3094
3095	std::string   result;
3096	const GLchar* selected_string;
3097
3098	if (DOS == m_test_case.m_line_endings)
3099	{
3100		selected_string = line_continuation_ending_dos;
3101	}
3102	else
3103	{
3104		selected_string = line_continuation_ending_unix;
3105	}
3106
3107	GLuint n_repetitions = (ONCE == m_test_case.m_repetitions) ? 1 : m_n_repetitions;
3108
3109	for (GLuint i = 0; i < n_repetitions; ++i)
3110	{
3111		result.append(selected_string);
3112	}
3113
3114	return result;
3115}
3116
3117/** Decides if shader should consist of multiple parts for the current test case
3118 *
3119 * @return true if test case requires multiple parts, false otherwise
3120 **/
3121bool LineContinuationTest::isShaderMultipart() const
3122{
3123	bool result;
3124
3125	switch (m_test_case.m_case)
3126	{
3127	case ASSIGNMENT_BEFORE_OPERATOR:
3128	case ASSIGNMENT_AFTER_OPERATOR:
3129	case VECTOR_VARIABLE_INITIALIZER:
3130	case TOKEN_INSIDE_FUNCTION_NAME:
3131	case TOKEN_INSIDE_TYPE_NAME:
3132	case TOKEN_INSIDE_VARIABLE_NAME:
3133	case PREPROCESSOR_TOKEN_INSIDE:
3134	case PREPROCESSOR_TOKEN_BETWEEN:
3135	case COMMENT:
3136	case SOURCE_TERMINATION_NULL:
3137	case SOURCE_TERMINATION_NON_NULL:
3138	default:
3139		result = false;
3140		break;
3141	case PART_TERMINATION_NULL:
3142	case PART_NEXT_TO_TERMINATION_NULL:
3143	case PART_TERMINATION_NON_NULL:
3144	case PART_NEXT_TO_TERMINATION_NON_NULL:
3145		result = true;
3146		break;
3147	}
3148
3149	return result;
3150}
3151
3152/** String describing line endings
3153 *
3154 * @param line_ending Line ending enum
3155 *
3156 * @return "unix" or "dos" strings
3157 **/
3158const GLchar* LineContinuationTest::lineEndingsToStr(LINE_ENDINGS line_ending) const
3159{
3160	const GLchar* result = 0;
3161
3162	if (UNIX == line_ending)
3163	{
3164		result = "unix";
3165	}
3166	else
3167	{
3168		result = "dos";
3169	}
3170
3171	return result;
3172}
3173
3174/** String describing number of repetitions
3175 *
3176 * @param repetitions Repetitions enum
3177 *
3178 * @return "single" or "multiple" strings
3179 **/
3180const GLchar* LineContinuationTest::repetitionsToStr(REPETITIONS repetitions) const
3181{
3182	const GLchar* result = 0;
3183
3184	if (ONCE == repetitions)
3185	{
3186		result = "single";
3187	}
3188	else
3189	{
3190		result = "multiple";
3191	}
3192
3193	return result;
3194}
3195
3196/** Replace all CASES tokens
3197 *
3198 * @param source String with shader template
3199 **/
3200void LineContinuationTest::replaceAllCaseTokens(std::string& source) const
3201{
3202
3203	/* Tokens to be replaced with line continuation */
3204	static const GLchar* token_assignment_before_operator_case = "ASSIGNMENT_BEFORE_OPERATOR_CASE";
3205	static const GLchar* token_assignment_after_operator_case  = "ASSIGNMENT_AFTER_OPERATOR_CASE";
3206	static const GLchar* token_vector_initializer			   = "VECTOR_VARIABLE_INITIALIZER_CASE";
3207	static const GLchar* token_function_case				   = "FUNCTION_CASE";
3208	static const GLchar* token_type_case					   = "TYPE_CASE";
3209	static const GLchar* token_variable_case				   = "VARIABLE_CASE";
3210	static const GLchar* token_preprocessor_inside_case		   = "PREPROCESSOR_INSIDE_CASE";
3211	static const GLchar* token_preprocessor_between_case	   = "PREPROCESSOR_BETWEEN_CASE";
3212	static const GLchar* token_comment						   = "COMMENT_CASE";
3213	static const GLchar* token_termination					   = "TERMINATION_CASE";
3214	static const GLchar* token_next_to_termination			   = "NEXT_TO_TERMINATION_CASE";
3215
3216	/* Line continuation and empty string*/
3217	static const GLchar* empty			   = "";
3218	const std::string&   line_continuation = getLineContinuationString();
3219
3220	/* These strings will used to replace "CASE" tokens */
3221	const GLchar* assignment_before_operator_case  = empty;
3222	const GLchar* assignment_after_operator_case   = empty;
3223	const GLchar* vector_variable_initializer_case = empty;
3224	const GLchar* function_case					   = empty;
3225	const GLchar* type_case						   = empty;
3226	const GLchar* variable_case					   = empty;
3227	const GLchar* preprocessor_inside_case		   = empty;
3228	const GLchar* preprocessor_between_case		   = empty;
3229	const GLchar* comment_case					   = empty;
3230	const GLchar* source_termination_case		   = empty;
3231	const GLchar* part_termination_case			   = empty;
3232	const GLchar* next_to_part_termination_case	= empty;
3233
3234	/* Configuration of test case */
3235	switch (m_test_case.m_case)
3236	{
3237	case ASSIGNMENT_BEFORE_OPERATOR:
3238		assignment_before_operator_case = line_continuation.c_str();
3239		break;
3240	case ASSIGNMENT_AFTER_OPERATOR:
3241		assignment_after_operator_case = line_continuation.c_str();
3242		break;
3243	case VECTOR_VARIABLE_INITIALIZER:
3244		vector_variable_initializer_case = line_continuation.c_str();
3245		break;
3246	case TOKEN_INSIDE_FUNCTION_NAME:
3247		function_case = line_continuation.c_str();
3248		break;
3249	case TOKEN_INSIDE_TYPE_NAME:
3250		type_case = line_continuation.c_str();
3251		break;
3252	case TOKEN_INSIDE_VARIABLE_NAME:
3253		variable_case = line_continuation.c_str();
3254		break;
3255	case PREPROCESSOR_TOKEN_INSIDE:
3256		preprocessor_inside_case = line_continuation.c_str();
3257		break;
3258	case PREPROCESSOR_TOKEN_BETWEEN:
3259		preprocessor_between_case = line_continuation.c_str();
3260		break;
3261	case COMMENT:
3262		comment_case = line_continuation.c_str();
3263		break;
3264	case SOURCE_TERMINATION_NULL: /* intended fall through */
3265	case SOURCE_TERMINATION_NON_NULL:
3266		source_termination_case = line_continuation.c_str();
3267		break;
3268	case PART_TERMINATION_NULL: /* intended fall through */
3269	case PART_TERMINATION_NON_NULL:
3270		part_termination_case   = line_continuation.c_str();
3271		source_termination_case = line_continuation.c_str();
3272		break;
3273	case PART_NEXT_TO_TERMINATION_NULL: /* intended fall through */
3274	case PART_NEXT_TO_TERMINATION_NON_NULL:
3275		next_to_part_termination_case = line_continuation.c_str();
3276		break;
3277	case DEBUG_CASE: /* intended fall through */
3278	default:
3279		break; /* no line continuations */
3280	}
3281
3282	Utils::replaceAllTokens(token_assignment_after_operator_case, assignment_after_operator_case, source);
3283	Utils::replaceAllTokens(token_assignment_before_operator_case, assignment_before_operator_case, source);
3284	Utils::replaceAllTokens(token_comment, comment_case, source);
3285	Utils::replaceAllTokens(token_function_case, function_case, source);
3286	Utils::replaceAllTokens(token_next_to_termination, next_to_part_termination_case, source);
3287	Utils::replaceAllTokens(token_termination, part_termination_case, source);
3288	Utils::replaceAllTokens(token_preprocessor_between_case, preprocessor_between_case, source);
3289	Utils::replaceAllTokens(token_preprocessor_inside_case, preprocessor_inside_case, source);
3290	Utils::replaceAllTokens(token_termination, source_termination_case, source);
3291	Utils::replaceAllTokens(token_type_case, type_case, source);
3292	Utils::replaceAllTokens(token_variable_case, variable_case, source);
3293	Utils::replaceAllTokens(token_vector_initializer, vector_variable_initializer_case, source);
3294}
3295
3296/** Decides if the current test case requires source lengths
3297 *
3298 * @return true if test requires lengths, false otherwise
3299 **/
3300bool LineContinuationTest::useSourceLengths() const
3301{
3302	bool result;
3303
3304	switch (m_test_case.m_case)
3305	{
3306	case ASSIGNMENT_BEFORE_OPERATOR:
3307	case ASSIGNMENT_AFTER_OPERATOR:
3308	case VECTOR_VARIABLE_INITIALIZER:
3309	case TOKEN_INSIDE_FUNCTION_NAME:
3310	case TOKEN_INSIDE_TYPE_NAME:
3311	case TOKEN_INSIDE_VARIABLE_NAME:
3312	case PREPROCESSOR_TOKEN_INSIDE:
3313	case PREPROCESSOR_TOKEN_BETWEEN:
3314	case COMMENT:
3315	case SOURCE_TERMINATION_NULL:
3316	case PART_TERMINATION_NULL:
3317	case PART_NEXT_TO_TERMINATION_NULL:
3318	default:
3319		result = false;
3320		break;
3321	case SOURCE_TERMINATION_NON_NULL:
3322	case PART_TERMINATION_NON_NULL:
3323	case PART_NEXT_TO_TERMINATION_NON_NULL:
3324		result = true;
3325		break;
3326	}
3327
3328	return result;
3329}
3330
3331/** Constructor
3332 *
3333 * @param context Test context
3334 **/
3335LineNumberingTest::LineNumberingTest(deqp::Context& context)
3336	: GLSLTestBase(context, "line_numbering", "Verify if line numbering is correct after line continuation")
3337{
3338	/* Nothing to be done here */
3339}
3340
3341/** Prepare source for given shader stage
3342 *
3343 * @param in_stage           Shader stage, compute shader will use 430
3344 * @param in_use_version_400 Select if 400 or 420 should be used
3345 * @param out_source         Prepared shader source instance
3346 **/
3347void LineNumberingTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
3348											Utils::shaderSource& out_source)
3349{
3350	static const GLchar* test_result_snippet_normal[6] = { /* Utils::COMPUTE_SHADER */
3351														   "ivec4(11, 1, 2, 3)",
3352														   /* Utils::VERTEX_SHADER */
3353														   "ivec4(9, 1, 2, 3)",
3354														   /* Utils::TESS_CTRL_SHADER */
3355														   "ivec4(12, 1, 2, 3)",
3356														   /* Utils::TESS_EVAL_SHADER */
3357														   "ivec4(12, 1, 2, 3)",
3358														   /* Utils::GEOMETRY_SHADER */
3359														   "ivec4(13, 1, 2, 3)",
3360														   /* Utils::FRAGMENT_SHADER */
3361														   "ivec4(10, 1, 2, 3)"
3362	};
3363
3364	static const GLchar* test_result_snippet_400[6] = { /* Utils::COMPUTE_SHADER */
3365														"ivec4(13, 1, 2, 3)",
3366														/* Utils::VERTEX_SHADER */
3367														"ivec4(11, 1, 2, 3)",
3368														/* Utils::TESS_CTRL_SHADER */
3369														"ivec4(14, 1, 2, 3)",
3370														/* Utils::TESS_EVAL_SHADER */
3371														"ivec4(14, 1, 2, 3)",
3372														/* Utils::GEOMETRY_SHADER */
3373														"ivec4(15, 1, 2, 3)",
3374														/* Utils::FRAGMENT_SHADER */
3375														"ivec4(12, 1, 2, 3)"
3376	};
3377
3378	static const GLchar* line_numbering_snippet = "ivec4 glsl\\\n"
3379												  "Test\\\n"
3380												  "Function(in ivec3 arg)\n"
3381												  "{\n"
3382												  "    return ivec4(__LINE__, arg.xyz);\n"
3383												  "}\n";
3384
3385	static const GLchar* compute_shader_template =
3386		"VERSION\n"
3387		"\n"
3388		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
3389		"\n"
3390		"writeonly uniform image2D uni_image;\n"
3391		"\n"
3392		"GLSL_TEST_FUNCTION"
3393		"\n"
3394		"void main()\n"
3395		"{\n"
3396		"    vec4 result = vec4(1, 0, 0, 1);\n"
3397		"\n"
3398		"    if (GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3)))\n"
3399		"    {\n"
3400		"        result = vec4(0, 1, 0, 1);\n"
3401		"    }\n"
3402		"\n"
3403		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
3404		"}\n"
3405		"\n";
3406
3407	static const GLchar* fragment_shader_template =
3408		"VERSION\n"
3409		"\n"
3410		"in  vec4 gs_fs_result;\n"
3411		"out vec4 fs_out_result;\n"
3412		"\n"
3413		"GLSL_TEST_FUNCTION"
3414		"\n"
3415		"void main()\n"
3416		"{\n"
3417		"    vec4 result = vec4(1, 0, 0, 1);\n"
3418		"\n"
3419		"    if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n"
3420		"        (vec4(0, 1, 0, 1) == gs_fs_result) )\n"
3421		"    {\n"
3422		"         result = vec4(0, 1, 0, 1);\n"
3423		"    }\n"
3424		"\n"
3425		"    fs_out_result = result;\n"
3426		"}\n"
3427		"\n";
3428
3429	static const GLchar* geometry_shader_template =
3430		"VERSION\n"
3431		"\n"
3432		"layout(points)                           in;\n"
3433		"layout(triangle_strip, max_vertices = 4) out;\n"
3434		"\n"
3435		"in  vec4 tes_gs_result[];\n"
3436		"out vec4 gs_fs_result;\n"
3437		"\n"
3438		"GLSL_TEST_FUNCTION"
3439		"\n"
3440		"void main()\n"
3441		"{\n"
3442		"    vec4 result = vec4(1, 0, 0, 1);\n"
3443		"\n"
3444		"    if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n"
3445		"        (vec4(0, 1, 0, 1) == tes_gs_result[0]) )\n"
3446		"    {\n"
3447		"         result = vec4(0, 1, 0, 1);\n"
3448		"    }\n"
3449		"\n"
3450		"    gs_fs_result = result;\n"
3451		"    gl_Position  = vec4(-1, -1, 0, 1);\n"
3452		"    EmitVertex();\n"
3453		"    gs_fs_result = result;\n"
3454		"    gl_Position  = vec4(-1, 1, 0, 1);\n"
3455		"    EmitVertex();\n"
3456		"    gs_fs_result = result;\n"
3457		"    gl_Position  = vec4(1, -1, 0, 1);\n"
3458		"    EmitVertex();\n"
3459		"    gs_fs_result = result;\n"
3460		"    gl_Position  = vec4(1, 1, 0, 1);\n"
3461		"    EmitVertex();\n"
3462		"}\n"
3463		"\n";
3464
3465	static const GLchar* tess_ctrl_shader_template =
3466		"VERSION\n"
3467		"\n"
3468		"layout(vertices = 1) out;\n"
3469		"\n"
3470		"in  vec4 vs_tcs_result[];\n"
3471		"out vec4 tcs_tes_result[];\n"
3472		"\n"
3473		"GLSL_TEST_FUNCTION"
3474		"\n"
3475		"void main()\n"
3476		"{\n"
3477		"    vec4 result = vec4(1, 0, 0, 1);\n"
3478		"\n"
3479		"    if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n"
3480		"        (vec4(0, 1, 0, 1) == vs_tcs_result[gl_InvocationID]) )\n"
3481		"    {\n"
3482		"         result = vec4(0, 1, 0, 1);\n"
3483		"    }\n"
3484		"\n"
3485		"    tcs_tes_result[gl_InvocationID] = result;\n"
3486		"\n"
3487		"    gl_TessLevelOuter[0] = 1.0;\n"
3488		"    gl_TessLevelOuter[1] = 1.0;\n"
3489		"    gl_TessLevelOuter[2] = 1.0;\n"
3490		"    gl_TessLevelOuter[3] = 1.0;\n"
3491		"    gl_TessLevelInner[0] = 1.0;\n"
3492		"    gl_TessLevelInner[1] = 1.0;\n"
3493		"}\n"
3494		"\n";
3495
3496	static const GLchar* tess_eval_shader_template =
3497		"VERSION\n"
3498		"\n"
3499		"layout(isolines, point_mode) in;\n"
3500		"\n"
3501		"in  vec4 tcs_tes_result[];\n"
3502		"out vec4 tes_gs_result;\n"
3503		"\n"
3504		"GLSL_TEST_FUNCTION"
3505		"\n"
3506		"void main()\n"
3507		"{\n"
3508		"    vec4 result = vec4(1, 0, 0, 1);\n"
3509		"\n"
3510		"    if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n"
3511		"        (vec4(0, 1, 0, 1) == tcs_tes_result[0]) )\n"
3512		"    {\n"
3513		"         result = vec4(0, 1, 0, 1);\n"
3514		"    }\n"
3515		"\n"
3516		"    tes_gs_result = result;\n"
3517		"}\n"
3518		"\n";
3519
3520	static const GLchar* vertex_shader_template = "VERSION\n"
3521												  "\n"
3522												  "out vec4 vs_tcs_result;\n"
3523												  "\n"
3524												  "GLSL_TEST_FUNCTION"
3525												  "\n"
3526												  "void main()\n"
3527												  "{\n"
3528												  "    vec4 result = vec4(1, 0, 0, 1);\n"
3529												  "\n"
3530												  "    if (GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3)))\n"
3531												  "    {\n"
3532												  "         result = vec4(0, 1, 0, 1);\n"
3533												  "    }\n"
3534												  "\n"
3535												  "    vs_tcs_result = result;\n"
3536												  "}\n"
3537												  "\n";
3538
3539	const GLchar* shader_template = 0;
3540
3541	switch (in_stage)
3542	{
3543	case Utils::COMPUTE_SHADER:
3544		shader_template = compute_shader_template;
3545		break;
3546	case Utils::FRAGMENT_SHADER:
3547		shader_template = fragment_shader_template;
3548		break;
3549	case Utils::GEOMETRY_SHADER:
3550		shader_template = geometry_shader_template;
3551		break;
3552	case Utils::TESS_CTRL_SHADER:
3553		shader_template = tess_ctrl_shader_template;
3554		break;
3555	case Utils::TESS_EVAL_SHADER:
3556		shader_template = tess_eval_shader_template;
3557		break;
3558	case Utils::VERTEX_SHADER:
3559		shader_template = vertex_shader_template;
3560		break;
3561	default:
3562		TCU_FAIL("Invalid enum");
3563	}
3564
3565	out_source.m_parts[0].m_code = shader_template;
3566
3567	size_t position = 0;
3568	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
3569						out_source.m_parts[0].m_code);
3570
3571	Utils::replaceToken("GLSL_TEST_FUNCTION", position, line_numbering_snippet, out_source.m_parts[0].m_code);
3572
3573	Utils::replaceToken("GLSL_TEST_RESULT", position,
3574						in_use_version_400 ? test_result_snippet_400[in_stage] : test_result_snippet_normal[in_stage],
3575						out_source.m_parts[0].m_code);
3576}
3577
3578/** Constructor
3579 *
3580 * @param context Test context
3581 **/
3582UTF8CharactersTest::UTF8CharactersTest(deqp::Context& context)
3583	: GLSLTestBase(context, "utf8_characters", "UTF8 character used in comment or preprocessor")
3584{
3585	/* Nothing to be done here */
3586}
3587
3588/** Overwrite getShaderSourceConfig method
3589 *
3590 * @param out_n_parts     Number of source parts used by this test case
3591 * @param out_use_lengths If source lengths shall be provided to compiler
3592 **/
3593void UTF8CharactersTest::getShaderSourceConfig(GLuint& out_n_parts, bool& out_use_lengths)
3594{
3595	out_n_parts		= 1;
3596	out_use_lengths = (AS_LAST_CHARACTER_NON_NULL_TERMINATED == m_test_case.m_case) ? true : false;
3597}
3598
3599/** Set up next test case
3600 *
3601 * @param test_case_index Index of next test case
3602 *
3603 * @return false if there is no more test cases, true otherwise
3604 **/
3605bool UTF8CharactersTest::prepareNextTestCase(glw::GLuint test_case_index)
3606{
3607	static const testCase test_cases[] = {
3608		{ IN_COMMENT, Utils::TWO_BYTES },
3609		{ IN_COMMENT, Utils::THREE_BYTES },
3610		{ IN_COMMENT, Utils::FOUR_BYTES },
3611		{ IN_COMMENT, Utils::FIVE_BYTES },
3612		{ IN_COMMENT, Utils::SIX_BYTES },
3613		{ IN_COMMENT, Utils::REDUNDANT_ASCII },
3614		{ IN_PREPROCESSOR, Utils::TWO_BYTES },
3615		{ IN_PREPROCESSOR, Utils::THREE_BYTES },
3616		{ IN_PREPROCESSOR, Utils::FOUR_BYTES },
3617		{ IN_PREPROCESSOR, Utils::FIVE_BYTES },
3618		{ IN_PREPROCESSOR, Utils::SIX_BYTES },
3619		{ IN_PREPROCESSOR, Utils::REDUNDANT_ASCII },
3620		{ AS_LAST_CHARACTER_NULL_TERMINATED, Utils::TWO_BYTES },
3621		{ AS_LAST_CHARACTER_NULL_TERMINATED, Utils::THREE_BYTES },
3622		{ AS_LAST_CHARACTER_NULL_TERMINATED, Utils::FOUR_BYTES },
3623		{ AS_LAST_CHARACTER_NULL_TERMINATED, Utils::FIVE_BYTES },
3624		{ AS_LAST_CHARACTER_NULL_TERMINATED, Utils::SIX_BYTES },
3625		{ AS_LAST_CHARACTER_NULL_TERMINATED, Utils::REDUNDANT_ASCII },
3626		{ AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::TWO_BYTES },
3627		{ AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::THREE_BYTES },
3628		{ AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::FOUR_BYTES },
3629		{ AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::FIVE_BYTES },
3630		{ AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::SIX_BYTES },
3631		{ AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::REDUNDANT_ASCII },
3632	};
3633
3634	static const GLuint max_test_cases = sizeof(test_cases) / sizeof(testCase);
3635
3636	if ((GLuint)-1 == test_case_index)
3637	{
3638		m_test_case.m_case		= DEBUG_CASE;
3639		m_test_case.m_character = Utils::EMPTY;
3640	}
3641	else if (max_test_cases <= test_case_index)
3642	{
3643		return false;
3644	}
3645	else
3646	{
3647		m_test_case = test_cases[test_case_index];
3648	}
3649
3650	m_context.getTestContext().getLog() << tcu::TestLog::Message << "Test case: utf8 character: "
3651										<< Utils::getUtf8Character(m_test_case.m_character) << " is placed "
3652										<< casesToStr() << tcu::TestLog::EndMessage;
3653
3654	return true;
3655}
3656
3657/** Prepare source for given shader stage
3658 *
3659 * @param in_stage           Shader stage, compute shader will use 430
3660 * @param in_use_version_400 Select if 400 or 420 should be used
3661 * @param out_source         Prepared shader source instance
3662 **/
3663void UTF8CharactersTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
3664											 Utils::shaderSource& out_source)
3665{
3666	static const GLchar* compute_shader_template =
3667		"VERSION\n"
3668		"\n"
3669		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
3670		"\n"
3671		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
3672		"\n"
3673		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
3674		"\n"
3675		"writeonly uniform image2D   uni_image;\n"
3676		"          uniform sampler2D uni_sampler;\n"
3677		"\n"
3678		"#if 0\n"
3679		"    #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n"
3680		"#else\n"
3681		"    #define SET_RESULT(XX) result = XX\n"
3682		"#endif\n"
3683		"\n"
3684		"void main()\n"
3685		"{\n"
3686		"    ivec2 coordinates = ivec2(gl_GlobalInvocationID.xy + ivec2(16, 16));\n"
3687		"    vec4  result      = vec4(1, 0, 0, 1);\n"
3688		"\n"
3689		"    if (vec4(0, 0, 1, 1) == texelFetch(uni_sampler, coordinates, 0 /* lod */))\n"
3690		"    {\n"
3691		"        SET_RESULT(vec4(0, 1, 0, 1));\n"
3692		"    }\n"
3693		"\n"
3694		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
3695		"}\n"
3696		"// Lorem ipsum LAST_CHARACTER_CASE";
3697
3698	static const GLchar* fragment_shader_template =
3699		"VERSION\n"
3700		"\n"
3701		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
3702		"\n"
3703		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
3704		"\n"
3705		"in      vec4      gs_fs_result;\n"
3706		"in      vec2      gs_fs_tex_coord;\n"
3707		"out     vec4      fs_out_result;\n"
3708		"uniform sampler2D uni_sampler;\n"
3709		"\n"
3710		"#if 0\n"
3711		"    #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n"
3712		"#else\n"
3713		"    #define SET_RESULT(XX) result = XX\n"
3714		"#endif\n"
3715		"\n"
3716		"void main()\n"
3717		"{\n"
3718		"    vec4 result = vec4(1, 0, 0, 1);\n"
3719		"\n"
3720		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, gs_fs_tex_coord)) &&\n"
3721		"        (vec4(0, 1, 0, 1) == gs_fs_result) )\n"
3722		"    {\n"
3723		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
3724		"    }\n"
3725		"\n"
3726		"    fs_out_result = result;\n"
3727		"}\n"
3728		"// Lorem ipsum LAST_CHARACTER_CASE";
3729
3730	static const GLchar* geometry_shader_template =
3731		"VERSION\n"
3732		"\n"
3733		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
3734		"\n"
3735		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
3736		"\n"
3737		"layout(points)                           in;\n"
3738		"layout(triangle_strip, max_vertices = 4) out;\n"
3739		"\n"
3740		"in      vec4      tes_gs_result[];\n"
3741		"out     vec2      gs_fs_tex_coord;\n"
3742		"out     vec4      gs_fs_result;\n"
3743		"uniform sampler2D uni_sampler;\n"
3744		"\n"
3745		"#if 0\n"
3746		"    #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n"
3747		"#else\n"
3748		"    #define SET_RESULT(XX) result = XX\n"
3749		"#endif\n"
3750		"\n"
3751		"void main()\n"
3752		"{\n"
3753		"    vec4 result = vec4(1, 0, 0, 1);\n"
3754		"\n"
3755		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5))) &&\n"
3756		"        (vec4(0, 1, 0, 1) == tes_gs_result[0]) )\n"
3757		"    {\n"
3758		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
3759		"    }\n"
3760		"\n"
3761		"    gs_fs_tex_coord = vec2(0.25, 0.25);\n"
3762		"    gs_fs_result    = result;\n"
3763		"    gl_Position     = vec4(-1, -1, 0, 1);\n"
3764		"    EmitVertex();\n"
3765		"    gs_fs_tex_coord = vec2(0.25, 0.75);\n"
3766		"    gs_fs_result    = result;\n"
3767		"    gl_Position     = vec4(-1, 1, 0, 1);\n"
3768		"    EmitVertex();\n"
3769		"    gs_fs_tex_coord = vec2(0.75, 0.25);\n"
3770		"    gs_fs_result    = result;\n"
3771		"    gl_Position     = vec4(1, -1, 0, 1);\n"
3772		"    EmitVertex();\n"
3773		"    gs_fs_tex_coord = vec2(0.75, 0.75);\n"
3774		"    gs_fs_result    = result;\n"
3775		"    gl_Position     = vec4(1, 1, 0, 1);\n"
3776		"    EmitVertex();\n"
3777		"}\n"
3778		"// Lorem ipsum LAST_CHARACTER_CASE";
3779
3780	static const GLchar* tess_ctrl_shader_template =
3781		"VERSION\n"
3782		"\n"
3783		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
3784		"\n"
3785		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
3786		"\n"
3787		"layout(vertices = 1) out;\n"
3788		"\n"
3789		"in      vec4      vs_tcs_result[];\n"
3790		"out     vec4      tcs_tes_result[];\n"
3791		"uniform sampler2D uni_sampler;\n"
3792		"\n"
3793		"#if 0\n"
3794		"    #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n"
3795		"#else\n"
3796		"    #define SET_RESULT(XX) result = XX\n"
3797		"#endif\n"
3798		"\n"
3799		"void main()\n"
3800		"{\n"
3801		"    vec4 result = vec4(1, 0, 0, 1);\n"
3802		"\n"
3803		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.4, 0.4))) &&\n"
3804		"        (vec4(0, 1, 0, 1) == vs_tcs_result[gl_InvocationID]) )\n"
3805		"    {\n"
3806		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
3807		"    }\n"
3808		"\n"
3809		"    tcs_tes_result[gl_InvocationID] = result;\n"
3810		"\n"
3811		"    gl_TessLevelOuter[0] = 1.0;\n"
3812		"    gl_TessLevelOuter[1] = 1.0;\n"
3813		"    gl_TessLevelOuter[2] = 1.0;\n"
3814		"    gl_TessLevelOuter[3] = 1.0;\n"
3815		"    gl_TessLevelInner[0] = 1.0;\n"
3816		"    gl_TessLevelInner[1] = 1.0;\n"
3817		"}\n"
3818		"// Lorem ipsum LAST_CHARACTER_CASE";
3819
3820	static const GLchar* tess_eval_shader_template =
3821		"VERSION\n"
3822		"\n"
3823		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
3824		"\n"
3825		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
3826		"\n"
3827		"layout(isolines, point_mode) in;\n"
3828		"\n"
3829		"in      vec4      tcs_tes_result[];\n"
3830		"out     vec4      tes_gs_result;\n"
3831		"uniform sampler2D uni_sampler;\n"
3832		"\n"
3833		"#if 0\n"
3834		"    #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n"
3835		"#else\n"
3836		"    #define SET_RESULT(XX) result = XX\n"
3837		"#endif\n"
3838		"\n"
3839		"void main()\n"
3840		"{\n"
3841		"    vec4 result = vec4(1, 0, 0, 1);\n"
3842		"\n"
3843		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.6, 0.6))) &&\n"
3844		"        (vec4(0, 1, 0, 1) == tcs_tes_result[0]) )\n"
3845		"    {\n"
3846		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
3847		"    }\n"
3848		"\n"
3849		"    tes_gs_result = result;\n"
3850		"}\n"
3851		"// Lorem ipsum LAST_CHARACTER_CASE";
3852
3853	static const GLchar* vertex_shader_template =
3854		"VERSION\n"
3855		"\n"
3856		"// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n"
3857		"\n"
3858		"/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n"
3859		"\n"
3860		"out     vec4      vs_tcs_result;\n"
3861		"uniform sampler2D uni_sampler;\n"
3862		"\n"
3863		"#if 0\n"
3864		"    #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n"
3865		"#else\n"
3866		"    #define SET_RESULT(XX) result = XX\n"
3867		"#endif\n"
3868		"\n"
3869		"void main()\n"
3870		"{\n"
3871		"    vec4 result = vec4(1, 0, 0, 1);\n"
3872		"\n"
3873		"    if (vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5)) )\n"
3874		"    {\n"
3875		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
3876		"    }\n"
3877		"\n"
3878		"    vs_tcs_result = result;\n"
3879		"}\n"
3880		"// Lorem ipsum LAST_CHARACTER_CASE";
3881
3882	const GLchar* shader_template	 = 0;
3883	const GLchar* comment_case		  = "";
3884	const GLchar* preprocessor_case   = "";
3885	const GLchar* last_character_case = "";
3886	const GLchar* utf8_character	  = Utils::getUtf8Character(m_test_case.m_character);
3887
3888	switch (in_stage)
3889	{
3890	case Utils::COMPUTE_SHADER:
3891		shader_template = compute_shader_template;
3892		break;
3893	case Utils::FRAGMENT_SHADER:
3894		shader_template = fragment_shader_template;
3895		break;
3896	case Utils::GEOMETRY_SHADER:
3897		shader_template = geometry_shader_template;
3898		break;
3899	case Utils::TESS_CTRL_SHADER:
3900		shader_template = tess_ctrl_shader_template;
3901		break;
3902	case Utils::TESS_EVAL_SHADER:
3903		shader_template = tess_eval_shader_template;
3904		break;
3905	case Utils::VERTEX_SHADER:
3906		shader_template = vertex_shader_template;
3907		break;
3908	default:
3909		TCU_FAIL("Invalid enum");
3910	}
3911
3912	switch (m_test_case.m_case)
3913	{
3914	case IN_COMMENT:
3915		comment_case = utf8_character;
3916		break;
3917	case IN_PREPROCESSOR:
3918		preprocessor_case = utf8_character;
3919		break;
3920	case AS_LAST_CHARACTER_NULL_TERMINATED:
3921		last_character_case = utf8_character;
3922		break;
3923	case AS_LAST_CHARACTER_NON_NULL_TERMINATED:
3924		last_character_case = utf8_character;
3925		break;
3926	case DEBUG_CASE:
3927		break;
3928	default:
3929		TCU_FAIL("Invalid enum");
3930	}
3931
3932	out_source.m_parts[0].m_code = shader_template;
3933
3934	size_t position = 0;
3935	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
3936						out_source.m_parts[0].m_code);
3937
3938	Utils::replaceAllTokens("COMMENT_CASE", comment_case, out_source.m_parts[0].m_code);
3939
3940	Utils::replaceAllTokens("PREPROCESSOR_CASE", preprocessor_case, out_source.m_parts[0].m_code);
3941
3942	Utils::replaceAllTokens("LAST_CHARACTER_CASE", last_character_case, out_source.m_parts[0].m_code);
3943}
3944
3945/** Prepare texture
3946 *
3947 * @param texture Texutre to be created and filled with content
3948 *
3949 * @return Name of sampler uniform that should be used for the texture
3950 **/
3951const GLchar* UTF8CharactersTest::prepareSourceTexture(Utils::texture& texture)
3952{
3953	std::vector<GLuint> data;
3954	static const GLuint width	  = 64;
3955	static const GLuint height	 = 64;
3956	static const GLuint data_size  = width * height;
3957	static const GLuint blue_color = 0xffff0000;
3958	static const GLuint grey_color = 0xaaaaaaaa;
3959
3960	data.resize(data_size);
3961
3962	for (GLuint i = 0; i < data_size; ++i)
3963	{
3964		data[i] = grey_color;
3965	}
3966
3967	for (GLuint y = 16; y < 48; ++y)
3968	{
3969		const GLuint line_offset = y * 64;
3970
3971		for (GLuint x = 16; x < 48; ++x)
3972		{
3973			const GLuint pixel_offset = x + line_offset;
3974
3975			data[pixel_offset] = blue_color;
3976		}
3977	}
3978
3979	texture.create(width, height, GL_RGBA8);
3980
3981	texture.update(width, height, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
3982
3983	return "uni_sampler";
3984}
3985
3986/** Returns description of current test case
3987 *
3988 * @return String with description
3989 **/
3990const GLchar* UTF8CharactersTest::casesToStr() const
3991{
3992	const GLchar* result = 0;
3993
3994	switch (m_test_case.m_case)
3995	{
3996	case IN_COMMENT:
3997		result = "in comment";
3998		break;
3999	case IN_PREPROCESSOR:
4000		result = "in preprocessor";
4001		break;
4002	case AS_LAST_CHARACTER_NULL_TERMINATED:
4003		result = "just before null";
4004		break;
4005	case AS_LAST_CHARACTER_NON_NULL_TERMINATED:
4006		result = "as last character";
4007		break;
4008	case DEBUG_CASE:
4009		result = "nowhere. This is debug!";
4010		break;
4011	default:
4012		TCU_FAIL("Invalid enum");
4013	}
4014
4015	return result;
4016}
4017
4018/** Constructor
4019 *
4020 * @param context Test context
4021 **/
4022UTF8InSourceTest::UTF8InSourceTest(deqp::Context& context)
4023	: NegativeTestBase(context, "utf8_in_source", "UTF8 characters used in shader source")
4024{
4025	/* Nothing to be done here */
4026}
4027
4028/** Set up next test case
4029 *
4030 * @param test_case_index Index of next test case
4031 *
4032 * @return false if there is no more test cases, true otherwise
4033 **/
4034bool UTF8InSourceTest::prepareNextTestCase(glw::GLuint test_case_index)
4035{
4036	static const Utils::UTF8_CHARACTERS test_cases[] = {
4037		Utils::TWO_BYTES,  Utils::THREE_BYTES, Utils::FOUR_BYTES,
4038		Utils::FIVE_BYTES, Utils::SIX_BYTES,   Utils::REDUNDANT_ASCII
4039	};
4040
4041	static const GLuint max_test_cases = sizeof(test_cases) / sizeof(Utils::UTF8_CHARACTERS);
4042
4043	if ((GLuint)-1 == test_case_index)
4044	{
4045		m_character = Utils::EMPTY;
4046	}
4047	else if (max_test_cases <= test_case_index)
4048	{
4049		return false;
4050	}
4051	else
4052	{
4053		m_character = test_cases[test_case_index];
4054	}
4055
4056	m_context.getTestContext().getLog() << tcu::TestLog::Message
4057										<< "Test case: utf8 character: " << Utils::getUtf8Character(m_character)
4058										<< tcu::TestLog::EndMessage;
4059
4060	return true;
4061}
4062
4063/** Prepare source for given shader stage
4064 *
4065 * @param in_stage           Shader stage, compute shader will use 430
4066 * @param in_use_version_400 Select if 400 or 420 should be used
4067 * @param out_source         Prepared shader source instance
4068 **/
4069void UTF8InSourceTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
4070										   Utils::shaderSource& out_source)
4071{
4072	static const GLchar* compute_shader_template =
4073		"VERSION\n"
4074		"\n"
4075		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
4076		"\n"
4077		"writeonly uniform image2D   uni_image;\n"
4078		"          uniform sampler2D uni_sampler;\n"
4079		"\n"
4080		"#define SET_RESULT(XX) resHEREult = XX\n"
4081		"\n"
4082		"void main()\n"
4083		"{\n"
4084		"    ivec2 coordinates = ivec2(gl_GlobalInvocationID.xy + ivec2(16, 16));\n"
4085		"    vec4  resHEREult      = vec4(1, 0, 0, 1);\n"
4086		"\n"
4087		"    if (vec4(0, 0, 1, 1) == texelFetch(uni_sampler, coordinates, 0 /* lod */))\n"
4088		"    {\n"
4089		"        SET_RESULT(vec4(0, 1, 0, 1));\n"
4090		"    }\n"
4091		"\n"
4092		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), resHEREult);\n"
4093		"}\n"
4094		"";
4095
4096	static const GLchar* fragment_shader_template =
4097		"VERSION\n"
4098		"\n"
4099		"in      vec4      gs_fs_result;\n"
4100		"in      vec2      gs_fs_tex_coord;\n"
4101		"out     vec4      fs_out_result;\n"
4102		"uniform sampler2D uni_sampler;\n"
4103		"\n"
4104		"#define SET_RESULT(XX) resHEREult = XX\n"
4105		"\n"
4106		"void main()\n"
4107		"{\n"
4108		"    vec4 resHEREult = vec4(1, 0, 0, 1);\n"
4109		"\n"
4110		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, gs_fs_tex_coord)) &&\n"
4111		"        (vec4(0, 1, 0, 1) == gs_fs_result) )\n"
4112		"    {\n"
4113		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
4114		"    }\n"
4115		"\n"
4116		"    fs_out_result = resHEREult;\n"
4117		"}\n"
4118		"\n";
4119
4120	static const GLchar* geometry_shader_template =
4121		"VERSION\n"
4122		"\n"
4123		"layout(points)                           in;\n"
4124		"layout(triangle_strip, max_vertices = 4) out;\n"
4125		"\n"
4126		"in      vec4      tes_gHEREs_result[];\n"
4127		"out     vec2      gs_fs_tex_coord;\n"
4128		"out     vec4      gs_fs_result;\n"
4129		"uniform sampler2D uni_sampler;\n"
4130		"\n"
4131		"#define SET_RESULT(XX) result = XX\n"
4132		"\n"
4133		"void main()\n"
4134		"{\n"
4135		"    vec4 result = vec4(1, 0, 0, 1);\n"
4136		"\n"
4137		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5))) &&\n"
4138		"        (vec4(0, 1, 0, 1) == tes_gHEREs_result[0]) )\n"
4139		"    {\n"
4140		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
4141		"    }\n"
4142		"\n"
4143		"    gs_fs_tex_coord = vec2(0.25, 0.25);\n"
4144		"    gs_fs_result    = result;\n"
4145		"    gl_Position     = vec4(-1, -1, 0, 1);\n"
4146		"    EmitVertex();\n"
4147		"    gs_fs_tex_coord = vec2(0.25, 0.75);\n"
4148		"    gs_fs_result    = result;\n"
4149		"    gl_Position     = vec4(-1, 1, 0, 1);\n"
4150		"    EmitVertex();\n"
4151		"    gs_fs_tex_coord = vec2(0.75, 0.25);\n"
4152		"    gs_fs_result    = result;\n"
4153		"    gl_Position     = vec4(1, -1, 0, 1);\n"
4154		"    EmitVertex();\n"
4155		"    gs_fs_tex_coord = vec2(0.75, 0.75);\n"
4156		"    gs_fs_result    = result;\n"
4157		"    gl_Position     = vec4(1, 1, 0, 1);\n"
4158		"    EmitVertex();\n"
4159		"}\n"
4160		"\n";
4161
4162	static const GLchar* tess_ctrl_shader_template =
4163		"VERSION\n"
4164		"\n"
4165		"layout(vertices = 1) out;\n"
4166		"\n"
4167		"in      vec4      vs_tcs_result[];\n"
4168		"out     vec4      tcHEREs_tes_result[];\n"
4169		"uniform sampler2D uni_sampler;\n"
4170		"\n"
4171		"#define SET_RESULT(XX) resulHEREt = XX\n"
4172		"\n"
4173		"void main()\n"
4174		"{\n"
4175		"    vec4 resulHEREt = vec4(1, 0, 0, 1);\n"
4176		"\n"
4177		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.4, 0.4))) &&\n"
4178		"        (vec4(0, 1, 0, 1) == vs_tcs_result[gl_InvocationID]) )\n"
4179		"    {\n"
4180		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
4181		"    }\n"
4182		"\n"
4183		"    tcHEREs_tes_result[gl_InvocationID] = resulHEREt;\n"
4184		"\n"
4185		"    gl_TessLevelOuter[0] = 1.0;\n"
4186		"    gl_TessLevelOuter[1] = 1.0;\n"
4187		"    gl_TessLevelOuter[2] = 1.0;\n"
4188		"    gl_TessLevelOuter[3] = 1.0;\n"
4189		"    gl_TessLevelInner[0] = 1.0;\n"
4190		"    gl_TessLevelInner[1] = 1.0;\n"
4191		"}\n"
4192		"\n";
4193
4194	static const GLchar* tess_eval_shader_template =
4195		"VERSION\n"
4196		"\n"
4197		"layout(isolines, point_mode) in;\n"
4198		"\n"
4199		"in      vec4      tcs_tes_result[];\n"
4200		"out     vec4      teHEREs_gs_result;\n"
4201		"uniform sampler2D uni_sampler;\n"
4202		"\n"
4203		"#define SET_RESULT(XX) reHEREsult = XX\n"
4204		"\n"
4205		"void main()\n"
4206		"{\n"
4207		"    vec4 reHEREsult = vec4(1, 0, 0, 1);\n"
4208		"\n"
4209		"    if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.6, 0.6))) &&\n"
4210		"        (vec4(0, 1, 0, 1) == tcs_tes_result[0]) )\n"
4211		"    {\n"
4212		"         SET_RESULT(vec4(0, 1, 0, 1));\n"
4213		"    }\n"
4214		"\n"
4215		"    teHEREs_gs_result = reHEREsult;\n"
4216		"}\n"
4217		"\n";
4218
4219	static const GLchar* vertex_shader_template = "VERSION\n"
4220												  "\n"
4221												  "out     vec4      vs_tcs_HEREresult;\n"
4222												  "uniform sampler2D uni_sampler;\n"
4223												  "\n"
4224												  "#define SET_RHEREESULT(XX) resHEREult = XX\n"
4225												  "\n"
4226												  "void main()\n"
4227												  "{\n"
4228												  "    vec4 resHEREult = vec4(1, 0, 0, 1);\n"
4229												  "\n"
4230												  "    if (vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5)) )\n"
4231												  "    {\n"
4232												  "         SET_RHEREESULT(vec4(0, 1, 0, 1));\n"
4233												  "    }\n"
4234												  "\n"
4235												  "    vs_tcs_HEREresult = resHEREult;\n"
4236												  "}\n"
4237												  "\n";
4238
4239	const GLchar* shader_template = 0;
4240	const GLchar* utf8_character  = Utils::getUtf8Character(m_character);
4241
4242	switch (in_stage)
4243	{
4244	case Utils::COMPUTE_SHADER:
4245		shader_template = compute_shader_template;
4246		break;
4247	case Utils::FRAGMENT_SHADER:
4248		shader_template = fragment_shader_template;
4249		break;
4250	case Utils::GEOMETRY_SHADER:
4251		shader_template = geometry_shader_template;
4252		break;
4253	case Utils::TESS_CTRL_SHADER:
4254		shader_template = tess_ctrl_shader_template;
4255		break;
4256	case Utils::TESS_EVAL_SHADER:
4257		shader_template = tess_eval_shader_template;
4258		break;
4259	case Utils::VERTEX_SHADER:
4260		shader_template = vertex_shader_template;
4261		break;
4262	default:
4263		TCU_FAIL("Invalid enum");
4264	}
4265
4266	out_source.m_parts[0].m_code = shader_template;
4267
4268	size_t position = 0;
4269	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
4270						out_source.m_parts[0].m_code);
4271
4272	Utils::replaceAllTokens("HERE", utf8_character, out_source.m_parts[0].m_code);
4273}
4274
4275/** Constructor
4276 *
4277 * @param context Test context
4278 **/
4279ImplicitConversionsValidTest::ImplicitConversionsValidTest(deqp::Context& context)
4280	: GLSLTestBase(context, "implicit_conversions", "Verifies that implicit conversions are allowed")
4281{
4282	/* Nothing to be done */
4283}
4284
4285/** Set up next test case
4286 *
4287 * @param test_case_index Index of next test case
4288 *
4289 * @return false if there is no more test cases, true otherwise
4290 **/
4291bool ImplicitConversionsValidTest::prepareNextTestCase(glw::GLuint test_case_index)
4292{
4293	m_current_test_case_index = test_case_index;
4294
4295	if ((glw::GLuint)-1 == test_case_index)
4296	{
4297		return true;
4298	}
4299	else if (m_test_cases.size() <= test_case_index)
4300	{
4301		return false;
4302	}
4303
4304	const testCase& test_case = m_test_cases[test_case_index];
4305
4306	m_context.getTestContext().getLog() << tcu::TestLog::Message
4307										<< "T1:" << Utils::getTypeName(test_case.m_types.m_t1, test_case.m_n_cols,
4308																	   test_case.m_n_rows)
4309										<< " T2:" << Utils::getTypeName(test_case.m_types.m_t2, test_case.m_n_cols,
4310																		test_case.m_n_rows)
4311										<< tcu::TestLog::EndMessage;
4312
4313	return true;
4314}
4315
4316/** Prepare source for given shader stage
4317 *
4318 * @param in_stage           Shader stage, compute shader will use 430
4319 * @param in_use_version_400 Select if 400 or 420 should be used
4320 * @param out_source         Prepared shader source instance
4321 **/
4322void ImplicitConversionsValidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
4323													   Utils::shaderSource& out_source)
4324{
4325	static const GLchar* function_definition = "T1 function(in T2 left, in T2 right)\n"
4326											   "{\n"
4327											   "    return left + right;\n"
4328											   "}\n";
4329
4330	static const GLchar* verification_snippet = "    const T2 const_left  = T2(VALUE_LIST);\n"
4331												"    const T2 const_right = T2(VALUE_LIST);\n"
4332												"\n"
4333												"    T1 const_result = function(const_left, const_right);\n"
4334												"\n"
4335												"    T1 literal_result = function(T2(VALUE_LIST), T2(VALUE_LIST));\n"
4336												"\n"
4337												"    T2 var_left  = uni_left;\n"
4338												"    T2 var_right = uni_right;\n"
4339												"\n"
4340												"    T1 var_result = function(var_left, var_right);\n"
4341												"\n"
4342												"    if ((literal_result != const_result) ||\n"
4343												"        (const_result   != var_result) )\n"
4344												"    {\n"
4345												"        result = vec4(1, 0, 0, 1);\n"
4346												"    }\n";
4347
4348	static const GLchar* compute_shader_template =
4349		"VERSION\n"
4350		"\n"
4351		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
4352		"\n"
4353		"writeonly uniform image2D uni_image;\n"
4354		"          uniform T2 uni_left;\n"
4355		"          uniform T2 uni_right;\n"
4356		"\n"
4357		"FUNCTION_DEFINITION"
4358		"\n"
4359		"void main()\n"
4360		"{\n"
4361		"    vec4 result = vec4(0, 1, 0, 1);\n"
4362		"\n"
4363		"VERIFICATION"
4364		"\n"
4365		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
4366		"}\n"
4367		"\n";
4368
4369	static const GLchar* fragment_shader_template = "VERSION\n"
4370													"\n"
4371													"in  vec4 gs_fs_result;\n"
4372													"out vec4 fs_out_result;\n"
4373													"uniform T2 uni_left;\n"
4374													"uniform T2 uni_right;\n"
4375													"\n"
4376													"FUNCTION_DEFINITION"
4377													"\n"
4378													"void main()\n"
4379													"{\n"
4380													"    vec4 result = vec4(0, 1, 0, 1);\n"
4381													"\n"
4382													"VERIFICATION"
4383													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
4384													"    {\n"
4385													"         result = vec4(1, 0, 0, 1);\n"
4386													"    }\n"
4387													"\n"
4388													"    fs_out_result = result;\n"
4389													"}\n"
4390													"\n";
4391
4392	static const GLchar* geometry_shader_template = "VERSION\n"
4393													"\n"
4394													"layout(points)                           in;\n"
4395													"layout(triangle_strip, max_vertices = 4) out;\n"
4396													"\n"
4397													"in  vec4 tes_gs_result[];\n"
4398													"out vec4 gs_fs_result;\n"
4399													"uniform T2 uni_left;\n"
4400													"uniform T2 uni_right;\n"
4401													"\n"
4402													"FUNCTION_DEFINITION"
4403													"\n"
4404													"void main()\n"
4405													"{\n"
4406													"    vec4 result = vec4(0, 1, 0, 1);\n"
4407													"\n"
4408													"VERIFICATION"
4409													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
4410													"    {\n"
4411													"         result = vec4(1, 0, 0, 1);\n"
4412													"    }\n"
4413													"\n"
4414													"    gs_fs_result = result;\n"
4415													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
4416													"    EmitVertex();\n"
4417													"    gs_fs_result = result;\n"
4418													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
4419													"    EmitVertex();\n"
4420													"    gs_fs_result = result;\n"
4421													"    gl_Position  = vec4(1, -1, 0, 1);\n"
4422													"    EmitVertex();\n"
4423													"    gs_fs_result = result;\n"
4424													"    gl_Position  = vec4(1, 1, 0, 1);\n"
4425													"    EmitVertex();\n"
4426													"}\n"
4427													"\n";
4428
4429	static const GLchar* tess_ctrl_shader_template =
4430		"VERSION\n"
4431		"\n"
4432		"layout(vertices = 1) out;\n"
4433		"\n"
4434		"in  vec4 vs_tcs_result[];\n"
4435		"out vec4 tcs_tes_result[];\n"
4436		"uniform T2 uni_left;\n"
4437		"uniform T2 uni_right;\n"
4438		"\n"
4439		"FUNCTION_DEFINITION"
4440		"\n"
4441		"void main()\n"
4442		"{\n"
4443		"    vec4 result = vec4(0, 1, 0, 1);\n"
4444		"\n"
4445		"VERIFICATION"
4446		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
4447		"    {\n"
4448		"         result = vec4(1, 0, 0, 1);\n"
4449		"    }\n"
4450		"\n"
4451		"    tcs_tes_result[gl_InvocationID] = result;\n"
4452		"\n"
4453		"    gl_TessLevelOuter[0] = 1.0;\n"
4454		"    gl_TessLevelOuter[1] = 1.0;\n"
4455		"    gl_TessLevelOuter[2] = 1.0;\n"
4456		"    gl_TessLevelOuter[3] = 1.0;\n"
4457		"    gl_TessLevelInner[0] = 1.0;\n"
4458		"    gl_TessLevelInner[1] = 1.0;\n"
4459		"}\n"
4460		"\n";
4461
4462	static const GLchar* tess_eval_shader_template = "VERSION\n"
4463													 "\n"
4464													 "layout(isolines, point_mode) in;\n"
4465													 "\n"
4466													 "in  vec4 tcs_tes_result[];\n"
4467													 "out vec4 tes_gs_result;\n"
4468													 "uniform T2 uni_left;\n"
4469													 "uniform T2 uni_right;\n"
4470													 "\n"
4471													 "FUNCTION_DEFINITION"
4472													 "\n"
4473													 "void main()\n"
4474													 "{\n"
4475													 "    vec4 result = vec4(0, 1, 0, 1);\n"
4476													 "\n"
4477													 "VERIFICATION"
4478													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
4479													 "    {\n"
4480													 "         result = vec4(1, 0, 0, 1);\n"
4481													 "    }\n"
4482													 "\n"
4483													 "    tes_gs_result = result;\n"
4484													 "}\n"
4485													 "\n";
4486
4487	static const GLchar* vertex_shader_template = "VERSION\n"
4488												  "\n"
4489												  "out vec4 vs_tcs_result;\n"
4490												  "uniform T2 uni_left;\n"
4491												  "uniform T2 uni_right;\n"
4492												  "\n"
4493												  "FUNCTION_DEFINITION"
4494												  "\n"
4495												  "void main()\n"
4496												  "{\n"
4497												  "    vec4 result = vec4(0, 1, 0, 1);\n"
4498												  "\n"
4499												  "VERIFICATION"
4500												  "\n"
4501												  "    vs_tcs_result = result;\n"
4502												  "}\n"
4503												  "\n";
4504
4505	const testCase&	test_case  = getCurrentTestCase();
4506	const GLchar*	  t1		  = Utils::getTypeName(test_case.m_types.m_t1, test_case.m_n_cols, test_case.m_n_rows);
4507	const GLchar*	  t2		  = Utils::getTypeName(test_case.m_types.m_t2, test_case.m_n_cols, test_case.m_n_rows);
4508	const std::string& value_list = getValueList(test_case.m_n_cols, test_case.m_n_rows);
4509	const GLchar*	  shader_template = 0;
4510
4511	switch (in_stage)
4512	{
4513	case Utils::COMPUTE_SHADER:
4514		shader_template = compute_shader_template;
4515		break;
4516	case Utils::FRAGMENT_SHADER:
4517		shader_template = fragment_shader_template;
4518		break;
4519	case Utils::GEOMETRY_SHADER:
4520		shader_template = geometry_shader_template;
4521		break;
4522	case Utils::TESS_CTRL_SHADER:
4523		shader_template = tess_ctrl_shader_template;
4524		break;
4525	case Utils::TESS_EVAL_SHADER:
4526		shader_template = tess_eval_shader_template;
4527		break;
4528	case Utils::VERTEX_SHADER:
4529		shader_template = vertex_shader_template;
4530		break;
4531	default:
4532		TCU_FAIL("Invalid enum");
4533	}
4534
4535	out_source.m_parts[0].m_code = shader_template;
4536
4537	size_t position = 0;
4538	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
4539						out_source.m_parts[0].m_code);
4540
4541	Utils::replaceToken("FUNCTION_DEFINITION", position, function_definition, out_source.m_parts[0].m_code);
4542
4543	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
4544
4545	Utils::replaceAllTokens("VALUE_LIST", value_list.c_str(), out_source.m_parts[0].m_code);
4546
4547	Utils::replaceAllTokens("T1", t1, out_source.m_parts[0].m_code);
4548
4549	Utils::replaceAllTokens("T2", t2, out_source.m_parts[0].m_code);
4550}
4551
4552/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
4553 *
4554 * @param program Current program
4555 **/
4556void ImplicitConversionsValidTest::prepareUniforms(Utils::program& program)
4557{
4558	static const GLdouble double_data[16] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
4559											  1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
4560	static const GLfloat float_data[16] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
4561											1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
4562	static const GLint  int_data[4]  = { 1, 1, 1, 1 };
4563	static const GLuint uint_data[4] = { 1u, 1u, 1u, 1u };
4564
4565	const testCase& test_case = getCurrentTestCase();
4566
4567	switch (test_case.m_types.m_t2)
4568	{
4569	case Utils::DOUBLE:
4570		program.uniform("uni_left", Utils::DOUBLE, test_case.m_n_cols, test_case.m_n_rows, double_data);
4571		program.uniform("uni_right", Utils::DOUBLE, test_case.m_n_cols, test_case.m_n_rows, double_data);
4572		break;
4573	case Utils::FLOAT:
4574		program.uniform("uni_left", Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows, float_data);
4575		program.uniform("uni_right", Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows, float_data);
4576		break;
4577	case Utils::INT:
4578		program.uniform("uni_left", Utils::INT, test_case.m_n_cols, test_case.m_n_rows, int_data);
4579		program.uniform("uni_right", Utils::INT, test_case.m_n_cols, test_case.m_n_rows, int_data);
4580		break;
4581	case Utils::UINT:
4582		program.uniform("uni_left", Utils::UINT, test_case.m_n_cols, test_case.m_n_rows, uint_data);
4583		program.uniform("uni_right", Utils::UINT, test_case.m_n_cols, test_case.m_n_rows, uint_data);
4584		break;
4585	default:
4586		TCU_FAIL("Invalid enum");
4587	}
4588}
4589
4590/** Prepare test cases
4591 *
4592 * @return true
4593 **/
4594bool ImplicitConversionsValidTest::testInit()
4595{
4596	static const typesPair allowed_conversions[] = {
4597		{ Utils::UINT, Utils::INT },   { Utils::FLOAT, Utils::INT },   { Utils::DOUBLE, Utils::INT },
4598		{ Utils::FLOAT, Utils::UINT }, { Utils::DOUBLE, Utils::UINT }, { Utils::FLOAT, Utils::FLOAT },
4599	};
4600
4601	static GLuint n_allowed_conversions = sizeof(allowed_conversions) / sizeof(typesPair);
4602
4603	m_debug_test_case.m_types.m_t1 = Utils::FLOAT;
4604	m_debug_test_case.m_types.m_t2 = Utils::FLOAT;
4605	m_debug_test_case.m_n_cols	 = 4;
4606	m_debug_test_case.m_n_rows	 = 4;
4607
4608	for (GLuint i = 0; i < n_allowed_conversions; ++i)
4609	{
4610		const typesPair& types = allowed_conversions[i];
4611
4612		GLuint allowed_columns = 1;
4613		if ((true == Utils::doesTypeSupportMatrix(types.m_t1)) && (true == Utils::doesTypeSupportMatrix(types.m_t2)))
4614		{
4615			allowed_columns = 4;
4616		}
4617
4618		{
4619			testCase test_case = { types, 1, 1 };
4620
4621			m_test_cases.push_back(test_case);
4622		}
4623
4624		for (GLuint row = 2; row <= 4; ++row)
4625		{
4626			for (GLuint col = 1; col <= allowed_columns; ++col)
4627			{
4628				testCase test_case = { types, col, row };
4629
4630				m_test_cases.push_back(test_case);
4631			}
4632		}
4633	}
4634
4635	return true;
4636}
4637
4638/** Returns reference to current test case
4639 *
4640 * @return Reference to testCase
4641 **/
4642const ImplicitConversionsValidTest::testCase& ImplicitConversionsValidTest::getCurrentTestCase()
4643{
4644	if ((glw::GLuint)-1 == m_current_test_case_index)
4645	{
4646		return m_debug_test_case;
4647	}
4648	else
4649	{
4650		return m_test_cases[m_current_test_case_index];
4651	}
4652}
4653
4654/** Get list of values to for glsl constants
4655 *
4656 * @param n_columns Number of columns
4657 * @param n_rows    Number of rows
4658 *
4659 * @return String with list of values separated with comma
4660 **/
4661std::string ImplicitConversionsValidTest::getValueList(glw::GLuint n_columns, glw::GLuint n_rows)
4662{
4663	std::string result;
4664
4665	for (GLuint i = 0; i < n_columns * n_rows; ++i)
4666	{
4667		if (i != n_columns * n_rows - 1)
4668		{
4669			result.append("1, ");
4670		}
4671		else
4672		{
4673			result.append("1");
4674		}
4675	}
4676
4677	return result;
4678}
4679
4680/** Constructor
4681 *
4682 * @param context Test context
4683 **/
4684ImplicitConversionsInvalidTest::ImplicitConversionsInvalidTest(deqp::Context& context)
4685	: NegativeTestBase(context, "implicit_conversions_invalid",
4686					   "Verifies that implicit conversions from uint to int are forbidden")
4687	, m_current_test_case_index(0)
4688{
4689	/* Nothing to be done here */
4690}
4691
4692/** Set up next test case
4693 *
4694 * @param test_case_index Index of next test case
4695 *
4696 * @return false if there is no more test cases, true otherwise
4697 **/
4698bool ImplicitConversionsInvalidTest::prepareNextTestCase(glw::GLuint test_case_index)
4699{
4700	m_current_test_case_index = test_case_index;
4701
4702	if ((glw::GLuint)-1 == test_case_index)
4703	{
4704		return false;
4705	}
4706	else if (4 <= test_case_index)
4707	{
4708		return false;
4709	}
4710
4711	m_context.getTestContext().getLog() << tcu::TestLog::Message
4712										<< "T1:" << Utils::getTypeName(Utils::UINT, 1, test_case_index + 1)
4713										<< " T2:" << Utils::getTypeName(Utils::INT, 1, test_case_index + 1)
4714										<< tcu::TestLog::EndMessage;
4715
4716	return true;
4717}
4718
4719/** Prepare source for given shader stage
4720 *
4721 * @param in_stage           Shader stage, compute shader will use 430
4722 * @param in_use_version_400 Select if 400 or 420 should be used
4723 * @param out_source         Prepared shader source instance
4724 **/
4725void ImplicitConversionsInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
4726														 Utils::shaderSource& out_source)
4727{
4728	static const GLchar* function_definition = "T1 function(in T2 left, in T2 right)\n"
4729											   "{\n"
4730											   "    return left + right;\n"
4731											   "}\n";
4732
4733	static const GLchar* verification_snippet = "    const T2 const_left  = T2(VALUE_LIST);\n"
4734												"    const T2 const_right = T2(VALUE_LIST);\n"
4735												"\n"
4736												"    T1 const_result = function(const_left, const_right);\n"
4737												"\n"
4738												"    T1 literal_result = function(T2(VALUE_LIST), T2(VALUE_LIST));\n"
4739												"\n"
4740												"    T2 var_left  = uni_left;\n"
4741												"    T2 var_right = uni_right;\n"
4742												"\n"
4743												"    T1 var_result = function(var_left, var_right);\n"
4744												"\n"
4745												"    if ((literal_result != const_result) ||\n"
4746												"        (const_result   != var_result) )\n"
4747												"    {\n"
4748												"        result = vec4(1, 0, 0, 1);\n"
4749												"    }\n";
4750
4751	static const GLchar* compute_shader_template =
4752		"VERSION\n"
4753		"\n"
4754		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
4755		"\n"
4756		"writeonly uniform image2D uni_image;\n"
4757		"          uniform T2 uni_left;\n"
4758		"          uniform T2 uni_right;\n"
4759		"\n"
4760		"FUNCTION_DEFINITION"
4761		"\n"
4762		"void main()\n"
4763		"{\n"
4764		"    vec4 result = vec4(0, 1, 0, 1);\n"
4765		"\n"
4766		"VERIFICATION"
4767		"\n"
4768		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
4769		"}\n"
4770		"\n";
4771
4772	static const GLchar* fragment_shader_template = "VERSION\n"
4773													"\n"
4774													"in  vec4 gs_fs_result;\n"
4775													"out vec4 fs_out_result;\n"
4776													"uniform T2 uni_left;\n"
4777													"uniform T2 uni_right;\n"
4778													"\n"
4779													"FUNCTION_DEFINITION"
4780													"\n"
4781													"void main()\n"
4782													"{\n"
4783													"    vec4 result = vec4(0, 1, 0, 1);\n"
4784													"\n"
4785													"VERIFICATION"
4786													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
4787													"    {\n"
4788													"         result = vec4(1, 0, 0, 1);\n"
4789													"    }\n"
4790													"\n"
4791													"    fs_out_result = result;\n"
4792													"}\n"
4793													"\n";
4794
4795	static const GLchar* geometry_shader_template = "VERSION\n"
4796													"\n"
4797													"layout(points)                           in;\n"
4798													"layout(triangle_strip, max_vertices = 4) out;\n"
4799													"\n"
4800													"in  vec4 tes_gs_result[];\n"
4801													"out vec4 gs_fs_result;\n"
4802													"uniform T2 uni_left;\n"
4803													"uniform T2 uni_right;\n"
4804													"\n"
4805													"FUNCTION_DEFINITION"
4806													"\n"
4807													"void main()\n"
4808													"{\n"
4809													"    vec4 result = vec4(0, 1, 0, 1);\n"
4810													"\n"
4811													"VERIFICATION"
4812													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
4813													"    {\n"
4814													"         result = vec4(1, 0, 0, 1);\n"
4815													"    }\n"
4816													"\n"
4817													"    gs_fs_result = result;\n"
4818													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
4819													"    EmitVertex();\n"
4820													"    gs_fs_result = result;\n"
4821													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
4822													"    EmitVertex();\n"
4823													"    gs_fs_result = result;\n"
4824													"    gl_Position  = vec4(1, -1, 0, 1);\n"
4825													"    EmitVertex();\n"
4826													"    gs_fs_result = result;\n"
4827													"    gl_Position  = vec4(1, 1, 0, 1);\n"
4828													"    EmitVertex();\n"
4829													"}\n"
4830													"\n";
4831
4832	static const GLchar* tess_ctrl_shader_template =
4833		"VERSION\n"
4834		"\n"
4835		"layout(vertices = 1) out;\n"
4836		"\n"
4837		"in  vec4 vs_tcs_result[];\n"
4838		"out vec4 tcs_tes_result[];\n"
4839		"uniform T2 uni_left;\n"
4840		"uniform T2 uni_right;\n"
4841		"\n"
4842		"FUNCTION_DEFINITION"
4843		"\n"
4844		"void main()\n"
4845		"{\n"
4846		"    vec4 result = vec4(0, 1, 0, 1);\n"
4847		"\n"
4848		"VERIFICATION"
4849		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
4850		"    {\n"
4851		"         result = vec4(1, 0, 0, 1);\n"
4852		"    }\n"
4853		"\n"
4854		"    tcs_tes_result[gl_InvocationID] = result;\n"
4855		"\n"
4856		"    gl_TessLevelOuter[0] = 1.0;\n"
4857		"    gl_TessLevelOuter[1] = 1.0;\n"
4858		"    gl_TessLevelOuter[2] = 1.0;\n"
4859		"    gl_TessLevelOuter[3] = 1.0;\n"
4860		"    gl_TessLevelInner[0] = 1.0;\n"
4861		"    gl_TessLevelInner[1] = 1.0;\n"
4862		"}\n"
4863		"\n";
4864
4865	static const GLchar* tess_eval_shader_template = "VERSION\n"
4866													 "\n"
4867													 "layout(isolines, point_mode) in;\n"
4868													 "\n"
4869													 "in  vec4 tcs_tes_result[];\n"
4870													 "out vec4 tes_gs_result;\n"
4871													 "uniform T2 uni_left;\n"
4872													 "uniform T2 uni_right;\n"
4873													 "\n"
4874													 "FUNCTION_DEFINITION"
4875													 "\n"
4876													 "void main()\n"
4877													 "{\n"
4878													 "    vec4 result = vec4(0, 1, 0, 1);\n"
4879													 "\n"
4880													 "VERIFICATION"
4881													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
4882													 "    {\n"
4883													 "         result = vec4(1, 0, 0, 1);\n"
4884													 "    }\n"
4885													 "\n"
4886													 "    tes_gs_result = result;\n"
4887													 "}\n"
4888													 "\n";
4889
4890	static const GLchar* vertex_shader_template = "VERSION\n"
4891												  "\n"
4892												  "out vec4 vs_tcs_result;\n"
4893												  "uniform T2 uni_left;\n"
4894												  "uniform T2 uni_right;\n"
4895												  "\n"
4896												  "FUNCTION_DEFINITION"
4897												  "\n"
4898												  "void main()\n"
4899												  "{\n"
4900												  "    vec4 result = vec4(0, 1, 0, 1);\n"
4901												  "\n"
4902												  "VERIFICATION"
4903												  "\n"
4904												  "    vs_tcs_result = result;\n"
4905												  "}\n"
4906												  "\n";
4907
4908	GLuint			   n_rows		   = m_current_test_case_index + 1;
4909	const GLchar*	  t1			   = Utils::getTypeName(Utils::INT, 1, n_rows);
4910	const GLchar*	  t2			   = Utils::getTypeName(Utils::UINT, 1, n_rows);
4911	const std::string& value_list	  = getValueList(n_rows);
4912	const GLchar*	  shader_template = 0;
4913
4914	switch (in_stage)
4915	{
4916	case Utils::COMPUTE_SHADER:
4917		shader_template = compute_shader_template;
4918		break;
4919	case Utils::FRAGMENT_SHADER:
4920		shader_template = fragment_shader_template;
4921		break;
4922	case Utils::GEOMETRY_SHADER:
4923		shader_template = geometry_shader_template;
4924		break;
4925	case Utils::TESS_CTRL_SHADER:
4926		shader_template = tess_ctrl_shader_template;
4927		break;
4928	case Utils::TESS_EVAL_SHADER:
4929		shader_template = tess_eval_shader_template;
4930		break;
4931	case Utils::VERTEX_SHADER:
4932		shader_template = vertex_shader_template;
4933		break;
4934	default:
4935		TCU_FAIL("Invalid enum");
4936	}
4937
4938	out_source.m_parts[0].m_code = shader_template;
4939
4940	size_t position = 0;
4941	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
4942						out_source.m_parts[0].m_code);
4943
4944	Utils::replaceToken("FUNCTION_DEFINITION", position, function_definition, out_source.m_parts[0].m_code);
4945
4946	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
4947
4948	Utils::replaceAllTokens("VALUE_LIST", value_list.c_str(), out_source.m_parts[0].m_code);
4949
4950	Utils::replaceAllTokens("T1", t1, out_source.m_parts[0].m_code);
4951
4952	Utils::replaceAllTokens("T2", t2, out_source.m_parts[0].m_code);
4953}
4954
4955/** Get list of values to for glsl constants
4956 *
4957 * @return String with list of values separated with comma
4958 **/
4959std::string ImplicitConversionsInvalidTest::getValueList(glw::GLuint n_rows)
4960{
4961	std::string result;
4962
4963	for (GLuint i = 0; i < n_rows; ++i)
4964	{
4965		if (i != n_rows - 1)
4966		{
4967			result.append("1, ");
4968		}
4969		else
4970		{
4971			result.append("1");
4972		}
4973	}
4974
4975	return result;
4976}
4977
4978/** Constructor
4979 *
4980 * @param context Test context
4981 **/
4982ConstDynamicValueTest::ConstDynamicValueTest(deqp::Context& context)
4983	: GLSLTestBase(context, "const_dynamic_value", "Test if constants can be initialized with dynamic values")
4984{
4985	/* Nothing to be done here */
4986}
4987
4988/** Prepare source for given shader stage
4989 *
4990 * @param in_stage           Shader stage, compute shader will use 430
4991 * @param in_use_version_400 Select if 400 or 420 should be used
4992 * @param out_source         Prepared shader source instance
4993 **/
4994void ConstDynamicValueTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
4995												Utils::shaderSource& out_source)
4996{
4997	static const GLchar* struct_definition = "struct S {\n"
4998											 "    float scalar;\n"
4999											 "    vec4  vector;\n"
5000											 "    mat2  matrix;\n"
5001											 "};\n";
5002
5003	static const GLchar* verification_snippet = "    const float c1     = uni_scalar;\n"
5004												"    const vec4  c2     = uni_vector;\n"
5005												"    const mat2  c3     = uni_matrix;\n"
5006												"    const S     c4     = { uni_scalar, uni_vector, uni_matrix };\n"
5007												"    const vec4  c5[15] = { uni_vector,\n"
5008												"                           uni_vector,\n"
5009												"                           uni_vector,\n"
5010												"                           uni_vector,\n"
5011												"                           uni_vector,\n"
5012												"                           uni_vector,\n"
5013												"                           uni_vector,\n"
5014												"                           uni_vector,\n"
5015												"                           uni_vector,\n"
5016												"                           uni_vector,\n"
5017												"                           uni_vector,\n"
5018												"                           uni_vector,\n"
5019												"                           uni_vector,\n"
5020												"                           uni_vector,\n"
5021												"                           uni_vector };\n"
5022												"    if ((SCALAR != c1)        ||\n"
5023												"        (VECTOR != c2)        ||\n"
5024												"        (MATRIX != c3)        ||\n"
5025												"        (SCALAR != c4.scalar) ||\n"
5026												"        (VECTOR != c4.vector) ||\n"
5027												"        (MATRIX != c4.matrix) ||\n"
5028												"        (VECTOR != c5[0])     ||\n"
5029												"        (VECTOR != c5[1])     ||\n"
5030												"        (VECTOR != c5[2])     ||\n"
5031												"        (VECTOR != c5[3])     ||\n"
5032												"        (VECTOR != c5[4])     ||\n"
5033												"        (VECTOR != c5[5])     ||\n"
5034												"        (VECTOR != c5[6])     ||\n"
5035												"        (VECTOR != c5[7])     ||\n"
5036												"        (VECTOR != c5[8])     ||\n"
5037												"        (VECTOR != c5[9])     ||\n"
5038												"        (VECTOR != c5[10])    ||\n"
5039												"        (VECTOR != c5[11])    ||\n"
5040												"        (VECTOR != c5[12])    ||\n"
5041												"        (VECTOR != c5[13])    ||\n"
5042												"        (VECTOR != c5[14])    )\n"
5043												"    {\n"
5044												"        result = vec4(1, 0, 0, 1);\n"
5045												"    }\n";
5046
5047	static const GLchar* compute_shader_template =
5048		"VERSION\n"
5049		"\n"
5050		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
5051		"\n"
5052		"writeonly uniform image2D uni_image;\n"
5053		"          uniform float uni_scalar;\n"
5054		"          uniform vec4  uni_vector;\n"
5055		"          uniform mat2  uni_matrix;\n"
5056		"\n"
5057		"STRUCTURE_DEFINITION"
5058		"\n"
5059		"void main()\n"
5060		"{\n"
5061		"    vec4 result = vec4(0, 1, 0, 1);\n"
5062		"\n"
5063		"VERIFICATION"
5064		"\n"
5065		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
5066		"}\n"
5067		"\n";
5068
5069	static const GLchar* fragment_shader_template = "VERSION\n"
5070													"\n"
5071													"in  vec4 gs_fs_result;\n"
5072													"out vec4 fs_out_result;\n"
5073													"uniform float uni_scalar;\n"
5074													"uniform vec4  uni_vector;\n"
5075													"uniform mat2  uni_matrix;\n"
5076													"\n"
5077													"STRUCTURE_DEFINITION"
5078													"\n"
5079													"void main()\n"
5080													"{\n"
5081													"    vec4 result = vec4(0, 1, 0, 1);\n"
5082													"\n"
5083													"VERIFICATION"
5084													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
5085													"    {\n"
5086													"         result = vec4(1, 0, 0, 1);\n"
5087													"    }\n"
5088													"\n"
5089													"    fs_out_result = result;\n"
5090													"}\n"
5091													"\n";
5092
5093	static const GLchar* geometry_shader_template = "VERSION\n"
5094													"\n"
5095													"layout(points)                           in;\n"
5096													"layout(triangle_strip, max_vertices = 4) out;\n"
5097													"\n"
5098													"in  vec4 tes_gs_result[];\n"
5099													"out vec4 gs_fs_result;\n"
5100													"uniform float uni_scalar;\n"
5101													"uniform vec4  uni_vector;\n"
5102													"uniform mat2  uni_matrix;\n"
5103													"\n"
5104													"STRUCTURE_DEFINITION"
5105													"\n"
5106													"void main()\n"
5107													"{\n"
5108													"    vec4 result = vec4(0, 1, 0, 1);\n"
5109													"\n"
5110													"VERIFICATION"
5111													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
5112													"    {\n"
5113													"         result = vec4(1, 0, 0, 1);\n"
5114													"    }\n"
5115													"\n"
5116													"    gs_fs_result = result;\n"
5117													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
5118													"    EmitVertex();\n"
5119													"    gs_fs_result = result;\n"
5120													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
5121													"    EmitVertex();\n"
5122													"    gs_fs_result = result;\n"
5123													"    gl_Position  = vec4(1, -1, 0, 1);\n"
5124													"    EmitVertex();\n"
5125													"    gs_fs_result = result;\n"
5126													"    gl_Position  = vec4(1, 1, 0, 1);\n"
5127													"    EmitVertex();\n"
5128													"}\n"
5129													"\n";
5130
5131	static const GLchar* tess_ctrl_shader_template =
5132		"VERSION\n"
5133		"\n"
5134		"layout(vertices = 1) out;\n"
5135		"\n"
5136		"in  vec4 vs_tcs_result[];\n"
5137		"out vec4 tcs_tes_result[];\n"
5138		"uniform float uni_scalar;\n"
5139		"uniform vec4  uni_vector;\n"
5140		"uniform mat2  uni_matrix;\n"
5141		"\n"
5142		"STRUCTURE_DEFINITION"
5143		"\n"
5144		"void main()\n"
5145		"{\n"
5146		"    vec4 result = vec4(0, 1, 0, 1);\n"
5147		"\n"
5148		"VERIFICATION"
5149		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
5150		"    {\n"
5151		"         result = vec4(1, 0, 0, 1);\n"
5152		"    }\n"
5153		"\n"
5154		"    tcs_tes_result[gl_InvocationID] = result;\n"
5155		"\n"
5156		"    gl_TessLevelOuter[0] = 1.0;\n"
5157		"    gl_TessLevelOuter[1] = 1.0;\n"
5158		"    gl_TessLevelOuter[2] = 1.0;\n"
5159		"    gl_TessLevelOuter[3] = 1.0;\n"
5160		"    gl_TessLevelInner[0] = 1.0;\n"
5161		"    gl_TessLevelInner[1] = 1.0;\n"
5162		"}\n"
5163		"\n";
5164
5165	static const GLchar* tess_eval_shader_template = "VERSION\n"
5166													 "\n"
5167													 "layout(isolines, point_mode) in;\n"
5168													 "\n"
5169													 "in  vec4 tcs_tes_result[];\n"
5170													 "out vec4 tes_gs_result;\n"
5171													 "uniform float uni_scalar;\n"
5172													 "uniform vec4  uni_vector;\n"
5173													 "uniform mat2  uni_matrix;\n"
5174													 "\n"
5175													 "STRUCTURE_DEFINITION"
5176													 "\n"
5177													 "void main()\n"
5178													 "{\n"
5179													 "    vec4 result = vec4(0, 1, 0, 1);\n"
5180													 "\n"
5181													 "VERIFICATION"
5182													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
5183													 "    {\n"
5184													 "         result = vec4(1, 0, 0, 1);\n"
5185													 "    }\n"
5186													 "\n"
5187													 "    tes_gs_result = result;\n"
5188													 "}\n"
5189													 "\n";
5190
5191	static const GLchar* vertex_shader_template = "VERSION\n"
5192												  "\n"
5193												  "out vec4 vs_tcs_result;\n"
5194												  "uniform float uni_scalar;\n"
5195												  "uniform vec4  uni_vector;\n"
5196												  "uniform mat2  uni_matrix;\n"
5197												  "\n"
5198												  "STRUCTURE_DEFINITION"
5199												  "\n"
5200												  "void main()\n"
5201												  "{\n"
5202												  "    vec4 result = vec4(0, 1, 0, 1);\n"
5203												  "\n"
5204												  "VERIFICATION"
5205												  "\n"
5206												  "    vs_tcs_result = result;\n"
5207												  "}\n"
5208												  "\n";
5209
5210	static const GLchar* scalar = "0.5";
5211	static const GLchar* vector = "vec4(0.5, 0.125, 0.375, 0)";
5212	static const GLchar* matrix = "mat2(0.5, 0.125, 0.375, 0)";
5213
5214	const GLchar* shader_template = 0;
5215
5216	switch (in_stage)
5217	{
5218	case Utils::COMPUTE_SHADER:
5219		shader_template = compute_shader_template;
5220		break;
5221	case Utils::FRAGMENT_SHADER:
5222		shader_template = fragment_shader_template;
5223		break;
5224	case Utils::GEOMETRY_SHADER:
5225		shader_template = geometry_shader_template;
5226		break;
5227	case Utils::TESS_CTRL_SHADER:
5228		shader_template = tess_ctrl_shader_template;
5229		break;
5230	case Utils::TESS_EVAL_SHADER:
5231		shader_template = tess_eval_shader_template;
5232		break;
5233	case Utils::VERTEX_SHADER:
5234		shader_template = vertex_shader_template;
5235		break;
5236	default:
5237		TCU_FAIL("Invalid enum");
5238	}
5239
5240	out_source.m_parts[0].m_code = shader_template;
5241
5242	size_t position = 0;
5243	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
5244						out_source.m_parts[0].m_code);
5245
5246	Utils::replaceToken("STRUCTURE_DEFINITION", position, struct_definition, out_source.m_parts[0].m_code);
5247
5248	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
5249
5250	Utils::replaceAllTokens("SCALAR", scalar, out_source.m_parts[0].m_code);
5251
5252	Utils::replaceAllTokens("VECTOR", vector, out_source.m_parts[0].m_code);
5253
5254	Utils::replaceAllTokens("MATRIX", matrix, out_source.m_parts[0].m_code);
5255}
5256
5257/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
5258 *
5259 * @param program Current program
5260 **/
5261void ConstDynamicValueTest::prepareUniforms(Utils::program& program)
5262{
5263	static const GLfloat float_data[4] = { 0.5f, 0.125f, 0.375f, 0.0f };
5264	static const GLfloat scalar		   = 0.5f;
5265
5266	program.uniform("uni_scalar", Utils::FLOAT, 1, 1, &scalar);
5267	program.uniform("uni_vector", Utils::FLOAT, 1, 4, float_data);
5268	program.uniform("uni_matrix", Utils::FLOAT, 2, 2, float_data);
5269}
5270
5271/** Constructor
5272 *
5273 * @param context Test context
5274 **/
5275ConstAssignmentTest::ConstAssignmentTest(deqp::Context& context)
5276	: NegativeTestBase(context, "const_assignment", "Verifies that constants cannot be overwritten")
5277	, m_current_test_case_index(0)
5278{
5279	/* Nothing to be done here */
5280}
5281
5282/** Set up next test case
5283 *
5284 * @param test_case_index Index of next test case
5285 *
5286 * @return false if there is no more test cases, true otherwise
5287 **/
5288bool ConstAssignmentTest::prepareNextTestCase(glw::GLuint test_case_index)
5289{
5290	m_current_test_case_index = test_case_index;
5291
5292	if ((glw::GLuint)-1 == test_case_index)
5293	{
5294		return true;
5295	}
5296	else if (2 <= test_case_index)
5297	{
5298		return false;
5299	}
5300
5301	return true;
5302}
5303
5304/** Prepare source for given shader stage
5305 *
5306 * @param in_stage           Shader stage, compute shader will use 430
5307 * @param in_use_version_400 Select if 400 or 420 should be used
5308 * @param out_source         Prepared shader source instance
5309 **/
5310void ConstAssignmentTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
5311											  Utils::shaderSource& out_source)
5312{
5313	static const GLchar* verification_snippet = "    const float c1 = INIT;\n"
5314												"\n"
5315												"    float temp = c1;\n"
5316												"\n"
5317												"    for (uint i = 0; i < 4; ++i)"
5318												"    {\n"
5319												"        temp += c1 + uni_value;\n"
5320												"        c1 -= 0.125;\n"
5321												"    }\n"
5322												"\n"
5323												"    if (0.0 == temp)\n"
5324												"    {\n"
5325												"        result = vec4(1, 0, 0, 1);\n"
5326												"    }\n";
5327
5328	static const GLchar* compute_shader_template =
5329		"VERSION\n"
5330		"\n"
5331		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
5332		"\n"
5333		"writeonly uniform image2D uni_image;\n"
5334		"          uniform float uni_value;\n"
5335		"\n"
5336		"void main()\n"
5337		"{\n"
5338		"    vec4 result = vec4(0, 1, 0, 1);\n"
5339		"\n"
5340		"VERIFICATION"
5341		"\n"
5342		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
5343		"}\n"
5344		"\n";
5345
5346	static const GLchar* fragment_shader_template = "VERSION\n"
5347													"\n"
5348													"in  vec4 gs_fs_result;\n"
5349													"out vec4 fs_out_result;\n"
5350													"uniform float uni_value;\n"
5351													"\n"
5352													"void main()\n"
5353													"{\n"
5354													"    vec4 result = vec4(0, 1, 0, 1);\n"
5355													"\n"
5356													"VERIFICATION"
5357													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
5358													"    {\n"
5359													"         result = vec4(1, 0, 0, 1);\n"
5360													"    }\n"
5361													"\n"
5362													"    fs_out_result = result;\n"
5363													"}\n"
5364													"\n";
5365
5366	static const GLchar* geometry_shader_template = "VERSION\n"
5367													"\n"
5368													"layout(points)                           in;\n"
5369													"layout(triangle_strip, max_vertices = 4) out;\n"
5370													"\n"
5371													"in  vec4 tes_gs_result[];\n"
5372													"out vec4 gs_fs_result;\n"
5373													"uniform float uni_value;\n"
5374													"\n"
5375													"void main()\n"
5376													"{\n"
5377													"    vec4 result = vec4(0, 1, 0, 1);\n"
5378													"\n"
5379													"VERIFICATION"
5380													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
5381													"    {\n"
5382													"         result = vec4(1, 0, 0, 1);\n"
5383													"    }\n"
5384													"\n"
5385													"    gs_fs_result = result;\n"
5386													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
5387													"    EmitVertex();\n"
5388													"    gs_fs_result = result;\n"
5389													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
5390													"    EmitVertex();\n"
5391													"    gs_fs_result = result;\n"
5392													"    gl_Position  = vec4(1, -1, 0, 1);\n"
5393													"    EmitVertex();\n"
5394													"    gs_fs_result = result;\n"
5395													"    gl_Position  = vec4(1, 1, 0, 1);\n"
5396													"    EmitVertex();\n"
5397													"}\n"
5398													"\n";
5399
5400	static const GLchar* tess_ctrl_shader_template =
5401		"VERSION\n"
5402		"\n"
5403		"layout(vertices = 1) out;\n"
5404		"\n"
5405		"in  vec4 vs_tcs_result[];\n"
5406		"out vec4 tcs_tes_result[];\n"
5407		"uniform float uni_value;\n"
5408		"\n"
5409		"void main()\n"
5410		"{\n"
5411		"    vec4 result = vec4(0, 1, 0, 1);\n"
5412		"\n"
5413		"VERIFICATION"
5414		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
5415		"    {\n"
5416		"         result = vec4(1, 0, 0, 1);\n"
5417		"    }\n"
5418		"\n"
5419		"    tcs_tes_result[gl_InvocationID] = result;\n"
5420		"\n"
5421		"    gl_TessLevelOuter[0] = 1.0;\n"
5422		"    gl_TessLevelOuter[1] = 1.0;\n"
5423		"    gl_TessLevelOuter[2] = 1.0;\n"
5424		"    gl_TessLevelOuter[3] = 1.0;\n"
5425		"    gl_TessLevelInner[0] = 1.0;\n"
5426		"    gl_TessLevelInner[1] = 1.0;\n"
5427		"}\n"
5428		"\n";
5429
5430	static const GLchar* tess_eval_shader_template = "VERSION\n"
5431													 "\n"
5432													 "layout(isolines, point_mode) in;\n"
5433													 "\n"
5434													 "in  vec4 tcs_tes_result[];\n"
5435													 "out vec4 tes_gs_result;\n"
5436													 "uniform float uni_value;\n"
5437													 "\n"
5438													 "void main()\n"
5439													 "{\n"
5440													 "    vec4 result = vec4(0, 1, 0, 1);\n"
5441													 "\n"
5442													 "VERIFICATION"
5443													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
5444													 "    {\n"
5445													 "         result = vec4(1, 0, 0, 1);\n"
5446													 "    }\n"
5447													 "\n"
5448													 "    tes_gs_result = result;\n"
5449													 "}\n"
5450													 "\n";
5451
5452	static const GLchar* vertex_shader_template = "VERSION\n"
5453												  "\n"
5454												  "out vec4 vs_tcs_result;\n"
5455												  "uniform float uni_value;\n"
5456												  "\n"
5457												  "void main()\n"
5458												  "{\n"
5459												  "    vec4 result = vec4(0, 1, 0, 1);\n"
5460												  "\n"
5461												  "VERIFICATION"
5462												  "\n"
5463												  "    vs_tcs_result = result;\n"
5464												  "}\n"
5465												  "\n";
5466
5467	static const GLchar* dynamic_init = "uni_value";
5468	static const GLchar* const_init   = "0.75";
5469
5470	const GLchar* shader_template = 0;
5471	const GLchar* l_init		  = 0;
5472
5473	switch (in_stage)
5474	{
5475	case Utils::COMPUTE_SHADER:
5476		shader_template = compute_shader_template;
5477		break;
5478	case Utils::FRAGMENT_SHADER:
5479		shader_template = fragment_shader_template;
5480		break;
5481	case Utils::GEOMETRY_SHADER:
5482		shader_template = geometry_shader_template;
5483		break;
5484	case Utils::TESS_CTRL_SHADER:
5485		shader_template = tess_ctrl_shader_template;
5486		break;
5487	case Utils::TESS_EVAL_SHADER:
5488		shader_template = tess_eval_shader_template;
5489		break;
5490	case Utils::VERTEX_SHADER:
5491		shader_template = vertex_shader_template;
5492		break;
5493	default:
5494		TCU_FAIL("Invalid enum");
5495	}
5496
5497	if (0 == m_current_test_case_index)
5498	{
5499		l_init = dynamic_init;
5500	}
5501	else
5502	{
5503		l_init = const_init;
5504	}
5505
5506	out_source.m_parts[0].m_code = shader_template;
5507
5508	size_t position = 0;
5509	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
5510						out_source.m_parts[0].m_code);
5511
5512	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
5513
5514	Utils::replaceAllTokens("INIT", l_init, out_source.m_parts[0].m_code);
5515}
5516
5517/** Constructor
5518 *
5519 * @param context Test context
5520 **/
5521ConstDynamicValueAsConstExprTest::ConstDynamicValueAsConstExprTest(deqp::Context& context)
5522	: NegativeTestBase(context, "const_dynamic_value_as_const_expr",
5523					   "Verifies that dynamic constants cannot be used as constant foldable expressions")
5524{
5525	/* Nothing to be done here */
5526}
5527
5528/** Prepare source for given shader stage
5529 *
5530 * @param in_stage           Shader stage, compute shader will use 430
5531 * @param in_use_version_400 Select if 400 or 420 should be used
5532 * @param out_source         Prepared shader source instance
5533 **/
5534void ConstDynamicValueAsConstExprTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
5535														   Utils::shaderSource& out_source)
5536{
5537	static const GLchar* verification_snippet = "    const uint c1 = INIT;\n"
5538												"\n"
5539												"    float temp[c1];\n"
5540												"\n"
5541												"    for (uint i = 0; i < c1; ++i)"
5542												"    {\n"
5543												"        temp[i] += uni_value;\n"
5544												"    }\n"
5545												"\n"
5546												"    if (0.0 == temp[c1 - 1])\n"
5547												"    {\n"
5548												"        result = vec4(1, 0, 0, 1);\n"
5549												"    }\n";
5550
5551	static const GLchar* compute_shader_template =
5552		"VERSION\n"
5553		"\n"
5554		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
5555		"\n"
5556		"writeonly uniform image2D uni_image;\n"
5557		"          uniform uint    uni_value;\n"
5558		"\n"
5559		"void main()\n"
5560		"{\n"
5561		"    vec4 result = vec4(0, 1, 0, 1);\n"
5562		"\n"
5563		"VERIFICATION"
5564		"\n"
5565		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
5566		"}\n"
5567		"\n";
5568
5569	static const GLchar* fragment_shader_template = "VERSION\n"
5570													"\n"
5571													"in  vec4 gs_fs_result;\n"
5572													"out vec4 fs_out_result;\n"
5573													"uniform uint uni_value;\n"
5574													"\n"
5575													"void main()\n"
5576													"{\n"
5577													"    vec4 result = vec4(0, 1, 0, 1);\n"
5578													"\n"
5579													"VERIFICATION"
5580													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
5581													"    {\n"
5582													"         result = vec4(1, 0, 0, 1);\n"
5583													"    }\n"
5584													"\n"
5585													"    fs_out_result = result;\n"
5586													"}\n"
5587													"\n";
5588
5589	static const GLchar* geometry_shader_template = "VERSION\n"
5590													"\n"
5591													"layout(points)                           in;\n"
5592													"layout(triangle_strip, max_vertices = 4) out;\n"
5593													"\n"
5594													"in  vec4 tes_gs_result[];\n"
5595													"out vec4 gs_fs_result;\n"
5596													"uniform uint uni_value;\n"
5597													"\n"
5598													"void main()\n"
5599													"{\n"
5600													"    vec4 result = vec4(0, 1, 0, 1);\n"
5601													"\n"
5602													"VERIFICATION"
5603													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
5604													"    {\n"
5605													"         result = vec4(1, 0, 0, 1);\n"
5606													"    }\n"
5607													"\n"
5608													"    gs_fs_result = result;\n"
5609													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
5610													"    EmitVertex();\n"
5611													"    gs_fs_result = result;\n"
5612													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
5613													"    EmitVertex();\n"
5614													"    gs_fs_result = result;\n"
5615													"    gl_Position  = vec4(1, -1, 0, 1);\n"
5616													"    EmitVertex();\n"
5617													"    gs_fs_result = result;\n"
5618													"    gl_Position  = vec4(1, 1, 0, 1);\n"
5619													"    EmitVertex();\n"
5620													"}\n"
5621													"\n";
5622
5623	static const GLchar* tess_ctrl_shader_template =
5624		"VERSION\n"
5625		"\n"
5626		"layout(vertices = 1) out;\n"
5627		"\n"
5628		"in  vec4 vs_tcs_result[];\n"
5629		"out vec4 tcs_tes_result[];\n"
5630		"uniform uint uni_value;\n"
5631		"\n"
5632		"void main()\n"
5633		"{\n"
5634		"    vec4 result = vec4(0, 1, 0, 1);\n"
5635		"\n"
5636		"VERIFICATION"
5637		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
5638		"    {\n"
5639		"         result = vec4(1, 0, 0, 1);\n"
5640		"    }\n"
5641		"\n"
5642		"    tcs_tes_result[gl_InvocationID] = result;\n"
5643		"\n"
5644		"    gl_TessLevelOuter[0] = 1.0;\n"
5645		"    gl_TessLevelOuter[1] = 1.0;\n"
5646		"    gl_TessLevelOuter[2] = 1.0;\n"
5647		"    gl_TessLevelOuter[3] = 1.0;\n"
5648		"    gl_TessLevelInner[0] = 1.0;\n"
5649		"    gl_TessLevelInner[1] = 1.0;\n"
5650		"}\n"
5651		"\n";
5652
5653	static const GLchar* tess_eval_shader_template = "VERSION\n"
5654													 "\n"
5655													 "layout(isolines, point_mode) in;\n"
5656													 "\n"
5657													 "in  vec4 tcs_tes_result[];\n"
5658													 "out vec4 tes_gs_result;\n"
5659													 "uniform uint uni_value;\n"
5660													 "\n"
5661													 "void main()\n"
5662													 "{\n"
5663													 "    vec4 result = vec4(0, 1, 0, 1);\n"
5664													 "\n"
5665													 "VERIFICATION"
5666													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
5667													 "    {\n"
5668													 "         result = vec4(1, 0, 0, 1);\n"
5669													 "    }\n"
5670													 "\n"
5671													 "    tes_gs_result = result;\n"
5672													 "}\n"
5673													 "\n";
5674
5675	static const GLchar* vertex_shader_template = "VERSION\n"
5676												  "\n"
5677												  "out vec4 vs_tcs_result;\n"
5678												  "uniform uint uni_value;\n"
5679												  "\n"
5680												  "void main()\n"
5681												  "{\n"
5682												  "    vec4 result = vec4(0, 1, 0, 1);\n"
5683												  "\n"
5684												  "VERIFICATION"
5685												  "\n"
5686												  "    vs_tcs_result = result;\n"
5687												  "}\n"
5688												  "\n";
5689
5690	static const GLchar* l_init = "uni_value";
5691
5692	const GLchar* shader_template = 0;
5693
5694	switch (in_stage)
5695	{
5696	case Utils::COMPUTE_SHADER:
5697		shader_template = compute_shader_template;
5698		break;
5699	case Utils::FRAGMENT_SHADER:
5700		shader_template = fragment_shader_template;
5701		break;
5702	case Utils::GEOMETRY_SHADER:
5703		shader_template = geometry_shader_template;
5704		break;
5705	case Utils::TESS_CTRL_SHADER:
5706		shader_template = tess_ctrl_shader_template;
5707		break;
5708	case Utils::TESS_EVAL_SHADER:
5709		shader_template = tess_eval_shader_template;
5710		break;
5711	case Utils::VERTEX_SHADER:
5712		shader_template = vertex_shader_template;
5713		break;
5714	default:
5715		TCU_FAIL("Invalid enum");
5716	}
5717
5718	out_source.m_parts[0].m_code = shader_template;
5719
5720	size_t position = 0;
5721	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
5722						out_source.m_parts[0].m_code);
5723
5724	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
5725
5726	Utils::replaceAllTokens("INIT", l_init, out_source.m_parts[0].m_code);
5727}
5728
5729/** Constructor
5730 *
5731 * @param context Test context
5732 **/
5733QualifierOrderTest::QualifierOrderTest(deqp::Context& context)
5734	: GLSLTestBase(context, "qualifier_order",
5735				   "Test verifies that valid permutation of input and output qalifiers are accepted")
5736	, m_current_test_case_index(0)
5737{
5738	/* Nothing to be done */
5739}
5740
5741/** Set up next test case
5742 *
5743 * @param test_case_index Index of next test case
5744 *
5745 * @return false if there is no more test cases, true otherwise
5746 **/
5747bool QualifierOrderTest::prepareNextTestCase(glw::GLuint test_case_index)
5748{
5749	m_current_test_case_index = test_case_index;
5750
5751	if ((glw::GLuint)-1 == test_case_index)
5752	{
5753		/* Nothing to be done here */
5754	}
5755	else if (m_test_cases.size() <= test_case_index)
5756	{
5757		return false;
5758	}
5759
5760	const Utils::qualifierSet& set = getCurrentTestCase();
5761
5762	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
5763
5764	for (GLuint i = 0; i < set.size(); ++i)
5765	{
5766		message << Utils::getQualifierString(set[i]) << " ";
5767	}
5768
5769	message << tcu::TestLog::EndMessage;
5770
5771	return true;
5772}
5773
5774/** Prepare source for given shader stage
5775 *
5776 * @param in_stage           Shader stage, compute shader will use 430
5777 * @param in_use_version_400 Select if 400 or 420 should be used
5778 * @param out_source         Prepared shader source instance
5779 **/
5780void QualifierOrderTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
5781											 Utils::shaderSource& out_source)
5782{
5783	static const GLchar* verification_snippet =
5784		"    vec4 diff = INPUT_VARIABLE_NAME - vec4(0, 0, 1, 1);\n"
5785		"    if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n"
5786		"    {\n"
5787		"        result = INPUT_VARIABLE_NAME;\n"
5788		"    }\n";
5789
5790	static const GLchar* fragment_shader_template = "VERSION\n"
5791													"\n"
5792													"in  vec4 gs_fs_result;\n"
5793													"layout (location = 0) out vec4 fs_out_result;\n"
5794													"\n"
5795													"VARIABLE_DECLARATION;\n"
5796													"VARIABLE_DECLARATION;\n"
5797													"\n"
5798													"void main()\n"
5799													"{\n"
5800													"    vec4 result = vec4(0, 1, 0, 1);\n"
5801													"\n"
5802													"VERIFICATION"
5803													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
5804													"    {\n"
5805													"         result = vec4(1, 0, 0, 1);\n"
5806													"    }\n"
5807													"\n"
5808													"    fs_out_result = result;\n"
5809													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5810													"}\n"
5811													"\n";
5812
5813	static const GLchar* geometry_shader_template = "VERSION\n"
5814													"\n"
5815													"layout(points)                           in;\n"
5816													"layout(triangle_strip, max_vertices = 4) out;\n"
5817													"\n"
5818													"in  vec4 tes_gs_result[];\n"
5819													"out vec4 gs_fs_result;\n"
5820													"\n"
5821													"VARIABLE_DECLARATION;\n"
5822													"VARIABLE_DECLARATION;\n"
5823													"\n"
5824													"void main()\n"
5825													"{\n"
5826													"    vec4 result = vec4(0, 1, 0, 1);\n"
5827													"\n"
5828													"VERIFICATION"
5829													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
5830													"    {\n"
5831													"         result = vec4(1, 0, 0, 1);\n"
5832													"    }\n"
5833													"\n"
5834													"    gs_fs_result = result;\n"
5835													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5836													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
5837													"    EmitVertex();\n"
5838													"    gs_fs_result = result;\n"
5839													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5840													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
5841													"    EmitVertex();\n"
5842													"    gs_fs_result = result;\n"
5843													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5844													"    gl_Position  = vec4(1, -1, 0, 1);\n"
5845													"    EmitVertex();\n"
5846													"    gs_fs_result = result;\n"
5847													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5848													"    gl_Position  = vec4(1, 1, 0, 1);\n"
5849													"    EmitVertex();\n"
5850													"}\n"
5851													"\n";
5852
5853	static const GLchar* tess_ctrl_shader_template =
5854		"VERSION\n"
5855		"\n"
5856		"layout(vertices = 1) out;\n"
5857		"\n"
5858		"in  vec4 vs_tcs_result[];\n"
5859		"out vec4 tcs_tes_result[];\n"
5860		"\n"
5861		"VARIABLE_DECLARATION;\n"
5862		"VARIABLE_DECLARATION;\n"
5863		"\n"
5864		"void main()\n"
5865		"{\n"
5866		"    vec4 result = vec4(0, 1, 0, 1);\n"
5867		"\n"
5868		"VERIFICATION"
5869		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
5870		"    {\n"
5871		"         result = vec4(1, 0, 0, 1);\n"
5872		"    }\n"
5873		"\n"
5874		"    tcs_tes_result[gl_InvocationID] = result;\n"
5875		"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5876		"\n"
5877		"    gl_TessLevelOuter[0] = 1.0;\n"
5878		"    gl_TessLevelOuter[1] = 1.0;\n"
5879		"    gl_TessLevelOuter[2] = 1.0;\n"
5880		"    gl_TessLevelOuter[3] = 1.0;\n"
5881		"    gl_TessLevelInner[0] = 1.0;\n"
5882		"    gl_TessLevelInner[1] = 1.0;\n"
5883		"}\n"
5884		"\n";
5885
5886	static const GLchar* tess_eval_shader_template = "VERSION\n"
5887													 "\n"
5888													 "layout(isolines, point_mode) in;\n"
5889													 "\n"
5890													 "in  vec4 tcs_tes_result[];\n"
5891													 "out vec4 tes_gs_result;\n"
5892													 "\n"
5893													 "VARIABLE_DECLARATION;\n"
5894													 "VARIABLE_DECLARATION;\n"
5895													 "\n"
5896													 "void main()\n"
5897													 "{\n"
5898													 "    vec4 result = vec4(0, 1, 0, 1);\n"
5899													 "\n"
5900													 "VERIFICATION"
5901													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
5902													 "    {\n"
5903													 "         result = vec4(1, 0, 0, 1);\n"
5904													 "    }\n"
5905													 "\n"
5906													 "    tes_gs_result = result;\n"
5907													 "    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5908													 "}\n"
5909													 "\n";
5910
5911	static const GLchar* vertex_shader_template = "VERSION\n"
5912												  "\n"
5913												  "out vec4 vs_tcs_result;\n"
5914												  "\n"
5915												  "VARIABLE_DECLARATION;\n"
5916												  "VARIABLE_DECLARATION;\n"
5917												  "\n"
5918												  "void main()\n"
5919												  "{\n"
5920												  "    vec4 result = vec4(0, 1, 0, 1);\n"
5921												  "\n"
5922												  "VERIFICATION"
5923												  "\n"
5924												  "    vs_tcs_result = result;\n"
5925												  "    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
5926												  "}\n"
5927												  "\n";
5928
5929	const GLchar* shader_template = 0;
5930
5931	switch (in_stage)
5932	{
5933	case Utils::COMPUTE_SHADER:
5934		return;
5935	case Utils::FRAGMENT_SHADER:
5936		shader_template = fragment_shader_template;
5937		break;
5938	case Utils::GEOMETRY_SHADER:
5939		shader_template = geometry_shader_template;
5940		break;
5941	case Utils::TESS_CTRL_SHADER:
5942		shader_template = tess_ctrl_shader_template;
5943		break;
5944	case Utils::TESS_EVAL_SHADER:
5945		shader_template = tess_eval_shader_template;
5946		break;
5947	case Utils::VERTEX_SHADER:
5948		shader_template = vertex_shader_template;
5949		break;
5950	default:
5951		TCU_FAIL("Invalid enum");
5952	}
5953
5954	const Utils::qualifierSet& test_case = getCurrentTestCase();
5955
5956	std::string in_test_decl;
5957	std::string in_test_ref;
5958	std::string out_test_decl;
5959	std::string out_test_ref;
5960
5961	Utils::prepareVariableStrings(in_stage, Utils::INPUT, test_case, "vec4", "test", in_test_decl, in_test_ref);
5962	Utils::prepareVariableStrings(in_stage, Utils::OUTPUT, test_case, "vec4", "test", out_test_decl, out_test_ref);
5963
5964	// sample storage qualifier is not a valid qualifier for fragment output
5965	if (in_stage == Utils::FRAGMENT_SHADER)
5966	{
5967		if (out_test_decl.find("sample") != std::string::npos)
5968			out_test_decl.erase(out_test_decl.find("sample"), 7);
5969	}
5970
5971	out_source.m_parts[0].m_code = shader_template;
5972
5973	size_t position = 0;
5974
5975	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
5976						out_source.m_parts[0].m_code);
5977
5978	Utils::replaceToken("VARIABLE_DECLARATION", position, in_test_decl.c_str(), out_source.m_parts[0].m_code);
5979
5980	Utils::replaceToken("VARIABLE_DECLARATION", position, out_test_decl.c_str(), out_source.m_parts[0].m_code);
5981
5982	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
5983
5984	position -= strlen(verification_snippet);
5985
5986	Utils::replaceAllTokens("OUTPUT_VARIABLE_NAME", out_test_ref.c_str(), out_source.m_parts[0].m_code);
5987
5988	Utils::replaceAllTokens("INPUT_VARIABLE_NAME", in_test_ref.c_str(), out_source.m_parts[0].m_code);
5989
5990	Utils::replaceAllTokens("LOC_VALUE", "1", out_source.m_parts[0].m_code);
5991}
5992
5993/**Prepare vertex buffer and vertex array object.
5994 *
5995 * @param program Program instance
5996 * @param buffer  Buffer instance
5997 * @param vao     VertexArray instance
5998 *
5999 * @return 0
6000 **/
6001void QualifierOrderTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer,
6002											 Utils::vertexArray& vao)
6003{
6004	std::string test_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "test");
6005	GLint		test_loc  = program.getAttribLocation(test_name.c_str());
6006
6007	if (-1 == test_loc)
6008	{
6009		TCU_FAIL("Vertex attribute location is invalid");
6010	}
6011
6012	vao.generate();
6013	vao.bind();
6014
6015	buffer.generate(GL_ARRAY_BUFFER);
6016
6017	GLfloat	data[]	= { 0.0f, 0.0f, 1.0f, 1.0f };
6018	GLsizeiptr data_size = sizeof(data);
6019
6020	buffer.update(data_size, data, GL_STATIC_DRAW);
6021
6022	/* GL entry points */
6023	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
6024
6025	/* Set up vao */
6026	gl.vertexAttribPointer(test_loc, 4 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */,
6027						   0 /* offset */);
6028	GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer");
6029
6030	/* Enable attribute */
6031	gl.enableVertexAttribArray(test_loc);
6032	GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray");
6033}
6034
6035/** Prepare test cases
6036 *
6037 * @return true
6038 **/
6039bool QualifierOrderTest::testInit()
6040{
6041	m_test_cases.resize(5);
6042
6043	m_test_cases[0].push_back(Utils::QUAL_HIGHP);
6044	m_test_cases[0].push_back(Utils::QUAL_IN);
6045	m_test_cases[0].push_back(Utils::QUAL_LOCATION);
6046	m_test_cases[0].push_back(Utils::QUAL_SMOOTH);
6047	m_test_cases[0].push_back(Utils::QUAL_INVARIANT);
6048
6049	m_test_cases[1].push_back(Utils::QUAL_LOWP);
6050	m_test_cases[1].push_back(Utils::QUAL_IN);
6051	m_test_cases[1].push_back(Utils::QUAL_SAMPLE);
6052	m_test_cases[1].push_back(Utils::QUAL_LOCATION);
6053	m_test_cases[1].push_back(Utils::QUAL_NOPERSPECTIVE);
6054	m_test_cases[1].push_back(Utils::QUAL_INVARIANT);
6055
6056	m_test_cases[2].push_back(Utils::QUAL_HIGHP);
6057	m_test_cases[2].push_back(Utils::QUAL_IN);
6058	m_test_cases[2].push_back(Utils::QUAL_LOCATION);
6059	m_test_cases[2].push_back(Utils::QUAL_SMOOTH);
6060	m_test_cases[2].push_back(Utils::QUAL_INVARIANT);
6061	m_test_cases[2].push_back(Utils::QUAL_LOCATION);
6062
6063	m_test_cases[3].push_back(Utils::QUAL_LOWP);
6064	m_test_cases[3].push_back(Utils::QUAL_IN);
6065	m_test_cases[3].push_back(Utils::QUAL_LOCATION);
6066	m_test_cases[3].push_back(Utils::QUAL_SAMPLE);
6067	m_test_cases[3].push_back(Utils::QUAL_LOCATION);
6068	m_test_cases[3].push_back(Utils::QUAL_NOPERSPECTIVE);
6069	m_test_cases[3].push_back(Utils::QUAL_INVARIANT);
6070
6071	m_test_cases[4].push_back(Utils::QUAL_HIGHP);
6072	m_test_cases[4].push_back(Utils::QUAL_IN);
6073	m_test_cases[4].push_back(Utils::QUAL_PATCH);
6074	m_test_cases[4].push_back(Utils::QUAL_LOCATION);
6075	m_test_cases[4].push_back(Utils::QUAL_INVARIANT);
6076
6077	return true;
6078}
6079
6080/** Returns reference to current test case
6081 *
6082 * @return Reference to testCase
6083 **/
6084const Utils::qualifierSet& QualifierOrderTest::getCurrentTestCase()
6085{
6086	if ((glw::GLuint)-1 == m_current_test_case_index)
6087	{
6088		return m_test_cases[0];
6089	}
6090	else
6091	{
6092		return m_test_cases[m_current_test_case_index];
6093	}
6094}
6095
6096/** Constructor
6097 *
6098 * @param context Test context
6099 **/
6100QualifierOrderBlockTest::QualifierOrderBlockTest(deqp::Context& context)
6101	: GLSLTestBase(context, "qualifier_order_block",
6102				   "Verifies that qualifiers of members of input block can be arranged in any order")
6103	, m_current_test_case_index(0)
6104{
6105	/* Nothing to be done here */
6106}
6107
6108/** Set up next test case
6109 *
6110 * @param test_case_index Index of next test case
6111 *
6112 * @return false if there is no more test cases, true otherwise
6113 **/
6114bool QualifierOrderBlockTest::prepareNextTestCase(glw::GLuint test_case_index)
6115{
6116	m_current_test_case_index = test_case_index;
6117
6118	if ((glw::GLuint)-1 == test_case_index)
6119	{
6120		/* Nothing to be done here */
6121	}
6122	else if (m_test_cases.size() <= test_case_index)
6123	{
6124		return false;
6125	}
6126
6127	const Utils::qualifierSet& set = getCurrentTestCase();
6128
6129	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
6130
6131	for (GLuint i = 0; i < set.size(); ++i)
6132	{
6133		message << Utils::getQualifierString(set[i]) << " ";
6134	}
6135
6136	message << tcu::TestLog::EndMessage;
6137
6138	return true;
6139}
6140
6141/** Prepare source for given shader stage
6142 *
6143 * @param in_stage           Shader stage, compute shader will use 430
6144 * @param in_use_version_400 Select if 400 or 420 should be used
6145 * @param out_source         Prepared shader source instance
6146 **/
6147void QualifierOrderBlockTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
6148												  Utils::shaderSource& out_source)
6149{
6150	static const GLchar* verification_snippet =
6151		"    vec4 diff = INPUT_VARIABLE_NAME - vec4(0, 0, 1, 1);\n"
6152		"    if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n"
6153		"    {\n"
6154		"        result = INPUT_VARIABLE_NAME;\n"
6155		"    }\n";
6156
6157	static const GLchar* fragment_shader_template = "VERSION\n"
6158													"\n"
6159													"in  vec4 gs_fs_result;\n"
6160													"layout (location = 0) out vec4 fs_out_result;\n"
6161													"\n"
6162													"in GSOutputBlock {\n"
6163													"    VARIABLE_DECLARATION;\n"
6164													"} input_block;\n"
6165													"out VARIABLE_DECLARATION;\n"
6166													"\n"
6167													"void main()\n"
6168													"{\n"
6169													"    vec4 result = vec4(0, 1, 0, 1);\n"
6170													"\n"
6171													"VERIFICATION"
6172													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
6173													"    {\n"
6174													"         result = vec4(1, 0, 0, 1);\n"
6175													"    }\n"
6176													"\n"
6177													"    fs_out_result = result;\n"
6178													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6179													"}\n"
6180													"\n";
6181
6182	static const GLchar* geometry_shader_template = "VERSION\n"
6183													"\n"
6184													"layout(points)                           in;\n"
6185													"layout(triangle_strip, max_vertices = 4) out;\n"
6186													"\n"
6187													"in  vec4 tes_gs_result[];\n"
6188													"out vec4 gs_fs_result;\n"
6189													"\n"
6190													"in TCSOutputBlock {\n"
6191													"    VARIABLE_DECLARATION;\n"
6192													"} input_block [];\n"
6193													"out GSOutputBlock {\n"
6194													"    VARIABLE_DECLARATION;\n"
6195													"} output_block;\n"
6196													"\n"
6197													"void main()\n"
6198													"{\n"
6199													"    vec4 result = vec4(0, 1, 0, 1);\n"
6200													"\n"
6201													"VERIFICATION"
6202													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
6203													"    {\n"
6204													"         result = vec4(1, 0, 0, 1);\n"
6205													"    }\n"
6206													"\n"
6207													"    gs_fs_result = result;\n"
6208													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6209													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
6210													"    EmitVertex();\n"
6211													"    gs_fs_result = result;\n"
6212													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6213													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
6214													"    EmitVertex();\n"
6215													"    gs_fs_result = result;\n"
6216													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6217													"    gl_Position  = vec4(1, -1, 0, 1);\n"
6218													"    EmitVertex();\n"
6219													"    gs_fs_result = result;\n"
6220													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6221													"    gl_Position  = vec4(1, 1, 0, 1);\n"
6222													"    EmitVertex();\n"
6223													"}\n"
6224													"\n";
6225
6226	static const GLchar* tess_ctrl_shader_template =
6227		"VERSION\n"
6228		"\n"
6229		"layout(vertices = 1) out;\n"
6230		"\n"
6231		"in  vec4 vs_tcs_result[];\n"
6232		"out vec4 tcs_tes_result[];\n"
6233		"\n"
6234		"in VSOutputBlock {\n"
6235		"    VARIABLE_DECLARATION;\n"
6236		"} input_block [];\n"
6237		"out TCSOutputBlock {\n"
6238		"    VARIABLE_DECLARATION;\n"
6239		"} output_block [];\n"
6240		"\n"
6241		"void main()\n"
6242		"{\n"
6243		"    vec4 result = vec4(0, 1, 0, 1);\n"
6244		"\n"
6245		"VERIFICATION"
6246		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
6247		"    {\n"
6248		"         result = vec4(1, 0, 0, 1);\n"
6249		"    }\n"
6250		"\n"
6251		"    tcs_tes_result[gl_InvocationID] = result;\n"
6252		"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6253		"\n"
6254		"    gl_TessLevelOuter[0] = 1.0;\n"
6255		"    gl_TessLevelOuter[1] = 1.0;\n"
6256		"    gl_TessLevelOuter[2] = 1.0;\n"
6257		"    gl_TessLevelOuter[3] = 1.0;\n"
6258		"    gl_TessLevelInner[0] = 1.0;\n"
6259		"    gl_TessLevelInner[1] = 1.0;\n"
6260		"}\n"
6261		"\n";
6262
6263	static const GLchar* tess_eval_shader_template = "VERSION\n"
6264													 "\n"
6265													 "layout(isolines, point_mode) in;\n"
6266													 "\n"
6267													 "in  vec4 tcs_tes_result[];\n"
6268													 "out vec4 tes_gs_result;\n"
6269													 "\n"
6270													 "in TCSOutputBlock {\n"
6271													 "    VARIABLE_DECLARATION;\n"
6272													 "} input_block [];\n"
6273													 "out TCSOutputBlock {\n"
6274													 "    VARIABLE_DECLARATION;\n"
6275													 "} output_block;\n"
6276													 "\n"
6277													 "void main()\n"
6278													 "{\n"
6279													 "    vec4 result = vec4(0, 1, 0, 1);\n"
6280													 "\n"
6281													 "VERIFICATION"
6282													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
6283													 "    {\n"
6284													 "         result = vec4(1, 0, 0, 1);\n"
6285													 "    }\n"
6286													 "\n"
6287													 "    tes_gs_result = result;\n"
6288													 "    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6289													 "}\n"
6290													 "\n";
6291
6292	static const GLchar* vertex_shader_template = "VERSION\n"
6293												  "\n"
6294												  "out vec4 vs_tcs_result;\n"
6295												  "\n"
6296												  "in VARIABLE_DECLARATION;\n"
6297												  "out VSOutputBlock {\n"
6298												  "    VARIABLE_DECLARATION;\n"
6299												  "} output_block;\n"
6300												  "\n"
6301												  "void main()\n"
6302												  "{\n"
6303												  "    vec4 result = vec4(0, 1, 0, 1);\n"
6304												  "\n"
6305												  "VERIFICATION"
6306												  "\n"
6307												  "    vs_tcs_result = result;\n"
6308												  "    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
6309												  "}\n"
6310												  "\n";
6311
6312	const GLchar* shader_template = 0;
6313
6314	switch (in_stage)
6315	{
6316	case Utils::COMPUTE_SHADER:
6317		return;
6318	case Utils::FRAGMENT_SHADER:
6319		shader_template = fragment_shader_template;
6320		break;
6321	case Utils::GEOMETRY_SHADER:
6322		shader_template = geometry_shader_template;
6323		break;
6324	case Utils::TESS_CTRL_SHADER:
6325		shader_template = tess_ctrl_shader_template;
6326		break;
6327	case Utils::TESS_EVAL_SHADER:
6328		shader_template = tess_eval_shader_template;
6329		break;
6330	case Utils::VERTEX_SHADER:
6331		shader_template = vertex_shader_template;
6332		break;
6333	default:
6334		TCU_FAIL("Invalid enum");
6335	}
6336
6337	const Utils::qualifierSet& test_case = getCurrentTestCase();
6338
6339	std::string in_test_decl;
6340	std::string in_test_ref;
6341	std::string out_test_decl;
6342	std::string out_test_ref;
6343
6344	switch (in_stage)
6345	{
6346	case Utils::VERTEX_SHADER:
6347		Utils::prepareVariableStrings(in_stage, Utils::INPUT, test_case, "vec4", "test", in_test_decl, in_test_ref);
6348		break;
6349	default:
6350		Utils::prepareBlockVariableStrings(in_stage, Utils::INPUT, test_case, "vec4", "test", "input_block",
6351										   in_test_decl, in_test_ref);
6352		break;
6353	}
6354
6355	switch (in_stage)
6356	{
6357	case Utils::FRAGMENT_SHADER:
6358		Utils::prepareVariableStrings(in_stage, Utils::OUTPUT, test_case, "vec4", "test", out_test_decl, out_test_ref);
6359		break;
6360	default:
6361		Utils::prepareBlockVariableStrings(in_stage, Utils::OUTPUT, test_case, "vec4", "test", "output_block",
6362										   out_test_decl, out_test_ref);
6363		break;
6364	}
6365
6366	// sample storage qualifier is not a valid qualifier for fragment output
6367	if (in_stage == Utils::FRAGMENT_SHADER)
6368	{
6369		if (out_test_decl.find("sample") != std::string::npos)
6370			out_test_decl.erase(out_test_decl.find("sample"), 7);
6371	}
6372	out_source.m_parts[0].m_code = shader_template;
6373
6374	size_t position = 0;
6375
6376	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
6377						out_source.m_parts[0].m_code);
6378
6379	Utils::replaceToken("VARIABLE_DECLARATION", position, in_test_decl.c_str(), out_source.m_parts[0].m_code);
6380
6381	Utils::replaceToken("VARIABLE_DECLARATION", position, out_test_decl.c_str(), out_source.m_parts[0].m_code);
6382
6383	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
6384
6385	position -= strlen(verification_snippet);
6386
6387	Utils::replaceAllTokens("OUTPUT_VARIABLE_NAME", out_test_ref.c_str(), out_source.m_parts[0].m_code);
6388
6389	Utils::replaceAllTokens("INPUT_VARIABLE_NAME", in_test_ref.c_str(), out_source.m_parts[0].m_code);
6390
6391	Utils::replaceAllTokens("LOC_VALUE", "1", out_source.m_parts[0].m_code);
6392}
6393
6394/**Prepare vertex buffer and vertex array object.
6395 *
6396 * @param program Program instance
6397 * @param buffer  Buffer instance
6398 * @param vao     VertexArray instance
6399 *
6400 * @return 0
6401 **/
6402void QualifierOrderBlockTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer,
6403												  Utils::vertexArray& vao)
6404{
6405	std::string test_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "test");
6406	GLint		test_loc  = program.getAttribLocation(test_name.c_str());
6407
6408	if (-1 == test_loc)
6409	{
6410		TCU_FAIL("Vertex attribute location is invalid");
6411	}
6412
6413	vao.generate();
6414	vao.bind();
6415
6416	buffer.generate(GL_ARRAY_BUFFER);
6417
6418	GLfloat	data[]	= { 0.0f, 0.0f, 1.0f, 1.0f };
6419	GLsizeiptr data_size = sizeof(data);
6420
6421	buffer.update(data_size, data, GL_STATIC_DRAW);
6422
6423	/* GL entry points */
6424	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
6425
6426	/* Set up vao */
6427	gl.vertexAttribPointer(test_loc, 4 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */,
6428						   0 /* offset */);
6429	GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer");
6430
6431	/* Enable attribute */
6432	gl.enableVertexAttribArray(test_loc);
6433	GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray");
6434}
6435
6436/** Prepare test cases
6437 *
6438 * @return true
6439 **/
6440bool QualifierOrderBlockTest::testInit()
6441{
6442	m_test_cases.resize(4);
6443
6444	m_test_cases[0].push_back(Utils::QUAL_HIGHP);
6445	m_test_cases[0].push_back(Utils::QUAL_FLAT);
6446	m_test_cases[0].push_back(Utils::QUAL_INVARIANT);
6447
6448	m_test_cases[1].push_back(Utils::QUAL_LOWP);
6449	m_test_cases[1].push_back(Utils::QUAL_SAMPLE);
6450	m_test_cases[1].push_back(Utils::QUAL_NOPERSPECTIVE);
6451	m_test_cases[1].push_back(Utils::QUAL_INVARIANT);
6452
6453	m_test_cases[2].push_back(Utils::QUAL_HIGHP);
6454	m_test_cases[2].push_back(Utils::QUAL_SMOOTH);
6455	m_test_cases[2].push_back(Utils::QUAL_INVARIANT);
6456
6457	m_test_cases[3].push_back(Utils::QUAL_LOWP);
6458	m_test_cases[3].push_back(Utils::QUAL_SAMPLE);
6459	m_test_cases[3].push_back(Utils::QUAL_NOPERSPECTIVE);
6460	m_test_cases[3].push_back(Utils::QUAL_INVARIANT);
6461
6462	return true;
6463}
6464
6465/** Returns reference to current test case
6466 *
6467 * @return Reference to testCase
6468 **/
6469const Utils::qualifierSet& QualifierOrderBlockTest::getCurrentTestCase()
6470{
6471	if ((glw::GLuint)-1 == m_current_test_case_index)
6472	{
6473		return m_test_cases[0];
6474	}
6475	else
6476	{
6477		return m_test_cases[m_current_test_case_index];
6478	}
6479}
6480
6481/** Constructor
6482 *
6483 * @param context Test context
6484 **/
6485QualifierOrderUniformTest::QualifierOrderUniformTest(deqp::Context& context)
6486	: GLSLTestBase(context, "qualifier_order_uniform",
6487				   "Test verifies that all valid permutation of input qalifiers are accepted")
6488	, m_current_test_case_index(0)
6489{
6490	/* Nothing to be done here */
6491}
6492
6493/** Set up next test case
6494 *
6495 * @param test_case_index Index of next test case
6496 *
6497 * @return false if there is no more test cases, true otherwise
6498 **/
6499bool QualifierOrderUniformTest::prepareNextTestCase(glw::GLuint test_case_index)
6500{
6501	m_current_test_case_index = test_case_index;
6502
6503	if ((glw::GLuint)-1 == test_case_index)
6504	{
6505		/* Nothing to be done here */
6506	}
6507	else if (m_test_cases.size() <= test_case_index)
6508	{
6509		return false;
6510	}
6511
6512	const Utils::qualifierSet& set = getCurrentTestCase();
6513
6514	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
6515
6516	for (GLuint i = 0; i < set.size(); ++i)
6517	{
6518		message << Utils::getQualifierString(set[i]) << " ";
6519	}
6520
6521	message << tcu::TestLog::EndMessage;
6522
6523	return true;
6524}
6525
6526/** Prepare source for given shader stage
6527 *
6528 * @param in_stage           Shader stage, compute shader will use 430
6529 * @param in_use_version_400 Select if 400 or 420 should be used
6530 * @param out_source         Prepared shader source instance
6531 **/
6532void QualifierOrderUniformTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
6533													Utils::shaderSource& out_source)
6534{
6535	static const GLchar* verification_snippet =
6536		"    vec4 diff = VARIABLE_NAME - vec4(0, 0, 1, 1);\n"
6537		"    if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n"
6538		"    {\n"
6539		"        result = VARIABLE_NAME;\n"
6540		"    }\n";
6541
6542	static const GLchar* variable_declaration = "    QUALIFIERS VARIABLE_NAME";
6543
6544	static const GLchar* fragment_shader_template = "VERSION\n"
6545													"#extension GL_ARB_explicit_uniform_location : enable\n"
6546													"\n"
6547													"in  vec4 gs_fs_result;\n"
6548													"out vec4 fs_out_result;\n"
6549													"\n"
6550													"VARIABLE_DECLARATION;\n"
6551													"\n"
6552													"void main()\n"
6553													"{\n"
6554													"    vec4 result = vec4(0, 1, 0, 1);\n"
6555													"\n"
6556													"VERIFICATION"
6557													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
6558													"    {\n"
6559													"         result = vec4(1, 0, 0, 1);\n"
6560													"    }\n"
6561													"\n"
6562													"    fs_out_result = result;\n"
6563													"}\n"
6564													"\n";
6565
6566	static const GLchar* geometry_shader_template = "VERSION\n"
6567													"#extension GL_ARB_explicit_uniform_location : enable\n"
6568													"\n"
6569													"layout(points)                           in;\n"
6570													"layout(triangle_strip, max_vertices = 4) out;\n"
6571													"\n"
6572													"in  vec4 tes_gs_result[];\n"
6573													"out vec4 gs_fs_result;\n"
6574													"\n"
6575													"VARIABLE_DECLARATION;\n"
6576													"\n"
6577													"void main()\n"
6578													"{\n"
6579													"    vec4 result = vec4(0, 1, 0, 1);\n"
6580													"\n"
6581													"VERIFICATION"
6582													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
6583													"    {\n"
6584													"         result = vec4(1, 0, 0, 1);\n"
6585													"    }\n"
6586													"\n"
6587													"    gs_fs_result = result;\n"
6588													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
6589													"    EmitVertex();\n"
6590													"    gs_fs_result = result;\n"
6591													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
6592													"    EmitVertex();\n"
6593													"    gs_fs_result = result;\n"
6594													"    gl_Position  = vec4(1, -1, 0, 1);\n"
6595													"    EmitVertex();\n"
6596													"    gs_fs_result = result;\n"
6597													"    gl_Position  = vec4(1, 1, 0, 1);\n"
6598													"    EmitVertex();\n"
6599													"}\n"
6600													"\n";
6601
6602	static const GLchar* tess_ctrl_shader_template =
6603		"VERSION\n"
6604		"#extension GL_ARB_explicit_uniform_location : enable\n"
6605		"\n"
6606		"layout(vertices = 1) out;\n"
6607		"\n"
6608		"in  vec4 vs_tcs_result[];\n"
6609		"out vec4 tcs_tes_result[];\n"
6610		"\n"
6611		"VARIABLE_DECLARATION;\n"
6612		"\n"
6613		"void main()\n"
6614		"{\n"
6615		"    vec4 result = vec4(0, 1, 0, 1);\n"
6616		"\n"
6617		"VERIFICATION"
6618		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
6619		"    {\n"
6620		"         result = vec4(1, 0, 0, 1);\n"
6621		"    }\n"
6622		"\n"
6623		"    tcs_tes_result[gl_InvocationID] = result;\n"
6624		"\n"
6625		"    gl_TessLevelOuter[0] = 1.0;\n"
6626		"    gl_TessLevelOuter[1] = 1.0;\n"
6627		"    gl_TessLevelOuter[2] = 1.0;\n"
6628		"    gl_TessLevelOuter[3] = 1.0;\n"
6629		"    gl_TessLevelInner[0] = 1.0;\n"
6630		"    gl_TessLevelInner[1] = 1.0;\n"
6631		"}\n"
6632		"\n";
6633
6634	static const GLchar* tess_eval_shader_template = "VERSION\n"
6635													 "#extension GL_ARB_explicit_uniform_location : enable\n"
6636													 "\n"
6637													 "layout(isolines, point_mode) in;\n"
6638													 "\n"
6639													 "in  vec4 tcs_tes_result[];\n"
6640													 "out vec4 tes_gs_result;\n"
6641													 "\n"
6642													 "VARIABLE_DECLARATION;\n"
6643													 "\n"
6644													 "void main()\n"
6645													 "{\n"
6646													 "    vec4 result = vec4(0, 1, 0, 1);\n"
6647													 "\n"
6648													 "VERIFICATION"
6649													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
6650													 "    {\n"
6651													 "         result = vec4(1, 0, 0, 1);\n"
6652													 "    }\n"
6653													 "\n"
6654													 "    tes_gs_result = result;\n"
6655													 "}\n"
6656													 "\n";
6657
6658	static const GLchar* vertex_shader_template = "VERSION\n"
6659												  "#extension GL_ARB_explicit_uniform_location : enable\n"
6660												  "\n"
6661												  "out vec4 vs_tcs_result;\n"
6662												  "\n"
6663												  "VARIABLE_DECLARATION;\n"
6664												  "\n"
6665												  "void main()\n"
6666												  "{\n"
6667												  "    vec4 result = vec4(0, 1, 0, 1);\n"
6668												  "\n"
6669												  "VERIFICATION"
6670												  "\n"
6671												  "    vs_tcs_result = result;\n"
6672												  "}\n"
6673												  "\n";
6674
6675	const GLchar* shader_template = 0;
6676	const GLchar* location_string = 0;
6677
6678	switch (in_stage)
6679	{
6680	case Utils::COMPUTE_SHADER:
6681		return;
6682	case Utils::FRAGMENT_SHADER:
6683		shader_template = fragment_shader_template;
6684		location_string = "0";
6685		break;
6686	case Utils::GEOMETRY_SHADER:
6687		shader_template = geometry_shader_template;
6688		location_string = "1";
6689		break;
6690	case Utils::TESS_CTRL_SHADER:
6691		shader_template = tess_ctrl_shader_template;
6692		location_string = "4";
6693		break;
6694	case Utils::TESS_EVAL_SHADER:
6695		shader_template = tess_eval_shader_template;
6696		location_string = "3";
6697		break;
6698	case Utils::VERTEX_SHADER:
6699		shader_template = vertex_shader_template;
6700		location_string = "2";
6701		break;
6702	default:
6703		TCU_FAIL("Invalid enum");
6704	}
6705
6706	const Utils::qualifierSet& test_case = getCurrentTestCase();
6707
6708	std::string uni_declaration;
6709	std::string uni_reference;
6710	Utils::prepareVariableStrings(in_stage, Utils::UNIFORM, test_case, "vec4", "test", uni_declaration, uni_reference);
6711
6712	out_source.m_parts[0].m_code = shader_template;
6713
6714	size_t position = 0;
6715
6716	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
6717						out_source.m_parts[0].m_code);
6718
6719	Utils::replaceToken("VARIABLE_DECLARATION", position, uni_declaration.c_str(), out_source.m_parts[0].m_code);
6720
6721	position -= strlen(variable_declaration);
6722
6723	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
6724
6725	Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code);
6726
6727	Utils::replaceAllTokens("LOC_VALUE", location_string, out_source.m_parts[0].m_code);
6728}
6729
6730/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
6731 *
6732 * @param program Current program
6733 **/
6734void QualifierOrderUniformTest::prepareUniforms(Utils::program& program)
6735{
6736	static const GLfloat float_data[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
6737
6738	program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
6739	program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
6740	program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
6741	program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
6742	program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
6743}
6744
6745/** Prepare test cases
6746 *
6747 * @return false if ARB_explicit_uniform_location is not supported, true otherwise
6748 **/
6749bool QualifierOrderUniformTest::testInit()
6750{
6751	if (false == m_is_explicit_uniform_location)
6752	{
6753		return false;
6754	}
6755
6756	m_test_cases.resize(4);
6757
6758	m_test_cases[0].push_back(Utils::QUAL_HIGHP);
6759	m_test_cases[0].push_back(Utils::QUAL_UNIFORM);
6760	m_test_cases[0].push_back(Utils::QUAL_LOCATION);
6761
6762	m_test_cases[1].push_back(Utils::QUAL_LOWP);
6763	m_test_cases[1].push_back(Utils::QUAL_UNIFORM);
6764	m_test_cases[1].push_back(Utils::QUAL_LOCATION);
6765
6766	m_test_cases[2].push_back(Utils::QUAL_HIGHP);
6767	m_test_cases[2].push_back(Utils::QUAL_LOCATION);
6768	m_test_cases[2].push_back(Utils::QUAL_UNIFORM);
6769	m_test_cases[2].push_back(Utils::QUAL_LOCATION);
6770
6771	m_test_cases[3].push_back(Utils::QUAL_LOCATION);
6772	m_test_cases[3].push_back(Utils::QUAL_LOWP);
6773	m_test_cases[3].push_back(Utils::QUAL_UNIFORM);
6774	m_test_cases[3].push_back(Utils::QUAL_LOCATION);
6775
6776	return true;
6777}
6778
6779/** Returns reference to current test case
6780 *
6781 * @return Reference to testCase
6782 **/
6783const Utils::qualifierSet& QualifierOrderUniformTest::getCurrentTestCase()
6784{
6785	if ((glw::GLuint)-1 == m_current_test_case_index)
6786	{
6787		return m_test_cases[0];
6788	}
6789	else
6790	{
6791		return m_test_cases[m_current_test_case_index];
6792	}
6793}
6794
6795/** Constructor
6796 *
6797 * @param context Test context
6798 **/
6799QualifierOrderFunctionInoutTest::QualifierOrderFunctionInoutTest(deqp::Context& context)
6800	: GLSLTestBase(context, "qualifier_order_function_inout", "Verify order of qualifiers of inout function parameters")
6801	, m_current_test_case_index(0)
6802{
6803	/* Nothing to be done here */
6804}
6805
6806/** Set up next test case
6807 *
6808 * @param test_case_index Index of next test case
6809 *
6810 * @return false if there is no more test cases, true otherwise
6811 **/
6812bool QualifierOrderFunctionInoutTest::prepareNextTestCase(glw::GLuint test_case_index)
6813{
6814	m_current_test_case_index = test_case_index;
6815
6816	if ((glw::GLuint)-1 == test_case_index)
6817	{
6818		/* Nothing to be done here */
6819	}
6820	else if (m_test_cases.size() <= test_case_index)
6821	{
6822		return false;
6823	}
6824
6825	const Utils::qualifierSet& set = getCurrentTestCase();
6826
6827	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
6828
6829	for (GLuint i = 0; i < set.size(); ++i)
6830	{
6831		message << Utils::getQualifierString(set[i]) << " ";
6832	}
6833
6834	message << tcu::TestLog::EndMessage;
6835
6836	return true;
6837}
6838
6839/** Prepare source for given shader stage
6840 *
6841 * @param in_stage           Shader stage, compute shader will use 430
6842 * @param in_use_version_400 Select if 400 or 420 should be used
6843 * @param out_source         Prepared shader source instance
6844 **/
6845void QualifierOrderFunctionInoutTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
6846														  Utils::shaderSource& out_source)
6847{
6848	static const GLchar* verification_snippet =
6849		"    vec4 temp = VARIABLE_NAME;\n"
6850		"\n"
6851		"    function(temp);\n"
6852		"\n"
6853		"    vec4 diff = temp - vec4(0, 0, 1, 1);\n"
6854		"    if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n"
6855		"    {\n"
6856		"        result = VARIABLE_NAME;\n"
6857		"    }\n";
6858
6859	static const GLchar* function_declaration = "void function(QUALIFIERS_LIST vec4 param)\n"
6860												"{\n"
6861												"    param = param.wzyx;\n"
6862												"}\n";
6863
6864	static const GLchar* fragment_shader_template = "VERSION\n"
6865													"\n"
6866													"in  vec4 gs_fs_result;\n"
6867													"out vec4 fs_out_result;\n"
6868													"\n"
6869													"uniform vec4 VARIABLE_NAME;\n"
6870													"\n"
6871													"FUNCTION_DECLARATION\n"
6872													"\n"
6873													"void main()\n"
6874													"{\n"
6875													"    vec4 result = vec4(0, 1, 0, 1);\n"
6876													"\n"
6877													"VERIFICATION"
6878													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
6879													"    {\n"
6880													"         result = vec4(1, 0, 0, 1);\n"
6881													"    }\n"
6882													"\n"
6883													"    fs_out_result = result;\n"
6884													"}\n"
6885													"\n";
6886
6887	static const GLchar* geometry_shader_template = "VERSION\n"
6888													"\n"
6889													"layout(points)                           in;\n"
6890													"layout(triangle_strip, max_vertices = 4) out;\n"
6891													"\n"
6892													"in  vec4 tes_gs_result[];\n"
6893													"out vec4 gs_fs_result;\n"
6894													"\n"
6895													"uniform vec4 VARIABLE_NAME;\n"
6896													"\n"
6897													"FUNCTION_DECLARATION\n"
6898													"\n"
6899													"void main()\n"
6900													"{\n"
6901													"    vec4 result = vec4(0, 1, 0, 1);\n"
6902													"\n"
6903													"VERIFICATION"
6904													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
6905													"    {\n"
6906													"         result = vec4(1, 0, 0, 1);\n"
6907													"    }\n"
6908													"\n"
6909													"    gs_fs_result = result;\n"
6910													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
6911													"    EmitVertex();\n"
6912													"    gs_fs_result = result;\n"
6913													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
6914													"    EmitVertex();\n"
6915													"    gs_fs_result = result;\n"
6916													"    gl_Position  = vec4(1, -1, 0, 1);\n"
6917													"    EmitVertex();\n"
6918													"    gs_fs_result = result;\n"
6919													"    gl_Position  = vec4(1, 1, 0, 1);\n"
6920													"    EmitVertex();\n"
6921													"}\n"
6922													"\n";
6923
6924	static const GLchar* tess_ctrl_shader_template =
6925		"VERSION\n"
6926		"\n"
6927		"layout(vertices = 1) out;\n"
6928		"\n"
6929		"in  vec4 vs_tcs_result[];\n"
6930		"out vec4 tcs_tes_result[];\n"
6931		"\n"
6932		"uniform vec4 VARIABLE_NAME;\n"
6933		"\n"
6934		"FUNCTION_DECLARATION\n"
6935		"\n"
6936		"void main()\n"
6937		"{\n"
6938		"    vec4 result = vec4(0, 1, 0, 1);\n"
6939		"\n"
6940		"VERIFICATION"
6941		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
6942		"    {\n"
6943		"         result = vec4(1, 0, 0, 1);\n"
6944		"    }\n"
6945		"\n"
6946		"    tcs_tes_result[gl_InvocationID] = result;\n"
6947		"\n"
6948		"    gl_TessLevelOuter[0] = 1.0;\n"
6949		"    gl_TessLevelOuter[1] = 1.0;\n"
6950		"    gl_TessLevelOuter[2] = 1.0;\n"
6951		"    gl_TessLevelOuter[3] = 1.0;\n"
6952		"    gl_TessLevelInner[0] = 1.0;\n"
6953		"    gl_TessLevelInner[1] = 1.0;\n"
6954		"}\n"
6955		"\n";
6956
6957	static const GLchar* tess_eval_shader_template = "VERSION\n"
6958													 "\n"
6959													 "layout(isolines, point_mode) in;\n"
6960													 "\n"
6961													 "in  vec4 tcs_tes_result[];\n"
6962													 "out vec4 tes_gs_result;\n"
6963													 "\n"
6964													 "uniform vec4 VARIABLE_NAME;\n"
6965													 "\n"
6966													 "FUNCTION_DECLARATION\n"
6967													 "\n"
6968													 "void main()\n"
6969													 "{\n"
6970													 "    vec4 result = vec4(0, 1, 0, 1);\n"
6971													 "\n"
6972													 "VERIFICATION"
6973													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
6974													 "    {\n"
6975													 "         result = vec4(1, 0, 0, 1);\n"
6976													 "    }\n"
6977													 "\n"
6978													 "    tes_gs_result = result;\n"
6979													 "}\n"
6980													 "\n";
6981
6982	static const GLchar* vertex_shader_template = "VERSION\n"
6983												  "\n"
6984												  "out vec4 vs_tcs_result;\n"
6985												  "\n"
6986												  "uniform vec4 VARIABLE_NAME;\n"
6987												  "\n"
6988												  "FUNCTION_DECLARATION\n"
6989												  "\n"
6990												  "void main()\n"
6991												  "{\n"
6992												  "    vec4 result = vec4(0, 1, 0, 1);\n"
6993												  "\n"
6994												  "VERIFICATION"
6995												  "\n"
6996												  "    vs_tcs_result = result;\n"
6997												  "}\n"
6998												  "\n";
6999
7000	const GLchar* shader_template = 0;
7001
7002	switch (in_stage)
7003	{
7004	case Utils::COMPUTE_SHADER:
7005		return;
7006	case Utils::FRAGMENT_SHADER:
7007		shader_template = fragment_shader_template;
7008		break;
7009	case Utils::GEOMETRY_SHADER:
7010		shader_template = geometry_shader_template;
7011		break;
7012	case Utils::TESS_CTRL_SHADER:
7013		shader_template = tess_ctrl_shader_template;
7014		break;
7015	case Utils::TESS_EVAL_SHADER:
7016		shader_template = tess_eval_shader_template;
7017		break;
7018	case Utils::VERTEX_SHADER:
7019		shader_template = vertex_shader_template;
7020		break;
7021	default:
7022		TCU_FAIL("Invalid enum");
7023	}
7024
7025	const std::string& uni_reference  = Utils::getVariableName(in_stage, Utils::UNIFORM, "test");
7026	const std::string& qualifier_list = Utils::getQualifiersListString(getCurrentTestCase());
7027
7028	out_source.m_parts[0].m_code = shader_template;
7029
7030	size_t position = 0;
7031
7032	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
7033						out_source.m_parts[0].m_code);
7034
7035	Utils::replaceToken("FUNCTION_DECLARATION", position, function_declaration, out_source.m_parts[0].m_code);
7036
7037	position -= strlen(function_declaration);
7038
7039	Utils::replaceToken("QUALIFIERS_LIST", position, qualifier_list.c_str(), out_source.m_parts[0].m_code);
7040
7041	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
7042
7043	Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code);
7044}
7045
7046/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
7047 *
7048 * @param program Current program
7049 **/
7050void QualifierOrderFunctionInoutTest::prepareUniforms(Utils::program& program)
7051{
7052	static const GLfloat float_data[4] = { 1.0f, 1.0f, 0.0f, 0.0f };
7053
7054	program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7055	program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7056	program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7057	program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7058	program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7059}
7060
7061/** Prepare test cases
7062 *
7063 * @return false if ARB_explicit_uniform_location is not supported, true otherwise
7064 **/
7065bool QualifierOrderFunctionInoutTest::testInit()
7066{
7067	m_test_cases.resize(6);
7068
7069	m_test_cases[0].push_back(Utils::QUAL_HIGHP);
7070	m_test_cases[0].push_back(Utils::QUAL_PRECISE);
7071	m_test_cases[0].push_back(Utils::QUAL_INOUT);
7072
7073	m_test_cases[1].push_back(Utils::QUAL_INOUT);
7074	m_test_cases[1].push_back(Utils::QUAL_PRECISE);
7075	m_test_cases[1].push_back(Utils::QUAL_HIGHP);
7076
7077	m_test_cases[2].push_back(Utils::QUAL_MEDIUMP);
7078	m_test_cases[2].push_back(Utils::QUAL_PRECISE);
7079	m_test_cases[2].push_back(Utils::QUAL_INOUT);
7080
7081	m_test_cases[3].push_back(Utils::QUAL_INOUT);
7082	m_test_cases[3].push_back(Utils::QUAL_PRECISE);
7083	m_test_cases[3].push_back(Utils::QUAL_MEDIUMP);
7084
7085	m_test_cases[4].push_back(Utils::QUAL_LOWP);
7086	m_test_cases[4].push_back(Utils::QUAL_PRECISE);
7087	m_test_cases[4].push_back(Utils::QUAL_INOUT);
7088
7089	m_test_cases[5].push_back(Utils::QUAL_INOUT);
7090	m_test_cases[5].push_back(Utils::QUAL_PRECISE);
7091	m_test_cases[5].push_back(Utils::QUAL_LOWP);
7092
7093	return true;
7094}
7095
7096/** Returns reference to current test case
7097 *
7098 * @return Reference to testCase
7099 **/
7100const Utils::qualifierSet& QualifierOrderFunctionInoutTest::getCurrentTestCase()
7101{
7102	if ((glw::GLuint)-1 == m_current_test_case_index)
7103	{
7104		return m_test_cases[0];
7105	}
7106	else
7107	{
7108		return m_test_cases[m_current_test_case_index];
7109	}
7110}
7111
7112/** Constructor
7113 *
7114 * @param context Test context
7115 **/
7116QualifierOrderFunctionInputTest::QualifierOrderFunctionInputTest(deqp::Context& context)
7117	: GLSLTestBase(context, "qualifier_order_function_input", "Verify order of qualifiers of function input parameters")
7118	, m_current_test_case_index(0)
7119{
7120	/* Nothing to be done here */
7121}
7122
7123/** Set up next test case
7124 *
7125 * @param test_case_index Index of next test case
7126 *
7127 * @return false if there is no more test cases, true otherwise
7128 **/
7129bool QualifierOrderFunctionInputTest::prepareNextTestCase(glw::GLuint test_case_index)
7130{
7131	m_current_test_case_index = test_case_index;
7132
7133	if ((glw::GLuint)-1 == test_case_index)
7134	{
7135		/* Nothing to be done here */
7136	}
7137	else if (m_test_cases.size() <= test_case_index)
7138	{
7139		return false;
7140	}
7141
7142	const Utils::qualifierSet& set = getCurrentTestCase();
7143
7144	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
7145
7146	for (GLuint i = 0; i < set.size(); ++i)
7147	{
7148		message << Utils::getQualifierString(set[i]) << " ";
7149	}
7150
7151	message << tcu::TestLog::EndMessage;
7152
7153	return true;
7154}
7155
7156/** Prepare source for given shader stage
7157 *
7158 * @param in_stage           Shader stage, compute shader will use 430
7159 * @param in_use_version_400 Select if 400 or 420 should be used
7160 * @param out_source         Prepared shader source instance
7161 **/
7162void QualifierOrderFunctionInputTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
7163														  Utils::shaderSource& out_source)
7164{
7165	static const GLchar* verification_snippet =
7166		"    vec4 temp = function(VARIABLE_NAME);\n"
7167		"\n"
7168		"    vec4 diff = temp - vec4(0, 0, 1, 1);\n"
7169		"    if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n"
7170		"    {\n"
7171		"        result = VARIABLE_NAME;\n"
7172		"    }\n";
7173
7174	static const GLchar* function_declaration = "vec4 function(QUALIFIERS_LIST vec4 param)\n"
7175												"{\n"
7176												"    return param.wzyx;\n"
7177												"}\n";
7178
7179	static const GLchar* fragment_shader_template = "VERSION\n"
7180													"\n"
7181													"in  vec4 gs_fs_result;\n"
7182													"out vec4 fs_out_result;\n"
7183													"\n"
7184													"uniform vec4 VARIABLE_NAME;\n"
7185													"\n"
7186													"FUNCTION_DECLARATION\n"
7187													"\n"
7188													"void main()\n"
7189													"{\n"
7190													"    vec4 result = vec4(0, 1, 0, 1);\n"
7191													"\n"
7192													"VERIFICATION"
7193													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
7194													"    {\n"
7195													"         result = vec4(1, 0, 0, 1);\n"
7196													"    }\n"
7197													"\n"
7198													"    fs_out_result = result;\n"
7199													"}\n"
7200													"\n";
7201
7202	static const GLchar* geometry_shader_template = "VERSION\n"
7203													"\n"
7204													"layout(points)                           in;\n"
7205													"layout(triangle_strip, max_vertices = 4) out;\n"
7206													"\n"
7207													"in  vec4 tes_gs_result[];\n"
7208													"out vec4 gs_fs_result;\n"
7209													"\n"
7210													"uniform vec4 VARIABLE_NAME;\n"
7211													"\n"
7212													"FUNCTION_DECLARATION\n"
7213													"\n"
7214													"void main()\n"
7215													"{\n"
7216													"    vec4 result = vec4(0, 1, 0, 1);\n"
7217													"\n"
7218													"VERIFICATION"
7219													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
7220													"    {\n"
7221													"         result = vec4(1, 0, 0, 1);\n"
7222													"    }\n"
7223													"\n"
7224													"    gs_fs_result = result;\n"
7225													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
7226													"    EmitVertex();\n"
7227													"    gs_fs_result = result;\n"
7228													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
7229													"    EmitVertex();\n"
7230													"    gs_fs_result = result;\n"
7231													"    gl_Position  = vec4(1, -1, 0, 1);\n"
7232													"    EmitVertex();\n"
7233													"    gs_fs_result = result;\n"
7234													"    gl_Position  = vec4(1, 1, 0, 1);\n"
7235													"    EmitVertex();\n"
7236													"}\n"
7237													"\n";
7238
7239	static const GLchar* tess_ctrl_shader_template =
7240		"VERSION\n"
7241		"\n"
7242		"layout(vertices = 1) out;\n"
7243		"\n"
7244		"in  vec4 vs_tcs_result[];\n"
7245		"out vec4 tcs_tes_result[];\n"
7246		"\n"
7247		"uniform vec4 VARIABLE_NAME;\n"
7248		"\n"
7249		"FUNCTION_DECLARATION\n"
7250		"\n"
7251		"void main()\n"
7252		"{\n"
7253		"    vec4 result = vec4(0, 1, 0, 1);\n"
7254		"\n"
7255		"VERIFICATION"
7256		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
7257		"    {\n"
7258		"         result = vec4(1, 0, 0, 1);\n"
7259		"    }\n"
7260		"\n"
7261		"    tcs_tes_result[gl_InvocationID] = result;\n"
7262		"\n"
7263		"    gl_TessLevelOuter[0] = 1.0;\n"
7264		"    gl_TessLevelOuter[1] = 1.0;\n"
7265		"    gl_TessLevelOuter[2] = 1.0;\n"
7266		"    gl_TessLevelOuter[3] = 1.0;\n"
7267		"    gl_TessLevelInner[0] = 1.0;\n"
7268		"    gl_TessLevelInner[1] = 1.0;\n"
7269		"}\n"
7270		"\n";
7271
7272	static const GLchar* tess_eval_shader_template = "VERSION\n"
7273													 "\n"
7274													 "layout(isolines, point_mode) in;\n"
7275													 "\n"
7276													 "in  vec4 tcs_tes_result[];\n"
7277													 "out vec4 tes_gs_result;\n"
7278													 "\n"
7279													 "uniform vec4 VARIABLE_NAME;\n"
7280													 "\n"
7281													 "FUNCTION_DECLARATION\n"
7282													 "\n"
7283													 "void main()\n"
7284													 "{\n"
7285													 "    vec4 result = vec4(0, 1, 0, 1);\n"
7286													 "\n"
7287													 "VERIFICATION"
7288													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
7289													 "    {\n"
7290													 "         result = vec4(1, 0, 0, 1);\n"
7291													 "    }\n"
7292													 "\n"
7293													 "    tes_gs_result = result;\n"
7294													 "}\n"
7295													 "\n";
7296
7297	static const GLchar* vertex_shader_template = "VERSION\n"
7298												  "\n"
7299												  "out vec4 vs_tcs_result;\n"
7300												  "\n"
7301												  "uniform vec4 VARIABLE_NAME;\n"
7302												  "\n"
7303												  "FUNCTION_DECLARATION\n"
7304												  "\n"
7305												  "void main()\n"
7306												  "{\n"
7307												  "    vec4 result = vec4(0, 1, 0, 1);\n"
7308												  "\n"
7309												  "VERIFICATION"
7310												  "\n"
7311												  "    vs_tcs_result = result;\n"
7312												  "}\n"
7313												  "\n";
7314
7315	const GLchar* shader_template = 0;
7316
7317	switch (in_stage)
7318	{
7319	case Utils::COMPUTE_SHADER:
7320		return;
7321	case Utils::FRAGMENT_SHADER:
7322		shader_template = fragment_shader_template;
7323		break;
7324	case Utils::GEOMETRY_SHADER:
7325		shader_template = geometry_shader_template;
7326		break;
7327	case Utils::TESS_CTRL_SHADER:
7328		shader_template = tess_ctrl_shader_template;
7329		break;
7330	case Utils::TESS_EVAL_SHADER:
7331		shader_template = tess_eval_shader_template;
7332		break;
7333	case Utils::VERTEX_SHADER:
7334		shader_template = vertex_shader_template;
7335		break;
7336	default:
7337		TCU_FAIL("Invalid enum");
7338	}
7339
7340	const std::string& uni_reference  = Utils::getVariableName(in_stage, Utils::UNIFORM, "test");
7341	const std::string& qualifier_list = Utils::getQualifiersListString(getCurrentTestCase());
7342
7343	out_source.m_parts[0].m_code = shader_template;
7344
7345	size_t position = 0;
7346
7347	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
7348						out_source.m_parts[0].m_code);
7349
7350	Utils::replaceToken("FUNCTION_DECLARATION", position, function_declaration, out_source.m_parts[0].m_code);
7351
7352	position -= strlen(function_declaration);
7353
7354	Utils::replaceToken("QUALIFIERS_LIST", position, qualifier_list.c_str(), out_source.m_parts[0].m_code);
7355
7356	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
7357
7358	Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code);
7359}
7360
7361/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
7362 *
7363 * @param program Current program
7364 **/
7365void QualifierOrderFunctionInputTest::prepareUniforms(Utils::program& program)
7366{
7367	static const GLfloat float_data[4] = { 1.0f, 1.0f, 0.0f, 0.0f };
7368
7369	program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7370	program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7371	program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7372	program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7373	program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7374}
7375
7376/** Prepare test cases
7377 *
7378 * @return false if ARB_explicit_uniform_location is not supported, true otherwise
7379 **/
7380bool QualifierOrderFunctionInputTest::testInit()
7381{
7382	m_test_cases.resize(6);
7383
7384	m_test_cases[0].push_back(Utils::QUAL_CONST);
7385	m_test_cases[0].push_back(Utils::QUAL_HIGHP);
7386	m_test_cases[0].push_back(Utils::QUAL_PRECISE);
7387	m_test_cases[0].push_back(Utils::QUAL_IN);
7388
7389	m_test_cases[1].push_back(Utils::QUAL_IN);
7390	m_test_cases[1].push_back(Utils::QUAL_CONST);
7391	m_test_cases[1].push_back(Utils::QUAL_PRECISE);
7392	m_test_cases[1].push_back(Utils::QUAL_HIGHP);
7393
7394	m_test_cases[2].push_back(Utils::QUAL_PRECISE);
7395	m_test_cases[2].push_back(Utils::QUAL_MEDIUMP);
7396	m_test_cases[2].push_back(Utils::QUAL_CONST);
7397	m_test_cases[2].push_back(Utils::QUAL_IN);
7398
7399	m_test_cases[3].push_back(Utils::QUAL_IN);
7400	m_test_cases[3].push_back(Utils::QUAL_PRECISE);
7401	m_test_cases[3].push_back(Utils::QUAL_MEDIUMP);
7402	m_test_cases[3].push_back(Utils::QUAL_CONST);
7403
7404	m_test_cases[4].push_back(Utils::QUAL_LOWP);
7405	m_test_cases[4].push_back(Utils::QUAL_CONST);
7406	m_test_cases[4].push_back(Utils::QUAL_IN);
7407	m_test_cases[4].push_back(Utils::QUAL_PRECISE);
7408
7409	m_test_cases[5].push_back(Utils::QUAL_IN);
7410	m_test_cases[5].push_back(Utils::QUAL_PRECISE);
7411	m_test_cases[5].push_back(Utils::QUAL_CONST);
7412	m_test_cases[5].push_back(Utils::QUAL_LOWP);
7413
7414	return true;
7415}
7416
7417/** Returns reference to current test case
7418 *
7419 * @return Reference to testCase
7420 **/
7421const Utils::qualifierSet& QualifierOrderFunctionInputTest::getCurrentTestCase()
7422{
7423	if ((glw::GLuint)-1 == m_current_test_case_index)
7424	{
7425		return m_test_cases[0];
7426	}
7427	else
7428	{
7429		return m_test_cases[m_current_test_case_index];
7430	}
7431}
7432
7433/** Constructor
7434 *
7435 * @param context Test context
7436 **/
7437QualifierOrderFunctionOutputTest::QualifierOrderFunctionOutputTest(deqp::Context& context)
7438	: GLSLTestBase(context, "qualifier_order_function_output",
7439				   "Verify order of qualifiers of output function parameters")
7440	, m_current_test_case_index(0)
7441{
7442	/* Nothing to be done here */
7443}
7444
7445/** Set up next test case
7446 *
7447 * @param test_case_index Index of next test case
7448 *
7449 * @return false if there is no more test cases, true otherwise
7450 **/
7451bool QualifierOrderFunctionOutputTest::prepareNextTestCase(glw::GLuint test_case_index)
7452{
7453	m_current_test_case_index = test_case_index;
7454
7455	if ((glw::GLuint)-1 == test_case_index)
7456	{
7457		/* Nothing to be done here */
7458	}
7459	else if (m_test_cases.size() <= test_case_index)
7460	{
7461		return false;
7462	}
7463
7464	const Utils::qualifierSet& set = getCurrentTestCase();
7465
7466	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
7467
7468	for (GLuint i = 0; i < set.size(); ++i)
7469	{
7470		message << Utils::getQualifierString(set[i]) << " ";
7471	}
7472
7473	message << tcu::TestLog::EndMessage;
7474
7475	return true;
7476}
7477
7478/** Prepare source for given shader stage
7479 *
7480 * @param in_stage           Shader stage, compute shader will use 430
7481 * @param in_use_version_400 Select if 400 or 420 should be used
7482 * @param out_source         Prepared shader source instance
7483 **/
7484void QualifierOrderFunctionOutputTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
7485														   Utils::shaderSource& out_source)
7486{
7487	static const GLchar* verification_snippet =
7488		"    vec4 temp;\n"
7489		"\n"
7490		"    function(temp);\n"
7491		"\n"
7492		"    vec4 diff = temp - vec4(0, 0, 1, 1);\n"
7493		"    if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n"
7494		"    {\n"
7495		"        result = VARIABLE_NAME;\n"
7496		"    }\n";
7497
7498	static const GLchar* function_declaration = "void function(QUALIFIERS_LIST vec4 param)\n"
7499												"{\n"
7500												"    param = VARIABLE_NAME.wzyx;\n"
7501												"}\n";
7502
7503	static const GLchar* fragment_shader_template = "VERSION\n"
7504													"\n"
7505													"in  vec4 gs_fs_result;\n"
7506													"out vec4 fs_out_result;\n"
7507													"\n"
7508													"uniform vec4 VARIABLE_NAME;\n"
7509													"\n"
7510													"FUNCTION_DECLARATION\n"
7511													"\n"
7512													"void main()\n"
7513													"{\n"
7514													"    vec4 result = vec4(0, 1, 0, 1);\n"
7515													"\n"
7516													"VERIFICATION"
7517													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
7518													"    {\n"
7519													"         result = vec4(1, 0, 0, 1);\n"
7520													"    }\n"
7521													"\n"
7522													"    fs_out_result = result;\n"
7523													"}\n"
7524													"\n";
7525
7526	static const GLchar* geometry_shader_template = "VERSION\n"
7527													"\n"
7528													"layout(points)                           in;\n"
7529													"layout(triangle_strip, max_vertices = 4) out;\n"
7530													"\n"
7531													"in  vec4 tes_gs_result[];\n"
7532													"out vec4 gs_fs_result;\n"
7533													"\n"
7534													"uniform vec4 VARIABLE_NAME;\n"
7535													"\n"
7536													"FUNCTION_DECLARATION\n"
7537													"\n"
7538													"void main()\n"
7539													"{\n"
7540													"    vec4 result = vec4(0, 1, 0, 1);\n"
7541													"\n"
7542													"VERIFICATION"
7543													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
7544													"    {\n"
7545													"         result = vec4(1, 0, 0, 1);\n"
7546													"    }\n"
7547													"\n"
7548													"    gs_fs_result = result;\n"
7549													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
7550													"    EmitVertex();\n"
7551													"    gs_fs_result = result;\n"
7552													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
7553													"    EmitVertex();\n"
7554													"    gs_fs_result = result;\n"
7555													"    gl_Position  = vec4(1, -1, 0, 1);\n"
7556													"    EmitVertex();\n"
7557													"    gs_fs_result = result;\n"
7558													"    gl_Position  = vec4(1, 1, 0, 1);\n"
7559													"    EmitVertex();\n"
7560													"}\n"
7561													"\n";
7562
7563	static const GLchar* tess_ctrl_shader_template =
7564		"VERSION\n"
7565		"\n"
7566		"layout(vertices = 1) out;\n"
7567		"\n"
7568		"in  vec4 vs_tcs_result[];\n"
7569		"out vec4 tcs_tes_result[];\n"
7570		"\n"
7571		"uniform vec4 VARIABLE_NAME;\n"
7572		"\n"
7573		"FUNCTION_DECLARATION\n"
7574		"\n"
7575		"void main()\n"
7576		"{\n"
7577		"    vec4 result = vec4(0, 1, 0, 1);\n"
7578		"\n"
7579		"VERIFICATION"
7580		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
7581		"    {\n"
7582		"         result = vec4(1, 0, 0, 1);\n"
7583		"    }\n"
7584		"\n"
7585		"    tcs_tes_result[gl_InvocationID] = result;\n"
7586		"\n"
7587		"    gl_TessLevelOuter[0] = 1.0;\n"
7588		"    gl_TessLevelOuter[1] = 1.0;\n"
7589		"    gl_TessLevelOuter[2] = 1.0;\n"
7590		"    gl_TessLevelOuter[3] = 1.0;\n"
7591		"    gl_TessLevelInner[0] = 1.0;\n"
7592		"    gl_TessLevelInner[1] = 1.0;\n"
7593		"}\n"
7594		"\n";
7595
7596	static const GLchar* tess_eval_shader_template = "VERSION\n"
7597													 "\n"
7598													 "layout(isolines, point_mode) in;\n"
7599													 "\n"
7600													 "in  vec4 tcs_tes_result[];\n"
7601													 "out vec4 tes_gs_result;\n"
7602													 "\n"
7603													 "uniform vec4 VARIABLE_NAME;\n"
7604													 "\n"
7605													 "FUNCTION_DECLARATION\n"
7606													 "\n"
7607													 "void main()\n"
7608													 "{\n"
7609													 "    vec4 result = vec4(0, 1, 0, 1);\n"
7610													 "\n"
7611													 "VERIFICATION"
7612													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
7613													 "    {\n"
7614													 "         result = vec4(1, 0, 0, 1);\n"
7615													 "    }\n"
7616													 "\n"
7617													 "    tes_gs_result = result;\n"
7618													 "}\n"
7619													 "\n";
7620
7621	static const GLchar* vertex_shader_template = "VERSION\n"
7622												  "\n"
7623												  "out vec4 vs_tcs_result;\n"
7624												  "\n"
7625												  "uniform vec4 VARIABLE_NAME;\n"
7626												  "\n"
7627												  "FUNCTION_DECLARATION\n"
7628												  "\n"
7629												  "void main()\n"
7630												  "{\n"
7631												  "    vec4 result = vec4(0, 1, 0, 1);\n"
7632												  "\n"
7633												  "VERIFICATION"
7634												  "\n"
7635												  "    vs_tcs_result = result;\n"
7636												  "}\n"
7637												  "\n";
7638
7639	const GLchar* shader_template = 0;
7640
7641	switch (in_stage)
7642	{
7643	case Utils::COMPUTE_SHADER:
7644		return;
7645	case Utils::FRAGMENT_SHADER:
7646		shader_template = fragment_shader_template;
7647		break;
7648	case Utils::GEOMETRY_SHADER:
7649		shader_template = geometry_shader_template;
7650		break;
7651	case Utils::TESS_CTRL_SHADER:
7652		shader_template = tess_ctrl_shader_template;
7653		break;
7654	case Utils::TESS_EVAL_SHADER:
7655		shader_template = tess_eval_shader_template;
7656		break;
7657	case Utils::VERTEX_SHADER:
7658		shader_template = vertex_shader_template;
7659		break;
7660	default:
7661		TCU_FAIL("Invalid enum");
7662	}
7663
7664	const std::string& uni_reference  = Utils::getVariableName(in_stage, Utils::UNIFORM, "test");
7665	const std::string& qualifier_list = Utils::getQualifiersListString(getCurrentTestCase());
7666
7667	out_source.m_parts[0].m_code = shader_template;
7668
7669	size_t position = 0;
7670
7671	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
7672						out_source.m_parts[0].m_code);
7673
7674	Utils::replaceToken("FUNCTION_DECLARATION", position, function_declaration, out_source.m_parts[0].m_code);
7675
7676	position -= strlen(function_declaration);
7677
7678	Utils::replaceToken("QUALIFIERS_LIST", position, qualifier_list.c_str(), out_source.m_parts[0].m_code);
7679
7680	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
7681
7682	Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code);
7683}
7684
7685/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
7686 *
7687 * @param program Current program
7688 **/
7689void QualifierOrderFunctionOutputTest::prepareUniforms(Utils::program& program)
7690{
7691	static const GLfloat float_data[4] = { 1.0f, 1.0f, 0.0f, 0.0f };
7692
7693	program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7694	program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7695	program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7696	program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7697	program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data);
7698}
7699
7700/** Prepare test cases
7701 *
7702 * @return false if ARB_explicit_uniform_location is not supported, true otherwise
7703 **/
7704bool QualifierOrderFunctionOutputTest::testInit()
7705{
7706	m_test_cases.resize(6);
7707
7708	m_test_cases[0].push_back(Utils::QUAL_HIGHP);
7709	m_test_cases[0].push_back(Utils::QUAL_PRECISE);
7710	m_test_cases[0].push_back(Utils::QUAL_OUT);
7711
7712	m_test_cases[1].push_back(Utils::QUAL_OUT);
7713	m_test_cases[1].push_back(Utils::QUAL_PRECISE);
7714	m_test_cases[1].push_back(Utils::QUAL_HIGHP);
7715
7716	m_test_cases[2].push_back(Utils::QUAL_PRECISE);
7717	m_test_cases[2].push_back(Utils::QUAL_MEDIUMP);
7718	m_test_cases[2].push_back(Utils::QUAL_OUT);
7719
7720	m_test_cases[3].push_back(Utils::QUAL_OUT);
7721	m_test_cases[3].push_back(Utils::QUAL_PRECISE);
7722	m_test_cases[3].push_back(Utils::QUAL_MEDIUMP);
7723
7724	m_test_cases[4].push_back(Utils::QUAL_LOWP);
7725	m_test_cases[4].push_back(Utils::QUAL_OUT);
7726	m_test_cases[4].push_back(Utils::QUAL_PRECISE);
7727
7728	m_test_cases[5].push_back(Utils::QUAL_OUT);
7729	m_test_cases[5].push_back(Utils::QUAL_PRECISE);
7730	m_test_cases[5].push_back(Utils::QUAL_LOWP);
7731
7732	return true;
7733}
7734
7735/** Returns reference to current test case
7736 *
7737 * @return Reference to testCase
7738 **/
7739const Utils::qualifierSet& QualifierOrderFunctionOutputTest::getCurrentTestCase()
7740{
7741	if ((glw::GLuint)-1 == m_current_test_case_index)
7742	{
7743		return m_test_cases[0];
7744	}
7745	else
7746	{
7747		return m_test_cases[m_current_test_case_index];
7748	}
7749}
7750
7751/** Constructor
7752 *
7753 * @param context Test context
7754 **/
7755QualifierOverrideLayoutTest::QualifierOverrideLayoutTest(deqp::Context& context)
7756	: GLSLTestBase(context, "qualifier_override_layout", "Verifies overriding layout qualifiers")
7757{
7758	/* Nothing to be done here */
7759}
7760
7761/** Prepare source for given shader stage
7762 *
7763 * @param in_stage           Shader stage, compute shader will use 430
7764 * @param in_use_version_400 Select if 400 or 420 should be used
7765 * @param out_source         Prepared shader source instance
7766 **/
7767void QualifierOverrideLayoutTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
7768													  Utils::shaderSource& out_source)
7769{
7770	static const GLchar* fragment_shader_template = "VERSION\n"
7771													"\n"
7772													"in  layout(location = 3) layout(location = 2) vec4 gs_fs_result;\n"
7773													"out vec4 fs_out_result;\n"
7774													"\n"
7775													"void main()\n"
7776													"{\n"
7777													"    vec4 result = vec4(0, 1, 0, 1);\n"
7778													"\n"
7779													"    if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
7780													"    {\n"
7781													"         result = vec4(1, 0, 0, 1);\n"
7782													"    }\n"
7783													"\n"
7784													"    fs_out_result = result;\n"
7785													"}\n"
7786													"\n";
7787
7788	static const GLchar* geometry_shader_template =
7789		"VERSION\n"
7790		"\n"
7791		"layout(points)                                                    in;\n"
7792		"layout(triangle_strip, max_vertices = 2) layout(max_vertices = 4) out;\n"
7793		"\n"
7794		"in  layout(location = 3) layout(location = 2) vec4 tes_gs_result[];\n"
7795		"out layout(location = 3) layout(location = 2) vec4 gs_fs_result;\n"
7796		"\n"
7797		"void main()\n"
7798		"{\n"
7799		"    vec4 result = vec4(0, 1, 0, 1);\n"
7800		"\n"
7801		"    if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
7802		"    {\n"
7803		"         result = vec4(1, 0, 0, 1);\n"
7804		"    }\n"
7805		"\n"
7806		"    gs_fs_result = result;\n"
7807		"    gl_Position  = vec4(-1, -1, 0, 1);\n"
7808		"    EmitVertex();\n"
7809		"    gs_fs_result = result;\n"
7810		"    gl_Position  = vec4(-1, 1, 0, 1);\n"
7811		"    EmitVertex();\n"
7812		"    gs_fs_result = result;\n"
7813		"    gl_Position  = vec4(1, -1, 0, 1);\n"
7814		"    EmitVertex();\n"
7815		"    gs_fs_result = result;\n"
7816		"    gl_Position  = vec4(1, 1, 0, 1);\n"
7817		"    EmitVertex();\n"
7818		"}\n"
7819		"\n";
7820
7821	static const GLchar* tess_ctrl_shader_template =
7822		"VERSION\n"
7823		"\n"
7824		"layout(vertices = 4) layout(vertices = 1) out;\n"
7825		"\n"
7826		"in  layout(location = 3) layout(location = 2) vec4 vs_tcs_result[];\n"
7827		"out layout(location = 3) layout(location = 2) vec4 tcs_tes_result[];\n"
7828		"\n"
7829		"void main()\n"
7830		"{\n"
7831		"    vec4 result = vec4(0, 1, 0, 1);\n"
7832		"\n"
7833		"    if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
7834		"    {\n"
7835		"         result = vec4(1, 0, 0, 1);\n"
7836		"    }\n"
7837		"\n"
7838		"    tcs_tes_result[gl_InvocationID] = result;\n"
7839		"\n"
7840		"    gl_TessLevelOuter[0] = 1.0;\n"
7841		"    gl_TessLevelOuter[1] = 1.0;\n"
7842		"    gl_TessLevelOuter[2] = 1.0;\n"
7843		"    gl_TessLevelOuter[3] = 1.0;\n"
7844		"    gl_TessLevelInner[0] = 1.0;\n"
7845		"    gl_TessLevelInner[1] = 1.0;\n"
7846		"}\n"
7847		"\n";
7848
7849	static const GLchar* tess_eval_shader_template =
7850		"VERSION\n"
7851		"\n"
7852		"layout(isolines, point_mode) in;\n"
7853		"\n"
7854		"in  layout(location = 3) layout(location = 2) vec4 tcs_tes_result[];\n"
7855		"out layout(location = 3) layout(location = 2) vec4 tes_gs_result;\n"
7856		"\n"
7857		"void main()\n"
7858		"{\n"
7859		"    vec4 result = vec4(0, 1, 0, 1);\n"
7860		"\n"
7861		"    if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
7862		"    {\n"
7863		"         result = vec4(1, 0, 0, 1);\n"
7864		"    }\n"
7865		"\n"
7866		"    tes_gs_result = result;\n"
7867		"}\n"
7868		"\n";
7869
7870	static const GLchar* vertex_shader_template = "VERSION\n"
7871												  "\n"
7872												  "in  layout(location = 3) layout(location = 2) vec4 in_vs_test;\n"
7873												  "out layout(location = 3) layout(location = 2) vec4 vs_tcs_result;\n"
7874												  "\n"
7875												  "void main()\n"
7876												  "{\n"
7877												  "    vec4 result = in_vs_test;\n"
7878												  "\n"
7879												  "    vs_tcs_result = result;\n"
7880												  "}\n"
7881												  "\n";
7882
7883	const GLchar* shader_template = 0;
7884
7885	switch (in_stage)
7886	{
7887	case Utils::COMPUTE_SHADER:
7888		return;
7889	case Utils::FRAGMENT_SHADER:
7890		shader_template = fragment_shader_template;
7891		break;
7892	case Utils::GEOMETRY_SHADER:
7893		shader_template = geometry_shader_template;
7894		break;
7895	case Utils::TESS_CTRL_SHADER:
7896		shader_template = tess_ctrl_shader_template;
7897		break;
7898	case Utils::TESS_EVAL_SHADER:
7899		shader_template = tess_eval_shader_template;
7900		break;
7901	case Utils::VERTEX_SHADER:
7902		shader_template = vertex_shader_template;
7903		break;
7904	default:
7905		TCU_FAIL("Invalid enum");
7906	}
7907
7908	out_source.m_parts[0].m_code = shader_template;
7909
7910	size_t position = 0;
7911
7912	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
7913						out_source.m_parts[0].m_code);
7914}
7915
7916/**Prepare vertex buffer and vertex array object.
7917 *
7918 * @param program Program instance
7919 * @param buffer  Buffer instance
7920 * @param vao     VertexArray instance
7921 *
7922 * @return 0
7923 **/
7924void QualifierOverrideLayoutTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer,
7925													  Utils::vertexArray& vao)
7926{
7927	static const GLint expected_location = 2;
7928
7929	std::string test_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "test");
7930	GLint		test_loc  = program.getAttribLocation(test_name.c_str());
7931
7932	if (expected_location != test_loc)
7933	{
7934		TCU_FAIL("Vertex attribute location is invalid");
7935	}
7936
7937	vao.generate();
7938	vao.bind();
7939
7940	buffer.generate(GL_ARRAY_BUFFER);
7941
7942	GLfloat	data[]	= { 0.0f, 1.0f, 0.0f, 1.0f };
7943	GLsizeiptr data_size = sizeof(data);
7944
7945	buffer.update(data_size, data, GL_STATIC_DRAW);
7946
7947	/* GL entry points */
7948	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
7949
7950	/* Set up vao */
7951	gl.vertexAttribPointer(test_loc, 4 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */,
7952						   0 /* offset */);
7953	GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer");
7954
7955	/* Enable attribute */
7956	gl.enableVertexAttribArray(test_loc);
7957	GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray");
7958}
7959
7960/** Constructor
7961 *
7962 * @param context Test context
7963 **/
7964BindingUniformBlocksTest::BindingUniformBlocksTest(deqp::Context& context)
7965	: GLSLTestBase(context, "binding_uniform_blocks", "Test verifies uniform block binding")
7966	, m_goku_buffer(context)
7967	, m_vegeta_buffer(context)
7968	, m_children_buffer(context)
7969{
7970	/* Nothing to be done here */
7971}
7972
7973/** Prepare source for given shader stage
7974 *
7975 * @param in_stage           Shader stage, compute shader will use 430
7976 * @param in_use_version_400 Select if 400 or 420 should be used
7977 * @param out_source         Prepared shader source instance
7978 **/
7979void BindingUniformBlocksTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
7980												   Utils::shaderSource& out_source)
7981{
7982	static const GLchar* uni_goku = "layout(std140, binding = 0) uniform GOKU {\n"
7983									"    vec4 chichi;\n"
7984									"} goku;\n";
7985
7986	static const GLchar* uni_vegeta = "layout(std140, binding = 1) uniform VEGETA {\n"
7987									  "    vec3 bulma;\n"
7988									  "} vegeta;\n";
7989
7990	static const GLchar* uni_children = "layout(std140, binding = 3) uniform CHILDREN {\n"
7991										"    vec4 gohan;\n"
7992										"    vec4 trunks;\n"
7993										"} children;\n\n";
7994
7995	static const GLchar* verification_snippet = "    if ((vec4(1, 0, 0, 0) != goku.chichi)    ||\n"
7996												"        (vec3(0, 1, 0)    != vegeta.bulma)   ||\n"
7997												"        (vec4(0, 0, 1, 0) != children.gohan) ||\n"
7998												"        (vec4(0, 0, 0, 1) != children.trunks) )\n"
7999												"    {\n"
8000												"        result = vec4(1, 0, 0, 1);\n"
8001												"    }\n";
8002
8003	static const GLchar* compute_shader_template =
8004		"VERSION\n"
8005		"\n"
8006		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
8007		"\n"
8008		"writeonly uniform image2D uni_image;\n"
8009		"\n"
8010		"UNI_GOKU\n"
8011		"UNI_VEGETA\n"
8012		"UNI_CHILDREN\n"
8013		"\n"
8014		"void main()\n"
8015		"{\n"
8016		"    vec4 result = vec4(0, 1, 0, 1);\n"
8017		"\n"
8018		"VERIFICATION"
8019		"\n"
8020		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
8021		"}\n"
8022		"\n";
8023
8024	static const GLchar* fragment_shader_template = "VERSION\n"
8025													"\n"
8026													"in  vec4 gs_fs_result;\n"
8027													"out vec4 fs_out_result;\n"
8028													"\n"
8029													"UNI_GOKU\n"
8030													"UNI_VEGETA\n"
8031													"UNI_CHILDREN\n"
8032													"\n"
8033													"void main()\n"
8034													"{\n"
8035													"    vec4 result = vec4(0, 1, 0, 1);\n"
8036													"\n"
8037													"VERIFICATION"
8038													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
8039													"    {\n"
8040													"         result = vec4(1, 0, 0, 1);\n"
8041													"    }\n"
8042													"\n"
8043													"    fs_out_result = result;\n"
8044													"}\n"
8045													"\n";
8046
8047	static const GLchar* geometry_shader_template = "VERSION\n"
8048													"\n"
8049													"layout(points)                           in;\n"
8050													"layout(triangle_strip, max_vertices = 4) out;\n"
8051													"\n"
8052													"in  vec4 tes_gs_result[];\n"
8053													"out vec4 gs_fs_result;\n"
8054													"\n"
8055													"UNI_CHILDREN\n"
8056													"UNI_GOKU\n"
8057													"UNI_VEGETA\n"
8058													"\n"
8059													"void main()\n"
8060													"{\n"
8061													"    vec4 result = vec4(0, 1, 0, 1);\n"
8062													"\n"
8063													"VERIFICATION"
8064													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
8065													"    {\n"
8066													"         result = vec4(1, 0, 0, 1);\n"
8067													"    }\n"
8068													"\n"
8069													"    gs_fs_result = result;\n"
8070													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
8071													"    EmitVertex();\n"
8072													"    gs_fs_result = result;\n"
8073													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
8074													"    EmitVertex();\n"
8075													"    gs_fs_result = result;\n"
8076													"    gl_Position  = vec4(1, -1, 0, 1);\n"
8077													"    EmitVertex();\n"
8078													"    gs_fs_result = result;\n"
8079													"    gl_Position  = vec4(1, 1, 0, 1);\n"
8080													"    EmitVertex();\n"
8081													"}\n"
8082													"\n";
8083
8084	static const GLchar* tess_ctrl_shader_template =
8085		"VERSION\n"
8086		"\n"
8087		"layout(vertices = 1) out;\n"
8088		"\n"
8089		"in  vec4 vs_tcs_result[];\n"
8090		"out vec4 tcs_tes_result[];\n"
8091		"\n"
8092		"UNI_VEGETA\n"
8093		"UNI_CHILDREN\n"
8094		"UNI_GOKU\n"
8095		"\n"
8096		"void main()\n"
8097		"{\n"
8098		"    vec4 result = vec4(0, 1, 0, 1);\n"
8099		"\n"
8100		"VERIFICATION"
8101		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
8102		"    {\n"
8103		"         result = vec4(1, 0, 0, 1);\n"
8104		"    }\n"
8105		"\n"
8106		"    tcs_tes_result[gl_InvocationID] = result;\n"
8107		"\n"
8108		"    gl_TessLevelOuter[0] = 1.0;\n"
8109		"    gl_TessLevelOuter[1] = 1.0;\n"
8110		"    gl_TessLevelOuter[2] = 1.0;\n"
8111		"    gl_TessLevelOuter[3] = 1.0;\n"
8112		"    gl_TessLevelInner[0] = 1.0;\n"
8113		"    gl_TessLevelInner[1] = 1.0;\n"
8114		"}\n"
8115		"\n";
8116
8117	static const GLchar* tess_eval_shader_template = "VERSION\n"
8118													 "\n"
8119													 "layout(isolines, point_mode) in;\n"
8120													 "\n"
8121													 "in  vec4 tcs_tes_result[];\n"
8122													 "out vec4 tes_gs_result;\n"
8123													 "\n"
8124													 "UNI_GOKU\n"
8125													 "UNI_CHILDREN\n"
8126													 "UNI_VEGETA\n"
8127													 "\n"
8128													 "void main()\n"
8129													 "{\n"
8130													 "    vec4 result = vec4(0, 1, 0, 1);\n"
8131													 "\n"
8132													 "VERIFICATION"
8133													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
8134													 "    {\n"
8135													 "         result = vec4(1, 0, 0, 1);\n"
8136													 "    }\n"
8137													 "\n"
8138													 "    tes_gs_result = result;\n"
8139													 "}\n"
8140													 "\n";
8141
8142	static const GLchar* vertex_shader_template = "VERSION\n"
8143												  "\n"
8144												  "out vec4 vs_tcs_result;\n"
8145												  "\n"
8146												  "UNI_CHILDREN\n"
8147												  "UNI_VEGETA\n"
8148												  "UNI_GOKU\n"
8149												  "\n"
8150												  "void main()\n"
8151												  "{\n"
8152												  "    vec4 result = vec4(0, 1, 0, 1);\n"
8153												  "\n"
8154												  "VERIFICATION"
8155												  "\n"
8156												  "    vs_tcs_result = result;\n"
8157												  "}\n"
8158												  "\n";
8159
8160	const GLchar* shader_template = 0;
8161
8162	switch (in_stage)
8163	{
8164	case Utils::COMPUTE_SHADER:
8165		shader_template = compute_shader_template;
8166		break;
8167	case Utils::FRAGMENT_SHADER:
8168		shader_template = fragment_shader_template;
8169		break;
8170	case Utils::GEOMETRY_SHADER:
8171		shader_template = geometry_shader_template;
8172		break;
8173	case Utils::TESS_CTRL_SHADER:
8174		shader_template = tess_ctrl_shader_template;
8175		break;
8176	case Utils::TESS_EVAL_SHADER:
8177		shader_template = tess_eval_shader_template;
8178		break;
8179	case Utils::VERTEX_SHADER:
8180		shader_template = vertex_shader_template;
8181		break;
8182	default:
8183		TCU_FAIL("Invalid enum");
8184	}
8185
8186	out_source.m_parts[0].m_code = shader_template;
8187
8188	size_t position = 0;
8189
8190	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
8191						out_source.m_parts[0].m_code);
8192
8193	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
8194
8195	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
8196
8197	Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code);
8198
8199	Utils::replaceAllTokens("UNI_CHILDREN", uni_children, out_source.m_parts[0].m_code);
8200}
8201
8202/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
8203 *
8204 * @param program Current program
8205 **/
8206void BindingUniformBlocksTest::prepareUniforms(Utils::program& program)
8207{
8208	(void)program;
8209	static const GLfloat goku_data[4]	 = { 1.0f, 0.0f, 0.0f, 0.0f };
8210	static const GLfloat vegeta_data[3]   = { 0.0f, 1.0f, 0.0f };
8211	static const GLfloat children_data[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f };
8212
8213	m_goku_buffer.generate(GL_UNIFORM_BUFFER);
8214	m_vegeta_buffer.generate(GL_UNIFORM_BUFFER);
8215	m_children_buffer.generate(GL_UNIFORM_BUFFER);
8216
8217	m_goku_buffer.update(sizeof(goku_data), (GLvoid*)goku_data, GL_STATIC_DRAW);
8218	m_vegeta_buffer.update(sizeof(vegeta_data), (GLvoid*)vegeta_data, GL_STATIC_DRAW);
8219	m_children_buffer.update(sizeof(children_data), (GLvoid*)children_data, GL_STATIC_DRAW);
8220
8221	m_goku_buffer.bindRange(0 /* index */, 0 /* offset */, sizeof(goku_data));
8222	m_vegeta_buffer.bindRange(1 /* index */, 0 /* offset */, sizeof(vegeta_data));
8223	m_children_buffer.bindRange(3 /* index */, 0 /* offset */, sizeof(children_data));
8224}
8225
8226/** Overwrite of releaseResource method, release extra uniform buffer
8227 *
8228 * @param ignored
8229 **/
8230void BindingUniformBlocksTest::releaseResource()
8231{
8232	m_goku_buffer.release();
8233	m_vegeta_buffer.release();
8234	m_children_buffer.release();
8235}
8236
8237/** Constructor
8238 *
8239 * @param context Test context
8240 **/
8241BindingUniformSingleBlockTest::BindingUniformSingleBlockTest(deqp::Context& context)
8242	: GLSLTestBase(context, "binding_uniform_single_block", "Test verifies uniform block binding")
8243	, m_goku_buffer(context)
8244	, m_test_stage(Utils::SHADER_STAGES_MAX)
8245{
8246	/* Nothing to be done here */
8247}
8248
8249/** Set up next test case
8250 *
8251 * @param test_case_index Index of next test case
8252 *
8253 * @return false if there is no more test cases, true otherwise
8254 **/
8255bool BindingUniformSingleBlockTest::prepareNextTestCase(glw::GLuint test_case_index)
8256{
8257	switch (test_case_index)
8258	{
8259	case (glw::GLuint)-1:
8260	case 0:
8261		m_test_stage = Utils::VERTEX_SHADER;
8262		break;
8263	case 1:
8264		m_test_stage = Utils::TESS_CTRL_SHADER;
8265		break;
8266	case 2:
8267		m_test_stage = Utils::TESS_EVAL_SHADER;
8268		break;
8269	case 3:
8270		m_test_stage = Utils::GEOMETRY_SHADER;
8271		break;
8272	case 4:
8273		m_test_stage = Utils::FRAGMENT_SHADER;
8274		break;
8275	default:
8276		return false;
8277	}
8278
8279	m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested stage: "
8280										<< Utils::getShaderStageName((Utils::SHADER_STAGES)m_test_stage)
8281										<< tcu::TestLog::EndMessage;
8282
8283	return true;
8284}
8285
8286/** Prepare source for given shader stage
8287 *
8288 * @param in_stage           Shader stage, compute shader will use 430
8289 * @param in_use_version_400 Select if 400 or 420 should be used
8290 * @param out_source         Prepared shader source instance
8291 **/
8292void BindingUniformSingleBlockTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
8293														Utils::shaderSource& out_source)
8294{
8295	static const GLchar* uni_goku_with_binding = "layout(std140, binding = 0) uniform GOKU {\n"
8296												 "    vec4 gohan;\n"
8297												 "    vec4 goten;\n"
8298												 "} goku;\n";
8299
8300	static const GLchar* uni_goku_no_binding = "layout(std140) uniform GOKU {\n"
8301											   "    vec4 gohan;\n"
8302											   "    vec4 goten;\n"
8303											   "} goku;\n";
8304
8305	static const GLchar* verification_snippet = "    if ((vec4(1, 0, 0, 0) != goku.gohan) ||\n"
8306												"        (vec4(0, 1, 0, 0) != goku.goten) )\n"
8307												"    {\n"
8308												"        result = vec4(1, 0, 0, 1);\n"
8309												"    }\n";
8310
8311	static const GLchar* compute_shader_template =
8312		"VERSION\n"
8313		"\n"
8314		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
8315		"\n"
8316		"writeonly uniform image2D uni_image;\n"
8317		"\n"
8318		"UNI_GOKU\n"
8319		"\n"
8320		"void main()\n"
8321		"{\n"
8322		"    vec4 result = vec4(0, 1, 0, 1);\n"
8323		"\n"
8324		"VERIFICATION"
8325		"\n"
8326		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
8327		"}\n"
8328		"\n";
8329
8330	static const GLchar* fragment_shader_template = "VERSION\n"
8331													"\n"
8332													"in  vec4 gs_fs_result;\n"
8333													"out vec4 fs_out_result;\n"
8334													"\n"
8335													"UNI_GOKU\n"
8336													"\n"
8337													"void main()\n"
8338													"{\n"
8339													"    vec4 result = vec4(0, 1, 0, 1);\n"
8340													"\n"
8341													"VERIFICATION"
8342													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
8343													"    {\n"
8344													"         result = vec4(1, 0, 0, 1);\n"
8345													"    }\n"
8346													"\n"
8347													"    fs_out_result = result;\n"
8348													"}\n"
8349													"\n";
8350
8351	static const GLchar* geometry_shader_template = "VERSION\n"
8352													"\n"
8353													"layout(points)                           in;\n"
8354													"layout(triangle_strip, max_vertices = 4) out;\n"
8355													"\n"
8356													"in  vec4 tes_gs_result[];\n"
8357													"out vec4 gs_fs_result;\n"
8358													"\n"
8359													"UNI_GOKU\n"
8360													"\n"
8361													"void main()\n"
8362													"{\n"
8363													"    vec4 result = vec4(0, 1, 0, 1);\n"
8364													"\n"
8365													"VERIFICATION"
8366													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
8367													"    {\n"
8368													"         result = vec4(1, 0, 0, 1);\n"
8369													"    }\n"
8370													"\n"
8371													"    gs_fs_result = result;\n"
8372													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
8373													"    EmitVertex();\n"
8374													"    gs_fs_result = result;\n"
8375													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
8376													"    EmitVertex();\n"
8377													"    gs_fs_result = result;\n"
8378													"    gl_Position  = vec4(1, -1, 0, 1);\n"
8379													"    EmitVertex();\n"
8380													"    gs_fs_result = result;\n"
8381													"    gl_Position  = vec4(1, 1, 0, 1);\n"
8382													"    EmitVertex();\n"
8383													"}\n"
8384													"\n";
8385
8386	static const GLchar* tess_ctrl_shader_template =
8387		"VERSION\n"
8388		"\n"
8389		"layout(vertices = 1) out;\n"
8390		"\n"
8391		"in  vec4 vs_tcs_result[];\n"
8392		"out vec4 tcs_tes_result[];\n"
8393		"\n"
8394		"UNI_GOKU\n"
8395		"\n"
8396		"void main()\n"
8397		"{\n"
8398		"    vec4 result = vec4(0, 1, 0, 1);\n"
8399		"\n"
8400		"VERIFICATION"
8401		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
8402		"    {\n"
8403		"         result = vec4(1, 0, 0, 1);\n"
8404		"    }\n"
8405		"\n"
8406		"    tcs_tes_result[gl_InvocationID] = result;\n"
8407		"\n"
8408		"    gl_TessLevelOuter[0] = 1.0;\n"
8409		"    gl_TessLevelOuter[1] = 1.0;\n"
8410		"    gl_TessLevelOuter[2] = 1.0;\n"
8411		"    gl_TessLevelOuter[3] = 1.0;\n"
8412		"    gl_TessLevelInner[0] = 1.0;\n"
8413		"    gl_TessLevelInner[1] = 1.0;\n"
8414		"}\n"
8415		"\n";
8416
8417	static const GLchar* tess_eval_shader_template = "VERSION\n"
8418													 "\n"
8419													 "layout(isolines, point_mode) in;\n"
8420													 "\n"
8421													 "in  vec4 tcs_tes_result[];\n"
8422													 "out vec4 tes_gs_result;\n"
8423													 "\n"
8424													 "UNI_GOKU\n"
8425													 "\n"
8426													 "void main()\n"
8427													 "{\n"
8428													 "    vec4 result = vec4(0, 1, 0, 1);\n"
8429													 "\n"
8430													 "VERIFICATION"
8431													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
8432													 "    {\n"
8433													 "         result = vec4(1, 0, 0, 1);\n"
8434													 "    }\n"
8435													 "\n"
8436													 "    tes_gs_result = result;\n"
8437													 "}\n"
8438													 "\n";
8439
8440	static const GLchar* vertex_shader_template = "VERSION\n"
8441												  "\n"
8442												  "out vec4 vs_tcs_result;\n"
8443												  "\n"
8444												  "UNI_GOKU\n"
8445												  "\n"
8446												  "void main()\n"
8447												  "{\n"
8448												  "    vec4 result = vec4(0, 1, 0, 1);\n"
8449												  "\n"
8450												  "VERIFICATION"
8451												  "\n"
8452												  "    vs_tcs_result = result;\n"
8453												  "}\n"
8454												  "\n";
8455
8456	const GLchar* shader_template	= 0;
8457	const GLchar* uniform_definition = uni_goku_no_binding;
8458
8459	switch (in_stage)
8460	{
8461	case Utils::COMPUTE_SHADER:
8462		shader_template	= compute_shader_template;
8463		uniform_definition = uni_goku_with_binding;
8464		break;
8465	case Utils::FRAGMENT_SHADER:
8466		shader_template = fragment_shader_template;
8467		break;
8468	case Utils::GEOMETRY_SHADER:
8469		shader_template = geometry_shader_template;
8470		break;
8471	case Utils::TESS_CTRL_SHADER:
8472		shader_template = tess_ctrl_shader_template;
8473		break;
8474	case Utils::TESS_EVAL_SHADER:
8475		shader_template = tess_eval_shader_template;
8476		break;
8477	case Utils::VERTEX_SHADER:
8478		shader_template = vertex_shader_template;
8479		break;
8480	default:
8481		TCU_FAIL("Invalid enum");
8482	}
8483
8484	if (in_stage == m_test_stage)
8485	{
8486		uniform_definition = uni_goku_with_binding;
8487	}
8488
8489	out_source.m_parts[0].m_code = shader_template;
8490
8491	size_t position = 0;
8492
8493	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
8494						out_source.m_parts[0].m_code);
8495
8496	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
8497
8498	Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code);
8499}
8500
8501/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
8502 *
8503 * @param program Current program
8504 **/
8505void BindingUniformSingleBlockTest::prepareUniforms(Utils::program& program)
8506{
8507	(void)program;
8508	static const GLfloat goku_data[8] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
8509
8510	m_goku_buffer.generate(GL_UNIFORM_BUFFER);
8511
8512	m_goku_buffer.update(sizeof(goku_data), (GLvoid*)goku_data, GL_STATIC_DRAW);
8513
8514	m_goku_buffer.bindRange(0 /* index */, 0 /* offset */, sizeof(goku_data));
8515}
8516
8517/** Overwrite of releaseResource method, release extra uniform buffer
8518 *
8519 * @param ignored
8520 **/
8521void BindingUniformSingleBlockTest::releaseResource()
8522{
8523	m_goku_buffer.release();
8524}
8525
8526/** Constructor
8527 *
8528 * @param context Test context
8529 **/
8530BindingUniformBlockArrayTest::BindingUniformBlockArrayTest(deqp::Context& context)
8531	: GLSLTestBase(context, "binding_uniform_block_array", "Test verifies binding of uniform block arrays")
8532	, m_goku_00_buffer(context)
8533	, m_goku_01_buffer(context)
8534	, m_goku_02_buffer(context)
8535	, m_goku_03_buffer(context)
8536	, m_goku_04_buffer(context)
8537	, m_goku_05_buffer(context)
8538	, m_goku_06_buffer(context)
8539	, m_goku_07_buffer(context)
8540	, m_goku_08_buffer(context)
8541	, m_goku_09_buffer(context)
8542	, m_goku_10_buffer(context)
8543	, m_goku_11_buffer(context)
8544	, m_goku_12_buffer(context)
8545	, m_goku_13_buffer(context)
8546{
8547	/* Nothing to be done here */
8548}
8549
8550/** Prepare source for given shader stage
8551 *
8552 * @param in_stage           Shader stage, compute shader will use 430
8553 * @param in_use_version_400 Select if 400 or 420 should be used
8554 * @param out_source         Prepared shader source instance
8555 **/
8556void BindingUniformBlockArrayTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
8557													   Utils::shaderSource& out_source)
8558{
8559	static const GLchar* uni_goku = "layout(std140, binding = 2) uniform GOKU {\n"
8560									"    vec4 gohan;\n"
8561									"    vec4 goten;\n"
8562									"} goku[14];\n";
8563
8564	static const GLchar* verification_snippet = "    if ((vec4(0, 0, 0, 0) != goku[0].gohan)  ||\n"
8565												"        (vec4(0, 0, 0, 1) != goku[0].goten)  ||\n"
8566												"        (vec4(0, 0, 1, 0) != goku[1].gohan)  ||\n"
8567												"        (vec4(0, 0, 1, 1) != goku[1].goten)  ||\n"
8568												"        (vec4(0, 1, 0, 0) != goku[2].gohan)  ||\n"
8569												"        (vec4(0, 1, 0, 1) != goku[2].goten)  ||\n"
8570												"        (vec4(0, 1, 1, 0) != goku[3].gohan)  ||\n"
8571												"        (vec4(0, 1, 1, 1) != goku[3].goten)  ||\n"
8572												"        (vec4(1, 0, 0, 0) != goku[4].gohan)  ||\n"
8573												"        (vec4(1, 0, 0, 1) != goku[4].goten)  ||\n"
8574												"        (vec4(1, 0, 1, 0) != goku[5].gohan)  ||\n"
8575												"        (vec4(1, 0, 1, 1) != goku[5].goten)  ||\n"
8576												"        (vec4(1, 1, 0, 0) != goku[6].gohan)  ||\n"
8577												"        (vec4(1, 1, 0, 1) != goku[6].goten)  ||\n"
8578												"        (vec4(1, 1, 1, 0) != goku[7].gohan)  ||\n"
8579												"        (vec4(1, 1, 1, 1) != goku[7].goten)  ||\n"
8580												"        (vec4(0, 0, 0, 0) != goku[8].gohan)  ||\n"
8581												"        (vec4(0, 0, 0, 1) != goku[8].goten)  ||\n"
8582												"        (vec4(0, 0, 1, 0) != goku[9].gohan)  ||\n"
8583												"        (vec4(0, 0, 1, 1) != goku[9].goten)  ||\n"
8584												"        (vec4(0, 1, 0, 0) != goku[10].gohan) ||\n"
8585												"        (vec4(0, 1, 0, 1) != goku[10].goten) ||\n"
8586												"        (vec4(0, 1, 1, 0) != goku[11].gohan) ||\n"
8587												"        (vec4(0, 1, 1, 1) != goku[11].goten) ||\n"
8588												"        (vec4(1, 0, 0, 0) != goku[12].gohan) ||\n"
8589												"        (vec4(1, 0, 0, 1) != goku[12].goten) ||\n"
8590												"        (vec4(1, 0, 1, 0) != goku[13].gohan) ||\n"
8591												"        (vec4(1, 0, 1, 1) != goku[13].goten) )\n"
8592												"    {\n"
8593												"        result = vec4(1, 0, 0, 1);\n"
8594												"    }\n";
8595
8596	static const GLchar* compute_shader_template =
8597		"VERSION\n"
8598		"\n"
8599		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
8600		"\n"
8601		"writeonly uniform image2D uni_image;\n"
8602		"\n"
8603		"UNI_GOKU\n"
8604		"\n"
8605		"void main()\n"
8606		"{\n"
8607		"    vec4 result = vec4(0, 1, 0, 1);\n"
8608		"\n"
8609		"VERIFICATION"
8610		"\n"
8611		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
8612		"}\n"
8613		"\n";
8614
8615	static const GLchar* fragment_shader_template = "VERSION\n"
8616													"\n"
8617													"in  vec4 gs_fs_result;\n"
8618													"out vec4 fs_out_result;\n"
8619													"\n"
8620													"UNI_GOKU\n"
8621													"\n"
8622													"void main()\n"
8623													"{\n"
8624													"    vec4 result = vec4(0, 1, 0, 1);\n"
8625													"\n"
8626													"VERIFICATION"
8627													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
8628													"    {\n"
8629													"         result = vec4(1, 0, 0, 1);\n"
8630													"    }\n"
8631													"\n"
8632													"    fs_out_result = result;\n"
8633													"}\n"
8634													"\n";
8635
8636	static const GLchar* geometry_shader_template = "VERSION\n"
8637													"\n"
8638													"layout(points)                           in;\n"
8639													"layout(triangle_strip, max_vertices = 4) out;\n"
8640													"\n"
8641													"in  vec4 tes_gs_result[];\n"
8642													"out vec4 gs_fs_result;\n"
8643													"\n"
8644													"UNI_GOKU\n"
8645													"\n"
8646													"void main()\n"
8647													"{\n"
8648													"    vec4 result = vec4(0, 1, 0, 1);\n"
8649													"\n"
8650													"VERIFICATION"
8651													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
8652													"    {\n"
8653													"         result = vec4(1, 0, 0, 1);\n"
8654													"    }\n"
8655													"\n"
8656													"    gs_fs_result = result;\n"
8657													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
8658													"    EmitVertex();\n"
8659													"    gs_fs_result = result;\n"
8660													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
8661													"    EmitVertex();\n"
8662													"    gs_fs_result = result;\n"
8663													"    gl_Position  = vec4(1, -1, 0, 1);\n"
8664													"    EmitVertex();\n"
8665													"    gs_fs_result = result;\n"
8666													"    gl_Position  = vec4(1, 1, 0, 1);\n"
8667													"    EmitVertex();\n"
8668													"}\n"
8669													"\n";
8670
8671	static const GLchar* tess_ctrl_shader_template =
8672		"VERSION\n"
8673		"\n"
8674		"layout(vertices = 1) out;\n"
8675		"\n"
8676		"in  vec4 vs_tcs_result[];\n"
8677		"out vec4 tcs_tes_result[];\n"
8678		"\n"
8679		"UNI_GOKU\n"
8680		"\n"
8681		"void main()\n"
8682		"{\n"
8683		"    vec4 result = vec4(0, 1, 0, 1);\n"
8684		"\n"
8685		"VERIFICATION"
8686		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
8687		"    {\n"
8688		"         result = vec4(1, 0, 0, 1);\n"
8689		"    }\n"
8690		"\n"
8691		"    tcs_tes_result[gl_InvocationID] = result;\n"
8692		"\n"
8693		"    gl_TessLevelOuter[0] = 1.0;\n"
8694		"    gl_TessLevelOuter[1] = 1.0;\n"
8695		"    gl_TessLevelOuter[2] = 1.0;\n"
8696		"    gl_TessLevelOuter[3] = 1.0;\n"
8697		"    gl_TessLevelInner[0] = 1.0;\n"
8698		"    gl_TessLevelInner[1] = 1.0;\n"
8699		"}\n"
8700		"\n";
8701
8702	static const GLchar* tess_eval_shader_template = "VERSION\n"
8703													 "\n"
8704													 "layout(isolines, point_mode) in;\n"
8705													 "\n"
8706													 "in  vec4 tcs_tes_result[];\n"
8707													 "out vec4 tes_gs_result;\n"
8708													 "\n"
8709													 "UNI_GOKU\n"
8710													 "\n"
8711													 "void main()\n"
8712													 "{\n"
8713													 "    vec4 result = vec4(0, 1, 0, 1);\n"
8714													 "\n"
8715													 "VERIFICATION"
8716													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
8717													 "    {\n"
8718													 "         result = vec4(1, 0, 0, 1);\n"
8719													 "    }\n"
8720													 "\n"
8721													 "    tes_gs_result = result;\n"
8722													 "}\n"
8723													 "\n";
8724
8725	static const GLchar* vertex_shader_template = "VERSION\n"
8726												  "\n"
8727												  "out vec4 vs_tcs_result;\n"
8728												  "\n"
8729												  "UNI_GOKU\n"
8730												  "\n"
8731												  "void main()\n"
8732												  "{\n"
8733												  "    vec4 result = vec4(0, 1, 0, 1);\n"
8734												  "\n"
8735												  "VERIFICATION"
8736												  "\n"
8737												  "    vs_tcs_result = result;\n"
8738												  "}\n"
8739												  "\n";
8740
8741	const GLchar* shader_template = 0;
8742
8743	switch (in_stage)
8744	{
8745	case Utils::COMPUTE_SHADER:
8746		shader_template = compute_shader_template;
8747		break;
8748	case Utils::FRAGMENT_SHADER:
8749		shader_template = fragment_shader_template;
8750		break;
8751	case Utils::GEOMETRY_SHADER:
8752		shader_template = geometry_shader_template;
8753		break;
8754	case Utils::TESS_CTRL_SHADER:
8755		shader_template = tess_ctrl_shader_template;
8756		break;
8757	case Utils::TESS_EVAL_SHADER:
8758		shader_template = tess_eval_shader_template;
8759		break;
8760	case Utils::VERTEX_SHADER:
8761		shader_template = vertex_shader_template;
8762		break;
8763	default:
8764		TCU_FAIL("Invalid enum");
8765	}
8766
8767	out_source.m_parts[0].m_code = shader_template;
8768
8769	size_t position = 0;
8770
8771	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
8772						out_source.m_parts[0].m_code);
8773
8774	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
8775
8776	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
8777}
8778
8779/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
8780 *
8781 * @param program Current program
8782 **/
8783void BindingUniformBlockArrayTest::prepareUniforms(Utils::program& program)
8784{
8785	static const GLfloat goku_data[][8] = {
8786		{ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f },
8787		{ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f },
8788		{ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f },
8789		{ 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f },
8790		{ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f },
8791		{ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f },
8792		{ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f }
8793	};
8794
8795	Utils::buffer* buffers[14] = { &m_goku_00_buffer, &m_goku_01_buffer, &m_goku_02_buffer, &m_goku_03_buffer,
8796								   &m_goku_04_buffer, &m_goku_05_buffer, &m_goku_06_buffer, &m_goku_07_buffer,
8797								   &m_goku_08_buffer, &m_goku_09_buffer, &m_goku_10_buffer, &m_goku_11_buffer,
8798								   &m_goku_12_buffer, &m_goku_13_buffer };
8799
8800	for (GLuint i = 0; i < 14; ++i)
8801	{
8802		checkBinding(program, i, i + 2);
8803
8804		buffers[i]->generate(GL_UNIFORM_BUFFER);
8805		buffers[i]->update(sizeof(GLfloat) * 8, (GLvoid*)goku_data[i], GL_STATIC_DRAW);
8806		buffers[i]->bindRange(i + 2 /* index */, 0 /* offset */, sizeof(GLfloat) * 8);
8807	}
8808}
8809
8810/** Overwrite of releaseResource method, release extra uniform buffer
8811 *
8812 * @param ignored
8813 **/
8814void BindingUniformBlockArrayTest::releaseResource()
8815{
8816	Utils::buffer* buffers[14] = { &m_goku_00_buffer, &m_goku_01_buffer, &m_goku_02_buffer, &m_goku_03_buffer,
8817								   &m_goku_04_buffer, &m_goku_05_buffer, &m_goku_06_buffer, &m_goku_07_buffer,
8818								   &m_goku_08_buffer, &m_goku_09_buffer, &m_goku_10_buffer, &m_goku_11_buffer,
8819								   &m_goku_12_buffer, &m_goku_13_buffer };
8820
8821	for (GLuint i = 0; i < 14; ++i)
8822	{
8823		buffers[i]->release();
8824	}
8825}
8826
8827/** Verifies that API reports correct uniform binding
8828 *
8829 * @param program          Program
8830 * @param index            Index of array element
8831 * @param expected_binding Expected binding
8832 **/
8833void BindingUniformBlockArrayTest::checkBinding(Utils::program& program, glw::GLuint index, glw::GLint expected_binding)
8834{
8835	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
8836
8837	GLchar buffer[64];
8838	sprintf(buffer, "GOKU[%d]", index);
8839
8840	const GLuint uniform_index = gl.getUniformBlockIndex(program.m_program_object_id, buffer);
8841	GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformBlockIndex");
8842	if (GL_INVALID_INDEX == uniform_index)
8843	{
8844		TCU_FAIL("Uniform block is inactive");
8845	}
8846
8847	GLint binding = -1;
8848
8849	gl.getActiveUniformBlockiv(program.m_program_object_id, uniform_index, GL_UNIFORM_BLOCK_BINDING, &binding);
8850	GLU_EXPECT_NO_ERROR(gl.getError(), "GetActiveUniformBlockiv");
8851
8852	if (expected_binding != binding)
8853	{
8854		TCU_FAIL("Wrong binding reported by API");
8855	}
8856}
8857
8858/** Constructor
8859 *
8860 * @param context Test context
8861 **/
8862BindingUniformDefaultTest::BindingUniformDefaultTest(deqp::Context& context)
8863	: APITestBase(context, "binding_uniform_default", "Test verifies default binding of uniform block")
8864{
8865	/* Nothing to be done here */
8866}
8867
8868/** Execute API call and verifies results
8869 *
8870 * @return true when results are positive, false otherwise
8871 **/
8872bool BindingUniformDefaultTest::checkResults(Utils::program& program)
8873{
8874	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
8875
8876	const GLuint index = gl.getUniformBlockIndex(program.m_program_object_id, "GOKU");
8877	GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformBlockIndex");
8878	if (GL_INVALID_INDEX == index)
8879	{
8880		TCU_FAIL("Uniform block is inactive");
8881		return false;
8882	}
8883
8884	GLint binding = -1;
8885
8886	gl.getActiveUniformBlockiv(program.m_program_object_id, index, GL_UNIFORM_BLOCK_BINDING, &binding);
8887	GLU_EXPECT_NO_ERROR(gl.getError(), "GetActiveUniformBlockiv");
8888
8889	if (0 != binding)
8890	{
8891		return false;
8892	}
8893
8894	return true;
8895}
8896
8897/** Prepare source for given shader stage
8898 *
8899 * @param in_stage           Shader stage, compute shader will use 430
8900 * @param in_use_version_400 Select if 400 or 420 should be used
8901 * @param out_source         Prepared shader source instance
8902 **/
8903void BindingUniformDefaultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
8904													Utils::shaderSource& out_source)
8905{
8906	static const GLchar* uni_goku = "layout(std140) uniform GOKU {\n"
8907									"    vec4 gohan;\n"
8908									"    vec4 goten;\n"
8909									"} goku;\n";
8910
8911	static const GLchar* verification_snippet = "    if ((vec4(0, 0, 0, 0) != goku.gohan) ||\n"
8912												"        (vec4(0, 0, 0, 1) != goku.goten) )\n"
8913												"    {\n"
8914												"        result = vec4(1, 0, 0, 1);\n"
8915												"    }\n";
8916
8917	static const GLchar* compute_shader_template =
8918		"VERSION\n"
8919		"\n"
8920		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
8921		"\n"
8922		"writeonly uniform image2D uni_image;\n"
8923		"\n"
8924		"UNI_GOKU\n"
8925		"\n"
8926		"void main()\n"
8927		"{\n"
8928		"    vec4 result = vec4(0, 1, 0, 1);\n"
8929		"\n"
8930		"VERIFICATION"
8931		"\n"
8932		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
8933		"}\n"
8934		"\n";
8935
8936	static const GLchar* fragment_shader_template = "VERSION\n"
8937													"\n"
8938													"in  vec4 gs_fs_result;\n"
8939													"out vec4 fs_out_result;\n"
8940													"\n"
8941													"UNI_GOKU\n"
8942													"\n"
8943													"void main()\n"
8944													"{\n"
8945													"    vec4 result = vec4(0, 1, 0, 1);\n"
8946													"\n"
8947													"VERIFICATION"
8948													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
8949													"    {\n"
8950													"         result = vec4(1, 0, 0, 1);\n"
8951													"    }\n"
8952													"\n"
8953													"    fs_out_result = result;\n"
8954													"}\n"
8955													"\n";
8956
8957	static const GLchar* geometry_shader_template = "VERSION\n"
8958													"\n"
8959													"layout(points)                           in;\n"
8960													"layout(triangle_strip, max_vertices = 4) out;\n"
8961													"\n"
8962													"in  vec4 tes_gs_result[];\n"
8963													"out vec4 gs_fs_result;\n"
8964													"\n"
8965													"UNI_GOKU\n"
8966													"\n"
8967													"void main()\n"
8968													"{\n"
8969													"    vec4 result = vec4(0, 1, 0, 1);\n"
8970													"\n"
8971													"VERIFICATION"
8972													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
8973													"    {\n"
8974													"         result = vec4(1, 0, 0, 1);\n"
8975													"    }\n"
8976													"\n"
8977													"    gs_fs_result = result;\n"
8978													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
8979													"    EmitVertex();\n"
8980													"    gs_fs_result = result;\n"
8981													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
8982													"    EmitVertex();\n"
8983													"    gs_fs_result = result;\n"
8984													"    gl_Position  = vec4(1, -1, 0, 1);\n"
8985													"    EmitVertex();\n"
8986													"    gs_fs_result = result;\n"
8987													"    gl_Position  = vec4(1, 1, 0, 1);\n"
8988													"    EmitVertex();\n"
8989													"}\n"
8990													"\n";
8991
8992	static const GLchar* tess_ctrl_shader_template =
8993		"VERSION\n"
8994		"\n"
8995		"layout(vertices = 1) out;\n"
8996		"\n"
8997		"in  vec4 vs_tcs_result[];\n"
8998		"out vec4 tcs_tes_result[];\n"
8999		"\n"
9000		"UNI_GOKU\n"
9001		"\n"
9002		"void main()\n"
9003		"{\n"
9004		"    vec4 result = vec4(0, 1, 0, 1);\n"
9005		"\n"
9006		"VERIFICATION"
9007		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
9008		"    {\n"
9009		"         result = vec4(1, 0, 0, 1);\n"
9010		"    }\n"
9011		"\n"
9012		"    tcs_tes_result[gl_InvocationID] = result;\n"
9013		"\n"
9014		"    gl_TessLevelOuter[0] = 1.0;\n"
9015		"    gl_TessLevelOuter[1] = 1.0;\n"
9016		"    gl_TessLevelOuter[2] = 1.0;\n"
9017		"    gl_TessLevelOuter[3] = 1.0;\n"
9018		"    gl_TessLevelInner[0] = 1.0;\n"
9019		"    gl_TessLevelInner[1] = 1.0;\n"
9020		"}\n"
9021		"\n";
9022
9023	static const GLchar* tess_eval_shader_template = "VERSION\n"
9024													 "\n"
9025													 "layout(isolines, point_mode) in;\n"
9026													 "\n"
9027													 "in  vec4 tcs_tes_result[];\n"
9028													 "out vec4 tes_gs_result;\n"
9029													 "\n"
9030													 "UNI_GOKU\n"
9031													 "\n"
9032													 "void main()\n"
9033													 "{\n"
9034													 "    vec4 result = vec4(0, 1, 0, 1);\n"
9035													 "\n"
9036													 "VERIFICATION"
9037													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
9038													 "    {\n"
9039													 "         result = vec4(1, 0, 0, 1);\n"
9040													 "    }\n"
9041													 "\n"
9042													 "    tes_gs_result = result;\n"
9043													 "}\n"
9044													 "\n";
9045
9046	static const GLchar* vertex_shader_template = "VERSION\n"
9047												  "\n"
9048												  "out vec4 vs_tcs_result;\n"
9049												  "\n"
9050												  "UNI_GOKU\n"
9051												  "\n"
9052												  "void main()\n"
9053												  "{\n"
9054												  "    vec4 result = vec4(0, 1, 0, 1);\n"
9055												  "\n"
9056												  "VERIFICATION"
9057												  "\n"
9058												  "    vs_tcs_result = result;\n"
9059												  "}\n"
9060												  "\n";
9061
9062	const GLchar* shader_template = 0;
9063
9064	switch (in_stage)
9065	{
9066	case Utils::COMPUTE_SHADER:
9067		shader_template = compute_shader_template;
9068		break;
9069	case Utils::FRAGMENT_SHADER:
9070		shader_template = fragment_shader_template;
9071		break;
9072	case Utils::GEOMETRY_SHADER:
9073		shader_template = geometry_shader_template;
9074		break;
9075	case Utils::TESS_CTRL_SHADER:
9076		shader_template = tess_ctrl_shader_template;
9077		break;
9078	case Utils::TESS_EVAL_SHADER:
9079		shader_template = tess_eval_shader_template;
9080		break;
9081	case Utils::VERTEX_SHADER:
9082		shader_template = vertex_shader_template;
9083		break;
9084	default:
9085		TCU_FAIL("Invalid enum");
9086	}
9087
9088	out_source.m_parts[0].m_code = shader_template;
9089
9090	size_t position = 0;
9091
9092	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
9093						out_source.m_parts[0].m_code);
9094
9095	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
9096
9097	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
9098}
9099
9100/** Constructor
9101 *
9102 * @param context Test context
9103 **/
9104BindingUniformAPIOverirdeTest::BindingUniformAPIOverirdeTest(deqp::Context& context)
9105	: GLSLTestBase(context, "binding_uniform_api_overirde", "Test verifies if binding can be overriden with API")
9106	, m_goku_buffer(context)
9107{
9108	/* Nothing to be done here */
9109}
9110
9111/** Prepare source for given shader stage
9112 *
9113 * @param in_stage           Shader stage, compute shader will use 430
9114 * @param in_use_version_400 Select if 400 or 420 should be used
9115 * @param out_source         Prepared shader source instance
9116 **/
9117void BindingUniformAPIOverirdeTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
9118														Utils::shaderSource& out_source)
9119{
9120	static const GLchar* uni_goku = "layout(std140, binding = 2) uniform GOKU {\n"
9121									"    vec4 gohan;\n"
9122									"    vec4 goten;\n"
9123									"} goku;\n";
9124
9125	static const GLchar* verification_snippet = "    if ((vec4(1, 0, 0, 0) != goku.gohan)  ||\n"
9126												"        (vec4(0, 1, 0, 0) != goku.goten)  )\n"
9127												"    {\n"
9128												"        result = vec4(1, 0, 0, 1);\n"
9129												"    }\n";
9130
9131	static const GLchar* compute_shader_template =
9132		"VERSION\n"
9133		"\n"
9134		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
9135		"\n"
9136		"writeonly uniform image2D uni_image;\n"
9137		"\n"
9138		"UNI_GOKU\n"
9139		"\n"
9140		"void main()\n"
9141		"{\n"
9142		"    vec4 result = vec4(0, 1, 0, 1);\n"
9143		"\n"
9144		"VERIFICATION"
9145		"\n"
9146		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
9147		"}\n"
9148		"\n";
9149
9150	static const GLchar* fragment_shader_template = "VERSION\n"
9151													"\n"
9152													"in  vec4 gs_fs_result;\n"
9153													"out vec4 fs_out_result;\n"
9154													"\n"
9155													"UNI_GOKU\n"
9156													"\n"
9157													"void main()\n"
9158													"{\n"
9159													"    vec4 result = vec4(0, 1, 0, 1);\n"
9160													"\n"
9161													"VERIFICATION"
9162													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
9163													"    {\n"
9164													"         result = vec4(1, 0, 0, 1);\n"
9165													"    }\n"
9166													"\n"
9167													"    fs_out_result = result;\n"
9168													"}\n"
9169													"\n";
9170
9171	static const GLchar* geometry_shader_template = "VERSION\n"
9172													"\n"
9173													"layout(points)                           in;\n"
9174													"layout(triangle_strip, max_vertices = 4) out;\n"
9175													"\n"
9176													"in  vec4 tes_gs_result[];\n"
9177													"out vec4 gs_fs_result;\n"
9178													"\n"
9179													"UNI_GOKU\n"
9180													"\n"
9181													"void main()\n"
9182													"{\n"
9183													"    vec4 result = vec4(0, 1, 0, 1);\n"
9184													"\n"
9185													"VERIFICATION"
9186													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
9187													"    {\n"
9188													"         result = vec4(1, 0, 0, 1);\n"
9189													"    }\n"
9190													"\n"
9191													"    gs_fs_result = result;\n"
9192													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
9193													"    EmitVertex();\n"
9194													"    gs_fs_result = result;\n"
9195													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
9196													"    EmitVertex();\n"
9197													"    gs_fs_result = result;\n"
9198													"    gl_Position  = vec4(1, -1, 0, 1);\n"
9199													"    EmitVertex();\n"
9200													"    gs_fs_result = result;\n"
9201													"    gl_Position  = vec4(1, 1, 0, 1);\n"
9202													"    EmitVertex();\n"
9203													"}\n"
9204													"\n";
9205
9206	static const GLchar* tess_ctrl_shader_template =
9207		"VERSION\n"
9208		"\n"
9209		"layout(vertices = 1) out;\n"
9210		"\n"
9211		"in  vec4 vs_tcs_result[];\n"
9212		"out vec4 tcs_tes_result[];\n"
9213		"\n"
9214		"UNI_GOKU\n"
9215		"\n"
9216		"void main()\n"
9217		"{\n"
9218		"    vec4 result = vec4(0, 1, 0, 1);\n"
9219		"\n"
9220		"VERIFICATION"
9221		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
9222		"    {\n"
9223		"         result = vec4(1, 0, 0, 1);\n"
9224		"    }\n"
9225		"\n"
9226		"    tcs_tes_result[gl_InvocationID] = result;\n"
9227		"\n"
9228		"    gl_TessLevelOuter[0] = 1.0;\n"
9229		"    gl_TessLevelOuter[1] = 1.0;\n"
9230		"    gl_TessLevelOuter[2] = 1.0;\n"
9231		"    gl_TessLevelOuter[3] = 1.0;\n"
9232		"    gl_TessLevelInner[0] = 1.0;\n"
9233		"    gl_TessLevelInner[1] = 1.0;\n"
9234		"}\n"
9235		"\n";
9236
9237	static const GLchar* tess_eval_shader_template = "VERSION\n"
9238													 "\n"
9239													 "layout(isolines, point_mode) in;\n"
9240													 "\n"
9241													 "in  vec4 tcs_tes_result[];\n"
9242													 "out vec4 tes_gs_result;\n"
9243													 "\n"
9244													 "UNI_GOKU\n"
9245													 "\n"
9246													 "void main()\n"
9247													 "{\n"
9248													 "    vec4 result = vec4(0, 1, 0, 1);\n"
9249													 "\n"
9250													 "VERIFICATION"
9251													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
9252													 "    {\n"
9253													 "         result = vec4(1, 0, 0, 1);\n"
9254													 "    }\n"
9255													 "\n"
9256													 "    tes_gs_result = result;\n"
9257													 "}\n"
9258													 "\n";
9259
9260	static const GLchar* vertex_shader_template = "VERSION\n"
9261												  "\n"
9262												  "out vec4 vs_tcs_result;\n"
9263												  "\n"
9264												  "UNI_GOKU\n"
9265												  "\n"
9266												  "void main()\n"
9267												  "{\n"
9268												  "    vec4 result = vec4(0, 1, 0, 1);\n"
9269												  "\n"
9270												  "VERIFICATION"
9271												  "\n"
9272												  "    vs_tcs_result = result;\n"
9273												  "}\n"
9274												  "\n";
9275
9276	const GLchar* shader_template = 0;
9277
9278	switch (in_stage)
9279	{
9280	case Utils::COMPUTE_SHADER:
9281		shader_template = compute_shader_template;
9282		break;
9283	case Utils::FRAGMENT_SHADER:
9284		shader_template = fragment_shader_template;
9285		break;
9286	case Utils::GEOMETRY_SHADER:
9287		shader_template = geometry_shader_template;
9288		break;
9289	case Utils::TESS_CTRL_SHADER:
9290		shader_template = tess_ctrl_shader_template;
9291		break;
9292	case Utils::TESS_EVAL_SHADER:
9293		shader_template = tess_eval_shader_template;
9294		break;
9295	case Utils::VERTEX_SHADER:
9296		shader_template = vertex_shader_template;
9297		break;
9298	default:
9299		TCU_FAIL("Invalid enum");
9300	}
9301
9302	out_source.m_parts[0].m_code = shader_template;
9303
9304	size_t position = 0;
9305
9306	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
9307						out_source.m_parts[0].m_code);
9308
9309	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
9310
9311	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
9312}
9313
9314/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
9315 *
9316 * @param program Current program
9317 **/
9318void BindingUniformAPIOverirdeTest::prepareUniforms(Utils::program& program)
9319{
9320	static const GLfloat goku_data[8] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
9321
9322	static const GLuint new_binding = 11;
9323
9324	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
9325
9326	const GLuint index = gl.getUniformBlockIndex(program.m_program_object_id, "GOKU");
9327	GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformBlockIndex");
9328	if (GL_INVALID_INDEX == index)
9329	{
9330		TCU_FAIL("Uniform block is inactive");
9331		return;
9332	}
9333
9334	gl.uniformBlockBinding(program.m_program_object_id, index, new_binding);
9335	GLU_EXPECT_NO_ERROR(gl.getError(), "UniformBlockBinding");
9336
9337	GLint binding = -1;
9338
9339	gl.getActiveUniformBlockiv(program.m_program_object_id, index, GL_UNIFORM_BLOCK_BINDING, &binding);
9340	GLU_EXPECT_NO_ERROR(gl.getError(), "GetActiveUniformBlockiv");
9341
9342	if (new_binding != binding)
9343	{
9344		TCU_FAIL("GetActiveUniformBlockiv returned wrong binding");
9345		return;
9346	}
9347
9348	m_goku_buffer.generate(GL_UNIFORM_BUFFER);
9349	m_goku_buffer.update(sizeof(GLfloat) * 8, (GLvoid*)goku_data, GL_STATIC_DRAW);
9350	m_goku_buffer.bindRange(new_binding /* index */, 0 /* offset */, sizeof(GLfloat) * 8);
9351}
9352
9353/** Overwrite of releaseResource method, release extra uniform buffer
9354 *
9355 * @param ignored
9356 **/
9357void BindingUniformAPIOverirdeTest::releaseResource()
9358{
9359	m_goku_buffer.release();
9360}
9361
9362/** Constructor
9363 *
9364 * @param context Test context
9365 **/
9366BindingUniformGlobalBlockTest::BindingUniformGlobalBlockTest(deqp::Context& context)
9367	: NegativeTestBase(context, "binding_uniform_global_block",
9368					   "Test verifies that global uniform cannot be qualified with binding")
9369{
9370	/* Nothing to be done here */
9371}
9372
9373/** Prepare source for given shader stage
9374 *
9375 * @param in_stage           Shader stage, compute shader will use 430
9376 * @param in_use_version_400 Select if 400 or 420 should be used
9377 * @param out_source         Prepared shader source instance
9378 **/
9379void BindingUniformGlobalBlockTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
9380														Utils::shaderSource& out_source)
9381{
9382	static const GLchar* verification_snippet = "    if (vec4(0, 0, 1, 1) != uni_test)\n"
9383												"    {\n"
9384												"        result = vec4(1, 0, 0, 1);\n"
9385												"    }\n";
9386
9387	static const GLchar* uniform_definition = "layout(binding = 0) uniform vec4 uni_test;\n";
9388
9389	static const GLchar* compute_shader_template =
9390		"VERSION\n"
9391		"\n"
9392		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
9393		"\n"
9394		"writeonly uniform image2D uni_image;\n"
9395		"\n"
9396		"UNIFORM_DEFINITION\n"
9397		"\n"
9398		"void main()\n"
9399		"{\n"
9400		"    vec4 result = vec4(0, 1, 0, 1);\n"
9401		"\n"
9402		"VERIFICATION"
9403		"\n"
9404		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
9405		"}\n"
9406		"\n";
9407
9408	static const GLchar* fragment_shader_template = "VERSION\n"
9409													"\n"
9410													"in  vec4 gs_fs_result;\n"
9411													"out vec4 fs_out_result;\n"
9412													"\n"
9413													"UNIFORM_DEFINITION\n"
9414													"\n"
9415													"void main()\n"
9416													"{\n"
9417													"    vec4 result = vec4(0, 1, 0, 1);\n"
9418													"\n"
9419													"VERIFICATION"
9420													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
9421													"    {\n"
9422													"         result = vec4(1, 0, 0, 1);\n"
9423													"    }\n"
9424													"\n"
9425													"    fs_out_result = result;\n"
9426													"}\n"
9427													"\n";
9428
9429	static const GLchar* geometry_shader_template = "VERSION\n"
9430													"\n"
9431													"layout(points)                           in;\n"
9432													"layout(triangle_strip, max_vertices = 4) out;\n"
9433													"\n"
9434													"in  vec4 tes_gs_result[];\n"
9435													"out vec4 gs_fs_result;\n"
9436													"\n"
9437													"UNIFORM_DEFINITION\n"
9438													"\n"
9439													"void main()\n"
9440													"{\n"
9441													"    vec4 result = vec4(0, 1, 0, 1);\n"
9442													"\n"
9443													"VERIFICATION"
9444													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
9445													"    {\n"
9446													"         result = vec4(1, 0, 0, 1);\n"
9447													"    }\n"
9448													"\n"
9449													"    gs_fs_result = result;\n"
9450													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
9451													"    EmitVertex();\n"
9452													"    gs_fs_result = result;\n"
9453													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
9454													"    EmitVertex();\n"
9455													"    gs_fs_result = result;\n"
9456													"    gl_Position  = vec4(1, -1, 0, 1);\n"
9457													"    EmitVertex();\n"
9458													"    gs_fs_result = result;\n"
9459													"    gl_Position  = vec4(1, 1, 0, 1);\n"
9460													"    EmitVertex();\n"
9461													"}\n"
9462													"\n";
9463
9464	static const GLchar* tess_ctrl_shader_template =
9465		"VERSION\n"
9466		"\n"
9467		"layout(vertices = 1) out;\n"
9468		"\n"
9469		"in  vec4 vs_tcs_result[];\n"
9470		"out vec4 tcs_tes_result[];\n"
9471		"\n"
9472		"UNIFORM_DEFINITION\n"
9473		"\n"
9474		"void main()\n"
9475		"{\n"
9476		"    vec4 result = vec4(0, 1, 0, 1);\n"
9477		"\n"
9478		"VERIFICATION"
9479		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
9480		"    {\n"
9481		"         result = vec4(1, 0, 0, 1);\n"
9482		"    }\n"
9483		"\n"
9484		"    tcs_tes_result[gl_InvocationID] = result;\n"
9485		"\n"
9486		"    gl_TessLevelOuter[0] = 1.0;\n"
9487		"    gl_TessLevelOuter[1] = 1.0;\n"
9488		"    gl_TessLevelOuter[2] = 1.0;\n"
9489		"    gl_TessLevelOuter[3] = 1.0;\n"
9490		"    gl_TessLevelInner[0] = 1.0;\n"
9491		"    gl_TessLevelInner[1] = 1.0;\n"
9492		"}\n"
9493		"\n";
9494
9495	static const GLchar* tess_eval_shader_template = "VERSION\n"
9496													 "\n"
9497													 "layout(isolines, point_mode) in;\n"
9498													 "\n"
9499													 "in  vec4 tcs_tes_result[];\n"
9500													 "out vec4 tes_gs_result;\n"
9501													 "\n"
9502													 "UNIFORM_DEFINITION\n"
9503													 "\n"
9504													 "void main()\n"
9505													 "{\n"
9506													 "    vec4 result = vec4(0, 1, 0, 1);\n"
9507													 "\n"
9508													 "VERIFICATION"
9509													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
9510													 "    {\n"
9511													 "         result = vec4(1, 0, 0, 1);\n"
9512													 "    }\n"
9513													 "\n"
9514													 "    tes_gs_result = result;\n"
9515													 "}\n"
9516													 "\n";
9517
9518	static const GLchar* vertex_shader_template = "VERSION\n"
9519												  "\n"
9520												  "out vec4 vs_tcs_result;\n"
9521												  "\n"
9522												  "UNIFORM_DEFINITION\n"
9523												  "\n"
9524												  "void main()\n"
9525												  "{\n"
9526												  "    vec4 result = vec4(0, 1, 0, 1);\n"
9527												  "\n"
9528												  "VERIFICATION"
9529												  "\n"
9530												  "    vs_tcs_result = result;\n"
9531												  "}\n"
9532												  "\n";
9533
9534	const GLchar* shader_template = 0;
9535
9536	switch (in_stage)
9537	{
9538	case Utils::COMPUTE_SHADER:
9539		shader_template = compute_shader_template;
9540		break;
9541	case Utils::FRAGMENT_SHADER:
9542		shader_template = fragment_shader_template;
9543		break;
9544	case Utils::GEOMETRY_SHADER:
9545		shader_template = geometry_shader_template;
9546		break;
9547	case Utils::TESS_CTRL_SHADER:
9548		shader_template = tess_ctrl_shader_template;
9549		break;
9550	case Utils::TESS_EVAL_SHADER:
9551		shader_template = tess_eval_shader_template;
9552		break;
9553	case Utils::VERTEX_SHADER:
9554		shader_template = vertex_shader_template;
9555		break;
9556	default:
9557		TCU_FAIL("Invalid enum");
9558	}
9559
9560	out_source.m_parts[0].m_code = shader_template;
9561
9562	size_t position = 0;
9563	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
9564						out_source.m_parts[0].m_code);
9565
9566	Utils::replaceToken("UNIFORM_DEFINITION", position, uniform_definition, out_source.m_parts[0].m_code);
9567
9568	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
9569}
9570
9571/** Constructor
9572 *
9573 * @param context Test context
9574 **/
9575BindingUniformInvalidTest::BindingUniformInvalidTest(deqp::Context& context)
9576	: NegativeTestBase(context, "binding_uniform_invalid", "Test verifies invalid binding values")
9577	, m_case(TEST_CASES_MAX)
9578{
9579	/* Nothing to be done here */
9580}
9581
9582/** Set up next test case
9583 *
9584 * @param test_case_index Index of next test case
9585 *
9586 * @return false if there is no more test cases, true otherwise
9587 **/
9588bool BindingUniformInvalidTest::prepareNextTestCase(glw::GLuint test_case_index)
9589{
9590	switch (test_case_index)
9591	{
9592	case (glw::GLuint)-1:
9593		m_case = TEST_CASES_MAX;
9594		break;
9595	case NEGATIVE_VALUE:
9596	case VARIABLE_NAME:
9597	case STD140:
9598	case MISSING:
9599		m_case = (TESTCASES)test_case_index;
9600		break;
9601	default:
9602		return false;
9603	}
9604
9605	return true;
9606}
9607
9608/** Prepare source for given shader stage
9609 *
9610 * @param in_stage           Shader stage, compute shader will use 430
9611 * @param in_use_version_400 Select if 400 or 420 should be used
9612 * @param out_source         Prepared shader source instance
9613 **/
9614void BindingUniformInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
9615													Utils::shaderSource& out_source)
9616{
9617	static const GLchar* verification_snippet = "    if (vec4(0, 0, 1, 1) != goku.gohan)\n"
9618												"    {\n"
9619												"        result = vec4(1, 0, 0, 1);\n"
9620												"    }\n";
9621
9622	static const GLchar* uniform_definition = "layout(std140, binding BINDING) uniform GOKU {\n"
9623											  "    vec4 gohan;\n"
9624											  "    vec4 goten;\n"
9625											  "} goku;\n";
9626
9627	static const GLchar* compute_shader_template =
9628		"VERSION\n"
9629		"\n"
9630		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
9631		"\n"
9632		"writeonly uniform image2D uni_image;\n"
9633		"\n"
9634		"UNIFORM_DEFINITION\n"
9635		"\n"
9636		"void main()\n"
9637		"{\n"
9638		"    vec4 result = vec4(0, 1, 0, 1);\n"
9639		"\n"
9640		"VERIFICATION"
9641		"\n"
9642		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
9643		"}\n"
9644		"\n";
9645
9646	static const GLchar* fragment_shader_template = "VERSION\n"
9647													"\n"
9648													"in  vec4 gs_fs_result;\n"
9649													"out vec4 fs_out_result;\n"
9650													"\n"
9651													"UNIFORM_DEFINITION\n"
9652													"\n"
9653													"void main()\n"
9654													"{\n"
9655													"    vec4 result = vec4(0, 1, 0, 1);\n"
9656													"\n"
9657													"VERIFICATION"
9658													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
9659													"    {\n"
9660													"         result = vec4(1, 0, 0, 1);\n"
9661													"    }\n"
9662													"\n"
9663													"    fs_out_result = result;\n"
9664													"}\n"
9665													"\n";
9666
9667	static const GLchar* geometry_shader_template = "VERSION\n"
9668													"\n"
9669													"layout(points)                           in;\n"
9670													"layout(triangle_strip, max_vertices = 4) out;\n"
9671													"\n"
9672													"in  vec4 tes_gs_result[];\n"
9673													"out vec4 gs_fs_result;\n"
9674													"\n"
9675													"UNIFORM_DEFINITION\n"
9676													"\n"
9677													"void main()\n"
9678													"{\n"
9679													"    vec4 result = vec4(0, 1, 0, 1);\n"
9680													"\n"
9681													"VERIFICATION"
9682													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
9683													"    {\n"
9684													"         result = vec4(1, 0, 0, 1);\n"
9685													"    }\n"
9686													"\n"
9687													"    gs_fs_result = result;\n"
9688													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
9689													"    EmitVertex();\n"
9690													"    gs_fs_result = result;\n"
9691													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
9692													"    EmitVertex();\n"
9693													"    gs_fs_result = result;\n"
9694													"    gl_Position  = vec4(1, -1, 0, 1);\n"
9695													"    EmitVertex();\n"
9696													"    gs_fs_result = result;\n"
9697													"    gl_Position  = vec4(1, 1, 0, 1);\n"
9698													"    EmitVertex();\n"
9699													"}\n"
9700													"\n";
9701
9702	static const GLchar* tess_ctrl_shader_template =
9703		"VERSION\n"
9704		"\n"
9705		"layout(vertices = 1) out;\n"
9706		"\n"
9707		"in  vec4 vs_tcs_result[];\n"
9708		"out vec4 tcs_tes_result[];\n"
9709		"\n"
9710		"UNIFORM_DEFINITION\n"
9711		"\n"
9712		"void main()\n"
9713		"{\n"
9714		"    vec4 result = vec4(0, 1, 0, 1);\n"
9715		"\n"
9716		"VERIFICATION"
9717		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
9718		"    {\n"
9719		"         result = vec4(1, 0, 0, 1);\n"
9720		"    }\n"
9721		"\n"
9722		"    tcs_tes_result[gl_InvocationID] = result;\n"
9723		"\n"
9724		"    gl_TessLevelOuter[0] = 1.0;\n"
9725		"    gl_TessLevelOuter[1] = 1.0;\n"
9726		"    gl_TessLevelOuter[2] = 1.0;\n"
9727		"    gl_TessLevelOuter[3] = 1.0;\n"
9728		"    gl_TessLevelInner[0] = 1.0;\n"
9729		"    gl_TessLevelInner[1] = 1.0;\n"
9730		"}\n"
9731		"\n";
9732
9733	static const GLchar* tess_eval_shader_template = "VERSION\n"
9734													 "\n"
9735													 "layout(isolines, point_mode) in;\n"
9736													 "\n"
9737													 "in  vec4 tcs_tes_result[];\n"
9738													 "out vec4 tes_gs_result;\n"
9739													 "\n"
9740													 "UNIFORM_DEFINITION\n"
9741													 "\n"
9742													 "void main()\n"
9743													 "{\n"
9744													 "    vec4 result = vec4(0, 1, 0, 1);\n"
9745													 "\n"
9746													 "VERIFICATION"
9747													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
9748													 "    {\n"
9749													 "         result = vec4(1, 0, 0, 1);\n"
9750													 "    }\n"
9751													 "\n"
9752													 "    tes_gs_result = result;\n"
9753													 "}\n"
9754													 "\n";
9755
9756	static const GLchar* vertex_shader_template = "VERSION\n"
9757												  "\n"
9758												  "out vec4 vs_tcs_result;\n"
9759												  "\n"
9760												  "UNIFORM_DEFINITION\n"
9761												  "\n"
9762												  "void main()\n"
9763												  "{\n"
9764												  "    vec4 result = vec4(0, 1, 0, 1);\n"
9765												  "\n"
9766												  "VERIFICATION"
9767												  "\n"
9768												  "    vs_tcs_result = result;\n"
9769												  "}\n"
9770												  "\n";
9771
9772	const GLchar* shader_template = 0;
9773
9774	switch (in_stage)
9775	{
9776	case Utils::COMPUTE_SHADER:
9777		shader_template = compute_shader_template;
9778		break;
9779	case Utils::FRAGMENT_SHADER:
9780		shader_template = fragment_shader_template;
9781		break;
9782	case Utils::GEOMETRY_SHADER:
9783		shader_template = geometry_shader_template;
9784		break;
9785	case Utils::TESS_CTRL_SHADER:
9786		shader_template = tess_ctrl_shader_template;
9787		break;
9788	case Utils::TESS_EVAL_SHADER:
9789		shader_template = tess_eval_shader_template;
9790		break;
9791	case Utils::VERTEX_SHADER:
9792		shader_template = vertex_shader_template;
9793		break;
9794	default:
9795		TCU_FAIL("Invalid enum");
9796	}
9797
9798	out_source.m_parts[0].m_code = shader_template;
9799
9800	size_t position = 0;
9801	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
9802						out_source.m_parts[0].m_code);
9803
9804	Utils::replaceToken("UNIFORM_DEFINITION", position, uniform_definition, out_source.m_parts[0].m_code);
9805
9806	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
9807
9808	Utils::replaceAllTokens("BINDING", getCaseString(m_case), out_source.m_parts[0].m_code);
9809}
9810
9811const GLchar* BindingUniformInvalidTest::getCaseString(TESTCASES test_case)
9812{
9813	(void)test_case;
9814	const GLchar* binding = 0;
9815
9816	switch (m_case)
9817	{
9818	case NEGATIVE_VALUE:
9819		binding = "= -1";
9820		break;
9821	case VARIABLE_NAME:
9822		binding = "= goku";
9823		break;
9824	case STD140:
9825		binding = "= std140";
9826		break;
9827	case MISSING:
9828		binding = "";
9829		break;
9830	case TEST_CASES_MAX:
9831		binding = "= 0";
9832		break;
9833	default:
9834		TCU_FAIL("Invalid enum");
9835	}
9836
9837	return binding;
9838}
9839
9840/** Constructor
9841 *
9842 * @param context Test context
9843 **/
9844BindingSamplersTest::BindingSamplersTest(deqp::Context& context)
9845	: GLSLTestBase(context, "binding_samplers", "Test verifies smaplers binding")
9846	, m_goku_texture(context)
9847	, m_vegeta_texture(context)
9848	, m_trunks_texture(context)
9849	, m_buffer(context)
9850	, m_test_case(Utils::TEXTURE_TYPES_MAX)
9851{
9852	/* Nothing to be done here */
9853}
9854
9855/** Set up next test case
9856 *
9857 * @param test_case_index Index of next test case
9858 *
9859 * @return false if there is no more test cases, true otherwise
9860 **/
9861bool BindingSamplersTest::prepareNextTestCase(glw::GLuint test_case_index)
9862{
9863	switch (test_case_index)
9864	{
9865	case (glw::GLuint)-1:
9866	case 0:
9867		m_test_case = Utils::TEX_2D;
9868		break;
9869	case 1:
9870		m_test_case = Utils::TEX_BUFFER;
9871		break;
9872	case 2:
9873		m_test_case = Utils::TEX_2D_RECT;
9874		break;
9875	case 3:
9876		m_test_case = Utils::TEX_2D_ARRAY;
9877		break;
9878	case 4:
9879		m_test_case = Utils::TEX_3D;
9880		break;
9881	case 5:
9882		m_test_case = Utils::TEX_CUBE;
9883		break;
9884	case 6:
9885		m_test_case = Utils::TEX_1D;
9886		break;
9887	case 7:
9888		m_test_case = Utils::TEX_1D_ARRAY;
9889		break;
9890	default:
9891		return false;
9892	}
9893
9894	m_context.getTestContext().getLog() << tcu::TestLog::Message
9895										<< "Tested texture type: " << Utils::getTextureTypeName(m_test_case)
9896										<< tcu::TestLog::EndMessage;
9897
9898	return true;
9899}
9900
9901/** Prepare source for given shader stage
9902 *
9903 * @param in_stage           Shader stage, compute shader will use 430
9904 * @param in_use_version_400 Select if 400 or 420 should be used
9905 * @param out_source         Prepared shader source instance
9906 **/
9907void BindingSamplersTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
9908											  Utils::shaderSource& out_source)
9909{
9910	static const GLchar* uni_goku = "layout(binding = 0) uniform TYPE goku;\n";
9911
9912	static const GLchar* uni_vegeta = "layout(binding = 1) uniform TYPE vegeta;\n";
9913
9914	static const GLchar* uni_trunks = "layout(binding = 3) uniform TYPE trunks;\n\n";
9915
9916	static const GLchar* verification_snippet = "    TEX_COORD_TYPE tex_coord = TEX_COORD_TYPE(COORDINATES);\n"
9917												"    vec4 goku_color   = SAMPLING_FUNCTION(goku,   tex_coord);\n"
9918												"    vec4 vegeta_color = SAMPLING_FUNCTION(vegeta, tex_coord);\n"
9919												"    vec4 trunks_color = SAMPLING_FUNCTION(trunks, tex_coord);\n"
9920												"\n"
9921												"    if ((vec4(1, 0, 0, 0) != goku_color)   ||\n"
9922												"        (vec4(0, 1, 0, 0) != vegeta_color) ||\n"
9923												"        (vec4(0, 0, 1, 0) != trunks_color)  )\n"
9924												"    {\n"
9925												"        result = vec4(1, 0, 0, 1);\n"
9926												"    }\n";
9927
9928	static const GLchar* compute_shader_template =
9929		"VERSION\n"
9930		"\n"
9931		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
9932		"\n"
9933		"writeonly uniform image2D uni_image;\n"
9934		"\n"
9935		"UNI_GOKU\n"
9936		"UNI_VEGETA\n"
9937		"UNI_TRUNKS\n"
9938		"\n"
9939		"void main()\n"
9940		"{\n"
9941		"    vec4 result = vec4(0, 1, 0, 1);\n"
9942		"\n"
9943		"VERIFICATION"
9944		"\n"
9945		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
9946		"}\n"
9947		"\n";
9948
9949	static const GLchar* fragment_shader_template = "VERSION\n"
9950													"\n"
9951													"in  vec4 gs_fs_result;\n"
9952													"out vec4 fs_out_result;\n"
9953													"\n"
9954													"UNI_GOKU\n"
9955													"UNI_VEGETA\n"
9956													"UNI_TRUNKS\n"
9957													"\n"
9958													"void main()\n"
9959													"{\n"
9960													"    vec4 result = vec4(0, 1, 0, 1);\n"
9961													"\n"
9962													"VERIFICATION"
9963													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
9964													"    {\n"
9965													"         result = vec4(1, 0, 0, 1);\n"
9966													"    }\n"
9967													"\n"
9968													"    fs_out_result = result;\n"
9969													"}\n"
9970													"\n";
9971
9972	static const GLchar* geometry_shader_template = "VERSION\n"
9973													"\n"
9974													"layout(points)                           in;\n"
9975													"layout(triangle_strip, max_vertices = 4) out;\n"
9976													"\n"
9977													"in  vec4 tes_gs_result[];\n"
9978													"out vec4 gs_fs_result;\n"
9979													"\n"
9980													"UNI_TRUNKS\n"
9981													"UNI_GOKU\n"
9982													"UNI_VEGETA\n"
9983													"\n"
9984													"void main()\n"
9985													"{\n"
9986													"    vec4 result = vec4(0, 1, 0, 1);\n"
9987													"\n"
9988													"VERIFICATION"
9989													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
9990													"    {\n"
9991													"         result = vec4(1, 0, 0, 1);\n"
9992													"    }\n"
9993													"\n"
9994													"    gs_fs_result = result;\n"
9995													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
9996													"    EmitVertex();\n"
9997													"    gs_fs_result = result;\n"
9998													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
9999													"    EmitVertex();\n"
10000													"    gs_fs_result = result;\n"
10001													"    gl_Position  = vec4(1, -1, 0, 1);\n"
10002													"    EmitVertex();\n"
10003													"    gs_fs_result = result;\n"
10004													"    gl_Position  = vec4(1, 1, 0, 1);\n"
10005													"    EmitVertex();\n"
10006													"}\n"
10007													"\n";
10008
10009	static const GLchar* tess_ctrl_shader_template =
10010		"VERSION\n"
10011		"\n"
10012		"layout(vertices = 1) out;\n"
10013		"\n"
10014		"in  vec4 vs_tcs_result[];\n"
10015		"out vec4 tcs_tes_result[];\n"
10016		"\n"
10017		"UNI_VEGETA\n"
10018		"UNI_TRUNKS\n"
10019		"UNI_GOKU\n"
10020		"\n"
10021		"void main()\n"
10022		"{\n"
10023		"    vec4 result = vec4(0, 1, 0, 1);\n"
10024		"\n"
10025		"VERIFICATION"
10026		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
10027		"    {\n"
10028		"         result = vec4(1, 0, 0, 1);\n"
10029		"    }\n"
10030		"\n"
10031		"    tcs_tes_result[gl_InvocationID] = result;\n"
10032		"\n"
10033		"    gl_TessLevelOuter[0] = 1.0;\n"
10034		"    gl_TessLevelOuter[1] = 1.0;\n"
10035		"    gl_TessLevelOuter[2] = 1.0;\n"
10036		"    gl_TessLevelOuter[3] = 1.0;\n"
10037		"    gl_TessLevelInner[0] = 1.0;\n"
10038		"    gl_TessLevelInner[1] = 1.0;\n"
10039		"}\n"
10040		"\n";
10041
10042	static const GLchar* tess_eval_shader_template = "VERSION\n"
10043													 "\n"
10044													 "layout(isolines, point_mode) in;\n"
10045													 "\n"
10046													 "in  vec4 tcs_tes_result[];\n"
10047													 "out vec4 tes_gs_result;\n"
10048													 "\n"
10049													 "UNI_GOKU\n"
10050													 "UNI_TRUNKS\n"
10051													 "UNI_VEGETA\n"
10052													 "\n"
10053													 "void main()\n"
10054													 "{\n"
10055													 "    vec4 result = vec4(0, 1, 0, 1);\n"
10056													 "\n"
10057													 "VERIFICATION"
10058													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
10059													 "    {\n"
10060													 "         result = vec4(1, 0, 0, 1);\n"
10061													 "    }\n"
10062													 "\n"
10063													 "    tes_gs_result = result;\n"
10064													 "}\n"
10065													 "\n";
10066
10067	static const GLchar* vertex_shader_template = "VERSION\n"
10068												  "\n"
10069												  "out vec4 vs_tcs_result;\n"
10070												  "\n"
10071												  "UNI_TRUNKS\n"
10072												  "UNI_VEGETA\n"
10073												  "UNI_GOKU\n"
10074												  "\n"
10075												  "void main()\n"
10076												  "{\n"
10077												  "    vec4 result = vec4(0, 1, 0, 1);\n"
10078												  "\n"
10079												  "VERIFICATION"
10080												  "\n"
10081												  "    vs_tcs_result = result;\n"
10082												  "}\n"
10083												  "\n";
10084
10085	const Utils::TYPES base_tex_coord_type = (Utils::TEX_BUFFER == m_test_case) ? Utils::INT : Utils::FLOAT;
10086	const GLchar*	  coordinates		   = 0;
10087	GLuint			   n_coordinates	   = Utils::getNumberOfCoordinates(m_test_case);
10088	const GLchar*	  shader_template	 = 0;
10089	const GLchar*	  sampler_type		   = Utils::getSamplerType(m_test_case);
10090	const GLchar*	  sampling_function   = (Utils::TEX_BUFFER == m_test_case) ? "texelFetch" : "texture";
10091	const GLchar*	  tex_coord_type	  = Utils::getTypeName(base_tex_coord_type, 1 /* n_columns */, n_coordinates);
10092
10093	switch (in_stage)
10094	{
10095	case Utils::COMPUTE_SHADER:
10096		shader_template = compute_shader_template;
10097		break;
10098	case Utils::FRAGMENT_SHADER:
10099		shader_template = fragment_shader_template;
10100		break;
10101	case Utils::GEOMETRY_SHADER:
10102		shader_template = geometry_shader_template;
10103		break;
10104	case Utils::TESS_CTRL_SHADER:
10105		shader_template = tess_ctrl_shader_template;
10106		break;
10107	case Utils::TESS_EVAL_SHADER:
10108		shader_template = tess_eval_shader_template;
10109		break;
10110	case Utils::VERTEX_SHADER:
10111		shader_template = vertex_shader_template;
10112		break;
10113	default:
10114		TCU_FAIL("Invalid enum");
10115	}
10116
10117	switch (n_coordinates)
10118	{
10119	case 1:
10120		coordinates = "0";
10121		break;
10122	case 2:
10123		coordinates = "0, 0";
10124		break;
10125	case 3:
10126		coordinates = "0, 0, 0";
10127		break;
10128	case 4:
10129		coordinates = "0, 0, 0, 0";
10130		break;
10131	}
10132
10133	out_source.m_parts[0].m_code = shader_template;
10134
10135	size_t position = 0;
10136
10137	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
10138						out_source.m_parts[0].m_code);
10139
10140	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
10141
10142	position -= strlen(verification_snippet);
10143
10144	Utils::replaceToken("COORDINATES", position, coordinates, out_source.m_parts[0].m_code);
10145
10146	Utils::replaceAllTokens("SAMPLING_FUNCTION", sampling_function, out_source.m_parts[0].m_code);
10147
10148	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
10149
10150	Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code);
10151
10152	Utils::replaceAllTokens("UNI_TRUNKS", uni_trunks, out_source.m_parts[0].m_code);
10153
10154	Utils::replaceAllTokens("TEX_COORD_TYPE", tex_coord_type, out_source.m_parts[0].m_code);
10155
10156	Utils::replaceAllTokens("TYPE", sampler_type, out_source.m_parts[0].m_code);
10157}
10158
10159/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
10160 *
10161 * @param program Current program
10162 **/
10163void BindingSamplersTest::prepareUniforms(Utils::program& program)
10164{
10165	(void)program;
10166	static const GLuint goku_data   = 0x000000ff;
10167	static const GLuint vegeta_data = 0x0000ff00;
10168	static const GLuint trunks_data = 0x00ff0000;
10169
10170	prepareTexture(m_goku_texture, m_test_case, goku_data);
10171	prepareTexture(m_vegeta_texture, m_test_case, vegeta_data);
10172	prepareTexture(m_trunks_texture, m_test_case, trunks_data);
10173
10174	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
10175
10176	gl.activeTexture(GL_TEXTURE0);
10177	GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
10178
10179	m_goku_texture.bind();
10180
10181	gl.activeTexture(GL_TEXTURE1);
10182	GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
10183
10184	m_vegeta_texture.bind();
10185
10186	gl.activeTexture(GL_TEXTURE3);
10187	GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
10188
10189	m_trunks_texture.bind();
10190}
10191
10192/** Overwrite of releaseResource method, release extra buffer and texture
10193 *
10194 * @param ignored
10195 **/
10196void BindingSamplersTest::releaseResource()
10197{
10198	m_goku_texture.release();
10199	m_vegeta_texture.release();
10200	m_trunks_texture.release();
10201	m_buffer.release();
10202}
10203
10204/** Prepare texture of given type filled with given color
10205 *
10206 * @param texture      Texture
10207 * @param texture_type Type of texture
10208 * @param color        Color
10209 **/
10210void BindingSamplersTest::prepareTexture(Utils::texture& texture, Utils::TEXTURE_TYPES texture_type, glw::GLuint color)
10211{
10212	(void)texture_type;
10213	static const GLuint width  = 16;
10214	static const GLuint height = 16;
10215	static const GLuint depth  = 1;
10216
10217	std::vector<GLuint> texture_data;
10218	texture_data.resize(width * height);
10219
10220	for (GLuint i = 0; i < texture_data.size(); ++i)
10221	{
10222		texture_data[i] = color;
10223	}
10224
10225	if (Utils::TEX_BUFFER != m_test_case)
10226	{
10227		texture.create(width, height, depth, GL_RGBA8, m_test_case);
10228
10229		texture.update(width, height, depth, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
10230	}
10231	else
10232	{
10233		m_buffer.generate(GL_TEXTURE_BUFFER);
10234		m_buffer.update(texture_data.size(), &texture_data[0], GL_STATIC_DRAW);
10235
10236		texture.createBuffer(GL_RGBA8, m_buffer.m_id);
10237	}
10238}
10239
10240/** Constructor
10241 *
10242 * @param context Test context
10243 **/
10244BindingSamplerSingleTest::BindingSamplerSingleTest(deqp::Context& context)
10245	: GLSLTestBase(context, "binding_sampler_single", "Test verifies sampler binding"), m_goku_texture(context)
10246{
10247	/* Nothing to be done here */
10248}
10249
10250/** Set up next test case
10251 *
10252 * @param test_case_index Index of next test case
10253 *
10254 * @return false if there is no more test cases, true otherwise
10255 **/
10256bool BindingSamplerSingleTest::prepareNextTestCase(glw::GLuint test_case_index)
10257{
10258	switch (test_case_index)
10259	{
10260	case (glw::GLuint)-1:
10261	case 0:
10262		m_test_stage = Utils::VERTEX_SHADER;
10263		break;
10264	case 1:
10265		m_test_stage = Utils::TESS_CTRL_SHADER;
10266		break;
10267	case 2:
10268		m_test_stage = Utils::TESS_EVAL_SHADER;
10269		break;
10270	case 3:
10271		m_test_stage = Utils::GEOMETRY_SHADER;
10272		break;
10273	case 4:
10274		m_test_stage = Utils::FRAGMENT_SHADER;
10275		break;
10276	default:
10277		return false;
10278	}
10279
10280	m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested stage: "
10281										<< Utils::getShaderStageName((Utils::SHADER_STAGES)m_test_stage)
10282										<< tcu::TestLog::EndMessage;
10283
10284	return true;
10285}
10286
10287/** Prepare source for given shader stage
10288 *
10289 * @param in_stage           Shader stage, compute shader will use 430
10290 * @param in_use_version_400 Select if 400 or 420 should be used
10291 * @param out_source         Prepared shader source instance
10292 **/
10293void BindingSamplerSingleTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
10294												   Utils::shaderSource& out_source)
10295{
10296	static const GLchar* uni_goku_with_binding = "layout(binding = 2) uniform sampler2D goku;\n";
10297
10298	static const GLchar* uni_goku_no_binding = "uniform sampler2D goku;\n";
10299
10300	static const GLchar* verification_snippet = "    vec4 goku_color = texture(goku, vec2(0,0));\n"
10301												"\n"
10302												"    if (vec4(1, 0, 0, 0) != goku_color)\n"
10303												"    {\n"
10304												"        result = vec4(1, 0, 0, 1);\n"
10305												"    }\n";
10306
10307	static const GLchar* compute_shader_template =
10308		"VERSION\n"
10309		"\n"
10310		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
10311		"\n"
10312		"writeonly uniform image2D uni_image;\n"
10313		"\n"
10314		"UNI_GOKU\n"
10315		"\n"
10316		"void main()\n"
10317		"{\n"
10318		"    vec4 result = vec4(0, 1, 0, 1);\n"
10319		"\n"
10320		"VERIFICATION"
10321		"\n"
10322		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
10323		"}\n"
10324		"\n";
10325
10326	static const GLchar* fragment_shader_template = "VERSION\n"
10327													"\n"
10328													"in  vec4 gs_fs_result;\n"
10329													"out vec4 fs_out_result;\n"
10330													"\n"
10331													"UNI_GOKU\n"
10332													"\n"
10333													"void main()\n"
10334													"{\n"
10335													"    vec4 result = vec4(0, 1, 0, 1);\n"
10336													"\n"
10337													"VERIFICATION"
10338													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
10339													"    {\n"
10340													"         result = vec4(1, 0, 0, 1);\n"
10341													"    }\n"
10342													"\n"
10343													"    fs_out_result = result;\n"
10344													"}\n"
10345													"\n";
10346
10347	static const GLchar* geometry_shader_template = "VERSION\n"
10348													"\n"
10349													"layout(points)                           in;\n"
10350													"layout(triangle_strip, max_vertices = 4) out;\n"
10351													"\n"
10352													"in  vec4 tes_gs_result[];\n"
10353													"out vec4 gs_fs_result;\n"
10354													"\n"
10355													"UNI_GOKU\n"
10356													"\n"
10357													"void main()\n"
10358													"{\n"
10359													"    vec4 result = vec4(0, 1, 0, 1);\n"
10360													"\n"
10361													"VERIFICATION"
10362													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
10363													"    {\n"
10364													"         result = vec4(1, 0, 0, 1);\n"
10365													"    }\n"
10366													"\n"
10367													"    gs_fs_result = result;\n"
10368													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
10369													"    EmitVertex();\n"
10370													"    gs_fs_result = result;\n"
10371													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
10372													"    EmitVertex();\n"
10373													"    gs_fs_result = result;\n"
10374													"    gl_Position  = vec4(1, -1, 0, 1);\n"
10375													"    EmitVertex();\n"
10376													"    gs_fs_result = result;\n"
10377													"    gl_Position  = vec4(1, 1, 0, 1);\n"
10378													"    EmitVertex();\n"
10379													"}\n"
10380													"\n";
10381
10382	static const GLchar* tess_ctrl_shader_template =
10383		"VERSION\n"
10384		"\n"
10385		"layout(vertices = 1) out;\n"
10386		"\n"
10387		"in  vec4 vs_tcs_result[];\n"
10388		"out vec4 tcs_tes_result[];\n"
10389		"\n"
10390		"UNI_GOKU\n"
10391		"\n"
10392		"void main()\n"
10393		"{\n"
10394		"    vec4 result = vec4(0, 1, 0, 1);\n"
10395		"\n"
10396		"VERIFICATION"
10397		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
10398		"    {\n"
10399		"         result = vec4(1, 0, 0, 1);\n"
10400		"    }\n"
10401		"\n"
10402		"    tcs_tes_result[gl_InvocationID] = result;\n"
10403		"\n"
10404		"    gl_TessLevelOuter[0] = 1.0;\n"
10405		"    gl_TessLevelOuter[1] = 1.0;\n"
10406		"    gl_TessLevelOuter[2] = 1.0;\n"
10407		"    gl_TessLevelOuter[3] = 1.0;\n"
10408		"    gl_TessLevelInner[0] = 1.0;\n"
10409		"    gl_TessLevelInner[1] = 1.0;\n"
10410		"}\n"
10411		"\n";
10412
10413	static const GLchar* tess_eval_shader_template = "VERSION\n"
10414													 "\n"
10415													 "layout(isolines, point_mode) in;\n"
10416													 "\n"
10417													 "in  vec4 tcs_tes_result[];\n"
10418													 "out vec4 tes_gs_result;\n"
10419													 "\n"
10420													 "UNI_GOKU\n"
10421													 "\n"
10422													 "void main()\n"
10423													 "{\n"
10424													 "    vec4 result = vec4(0, 1, 0, 1);\n"
10425													 "\n"
10426													 "VERIFICATION"
10427													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
10428													 "    {\n"
10429													 "         result = vec4(1, 0, 0, 1);\n"
10430													 "    }\n"
10431													 "\n"
10432													 "    tes_gs_result = result;\n"
10433													 "}\n"
10434													 "\n";
10435
10436	static const GLchar* vertex_shader_template = "VERSION\n"
10437												  "\n"
10438												  "out vec4 vs_tcs_result;\n"
10439												  "\n"
10440												  "UNI_GOKU\n"
10441												  "\n"
10442												  "void main()\n"
10443												  "{\n"
10444												  "    vec4 result = vec4(0, 1, 0, 1);\n"
10445												  "\n"
10446												  "VERIFICATION"
10447												  "\n"
10448												  "    vs_tcs_result = result;\n"
10449												  "}\n"
10450												  "\n";
10451
10452	const GLchar* shader_template	= 0;
10453	const GLchar* uniform_definition = uni_goku_no_binding;
10454
10455	switch (in_stage)
10456	{
10457	case Utils::COMPUTE_SHADER:
10458		shader_template	= compute_shader_template;
10459		uniform_definition = uni_goku_with_binding;
10460		break;
10461	case Utils::FRAGMENT_SHADER:
10462		shader_template = fragment_shader_template;
10463		break;
10464	case Utils::GEOMETRY_SHADER:
10465		shader_template = geometry_shader_template;
10466		break;
10467	case Utils::TESS_CTRL_SHADER:
10468		shader_template = tess_ctrl_shader_template;
10469		break;
10470	case Utils::TESS_EVAL_SHADER:
10471		shader_template = tess_eval_shader_template;
10472		break;
10473	case Utils::VERTEX_SHADER:
10474		shader_template = vertex_shader_template;
10475		break;
10476	default:
10477		TCU_FAIL("Invalid enum");
10478	}
10479
10480	if (in_stage == m_test_stage)
10481	{
10482		uniform_definition = uni_goku_with_binding;
10483	}
10484
10485	out_source.m_parts[0].m_code = shader_template;
10486
10487	size_t position = 0;
10488
10489	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
10490						out_source.m_parts[0].m_code);
10491
10492	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
10493
10494	Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code);
10495}
10496
10497/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
10498 *
10499 * @param program Current program
10500 **/
10501void BindingSamplerSingleTest::prepareUniforms(Utils::program& program)
10502{
10503	(void)program;
10504	static const GLuint goku_data = 0x000000ff;
10505
10506	m_goku_texture.create(16, 16, GL_RGBA8);
10507
10508	std::vector<GLuint> texture_data;
10509	texture_data.resize(16 * 16);
10510
10511	for (GLuint i = 0; i < texture_data.size(); ++i)
10512	{
10513		texture_data[i] = goku_data;
10514	}
10515
10516	m_goku_texture.update(16, 16, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
10517
10518	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
10519
10520	gl.activeTexture(GL_TEXTURE2);
10521	GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
10522
10523	m_goku_texture.bind();
10524}
10525
10526/** Overwrite of releaseResource method, release extra texture
10527 *
10528 * @param ignored
10529 **/
10530void BindingSamplerSingleTest::releaseResource()
10531{
10532	m_goku_texture.release();
10533}
10534
10535/** Constructor
10536 *
10537 * @param context Test context
10538 **/
10539BindingSamplerArrayTest::BindingSamplerArrayTest(deqp::Context& context)
10540	: GLSLTestBase(context, "binding_sampler_array", "Test verifies binding of sampler arrays")
10541	, m_goku_00_texture(context)
10542	, m_goku_01_texture(context)
10543	, m_goku_02_texture(context)
10544	, m_goku_03_texture(context)
10545	, m_goku_04_texture(context)
10546	, m_goku_05_texture(context)
10547	, m_goku_06_texture(context)
10548{
10549	/* Nothing to be done here */
10550}
10551
10552/** Prepare source for given shader stage
10553 *
10554 * @param in_stage           Shader stage, compute shader will use 430
10555 * @param in_use_version_400 Select if 400 or 420 should be used
10556 * @param out_source         Prepared shader source instance
10557 **/
10558void BindingSamplerArrayTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
10559												  Utils::shaderSource& out_source)
10560{
10561	static const GLchar* uni_goku = "layout(binding = 1) uniform sampler2D goku[7];\n";
10562
10563	static const GLchar* verification_snippet = "    vec4 color[7];\n"
10564												"\n"
10565												"    for (uint i = 0u; i < 7; ++i)\n"
10566												"    {\n"
10567												"        color[i] = texture(goku[i], vec2(0, 0));\n"
10568												"    }\n"
10569												"\n"
10570												"    if ((vec4(0, 0, 0, 0) != color[0]) ||\n"
10571												"        (vec4(0, 0, 0, 1) != color[1]) ||\n"
10572												"        (vec4(0, 0, 1, 0) != color[2]) ||\n"
10573												"        (vec4(0, 0, 1, 1) != color[3]) ||\n"
10574												"        (vec4(0, 1, 0, 0) != color[4]) ||\n"
10575												"        (vec4(0, 1, 0, 1) != color[5]) ||\n"
10576												"        (vec4(0, 1, 1, 0) != color[6]) )\n"
10577												"    {\n"
10578												"        result = vec4(1, 0, 0, 1);\n"
10579												"    }\n";
10580
10581	static const GLchar* compute_shader_template =
10582		"VERSION\n"
10583		"\n"
10584		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
10585		"\n"
10586		"writeonly uniform image2D uni_image;\n"
10587		"\n"
10588		"UNI_GOKU\n"
10589		"\n"
10590		"void main()\n"
10591		"{\n"
10592		"    vec4 result = vec4(0, 1, 0, 1);\n"
10593		"\n"
10594		"VERIFICATION"
10595		"\n"
10596		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
10597		"}\n"
10598		"\n";
10599
10600	static const GLchar* fragment_shader_template = "VERSION\n"
10601													"\n"
10602													"in  vec4 gs_fs_result;\n"
10603													"out vec4 fs_out_result;\n"
10604													"\n"
10605													"UNI_GOKU\n"
10606													"\n"
10607													"void main()\n"
10608													"{\n"
10609													"    vec4 result = vec4(0, 1, 0, 1);\n"
10610													"\n"
10611													"VERIFICATION"
10612													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
10613													"    {\n"
10614													"         result = vec4(1, 0, 0, 1);\n"
10615													"    }\n"
10616													"\n"
10617													"    fs_out_result = result;\n"
10618													"}\n"
10619													"\n";
10620
10621	static const GLchar* geometry_shader_template = "VERSION\n"
10622													"\n"
10623													"layout(points)                           in;\n"
10624													"layout(triangle_strip, max_vertices = 4) out;\n"
10625													"\n"
10626													"in  vec4 tes_gs_result[];\n"
10627													"out vec4 gs_fs_result;\n"
10628													"\n"
10629													"UNI_GOKU\n"
10630													"\n"
10631													"void main()\n"
10632													"{\n"
10633													"    vec4 result = vec4(0, 1, 0, 1);\n"
10634													"\n"
10635													"VERIFICATION"
10636													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
10637													"    {\n"
10638													"         result = vec4(1, 0, 0, 1);\n"
10639													"    }\n"
10640													"\n"
10641													"    gs_fs_result = result;\n"
10642													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
10643													"    EmitVertex();\n"
10644													"    gs_fs_result = result;\n"
10645													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
10646													"    EmitVertex();\n"
10647													"    gs_fs_result = result;\n"
10648													"    gl_Position  = vec4(1, -1, 0, 1);\n"
10649													"    EmitVertex();\n"
10650													"    gs_fs_result = result;\n"
10651													"    gl_Position  = vec4(1, 1, 0, 1);\n"
10652													"    EmitVertex();\n"
10653													"}\n"
10654													"\n";
10655
10656	static const GLchar* tess_ctrl_shader_template =
10657		"VERSION\n"
10658		"\n"
10659		"layout(vertices = 1) out;\n"
10660		"\n"
10661		"in  vec4 vs_tcs_result[];\n"
10662		"out vec4 tcs_tes_result[];\n"
10663		"\n"
10664		"UNI_GOKU\n"
10665		"\n"
10666		"void main()\n"
10667		"{\n"
10668		"    vec4 result = vec4(0, 1, 0, 1);\n"
10669		"\n"
10670		"VERIFICATION"
10671		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
10672		"    {\n"
10673		"         result = vec4(1, 0, 0, 1);\n"
10674		"    }\n"
10675		"\n"
10676		"    tcs_tes_result[gl_InvocationID] = result;\n"
10677		"\n"
10678		"    gl_TessLevelOuter[0] = 1.0;\n"
10679		"    gl_TessLevelOuter[1] = 1.0;\n"
10680		"    gl_TessLevelOuter[2] = 1.0;\n"
10681		"    gl_TessLevelOuter[3] = 1.0;\n"
10682		"    gl_TessLevelInner[0] = 1.0;\n"
10683		"    gl_TessLevelInner[1] = 1.0;\n"
10684		"}\n"
10685		"\n";
10686
10687	static const GLchar* tess_eval_shader_template = "VERSION\n"
10688													 "\n"
10689													 "layout(isolines, point_mode) in;\n"
10690													 "\n"
10691													 "in  vec4 tcs_tes_result[];\n"
10692													 "out vec4 tes_gs_result;\n"
10693													 "\n"
10694													 "UNI_GOKU\n"
10695													 "\n"
10696													 "void main()\n"
10697													 "{\n"
10698													 "    vec4 result = vec4(0, 1, 0, 1);\n"
10699													 "\n"
10700													 "VERIFICATION"
10701													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
10702													 "    {\n"
10703													 "         result = vec4(1, 0, 0, 1);\n"
10704													 "    }\n"
10705													 "\n"
10706													 "    tes_gs_result = result;\n"
10707													 "}\n"
10708													 "\n";
10709
10710	static const GLchar* vertex_shader_template = "VERSION\n"
10711												  "\n"
10712												  "out vec4 vs_tcs_result;\n"
10713												  "\n"
10714												  "UNI_GOKU\n"
10715												  "\n"
10716												  "void main()\n"
10717												  "{\n"
10718												  "    vec4 result = vec4(0, 1, 0, 1);\n"
10719												  "\n"
10720												  "VERIFICATION"
10721												  "\n"
10722												  "    vs_tcs_result = result;\n"
10723												  "}\n"
10724												  "\n";
10725
10726	const GLchar* shader_template = 0;
10727
10728	switch (in_stage)
10729	{
10730	case Utils::COMPUTE_SHADER:
10731		shader_template = compute_shader_template;
10732		break;
10733	case Utils::FRAGMENT_SHADER:
10734		shader_template = fragment_shader_template;
10735		break;
10736	case Utils::GEOMETRY_SHADER:
10737		shader_template = geometry_shader_template;
10738		break;
10739	case Utils::TESS_CTRL_SHADER:
10740		shader_template = tess_ctrl_shader_template;
10741		break;
10742	case Utils::TESS_EVAL_SHADER:
10743		shader_template = tess_eval_shader_template;
10744		break;
10745	case Utils::VERTEX_SHADER:
10746		shader_template = vertex_shader_template;
10747		break;
10748	default:
10749		TCU_FAIL("Invalid enum");
10750	}
10751
10752	out_source.m_parts[0].m_code = shader_template;
10753
10754	size_t position = 0;
10755
10756	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
10757						out_source.m_parts[0].m_code);
10758
10759	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
10760
10761	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
10762}
10763
10764/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
10765 *
10766 * @param program Current program
10767 **/
10768void BindingSamplerArrayTest::prepareUniforms(Utils::program& program)
10769{
10770	static const GLuint goku_data[7] = {
10771		0x00000000, 0xff000000, 0x00ff0000, 0xffff0000, 0x0000ff00, 0xff00ff00, 0x00ffff00,
10772	};
10773
10774	static const GLuint binding_offset = 1;
10775
10776	Utils::texture* textures[7] = {
10777		&m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture,
10778		&m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture,
10779	};
10780
10781	std::vector<GLuint> texture_data;
10782	texture_data.resize(16 * 16);
10783
10784	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
10785
10786	for (GLuint i = 0; i < 7; ++i)
10787	{
10788		GLint expected_binding = i + binding_offset;
10789
10790		checkBinding(program, i, expected_binding);
10791
10792		gl.activeTexture(GL_TEXTURE0 + expected_binding);
10793		GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
10794
10795		textures[i]->create(16, 16, GL_RGBA8);
10796
10797		for (GLuint j = 0; j < texture_data.size(); ++j)
10798		{
10799			texture_data[j] = goku_data[i];
10800		}
10801
10802		textures[i]->update(16, 16, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
10803	}
10804}
10805
10806/** Overwrite of releaseResource method, release extra textures
10807 *
10808 * @param ignored
10809 **/
10810void BindingSamplerArrayTest::releaseResource()
10811{
10812	Utils::texture* textures[7] = {
10813		&m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture,
10814		&m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture,
10815	};
10816
10817	for (GLuint i = 0; i < 7; ++i)
10818	{
10819		textures[i]->release();
10820	}
10821}
10822
10823/** Verifies that API reports correct uniform binding
10824 *
10825 * @param program          Program
10826 * @param index            Index of array element
10827 * @param expected_binding Expected binding
10828 **/
10829void BindingSamplerArrayTest::checkBinding(Utils::program& program, GLuint index, GLint expected_binding)
10830{
10831	if (false == Utils::checkUniformArrayBinding(program, "goku", index, expected_binding))
10832	{
10833		TCU_FAIL("Wrong binding reported by API");
10834	}
10835}
10836
10837/** Constructor
10838 *
10839 * @param context Test context
10840 **/
10841BindingSamplerDefaultTest::BindingSamplerDefaultTest(deqp::Context& context)
10842	: APITestBase(context, "binding_sampler_default", "Test verifies default sampler binding")
10843{
10844	/* Nothing to be done here */
10845}
10846
10847/** Execute API call and verifies results
10848 *
10849 * @return true when results are positive, false otherwise
10850 **/
10851bool BindingSamplerDefaultTest::checkResults(Utils::program& program)
10852{
10853	return Utils::checkUniformBinding(program, "goku", 0 /* expected_binding */);
10854}
10855
10856/** Prepare source for given shader stage
10857 *
10858 * @param in_stage           Shader stage, compute shader will use 430
10859 * @param in_use_version_400 Select if 400 or 420 should be used
10860 * @param out_source         Prepared shader source instance
10861 **/
10862void BindingSamplerDefaultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
10863													Utils::shaderSource& out_source)
10864{
10865	static const GLchar* uni_goku = "uniform sampler2D goku;\n";
10866
10867	static const GLchar* verification_snippet = "    vec4 color = texture(goku, vec2(0,0));\n"
10868												"    if (vec4(1, 0, 0, 0) != color)\n"
10869												"    {\n"
10870												"        result = vec4(1, 0, 0, 1);\n"
10871												"    }\n";
10872
10873	static const GLchar* compute_shader_template =
10874		"VERSION\n"
10875		"\n"
10876		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
10877		"\n"
10878		"writeonly uniform image2D uni_image;\n"
10879		"\n"
10880		"UNI_GOKU\n"
10881		"\n"
10882		"void main()\n"
10883		"{\n"
10884		"    vec4 result = vec4(0, 1, 0, 1);\n"
10885		"\n"
10886		"VERIFICATION"
10887		"\n"
10888		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
10889		"}\n"
10890		"\n";
10891
10892	static const GLchar* fragment_shader_template = "VERSION\n"
10893													"\n"
10894													"in  vec4 gs_fs_result;\n"
10895													"out vec4 fs_out_result;\n"
10896													"\n"
10897													"UNI_GOKU\n"
10898													"\n"
10899													"void main()\n"
10900													"{\n"
10901													"    vec4 result = vec4(0, 1, 0, 1);\n"
10902													"\n"
10903													"VERIFICATION"
10904													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
10905													"    {\n"
10906													"         result = vec4(1, 0, 0, 1);\n"
10907													"    }\n"
10908													"\n"
10909													"    fs_out_result = result;\n"
10910													"}\n"
10911													"\n";
10912
10913	static const GLchar* geometry_shader_template = "VERSION\n"
10914													"\n"
10915													"layout(points)                           in;\n"
10916													"layout(triangle_strip, max_vertices = 4) out;\n"
10917													"\n"
10918													"in  vec4 tes_gs_result[];\n"
10919													"out vec4 gs_fs_result;\n"
10920													"\n"
10921													"UNI_GOKU\n"
10922													"\n"
10923													"void main()\n"
10924													"{\n"
10925													"    vec4 result = vec4(0, 1, 0, 1);\n"
10926													"\n"
10927													"VERIFICATION"
10928													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
10929													"    {\n"
10930													"         result = vec4(1, 0, 0, 1);\n"
10931													"    }\n"
10932													"\n"
10933													"    gs_fs_result = result;\n"
10934													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
10935													"    EmitVertex();\n"
10936													"    gs_fs_result = result;\n"
10937													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
10938													"    EmitVertex();\n"
10939													"    gs_fs_result = result;\n"
10940													"    gl_Position  = vec4(1, -1, 0, 1);\n"
10941													"    EmitVertex();\n"
10942													"    gs_fs_result = result;\n"
10943													"    gl_Position  = vec4(1, 1, 0, 1);\n"
10944													"    EmitVertex();\n"
10945													"}\n"
10946													"\n";
10947
10948	static const GLchar* tess_ctrl_shader_template =
10949		"VERSION\n"
10950		"\n"
10951		"layout(vertices = 1) out;\n"
10952		"\n"
10953		"in  vec4 vs_tcs_result[];\n"
10954		"out vec4 tcs_tes_result[];\n"
10955		"\n"
10956		"UNI_GOKU\n"
10957		"\n"
10958		"void main()\n"
10959		"{\n"
10960		"    vec4 result = vec4(0, 1, 0, 1);\n"
10961		"\n"
10962		"VERIFICATION"
10963		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
10964		"    {\n"
10965		"         result = vec4(1, 0, 0, 1);\n"
10966		"    }\n"
10967		"\n"
10968		"    tcs_tes_result[gl_InvocationID] = result;\n"
10969		"\n"
10970		"    gl_TessLevelOuter[0] = 1.0;\n"
10971		"    gl_TessLevelOuter[1] = 1.0;\n"
10972		"    gl_TessLevelOuter[2] = 1.0;\n"
10973		"    gl_TessLevelOuter[3] = 1.0;\n"
10974		"    gl_TessLevelInner[0] = 1.0;\n"
10975		"    gl_TessLevelInner[1] = 1.0;\n"
10976		"}\n"
10977		"\n";
10978
10979	static const GLchar* tess_eval_shader_template = "VERSION\n"
10980													 "\n"
10981													 "layout(isolines, point_mode) in;\n"
10982													 "\n"
10983													 "in  vec4 tcs_tes_result[];\n"
10984													 "out vec4 tes_gs_result;\n"
10985													 "\n"
10986													 "UNI_GOKU\n"
10987													 "\n"
10988													 "void main()\n"
10989													 "{\n"
10990													 "    vec4 result = vec4(0, 1, 0, 1);\n"
10991													 "\n"
10992													 "VERIFICATION"
10993													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
10994													 "    {\n"
10995													 "         result = vec4(1, 0, 0, 1);\n"
10996													 "    }\n"
10997													 "\n"
10998													 "    tes_gs_result = result;\n"
10999													 "}\n"
11000													 "\n";
11001
11002	static const GLchar* vertex_shader_template = "VERSION\n"
11003												  "\n"
11004												  "out vec4 vs_tcs_result;\n"
11005												  "\n"
11006												  "UNI_GOKU\n"
11007												  "\n"
11008												  "void main()\n"
11009												  "{\n"
11010												  "    vec4 result = vec4(0, 1, 0, 1);\n"
11011												  "\n"
11012												  "VERIFICATION"
11013												  "\n"
11014												  "    vs_tcs_result = result;\n"
11015												  "}\n"
11016												  "\n";
11017
11018	const GLchar* shader_template = 0;
11019
11020	switch (in_stage)
11021	{
11022	case Utils::COMPUTE_SHADER:
11023		shader_template = compute_shader_template;
11024		break;
11025	case Utils::FRAGMENT_SHADER:
11026		shader_template = fragment_shader_template;
11027		break;
11028	case Utils::GEOMETRY_SHADER:
11029		shader_template = geometry_shader_template;
11030		break;
11031	case Utils::TESS_CTRL_SHADER:
11032		shader_template = tess_ctrl_shader_template;
11033		break;
11034	case Utils::TESS_EVAL_SHADER:
11035		shader_template = tess_eval_shader_template;
11036		break;
11037	case Utils::VERTEX_SHADER:
11038		shader_template = vertex_shader_template;
11039		break;
11040	default:
11041		TCU_FAIL("Invalid enum");
11042	}
11043
11044	out_source.m_parts[0].m_code = shader_template;
11045
11046	size_t position = 0;
11047
11048	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
11049						out_source.m_parts[0].m_code);
11050
11051	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
11052
11053	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
11054}
11055
11056/** Constructor
11057 *
11058 * @param context Test context
11059 **/
11060BindingSamplerAPIOverrideTest::BindingSamplerAPIOverrideTest(deqp::Context& context)
11061	: GLSLTestBase(context, "binding_sampler_api_override", "Verifies that API can override sampler binding")
11062	, m_goku_texture(context)
11063{
11064	/* Nothing to be done here */
11065}
11066
11067/** Prepare source for given shader stage
11068 *
11069 * @param in_stage           Shader stage, compute shader will use 430
11070 * @param in_use_version_400 Select if 400 or 420 should be used
11071 * @param out_source         Prepared shader source instance
11072 **/
11073void BindingSamplerAPIOverrideTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
11074														Utils::shaderSource& out_source)
11075{
11076	static const GLchar* uni_goku = "layout(binding = 2) uniform sampler2D goku;\n";
11077
11078	static const GLchar* verification_snippet = "    vec4 color = texture(goku, vec2(0,0));\n"
11079												"    if (vec4(1, 0, 0, 0) != color)\n"
11080												"    {\n"
11081												"        result = vec4(1, 0, 0, 1);\n"
11082												"    }\n";
11083
11084	static const GLchar* compute_shader_template =
11085		"VERSION\n"
11086		"\n"
11087		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
11088		"\n"
11089		"writeonly uniform image2D uni_image;\n"
11090		"\n"
11091		"UNI_GOKU\n"
11092		"\n"
11093		"void main()\n"
11094		"{\n"
11095		"    vec4 result = vec4(0, 1, 0, 1);\n"
11096		"\n"
11097		"VERIFICATION"
11098		"\n"
11099		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
11100		"}\n"
11101		"\n";
11102
11103	static const GLchar* fragment_shader_template = "VERSION\n"
11104													"\n"
11105													"in  vec4 gs_fs_result;\n"
11106													"out vec4 fs_out_result;\n"
11107													"\n"
11108													"UNI_GOKU\n"
11109													"\n"
11110													"void main()\n"
11111													"{\n"
11112													"    vec4 result = vec4(0, 1, 0, 1);\n"
11113													"\n"
11114													"VERIFICATION"
11115													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
11116													"    {\n"
11117													"         result = vec4(1, 0, 0, 1);\n"
11118													"    }\n"
11119													"\n"
11120													"    fs_out_result = result;\n"
11121													"}\n"
11122													"\n";
11123
11124	static const GLchar* geometry_shader_template = "VERSION\n"
11125													"\n"
11126													"layout(points)                           in;\n"
11127													"layout(triangle_strip, max_vertices = 4) out;\n"
11128													"\n"
11129													"in  vec4 tes_gs_result[];\n"
11130													"out vec4 gs_fs_result;\n"
11131													"\n"
11132													"UNI_GOKU\n"
11133													"\n"
11134													"void main()\n"
11135													"{\n"
11136													"    vec4 result = vec4(0, 1, 0, 1);\n"
11137													"\n"
11138													"VERIFICATION"
11139													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
11140													"    {\n"
11141													"         result = vec4(1, 0, 0, 1);\n"
11142													"    }\n"
11143													"\n"
11144													"    gs_fs_result = result;\n"
11145													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
11146													"    EmitVertex();\n"
11147													"    gs_fs_result = result;\n"
11148													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
11149													"    EmitVertex();\n"
11150													"    gs_fs_result = result;\n"
11151													"    gl_Position  = vec4(1, -1, 0, 1);\n"
11152													"    EmitVertex();\n"
11153													"    gs_fs_result = result;\n"
11154													"    gl_Position  = vec4(1, 1, 0, 1);\n"
11155													"    EmitVertex();\n"
11156													"}\n"
11157													"\n";
11158
11159	static const GLchar* tess_ctrl_shader_template =
11160		"VERSION\n"
11161		"\n"
11162		"layout(vertices = 1) out;\n"
11163		"\n"
11164		"in  vec4 vs_tcs_result[];\n"
11165		"out vec4 tcs_tes_result[];\n"
11166		"\n"
11167		"UNI_GOKU\n"
11168		"\n"
11169		"void main()\n"
11170		"{\n"
11171		"    vec4 result = vec4(0, 1, 0, 1);\n"
11172		"\n"
11173		"VERIFICATION"
11174		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
11175		"    {\n"
11176		"         result = vec4(1, 0, 0, 1);\n"
11177		"    }\n"
11178		"\n"
11179		"    tcs_tes_result[gl_InvocationID] = result;\n"
11180		"\n"
11181		"    gl_TessLevelOuter[0] = 1.0;\n"
11182		"    gl_TessLevelOuter[1] = 1.0;\n"
11183		"    gl_TessLevelOuter[2] = 1.0;\n"
11184		"    gl_TessLevelOuter[3] = 1.0;\n"
11185		"    gl_TessLevelInner[0] = 1.0;\n"
11186		"    gl_TessLevelInner[1] = 1.0;\n"
11187		"}\n"
11188		"\n";
11189
11190	static const GLchar* tess_eval_shader_template = "VERSION\n"
11191													 "\n"
11192													 "layout(isolines, point_mode) in;\n"
11193													 "\n"
11194													 "in  vec4 tcs_tes_result[];\n"
11195													 "out vec4 tes_gs_result;\n"
11196													 "\n"
11197													 "UNI_GOKU\n"
11198													 "\n"
11199													 "void main()\n"
11200													 "{\n"
11201													 "    vec4 result = vec4(0, 1, 0, 1);\n"
11202													 "\n"
11203													 "VERIFICATION"
11204													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
11205													 "    {\n"
11206													 "         result = vec4(1, 0, 0, 1);\n"
11207													 "    }\n"
11208													 "\n"
11209													 "    tes_gs_result = result;\n"
11210													 "}\n"
11211													 "\n";
11212
11213	static const GLchar* vertex_shader_template = "VERSION\n"
11214												  "\n"
11215												  "out vec4 vs_tcs_result;\n"
11216												  "\n"
11217												  "UNI_GOKU\n"
11218												  "\n"
11219												  "void main()\n"
11220												  "{\n"
11221												  "    vec4 result = vec4(0, 1, 0, 1);\n"
11222												  "\n"
11223												  "VERIFICATION"
11224												  "\n"
11225												  "    vs_tcs_result = result;\n"
11226												  "}\n"
11227												  "\n";
11228
11229	const GLchar* shader_template = 0;
11230
11231	switch (in_stage)
11232	{
11233	case Utils::COMPUTE_SHADER:
11234		shader_template = compute_shader_template;
11235		break;
11236	case Utils::FRAGMENT_SHADER:
11237		shader_template = fragment_shader_template;
11238		break;
11239	case Utils::GEOMETRY_SHADER:
11240		shader_template = geometry_shader_template;
11241		break;
11242	case Utils::TESS_CTRL_SHADER:
11243		shader_template = tess_ctrl_shader_template;
11244		break;
11245	case Utils::TESS_EVAL_SHADER:
11246		shader_template = tess_eval_shader_template;
11247		break;
11248	case Utils::VERTEX_SHADER:
11249		shader_template = vertex_shader_template;
11250		break;
11251	default:
11252		TCU_FAIL("Invalid enum");
11253	}
11254
11255	out_source.m_parts[0].m_code = shader_template;
11256
11257	size_t position = 0;
11258
11259	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
11260						out_source.m_parts[0].m_code);
11261
11262	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
11263
11264	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
11265}
11266
11267/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
11268 *
11269 * @param program Current program
11270 **/
11271void BindingSamplerAPIOverrideTest::prepareUniforms(Utils::program& program)
11272{
11273	static const GLuint goku_data   = 0x000000ff;
11274	static const GLint  new_binding = 11;
11275
11276	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
11277
11278	const GLint uniform_location = program.getUniformLocation("goku");
11279	if (-1 == uniform_location)
11280	{
11281		TCU_FAIL("Uniform is inactive");
11282	}
11283
11284	gl.uniform1i(uniform_location, new_binding);
11285
11286	GLint binding = -1;
11287
11288	gl.getUniformiv(program.m_program_object_id, uniform_location, &binding);
11289	GLU_EXPECT_NO_ERROR(gl.getError(), "getUniformiv");
11290
11291	if (new_binding != binding)
11292	{
11293		TCU_FAIL("Wrong binding value");
11294		return;
11295	}
11296
11297	m_goku_texture.create(16, 16, GL_RGBA8);
11298
11299	std::vector<GLuint> texture_data;
11300	texture_data.resize(16 * 16);
11301
11302	for (GLuint i = 0; i < texture_data.size(); ++i)
11303	{
11304		texture_data[i] = goku_data;
11305	}
11306
11307	m_goku_texture.update(16, 16, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
11308
11309	gl.activeTexture(GL_TEXTURE11);
11310	GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture");
11311
11312	m_goku_texture.bind();
11313}
11314
11315/** Overwrite of releaseResource method, release extra texture
11316 *
11317 * @param ignored
11318 **/
11319void BindingSamplerAPIOverrideTest::releaseResource()
11320{
11321	m_goku_texture.release();
11322}
11323
11324/** Constructor
11325 *
11326 * @param context Test context
11327 **/
11328BindingSamplerInvalidTest::BindingSamplerInvalidTest(deqp::Context& context)
11329	: NegativeTestBase(context, "binding_sampler_invalid", "Test verifies invalid binding values")
11330{
11331	/* Nothing to be done here */
11332}
11333
11334/** Set up next test case
11335 *
11336 * @param test_case_index Index of next test case
11337 *
11338 * @return false if there is no more test cases, true otherwise
11339 **/
11340bool BindingSamplerInvalidTest::prepareNextTestCase(glw::GLuint test_case_index)
11341{
11342	switch (test_case_index)
11343	{
11344	case (glw::GLuint)-1:
11345		m_case = TEST_CASES_MAX;
11346		break;
11347	case NEGATIVE_VALUE:
11348	case VARIABLE_NAME:
11349	case STD140:
11350	case MISSING:
11351		m_case = (TESTCASES)test_case_index;
11352		break;
11353	default:
11354		return false;
11355	}
11356
11357	return true;
11358}
11359
11360/** Prepare source for given shader stage
11361 *
11362 * @param in_stage           Shader stage, compute shader will use 430
11363 * @param in_use_version_400 Select if 400 or 420 should be used
11364 * @param out_source         Prepared shader source instance
11365 **/
11366void BindingSamplerInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
11367													Utils::shaderSource& out_source)
11368{
11369	static const GLchar* uni_goku = "layout(binding BINDING) uniform sampler2D goku;\n";
11370
11371	static const GLchar* verification_snippet = "    vec4 color = texture(goku, vec2(0,0));\n"
11372												"    if (vec4(1, 0, 0, 0) != color)\n"
11373												"    {\n"
11374												"        result = vec4(1, 0, 0, 1);\n"
11375												"    }\n";
11376
11377	static const GLchar* compute_shader_template =
11378		"VERSION\n"
11379		"\n"
11380		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
11381		"\n"
11382		"writeonly uniform image2D uni_image;\n"
11383		"\n"
11384		"UNI_GOKU\n"
11385		"\n"
11386		"void main()\n"
11387		"{\n"
11388		"    vec4 result = vec4(0, 1, 0, 1);\n"
11389		"\n"
11390		"VERIFICATION"
11391		"\n"
11392		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
11393		"}\n"
11394		"\n";
11395
11396	static const GLchar* fragment_shader_template = "VERSION\n"
11397													"\n"
11398													"in  vec4 gs_fs_result;\n"
11399													"out vec4 fs_out_result;\n"
11400													"\n"
11401													"UNI_GOKU\n"
11402													"\n"
11403													"void main()\n"
11404													"{\n"
11405													"    vec4 result = vec4(0, 1, 0, 1);\n"
11406													"\n"
11407													"VERIFICATION"
11408													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
11409													"    {\n"
11410													"         result = vec4(1, 0, 0, 1);\n"
11411													"    }\n"
11412													"\n"
11413													"    fs_out_result = result;\n"
11414													"}\n"
11415													"\n";
11416
11417	static const GLchar* geometry_shader_template = "VERSION\n"
11418													"\n"
11419													"layout(points)                           in;\n"
11420													"layout(triangle_strip, max_vertices = 4) out;\n"
11421													"\n"
11422													"in  vec4 tes_gs_result[];\n"
11423													"out vec4 gs_fs_result;\n"
11424													"\n"
11425													"UNI_GOKU\n"
11426													"\n"
11427													"void main()\n"
11428													"{\n"
11429													"    vec4 result = vec4(0, 1, 0, 1);\n"
11430													"\n"
11431													"VERIFICATION"
11432													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
11433													"    {\n"
11434													"         result = vec4(1, 0, 0, 1);\n"
11435													"    }\n"
11436													"\n"
11437													"    gs_fs_result = result;\n"
11438													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
11439													"    EmitVertex();\n"
11440													"    gs_fs_result = result;\n"
11441													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
11442													"    EmitVertex();\n"
11443													"    gs_fs_result = result;\n"
11444													"    gl_Position  = vec4(1, -1, 0, 1);\n"
11445													"    EmitVertex();\n"
11446													"    gs_fs_result = result;\n"
11447													"    gl_Position  = vec4(1, 1, 0, 1);\n"
11448													"    EmitVertex();\n"
11449													"}\n"
11450													"\n";
11451
11452	static const GLchar* tess_ctrl_shader_template =
11453		"VERSION\n"
11454		"\n"
11455		"layout(vertices = 1) out;\n"
11456		"\n"
11457		"in  vec4 vs_tcs_result[];\n"
11458		"out vec4 tcs_tes_result[];\n"
11459		"\n"
11460		"UNI_GOKU\n"
11461		"\n"
11462		"void main()\n"
11463		"{\n"
11464		"    vec4 result = vec4(0, 1, 0, 1);\n"
11465		"\n"
11466		"VERIFICATION"
11467		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
11468		"    {\n"
11469		"         result = vec4(1, 0, 0, 1);\n"
11470		"    }\n"
11471		"\n"
11472		"    tcs_tes_result[gl_InvocationID] = result;\n"
11473		"\n"
11474		"    gl_TessLevelOuter[0] = 1.0;\n"
11475		"    gl_TessLevelOuter[1] = 1.0;\n"
11476		"    gl_TessLevelOuter[2] = 1.0;\n"
11477		"    gl_TessLevelOuter[3] = 1.0;\n"
11478		"    gl_TessLevelInner[0] = 1.0;\n"
11479		"    gl_TessLevelInner[1] = 1.0;\n"
11480		"}\n"
11481		"\n";
11482
11483	static const GLchar* tess_eval_shader_template = "VERSION\n"
11484													 "\n"
11485													 "layout(isolines, point_mode) in;\n"
11486													 "\n"
11487													 "in  vec4 tcs_tes_result[];\n"
11488													 "out vec4 tes_gs_result;\n"
11489													 "\n"
11490													 "UNI_GOKU\n"
11491													 "\n"
11492													 "void main()\n"
11493													 "{\n"
11494													 "    vec4 result = vec4(0, 1, 0, 1);\n"
11495													 "\n"
11496													 "VERIFICATION"
11497													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
11498													 "    {\n"
11499													 "         result = vec4(1, 0, 0, 1);\n"
11500													 "    }\n"
11501													 "\n"
11502													 "    tes_gs_result = result;\n"
11503													 "}\n"
11504													 "\n";
11505
11506	static const GLchar* vertex_shader_template = "VERSION\n"
11507												  "\n"
11508												  "out vec4 vs_tcs_result;\n"
11509												  "\n"
11510												  "UNI_GOKU\n"
11511												  "\n"
11512												  "void main()\n"
11513												  "{\n"
11514												  "    vec4 result = vec4(0, 1, 0, 1);\n"
11515												  "\n"
11516												  "VERIFICATION"
11517												  "\n"
11518												  "    vs_tcs_result = result;\n"
11519												  "}\n"
11520												  "\n";
11521
11522	const GLchar* shader_template = 0;
11523
11524	switch (in_stage)
11525	{
11526	case Utils::COMPUTE_SHADER:
11527		shader_template = compute_shader_template;
11528		break;
11529	case Utils::FRAGMENT_SHADER:
11530		shader_template = fragment_shader_template;
11531		break;
11532	case Utils::GEOMETRY_SHADER:
11533		shader_template = geometry_shader_template;
11534		break;
11535	case Utils::TESS_CTRL_SHADER:
11536		shader_template = tess_ctrl_shader_template;
11537		break;
11538	case Utils::TESS_EVAL_SHADER:
11539		shader_template = tess_eval_shader_template;
11540		break;
11541	case Utils::VERTEX_SHADER:
11542		shader_template = vertex_shader_template;
11543		break;
11544	default:
11545		TCU_FAIL("Invalid enum");
11546	}
11547
11548	out_source.m_parts[0].m_code = shader_template;
11549
11550	size_t position = 0;
11551
11552	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
11553						out_source.m_parts[0].m_code);
11554
11555	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
11556
11557	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
11558
11559	Utils::replaceAllTokens("BINDING", getCaseString(m_case), out_source.m_parts[0].m_code);
11560}
11561
11562const GLchar* BindingSamplerInvalidTest::getCaseString(TESTCASES test_case)
11563{
11564	(void)test_case;
11565	const GLchar* binding = 0;
11566
11567	switch (m_case)
11568	{
11569	case NEGATIVE_VALUE:
11570		binding = "= -1";
11571		break;
11572	case VARIABLE_NAME:
11573		binding = "= goku";
11574		break;
11575	case STD140:
11576		binding = "= std140";
11577		break;
11578	case MISSING:
11579		binding = "";
11580		break;
11581	case TEST_CASES_MAX:
11582		binding = "= 0";
11583		break;
11584	default:
11585		TCU_FAIL("Invalid enum");
11586	}
11587
11588	return binding;
11589}
11590
11591/* Constants used by BindingImagesTest */
11592const GLuint BindingImagesTest::m_goku_data   = 0x000000ff;
11593const GLuint BindingImagesTest::m_vegeta_data = 0x0000ff00;
11594const GLuint BindingImagesTest::m_trunks_data = 0x00ff0000;
11595
11596/** Constructor
11597 *
11598 * @param context Test context
11599 **/
11600BindingImagesTest::BindingImagesTest(deqp::Context& context)
11601	: BindingImageTest(context, "binding_images", "Test verifies binding of images")
11602	, m_goku_texture(context)
11603	, m_vegeta_texture(context)
11604	, m_trunks_texture(context)
11605	, m_goku_buffer(context)
11606	, m_vegeta_buffer(context)
11607	, m_trunks_buffer(context)
11608{
11609	/* Nothing to be done here */
11610}
11611
11612/** Set up next test case
11613 *
11614 * @param test_case_index Index of next test case
11615 *
11616 * @return false if there is no more test cases, true otherwise
11617 **/
11618bool BindingImagesTest::prepareNextTestCase(glw::GLuint test_case_index)
11619{
11620	switch (test_case_index)
11621	{
11622	case (glw::GLuint)-1:
11623	case 0:
11624		m_test_case = Utils::TEX_2D;
11625		break;
11626	case 1:
11627		m_test_case = Utils::TEX_BUFFER;
11628		break;
11629	case 2:
11630		m_test_case = Utils::TEX_2D_RECT;
11631		break;
11632	case 3:
11633		m_test_case = Utils::TEX_2D_ARRAY;
11634		break;
11635	case 4:
11636		m_test_case = Utils::TEX_3D;
11637		break;
11638	case 5:
11639		m_test_case = Utils::TEX_CUBE;
11640		break;
11641	case 6:
11642		m_test_case = Utils::TEX_1D;
11643		break;
11644	case 7:
11645		m_test_case = Utils::TEX_1D_ARRAY;
11646		break;
11647	default:
11648		return false;
11649	}
11650
11651	m_context.getTestContext().getLog() << tcu::TestLog::Message
11652										<< "Tested texture type: " << Utils::getTextureTypeName(m_test_case)
11653										<< tcu::TestLog::EndMessage;
11654
11655	return true;
11656}
11657
11658/** Prepare source for given shader stage
11659 *
11660 * @param in_stage           Shader stage, compute shader will use 430
11661 * @param in_use_version_400 Select if 400 or 420 should be used
11662 * @param out_source         Prepared shader source instance
11663 **/
11664void BindingImagesTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
11665											Utils::shaderSource& out_source)
11666{
11667	static const GLchar* uni_goku = "layout(binding = 1, rgba8) uniform TYPE goku;\n";
11668
11669	static const GLchar* uni_vegeta = "layout(binding = 2, rgba8) uniform TYPE vegeta;\n";
11670
11671	static const GLchar* uni_trunks = "layout(binding = 4, rgba8) uniform TYPE trunks;\n\n";
11672
11673	static const GLchar* verification_snippet = "    TEX_COORD_TYPE tex_coord_read  = TEX_COORD_TYPE(COORDINATES);\n"
11674												"    TEX_COORD_TYPE tex_coord_write = TEX_COORD_TYPE(COORDINATES);\n"
11675												"    vec4 goku_color   = imageLoad(goku,   tex_coord_read);\n"
11676												"    vec4 vegeta_color = imageLoad(vegeta, tex_coord_read);\n"
11677												"    vec4 trunks_color = imageLoad(trunks, tex_coord_read);\n"
11678												"\n"
11679												"    imageStore(goku,   tex_coord_write, vec4(0, 1, 0, 1));\n"
11680												"    imageStore(vegeta, tex_coord_write, vec4(0, 1, 0, 1));\n"
11681												"    imageStore(trunks, tex_coord_write, vec4(0, 1, 0, 1));\n"
11682												"\n"
11683												"    if ((vec4(1, 0, 0, 0) != goku_color)   ||\n"
11684												"        (vec4(0, 1, 0, 0) != vegeta_color) ||\n"
11685												"        (vec4(0, 0, 1, 0) != trunks_color)  )\n"
11686												"    {\n"
11687												"        result = goku_color;\n"
11688												"        //result = vec4(1, 0, 0, 1);\n"
11689												"    }\n";
11690
11691	static const GLchar* compute_shader_template =
11692		"VERSION\n"
11693		"#extension GL_ARB_shader_image_load_store : enable\n"
11694		"\n"
11695		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
11696		"\n"
11697		"writeonly uniform image2D uni_image;\n"
11698		"\n"
11699		"UNI_GOKU\n"
11700		"UNI_VEGETA\n"
11701		"UNI_TRUNKS\n"
11702		"\n"
11703		"void main()\n"
11704		"{\n"
11705		"    vec4 result = vec4(0, 1, 0, 1);\n"
11706		"\n"
11707		"    if(gl_GlobalInvocationID.xy == vec2(0, 0)) {\n"
11708		"VERIFICATION"
11709		"    }\n"
11710		"\n"
11711		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
11712		"}\n"
11713		"\n";
11714
11715	static const GLchar* fragment_shader_template = "VERSION\n"
11716													"#extension GL_ARB_shader_image_load_store : enable\n"
11717													"\n"
11718													"in  vec4 gs_fs_result;\n"
11719													"out vec4 fs_out_result;\n"
11720													"\n"
11721													"UNI_GOKU\n"
11722													"UNI_VEGETA\n"
11723													"UNI_TRUNKS\n"
11724													"\n"
11725													"void main()\n"
11726													"{\n"
11727													"    vec4 result = vec4(0, 1, 0, 1);\n"
11728													"\n"
11729													"VERIFICATION"
11730													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
11731													"    {\n"
11732													"         result = vec4(1, 0, 0, 1);\n"
11733													"    }\n"
11734													"\n"
11735													"    fs_out_result = result;\n"
11736													"}\n"
11737													"\n";
11738
11739	static const GLchar* geometry_shader_template = "VERSION\n"
11740													"#extension GL_ARB_shader_image_load_store : enable\n"
11741													"\n"
11742													"layout(points)                           in;\n"
11743													"layout(triangle_strip, max_vertices = 4) out;\n"
11744													"\n"
11745													"in  vec4 tes_gs_result[];\n"
11746													"out vec4 gs_fs_result;\n"
11747													"\n"
11748													"#if IMAGES\n"
11749													"UNI_TRUNKS\n"
11750													"UNI_GOKU\n"
11751													"UNI_VEGETA\n"
11752													"#endif\n"
11753													"\n"
11754													"void main()\n"
11755													"{\n"
11756													"    vec4 result = vec4(0, 1, 0, 1);\n"
11757													"\n"
11758													"#if IMAGES\n"
11759													"VERIFICATION else\n"
11760													"#endif\n"
11761													"    if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
11762													"    {\n"
11763													"         result = vec4(1, 0, 0, 1);\n"
11764													"    }\n"
11765													"\n"
11766													"    gs_fs_result = result;\n"
11767													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
11768													"    EmitVertex();\n"
11769													"    gs_fs_result = result;\n"
11770													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
11771													"    EmitVertex();\n"
11772													"    gs_fs_result = result;\n"
11773													"    gl_Position  = vec4(1, -1, 0, 1);\n"
11774													"    EmitVertex();\n"
11775													"    gs_fs_result = result;\n"
11776													"    gl_Position  = vec4(1, 1, 0, 1);\n"
11777													"    EmitVertex();\n"
11778													"}\n"
11779													"\n";
11780
11781	static const GLchar* tess_ctrl_shader_template =
11782		"VERSION\n"
11783		"#extension GL_ARB_shader_image_load_store : enable\n"
11784		"\n"
11785		"layout(vertices = 1) out;\n"
11786		"\n"
11787		"in  vec4 vs_tcs_result[];\n"
11788		"out vec4 tcs_tes_result[];\n"
11789		"\n"
11790		"#if IMAGES\n"
11791		"UNI_VEGETA\n"
11792		"UNI_TRUNKS\n"
11793		"UNI_GOKU\n"
11794		"#endif\n"
11795		"\n"
11796		"void main()\n"
11797		"{\n"
11798		"    vec4 result = vec4(0, 1, 0, 1);\n"
11799		"\n"
11800		"#if IMAGES\n"
11801		"VERIFICATION else\n"
11802		"#endif\n"
11803		"    if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
11804		"    {\n"
11805		"         result = vec4(1, 0, 0, 1);\n"
11806		"    }\n"
11807		"\n"
11808		"    tcs_tes_result[gl_InvocationID] = result;\n"
11809		"\n"
11810		"    gl_TessLevelOuter[0] = 1.0;\n"
11811		"    gl_TessLevelOuter[1] = 1.0;\n"
11812		"    gl_TessLevelOuter[2] = 1.0;\n"
11813		"    gl_TessLevelOuter[3] = 1.0;\n"
11814		"    gl_TessLevelInner[0] = 1.0;\n"
11815		"    gl_TessLevelInner[1] = 1.0;\n"
11816		"}\n"
11817		"\n";
11818
11819	static const GLchar* tess_eval_shader_template = "VERSION\n"
11820													 "#extension GL_ARB_shader_image_load_store : enable\n"
11821													 "\n"
11822													 "layout(isolines, point_mode) in;\n"
11823													 "\n"
11824													 "in  vec4 tcs_tes_result[];\n"
11825													 "out vec4 tes_gs_result;\n"
11826													 "\n"
11827													 "#if IMAGES\n"
11828													 "UNI_GOKU\n"
11829													 "UNI_TRUNKS\n"
11830													 "UNI_VEGETA\n"
11831													 "#endif\n"
11832													 "\n"
11833													 "void main()\n"
11834													 "{\n"
11835													 "    vec4 result = vec4(0, 1, 0, 1);\n"
11836													 "\n"
11837													 "#if IMAGES\n"
11838													 "VERIFICATION else\n"
11839													 "#endif\n"
11840													 "    if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
11841													 "    {\n"
11842													 "         result = vec4(1, 0, 0, 1);\n"
11843													 "    }\n"
11844													 "\n"
11845													 "    tes_gs_result = result;\n"
11846													 "}\n"
11847													 "\n";
11848
11849	static const GLchar* vertex_shader_template = "VERSION\n"
11850												  "#extension GL_ARB_shader_image_load_store : enable\n"
11851												  "\n"
11852												  "out vec4 vs_tcs_result;\n"
11853												  "\n"
11854												  "#if IMAGES\n"
11855												  "UNI_TRUNKS\n"
11856												  "UNI_VEGETA\n"
11857												  "UNI_GOKU\n"
11858												  "#endif\n"
11859												  "\n"
11860												  "void main()\n"
11861												  "{\n"
11862												  "    vec4 result = vec4(0, 1, 0, 1);\n"
11863												  "\n"
11864												  "#if IMAGES\n"
11865												  "VERIFICATION"
11866												  "#endif\n"
11867												  "\n"
11868												  "    vs_tcs_result = result;\n"
11869												  "}\n"
11870												  "\n";
11871
11872	const GLchar* coordinates_read  = 0;
11873	const GLchar* coordinates_write = 0;
11874	const GLchar* image_type		= Utils::getImageType(m_test_case);
11875	GLuint		  n_coordinates		= Utils::getNumberOfCoordinates(m_test_case);
11876	const GLchar* shader_template   = 0;
11877	const GLchar* tex_coord_type	= Utils::getTypeName(Utils::INT, 1 /* n_columns */, n_coordinates);
11878
11879	switch (in_stage)
11880	{
11881	case Utils::COMPUTE_SHADER:
11882		shader_template = compute_shader_template;
11883		break;
11884	case Utils::FRAGMENT_SHADER:
11885		shader_template = fragment_shader_template;
11886		break;
11887	case Utils::GEOMETRY_SHADER:
11888		shader_template = geometry_shader_template;
11889		break;
11890	case Utils::TESS_CTRL_SHADER:
11891		shader_template = tess_ctrl_shader_template;
11892		break;
11893	case Utils::TESS_EVAL_SHADER:
11894		shader_template = tess_eval_shader_template;
11895		break;
11896	case Utils::VERTEX_SHADER:
11897		shader_template = vertex_shader_template;
11898		break;
11899	default:
11900		TCU_FAIL("Invalid enum");
11901	}
11902
11903	switch (n_coordinates)
11904	{
11905	case 1:
11906		coordinates_read  = "1";
11907		coordinates_write = "0";
11908		break;
11909	case 2:
11910		coordinates_read  = "1, 0";
11911		coordinates_write = "0, 0";
11912		break;
11913	case 3:
11914		coordinates_read  = "1, 0, 0";
11915		coordinates_write = "0, 0, 0";
11916		break;
11917	case 4:
11918		coordinates_read  = "1, 0, 0, 0";
11919		coordinates_write = "0, 0, 0, 0";
11920		break;
11921	}
11922
11923	out_source.m_parts[0].m_code = shader_template;
11924
11925	size_t position = 0;
11926
11927	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
11928						out_source.m_parts[0].m_code);
11929
11930	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
11931
11932	position -= strlen(verification_snippet);
11933
11934	Utils::replaceToken("COORDINATES", position, coordinates_read, out_source.m_parts[0].m_code);
11935
11936	Utils::replaceToken("COORDINATES", position, coordinates_write, out_source.m_parts[0].m_code);
11937
11938	Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
11939							out_source.m_parts[0].m_code);
11940
11941	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
11942
11943	Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code);
11944
11945	Utils::replaceAllTokens("UNI_TRUNKS", uni_trunks, out_source.m_parts[0].m_code);
11946
11947	Utils::replaceAllTokens("TEX_COORD_TYPE", tex_coord_type, out_source.m_parts[0].m_code);
11948
11949	Utils::replaceAllTokens("TYPE", image_type, out_source.m_parts[0].m_code);
11950}
11951
11952/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
11953 *
11954 * @param program Current program
11955 **/
11956void BindingImagesTest::prepareUniforms(Utils::program& program)
11957{
11958	(void)program;
11959	prepareBuffer(m_goku_buffer, m_goku_data);
11960	prepareBuffer(m_vegeta_buffer, m_vegeta_data);
11961	prepareBuffer(m_trunks_buffer, m_trunks_data);
11962
11963	prepareTexture(m_goku_texture, m_goku_buffer, m_test_case, m_goku_data, 1);
11964	prepareTexture(m_vegeta_texture, m_vegeta_buffer, m_test_case, m_vegeta_data, 2);
11965	prepareTexture(m_trunks_texture, m_trunks_buffer, m_test_case, m_trunks_data, 4);
11966}
11967
11968/** Overwrite of releaseResource method, release extra buffers and textures
11969 *
11970 * @param ignored
11971 **/
11972void BindingImagesTest::releaseResource()
11973{
11974	m_goku_texture.release();
11975	m_vegeta_texture.release();
11976	m_trunks_texture.release();
11977	if (m_test_case != Utils::TEX_BUFFER)
11978	{
11979		m_goku_buffer.release();
11980		m_vegeta_buffer.release();
11981		m_trunks_buffer.release();
11982	}
11983}
11984
11985/** Verify that all images have green texel at [0,0,0,0]
11986 *
11987 * @return true texel is green, false otherwise
11988 **/
11989bool BindingImagesTest::verifyAdditionalResults() const
11990{
11991	if (Utils::TEX_BUFFER != m_test_case)
11992	{
11993		return (verifyTexture(m_goku_texture) && verifyTexture(m_vegeta_texture) && verifyTexture(m_trunks_texture));
11994	}
11995	else
11996	{
11997		return (verifyBuffer(m_goku_buffer) && verifyBuffer(m_vegeta_buffer) && verifyBuffer(m_trunks_buffer));
11998	}
11999}
12000
12001/** Constructor
12002 *
12003 * @param context Test context
12004 **/
12005BindingImageSingleTest::BindingImageSingleTest(deqp::Context& context)
12006	: BindingImageTest(context, "binding_image_single", "Test verifies single binding of image used in multiple stages")
12007	, m_goku_texture(context)
12008{
12009	/* Nothing to be done here */
12010}
12011
12012/** Set up next test case
12013 *
12014 * @param test_case_index Index of next test case
12015 *
12016 * @return false if there is no more test cases, true otherwise
12017 **/
12018bool BindingImageSingleTest::prepareNextTestCase(glw::GLuint test_case_index)
12019{
12020	switch (test_case_index)
12021	{
12022	case (glw::GLuint)-1:
12023	case 0:
12024		m_test_stage = Utils::VERTEX_SHADER;
12025		break;
12026	case 1:
12027		m_test_stage = Utils::TESS_CTRL_SHADER;
12028		break;
12029	case 2:
12030		m_test_stage = Utils::TESS_EVAL_SHADER;
12031		break;
12032	case 3:
12033		m_test_stage = Utils::GEOMETRY_SHADER;
12034		break;
12035	case 4:
12036		m_test_stage = Utils::FRAGMENT_SHADER;
12037		break;
12038	default:
12039		return false;
12040	}
12041
12042	m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested stage: "
12043										<< Utils::getShaderStageName((Utils::SHADER_STAGES)m_test_stage)
12044										<< tcu::TestLog::EndMessage;
12045
12046	return true;
12047}
12048
12049/** Prepare source for given shader stage
12050 *
12051 * @param in_stage           Shader stage, compute shader will use 430
12052 * @param in_use_version_400 Select if 400 or 420 should be used
12053 * @param out_source         Prepared shader source instance
12054 **/
12055void BindingImageSingleTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
12056												 Utils::shaderSource& out_source)
12057{
12058	static const GLchar* uni_goku_with_binding = "layout(binding = 2, rgba8) uniform image2D goku;\n";
12059
12060	static const GLchar* uni_goku_no_binding = "layout(rgba8) uniform image2D goku;\n";
12061
12062	static const GLchar* verification_snippet = "    vec4 goku_color = imageLoad(goku, ivec2(0,1));\n"
12063												"\n"
12064												"    imageStore(goku, ivec2(0,0), vec4(0, 1, 0, 1));\n"
12065												"\n"
12066												"    if (vec4(1, 0, 0, 0) != goku_color)\n"
12067												"    {\n"
12068												"        result = vec4(1, 0, 0, 1);\n"
12069												"    }\n";
12070
12071	static const GLchar* compute_shader_template =
12072		"VERSION\n"
12073		"#extension GL_ARB_shader_image_load_store : enable\n"
12074		"\n"
12075		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
12076		"\n"
12077		"writeonly uniform image2D uni_image;\n"
12078		"\n"
12079		"UNI_GOKU\n"
12080		"\n"
12081		"void main()\n"
12082		"{\n"
12083		"    vec4 result = vec4(0, 1, 0, 1);\n"
12084		"\n"
12085		"VERIFICATION"
12086		"\n"
12087		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
12088		"}\n"
12089		"\n";
12090
12091	static const GLchar* fragment_shader_template = "VERSION\n"
12092													"#extension GL_ARB_shader_image_load_store : enable\n"
12093													"\n"
12094													"in  vec4 gs_fs_result;\n"
12095													"out vec4 fs_out_result;\n"
12096													"\n"
12097													"UNI_GOKU\n"
12098													"\n"
12099													"void main()\n"
12100													"{\n"
12101													"    vec4 result = vec4(0, 1, 0, 1);\n"
12102													"\n"
12103													"VERIFICATION"
12104													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
12105													"    {\n"
12106													"         result = vec4(1, 0, 0, 1);\n"
12107													"    }\n"
12108													"\n"
12109													"    fs_out_result = result;\n"
12110													"}\n"
12111													"\n";
12112
12113	static const GLchar* geometry_shader_template = "VERSION\n"
12114													"#extension GL_ARB_shader_image_load_store : enable\n"
12115													"\n"
12116													"layout(points)                           in;\n"
12117													"layout(triangle_strip, max_vertices = 4) out;\n"
12118													"\n"
12119													"in  vec4 tes_gs_result[];\n"
12120													"out vec4 gs_fs_result;\n"
12121													"\n"
12122													"#if IMAGES\n"
12123													"UNI_GOKU\n"
12124													"#endif\n"
12125													"\n"
12126													"void main()\n"
12127													"{\n"
12128													"    vec4 result = vec4(0, 1, 0, 1);\n"
12129													"\n"
12130													"#if IMAGES\n"
12131													"VERIFICATION else\n"
12132													"#endif\n"
12133													"    if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
12134													"    {\n"
12135													"         result = vec4(1, 0, 0, 1);\n"
12136													"    }\n"
12137													"\n"
12138													"    gs_fs_result = result;\n"
12139													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
12140													"    EmitVertex();\n"
12141													"    gs_fs_result = result;\n"
12142													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
12143													"    EmitVertex();\n"
12144													"    gs_fs_result = result;\n"
12145													"    gl_Position  = vec4(1, -1, 0, 1);\n"
12146													"    EmitVertex();\n"
12147													"    gs_fs_result = result;\n"
12148													"    gl_Position  = vec4(1, 1, 0, 1);\n"
12149													"    EmitVertex();\n"
12150													"}\n"
12151													"\n";
12152
12153	static const GLchar* tess_ctrl_shader_template =
12154		"VERSION\n"
12155		"#extension GL_ARB_shader_image_load_store : enable\n"
12156		"\n"
12157		"layout(vertices = 1) out;\n"
12158		"\n"
12159		"in  vec4 vs_tcs_result[];\n"
12160		"out vec4 tcs_tes_result[];\n"
12161		"\n"
12162		"#if IMAGES\n"
12163		"UNI_GOKU\n"
12164		"#endif\n"
12165		"\n"
12166		"void main()\n"
12167		"{\n"
12168		"    vec4 result = vec4(0, 1, 0, 1);\n"
12169		"\n"
12170		"#if IMAGES\n"
12171		"VERIFICATION else\n"
12172		"#endif\n"
12173		"    if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
12174		"    {\n"
12175		"         result = vec4(1, 0, 0, 1);\n"
12176		"    }\n"
12177		"\n"
12178		"    tcs_tes_result[gl_InvocationID] = result;\n"
12179		"\n"
12180		"    gl_TessLevelOuter[0] = 1.0;\n"
12181		"    gl_TessLevelOuter[1] = 1.0;\n"
12182		"    gl_TessLevelOuter[2] = 1.0;\n"
12183		"    gl_TessLevelOuter[3] = 1.0;\n"
12184		"    gl_TessLevelInner[0] = 1.0;\n"
12185		"    gl_TessLevelInner[1] = 1.0;\n"
12186		"}\n"
12187		"\n";
12188
12189	static const GLchar* tess_eval_shader_template = "VERSION\n"
12190													 "#extension GL_ARB_shader_image_load_store : enable\n"
12191													 "\n"
12192													 "layout(isolines, point_mode) in;\n"
12193													 "\n"
12194													 "in  vec4 tcs_tes_result[];\n"
12195													 "out vec4 tes_gs_result;\n"
12196													 "\n"
12197													 "#if IMAGES\n"
12198													 "UNI_GOKU\n"
12199													 "#endif\n"
12200													 "\n"
12201													 "void main()\n"
12202													 "{\n"
12203													 "    vec4 result = vec4(0, 1, 0, 1);\n"
12204													 "\n"
12205													 "#if IMAGES\n"
12206													 "VERIFICATION else\n"
12207													 "#endif\n"
12208													 "    if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
12209													 "    {\n"
12210													 "         result = vec4(1, 0, 0, 1);\n"
12211													 "    }\n"
12212													 "\n"
12213													 "    tes_gs_result = result;\n"
12214													 "}\n"
12215													 "\n";
12216
12217	static const GLchar* vertex_shader_template = "VERSION\n"
12218												  "#extension GL_ARB_shader_image_load_store : enable\n"
12219												  "\n"
12220												  "out vec4 vs_tcs_result;\n"
12221												  "\n"
12222												  "#if IMAGES\n"
12223												  "UNI_GOKU\n"
12224												  "#endif\n"
12225												  "\n"
12226												  "void main()\n"
12227												  "{\n"
12228												  "    vec4 result = vec4(0, 1, 0, 1);\n"
12229												  "\n"
12230												  "#if IMAGES\n"
12231												  "VERIFICATION"
12232												  "#endif\n"
12233												  "\n"
12234												  "    vs_tcs_result = result;\n"
12235												  "}\n"
12236												  "\n";
12237
12238	const GLchar* shader_template	= 0;
12239	const GLchar* uniform_definition = uni_goku_no_binding;
12240
12241	switch (in_stage)
12242	{
12243	case Utils::COMPUTE_SHADER:
12244		shader_template	= compute_shader_template;
12245		uniform_definition = uni_goku_with_binding;
12246		break;
12247	case Utils::FRAGMENT_SHADER:
12248		shader_template = fragment_shader_template;
12249		/* We can't rely on the binding qualifier being present in m_test_stage
12250		 * if images are unsupported in that stage.
12251		 */
12252		if (maxImageUniforms(m_test_stage) == 0)
12253			uniform_definition = uni_goku_with_binding;
12254		break;
12255	case Utils::GEOMETRY_SHADER:
12256		shader_template = geometry_shader_template;
12257		break;
12258	case Utils::TESS_CTRL_SHADER:
12259		shader_template = tess_ctrl_shader_template;
12260		break;
12261	case Utils::TESS_EVAL_SHADER:
12262		shader_template = tess_eval_shader_template;
12263		break;
12264	case Utils::VERTEX_SHADER:
12265		shader_template = vertex_shader_template;
12266		break;
12267	default:
12268		TCU_FAIL("Invalid enum");
12269	}
12270
12271	if (in_stage == m_test_stage)
12272	{
12273		uniform_definition = uni_goku_with_binding;
12274	}
12275
12276	out_source.m_parts[0].m_code = shader_template;
12277
12278	size_t position = 0;
12279
12280	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
12281						out_source.m_parts[0].m_code);
12282
12283	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
12284
12285	Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
12286							out_source.m_parts[0].m_code);
12287
12288	Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code);
12289}
12290
12291/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
12292 *
12293 * @param program Current program
12294 **/
12295void BindingImageSingleTest::prepareUniforms(Utils::program& program)
12296{
12297	(void)program;
12298	static const GLuint goku_data = 0x000000ff;
12299
12300	prepareTexture(m_goku_texture, Utils::buffer(m_context), Utils::TEX_2D, goku_data, 2 /* unit */);
12301}
12302
12303/** Overwrite of releaseResource method, release extra texture
12304 *
12305 * @param ignored
12306 **/
12307void BindingImageSingleTest::releaseResource()
12308{
12309	m_goku_texture.release();
12310}
12311
12312/** Verify that all images have green texel at [0,0,0,0]
12313 *
12314 * @return true texel is green, false otherwise
12315 **/
12316bool BindingImageSingleTest::verifyAdditionalResults() const
12317{
12318	return verifyTexture(m_goku_texture);
12319}
12320
12321/** Constructor
12322 *
12323 * @param context Test context
12324 **/
12325BindingImageArrayTest::BindingImageArrayTest(deqp::Context& context)
12326	: BindingImageTest(context, "binding_image_array", "Test verifies binding of image array")
12327	, m_goku_00_texture(context)
12328	, m_goku_01_texture(context)
12329	, m_goku_02_texture(context)
12330	, m_goku_03_texture(context)
12331	, m_goku_04_texture(context)
12332	, m_goku_05_texture(context)
12333	, m_goku_06_texture(context)
12334{
12335	/* Nothing to be done here */
12336}
12337
12338/** Prepare source for given shader stage
12339 *
12340 * @param in_stage           Shader stage, compute shader will use 430
12341 * @param in_use_version_400 Select if 400 or 420 should be used
12342 * @param out_source         Prepared shader source instance
12343 **/
12344void BindingImageArrayTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
12345												Utils::shaderSource& out_source)
12346{
12347	static const GLchar* uni_goku = "layout(binding = 1, rgba8) uniform image2D goku[7];\n";
12348
12349	static const GLchar* verification_snippet = "    vec4 color[7];\n"
12350												"\n"
12351												"    for (uint i = 0u; i < 7; ++i)\n"
12352												"    {\n"
12353												"        color[i] = imageLoad(goku[i], ivec2(0,0));\n"
12354												"    }\n"
12355												"\n"
12356												"    if ((vec4(0, 0, 0, 0) != color[0]) ||\n"
12357												"        (vec4(0, 0, 0, 1) != color[1]) ||\n"
12358												"        (vec4(0, 0, 1, 0) != color[2]) ||\n"
12359												"        (vec4(0, 0, 1, 1) != color[3]) ||\n"
12360												"        (vec4(0, 1, 0, 0) != color[4]) ||\n"
12361												"        (vec4(0, 1, 0, 1) != color[5]) ||\n"
12362												"        (vec4(0, 1, 1, 0) != color[6]) )\n"
12363												"    {\n"
12364												"        result = vec4(1, 0, 0, 1);\n"
12365												"    }\n";
12366
12367	static const GLchar* compute_shader_template =
12368		"VERSION\n"
12369		"#extension GL_ARB_shader_image_load_store : enable\n"
12370		"\n"
12371		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
12372		"\n"
12373		"writeonly uniform image2D uni_image;\n"
12374		"\n"
12375		"UNI_GOKU\n"
12376		"\n"
12377		"void main()\n"
12378		"{\n"
12379		"    vec4 result = vec4(0, 1, 0, 1);\n"
12380		"\n"
12381		"VERIFICATION"
12382		"\n"
12383		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
12384		"}\n"
12385		"\n";
12386
12387	static const GLchar* fragment_shader_template = "VERSION\n"
12388													"#extension GL_ARB_shader_image_load_store : enable\n"
12389													"\n"
12390													"in  vec4 gs_fs_result;\n"
12391													"out vec4 fs_out_result;\n"
12392													"\n"
12393													"UNI_GOKU\n"
12394													"\n"
12395													"void main()\n"
12396													"{\n"
12397													"    vec4 result = vec4(0, 1, 0, 1);\n"
12398													"\n"
12399													"VERIFICATION"
12400													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
12401													"    {\n"
12402													"         result = vec4(1, 0, 0, 1);\n"
12403													"    }\n"
12404													"\n"
12405													"    fs_out_result = result;\n"
12406													"}\n"
12407													"\n";
12408
12409	static const GLchar* geometry_shader_template = "VERSION\n"
12410													"#extension GL_ARB_shader_image_load_store : enable\n"
12411													"\n"
12412													"layout(points)                           in;\n"
12413													"layout(triangle_strip, max_vertices = 4) out;\n"
12414													"\n"
12415													"in  vec4 tes_gs_result[];\n"
12416													"out vec4 gs_fs_result;\n"
12417													"\n"
12418													"#if IMAGES\n"
12419													"UNI_GOKU\n"
12420													"#endif\n"
12421													"\n"
12422													"void main()\n"
12423													"{\n"
12424													"    vec4 result = vec4(0, 1, 0, 1);\n"
12425													"\n"
12426													"#if IMAGES\n"
12427													"VERIFICATION else\n"
12428													"#endif\n"
12429													"    if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
12430													"    {\n"
12431													"         result = vec4(1, 0, 0, 1);\n"
12432													"    }\n"
12433													"\n"
12434													"    gs_fs_result = result;\n"
12435													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
12436													"    EmitVertex();\n"
12437													"    gs_fs_result = result;\n"
12438													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
12439													"    EmitVertex();\n"
12440													"    gs_fs_result = result;\n"
12441													"    gl_Position  = vec4(1, -1, 0, 1);\n"
12442													"    EmitVertex();\n"
12443													"    gs_fs_result = result;\n"
12444													"    gl_Position  = vec4(1, 1, 0, 1);\n"
12445													"    EmitVertex();\n"
12446													"}\n"
12447													"\n";
12448
12449	static const GLchar* tess_ctrl_shader_template =
12450		"VERSION\n"
12451		"#extension GL_ARB_shader_image_load_store : enable\n"
12452		"\n"
12453		"layout(vertices = 1) out;\n"
12454		"\n"
12455		"in  vec4 vs_tcs_result[];\n"
12456		"out vec4 tcs_tes_result[];\n"
12457		"\n"
12458		"#if IMAGES\n"
12459		"UNI_GOKU\n"
12460		"#endif\n"
12461		"\n"
12462		"void main()\n"
12463		"{\n"
12464		"    vec4 result = vec4(0, 1, 0, 1);\n"
12465		"\n"
12466		"#if IMAGES\n"
12467		"VERIFICATION else\n"
12468		"#endif\n"
12469		"    if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
12470		"    {\n"
12471		"         result = vec4(1, 0, 0, 1);\n"
12472		"    }\n"
12473		"\n"
12474		"    tcs_tes_result[gl_InvocationID] = result;\n"
12475		"\n"
12476		"    gl_TessLevelOuter[0] = 1.0;\n"
12477		"    gl_TessLevelOuter[1] = 1.0;\n"
12478		"    gl_TessLevelOuter[2] = 1.0;\n"
12479		"    gl_TessLevelOuter[3] = 1.0;\n"
12480		"    gl_TessLevelInner[0] = 1.0;\n"
12481		"    gl_TessLevelInner[1] = 1.0;\n"
12482		"}\n"
12483		"\n";
12484
12485	static const GLchar* tess_eval_shader_template = "VERSION\n"
12486													 "#extension GL_ARB_shader_image_load_store : enable\n"
12487													 "\n"
12488													 "layout(isolines, point_mode) in;\n"
12489													 "\n"
12490													 "in  vec4 tcs_tes_result[];\n"
12491													 "out vec4 tes_gs_result;\n"
12492													 "\n"
12493													 "#if IMAGES\n"
12494													 "UNI_GOKU\n"
12495													 "#endif\n"
12496													 "\n"
12497													 "void main()\n"
12498													 "{\n"
12499													 "    vec4 result = vec4(0, 1, 0, 1);\n"
12500													 "\n"
12501													 "#if IMAGES\n"
12502													 "VERIFICATION else\n"
12503													 "#endif\n"
12504													 "    if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
12505													 "    {\n"
12506													 "         result = vec4(1, 0, 0, 1);\n"
12507													 "    }\n"
12508													 "\n"
12509													 "    tes_gs_result = result;\n"
12510													 "}\n"
12511													 "\n";
12512
12513	static const GLchar* vertex_shader_template = "VERSION\n"
12514												  "#extension GL_ARB_shader_image_load_store : enable\n"
12515												  "\n"
12516												  "out vec4 vs_tcs_result;\n"
12517												  "\n"
12518												  "#if IMAGES\n"
12519												  "UNI_GOKU\n"
12520												  "#endif\n"
12521												  "\n"
12522												  "void main()\n"
12523												  "{\n"
12524												  "    vec4 result = vec4(0, 1, 0, 1);\n"
12525												  "\n"
12526												  "#if IMAGES\n"
12527												  "VERIFICATION"
12528												  "#endif\n"
12529												  "\n"
12530												  "    vs_tcs_result = result;\n"
12531												  "}\n"
12532												  "\n";
12533
12534	const GLchar* shader_template = 0;
12535
12536	switch (in_stage)
12537	{
12538	case Utils::COMPUTE_SHADER:
12539		shader_template = compute_shader_template;
12540		break;
12541	case Utils::FRAGMENT_SHADER:
12542		shader_template = fragment_shader_template;
12543		break;
12544	case Utils::GEOMETRY_SHADER:
12545		shader_template = geometry_shader_template;
12546		break;
12547	case Utils::TESS_CTRL_SHADER:
12548		shader_template = tess_ctrl_shader_template;
12549		break;
12550	case Utils::TESS_EVAL_SHADER:
12551		shader_template = tess_eval_shader_template;
12552		break;
12553	case Utils::VERTEX_SHADER:
12554		shader_template = vertex_shader_template;
12555		break;
12556	default:
12557		TCU_FAIL("Invalid enum");
12558	}
12559
12560	out_source.m_parts[0].m_code = shader_template;
12561
12562	size_t position = 0;
12563
12564	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
12565						out_source.m_parts[0].m_code);
12566
12567	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
12568
12569	Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
12570							out_source.m_parts[0].m_code);
12571
12572	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
12573}
12574
12575/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
12576 *
12577 * @param program Current program
12578 **/
12579void BindingImageArrayTest::prepareUniforms(Utils::program& program)
12580{
12581	static const GLuint goku_data[7] = {
12582		0x00000000, 0xff000000, 0x00ff0000, 0xffff0000, 0x0000ff00, 0xff00ff00, 0x00ffff00,
12583	};
12584
12585	Utils::texture* textures[7] = {
12586		&m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture,
12587		&m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture,
12588	};
12589
12590	for (GLuint i = 0; i < 7; ++i)
12591	{
12592		GLint expected_binding = i + 1;
12593
12594		checkBinding(program, i, expected_binding);
12595
12596		prepareTexture(*textures[i], Utils::buffer(m_context), Utils::TEX_2D, goku_data[i], expected_binding);
12597	}
12598}
12599
12600/** Overwrite of releaseResource method, release extra textures
12601 *
12602 * @param ignored
12603 **/
12604void BindingImageArrayTest::releaseResource()
12605{
12606	Utils::texture* textures[7] = {
12607		&m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture,
12608		&m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture,
12609	};
12610
12611	for (GLuint i = 0; i < 7; ++i)
12612	{
12613		textures[i]->release();
12614	}
12615}
12616
12617/** Verifies that API reports correct uniform binding
12618 *
12619 * @param program          Program
12620 * @param index            Index of array element
12621 * @param expected_binding Expected binding
12622 **/
12623void BindingImageArrayTest::checkBinding(Utils::program& program, GLuint index, GLint expected_binding)
12624{
12625	if (false == Utils::checkUniformArrayBinding(program, "goku", index, expected_binding))
12626	{
12627		TCU_FAIL("Wrong binding reported by API");
12628	}
12629}
12630
12631/** Constructor
12632 *
12633 * @param context Test context
12634 **/
12635BindingImageDefaultTest::BindingImageDefaultTest(deqp::Context& context)
12636	: APITestBase(context, "binding_image_default", "Test verifies default image binding")
12637{
12638	/* Nothing to be done here */
12639}
12640
12641/** Execute API call and verifies results
12642 *
12643 * @return true when results are positive, false otherwise
12644 **/
12645bool BindingImageDefaultTest::checkResults(Utils::program& program)
12646{
12647	return Utils::checkUniformBinding(program, "goku", 0 /* expected_binding */);
12648}
12649
12650/** Prepare source for given shader stage
12651 *
12652 * @param in_stage           Shader stage, compute shader will use 430
12653 * @param in_use_version_400 Select if 400 or 420 should be used
12654 * @param out_source         Prepared shader source instance
12655 **/
12656void BindingImageDefaultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
12657												  Utils::shaderSource& out_source)
12658{
12659	static const GLchar* uni_goku = "layout(rgba8) uniform image2D goku;\n";
12660
12661	static const GLchar* verification_snippet = "    vec4 goku_color = imageLoad(goku, ivec2(0,0));\n"
12662												"\n"
12663												"    if (vec4(1, 0, 0, 0) != goku_color)\n"
12664												"    {\n"
12665												"        result = vec4(1, 0, 0, 1);\n"
12666												"    }\n";
12667
12668	static const GLchar* compute_shader_template =
12669		"VERSION\n"
12670		"#extension GL_ARB_shader_image_load_store : enable\n"
12671		"\n"
12672		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
12673		"\n"
12674		"writeonly uniform image2D uni_image;\n"
12675		"\n"
12676		"UNI_GOKU\n"
12677		"\n"
12678		"void main()\n"
12679		"{\n"
12680		"    vec4 result = vec4(0, 1, 0, 1);\n"
12681		"\n"
12682		"VERIFICATION"
12683		"\n"
12684		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
12685		"}\n"
12686		"\n";
12687
12688	static const GLchar* fragment_shader_template = "VERSION\n"
12689													"#extension GL_ARB_shader_image_load_store : enable\n"
12690													"\n"
12691													"in  vec4 gs_fs_result;\n"
12692													"out vec4 fs_out_result;\n"
12693													"\n"
12694													"UNI_GOKU\n"
12695													"\n"
12696													"void main()\n"
12697													"{\n"
12698													"    vec4 result = vec4(0, 1, 0, 1);\n"
12699													"\n"
12700													"VERIFICATION"
12701													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
12702													"    {\n"
12703													"         result = vec4(1, 0, 0, 1);\n"
12704													"    }\n"
12705													"\n"
12706													"    fs_out_result = result;\n"
12707													"}\n"
12708													"\n";
12709
12710	static const GLchar* geometry_shader_template = "VERSION\n"
12711													"#extension GL_ARB_shader_image_load_store : enable\n"
12712													"\n"
12713													"layout(points)                           in;\n"
12714													"layout(triangle_strip, max_vertices = 4) out;\n"
12715													"\n"
12716													"in  vec4 tes_gs_result[];\n"
12717													"out vec4 gs_fs_result;\n"
12718													"\n"
12719													"#if IMAGES\n"
12720													"UNI_GOKU\n"
12721													"#endif\n"
12722													"\n"
12723													"void main()\n"
12724													"{\n"
12725													"    vec4 result = vec4(0, 1, 0, 1);\n"
12726													"\n"
12727													"#if IMAGES\n"
12728													"VERIFICATION else\n"
12729													"#endif\n"
12730													"    if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
12731													"    {\n"
12732													"         result = vec4(1, 0, 0, 1);\n"
12733													"    }\n"
12734													"\n"
12735													"    gs_fs_result = result;\n"
12736													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
12737													"    EmitVertex();\n"
12738													"    gs_fs_result = result;\n"
12739													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
12740													"    EmitVertex();\n"
12741													"    gs_fs_result = result;\n"
12742													"    gl_Position  = vec4(1, -1, 0, 1);\n"
12743													"    EmitVertex();\n"
12744													"    gs_fs_result = result;\n"
12745													"    gl_Position  = vec4(1, 1, 0, 1);\n"
12746													"    EmitVertex();\n"
12747													"}\n"
12748													"\n";
12749
12750	static const GLchar* tess_ctrl_shader_template =
12751		"VERSION\n"
12752		"#extension GL_ARB_shader_image_load_store : enable\n"
12753		"\n"
12754		"layout(vertices = 1) out;\n"
12755		"\n"
12756		"in  vec4 vs_tcs_result[];\n"
12757		"out vec4 tcs_tes_result[];\n"
12758		"\n"
12759		"#if IMAGES\n"
12760		"UNI_GOKU\n"
12761		"#endif\n"
12762		"\n"
12763		"void main()\n"
12764		"{\n"
12765		"    vec4 result = vec4(0, 1, 0, 1);\n"
12766		"\n"
12767		"#if IMAGES\n"
12768		"VERIFICATION else\n"
12769		"#endif\n"
12770		"    if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
12771		"    {\n"
12772		"         result = vec4(1, 0, 0, 1);\n"
12773		"    }\n"
12774		"\n"
12775		"    tcs_tes_result[gl_InvocationID] = result;\n"
12776		"\n"
12777		"    gl_TessLevelOuter[0] = 1.0;\n"
12778		"    gl_TessLevelOuter[1] = 1.0;\n"
12779		"    gl_TessLevelOuter[2] = 1.0;\n"
12780		"    gl_TessLevelOuter[3] = 1.0;\n"
12781		"    gl_TessLevelInner[0] = 1.0;\n"
12782		"    gl_TessLevelInner[1] = 1.0;\n"
12783		"}\n"
12784		"\n";
12785
12786	static const GLchar* tess_eval_shader_template = "VERSION\n"
12787													 "#extension GL_ARB_shader_image_load_store : enable\n"
12788													 "\n"
12789													 "layout(isolines, point_mode) in;\n"
12790													 "\n"
12791													 "in  vec4 tcs_tes_result[];\n"
12792													 "out vec4 tes_gs_result;\n"
12793													 "\n"
12794													 "#if IMAGES\n"
12795													 "UNI_GOKU\n"
12796													 "#endif\n"
12797													 "\n"
12798													 "void main()\n"
12799													 "{\n"
12800													 "    vec4 result = vec4(0, 1, 0, 1);\n"
12801													 "\n"
12802													 "#if IMAGES\n"
12803													 "VERIFICATION else\n"
12804													 "#endif\n"
12805													 "    if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
12806													 "    {\n"
12807													 "         result = vec4(1, 0, 0, 1);\n"
12808													 "    }\n"
12809													 "\n"
12810													 "    tes_gs_result = result;\n"
12811													 "}\n"
12812													 "\n";
12813
12814	static const GLchar* vertex_shader_template = "VERSION\n"
12815												  "#extension GL_ARB_shader_image_load_store : enable\n"
12816												  "\n"
12817												  "out vec4 vs_tcs_result;\n"
12818												  "\n"
12819												  "#if IMAGES\n"
12820												  "UNI_GOKU\n"
12821												  "#endif\n"
12822												  "\n"
12823												  "void main()\n"
12824												  "{\n"
12825												  "    vec4 result = vec4(0, 1, 0, 1);\n"
12826												  "\n"
12827												  "#if IMAGES\n"
12828												  "VERIFICATION"
12829												  "#endif\n"
12830												  "\n"
12831												  "    vs_tcs_result = result;\n"
12832												  "}\n"
12833												  "\n";
12834
12835	const GLchar* shader_template = 0;
12836
12837	switch (in_stage)
12838	{
12839	case Utils::COMPUTE_SHADER:
12840		shader_template = compute_shader_template;
12841		break;
12842	case Utils::FRAGMENT_SHADER:
12843		shader_template = fragment_shader_template;
12844		break;
12845	case Utils::GEOMETRY_SHADER:
12846		shader_template = geometry_shader_template;
12847		break;
12848	case Utils::TESS_CTRL_SHADER:
12849		shader_template = tess_ctrl_shader_template;
12850		break;
12851	case Utils::TESS_EVAL_SHADER:
12852		shader_template = tess_eval_shader_template;
12853		break;
12854	case Utils::VERTEX_SHADER:
12855		shader_template = vertex_shader_template;
12856		break;
12857	default:
12858		TCU_FAIL("Invalid enum");
12859	}
12860
12861	out_source.m_parts[0].m_code = shader_template;
12862
12863	size_t position = 0;
12864
12865	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
12866						out_source.m_parts[0].m_code);
12867
12868	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
12869
12870	Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
12871							out_source.m_parts[0].m_code);
12872
12873	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
12874}
12875
12876/** Constructor
12877 *
12878 * @param context Test context
12879 **/
12880BindingImageAPIOverrideTest::BindingImageAPIOverrideTest(deqp::Context& context)
12881	: BindingImageTest(context, "binding_image_api_override", "Verifies that API can override image binding")
12882	, m_goku_texture(context)
12883{
12884	/* Nothing to be done here */
12885}
12886
12887/** Prepare source for given shader stage
12888 *
12889 * @param in_stage           Shader stage, compute shader will use 430
12890 * @param in_use_version_400 Select if 400 or 420 should be used
12891 * @param out_source         Prepared shader source instance
12892 **/
12893void BindingImageAPIOverrideTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
12894													  Utils::shaderSource& out_source)
12895{
12896	static const GLchar* uni_goku = "layout(binding = 3, rgba8) uniform image2D goku;\n";
12897
12898	static const GLchar* verification_snippet = "    vec4 goku_color = imageLoad(goku, ivec2(0,0));\n"
12899												"\n"
12900												"    if (vec4(1, 0, 0, 0) != goku_color)\n"
12901												"    {\n"
12902												"        result = vec4(1, 0, 0, 1);\n"
12903												"    }\n";
12904
12905	static const GLchar* compute_shader_template =
12906		"VERSION\n"
12907		"#extension GL_ARB_shader_image_load_store : enable\n"
12908		"\n"
12909		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
12910		"\n"
12911		"writeonly uniform image2D uni_image;\n"
12912		"\n"
12913		"UNI_GOKU\n"
12914		"\n"
12915		"void main()\n"
12916		"{\n"
12917		"    vec4 result = vec4(0, 1, 0, 1);\n"
12918		"\n"
12919		"VERIFICATION"
12920		"\n"
12921		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
12922		"}\n"
12923		"\n";
12924
12925	static const GLchar* fragment_shader_template = "VERSION\n"
12926													"#extension GL_ARB_shader_image_load_store : enable\n"
12927													"\n"
12928													"in  vec4 gs_fs_result;\n"
12929													"out vec4 fs_out_result;\n"
12930													"\n"
12931													"UNI_GOKU\n"
12932													"\n"
12933													"void main()\n"
12934													"{\n"
12935													"    vec4 result = vec4(0, 1, 0, 1);\n"
12936													"\n"
12937													"VERIFICATION"
12938													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
12939													"    {\n"
12940													"         result = vec4(1, 0, 0, 1);\n"
12941													"    }\n"
12942													"\n"
12943													"    fs_out_result = result;\n"
12944													"}\n"
12945													"\n";
12946
12947	static const GLchar* geometry_shader_template = "VERSION\n"
12948													"#extension GL_ARB_shader_image_load_store : enable\n"
12949													"\n"
12950													"layout(points)                           in;\n"
12951													"layout(triangle_strip, max_vertices = 4) out;\n"
12952													"\n"
12953													"in  vec4 tes_gs_result[];\n"
12954													"out vec4 gs_fs_result;\n"
12955													"\n"
12956													"#if IMAGES\n"
12957													"UNI_GOKU\n"
12958													"#endif\n"
12959													"\n"
12960													"void main()\n"
12961													"{\n"
12962													"    vec4 result = vec4(0, 1, 0, 1);\n"
12963													"\n"
12964													"#if IMAGES\n"
12965													"VERIFICATION else\n"
12966													"#endif\n"
12967													"    if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
12968													"    {\n"
12969													"         result = vec4(1, 0, 0, 1);\n"
12970													"    }\n"
12971													"\n"
12972													"    gs_fs_result = result;\n"
12973													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
12974													"    EmitVertex();\n"
12975													"    gs_fs_result = result;\n"
12976													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
12977													"    EmitVertex();\n"
12978													"    gs_fs_result = result;\n"
12979													"    gl_Position  = vec4(1, -1, 0, 1);\n"
12980													"    EmitVertex();\n"
12981													"    gs_fs_result = result;\n"
12982													"    gl_Position  = vec4(1, 1, 0, 1);\n"
12983													"    EmitVertex();\n"
12984													"}\n"
12985													"\n";
12986
12987	static const GLchar* tess_ctrl_shader_template =
12988		"VERSION\n"
12989		"#extension GL_ARB_shader_image_load_store : enable\n"
12990		"\n"
12991		"layout(vertices = 1) out;\n"
12992		"\n"
12993		"in  vec4 vs_tcs_result[];\n"
12994		"out vec4 tcs_tes_result[];\n"
12995		"\n"
12996		"#if IMAGES\n"
12997		"UNI_GOKU\n"
12998		"#endif\n"
12999		"\n"
13000		"void main()\n"
13001		"{\n"
13002		"    vec4 result = vec4(0, 1, 0, 1);\n"
13003		"\n"
13004		"#if IMAGES\n"
13005		"VERIFICATION else\n"
13006		"#endif\n"
13007		"    if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
13008		"    {\n"
13009		"         result = vec4(1, 0, 0, 1);\n"
13010		"    }\n"
13011		"\n"
13012		"    tcs_tes_result[gl_InvocationID] = result;\n"
13013		"\n"
13014		"    gl_TessLevelOuter[0] = 1.0;\n"
13015		"    gl_TessLevelOuter[1] = 1.0;\n"
13016		"    gl_TessLevelOuter[2] = 1.0;\n"
13017		"    gl_TessLevelOuter[3] = 1.0;\n"
13018		"    gl_TessLevelInner[0] = 1.0;\n"
13019		"    gl_TessLevelInner[1] = 1.0;\n"
13020		"}\n"
13021		"\n";
13022
13023	static const GLchar* tess_eval_shader_template = "VERSION\n"
13024													 "#extension GL_ARB_shader_image_load_store : enable\n"
13025													 "\n"
13026													 "layout(isolines, point_mode) in;\n"
13027													 "\n"
13028													 "in  vec4 tcs_tes_result[];\n"
13029													 "out vec4 tes_gs_result;\n"
13030													 "\n"
13031													 "#if IMAGES\n"
13032													 "UNI_GOKU\n"
13033													 "#endif\n"
13034													 "\n"
13035													 "void main()\n"
13036													 "{\n"
13037													 "    vec4 result = vec4(0, 1, 0, 1);\n"
13038													 "\n"
13039													 "#if IMAGES\n"
13040													 "VERIFICATION else\n"
13041													 "#endif\n"
13042													 "    if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
13043													 "    {\n"
13044													 "         result = vec4(1, 0, 0, 1);\n"
13045													 "    }\n"
13046													 "\n"
13047													 "    tes_gs_result = result;\n"
13048													 "}\n"
13049													 "\n";
13050
13051	static const GLchar* vertex_shader_template = "VERSION\n"
13052												  "#extension GL_ARB_shader_image_load_store : enable\n"
13053												  "\n"
13054												  "out vec4 vs_tcs_result;\n"
13055												  "\n"
13056												  "#if IMAGES\n"
13057												  "UNI_GOKU\n"
13058												  "#endif\n"
13059												  "\n"
13060												  "void main()\n"
13061												  "{\n"
13062												  "    vec4 result = vec4(0, 1, 0, 1);\n"
13063												  "\n"
13064												  "#if IMAGES\n"
13065												  "VERIFICATION"
13066												  "#endif\n"
13067												  "\n"
13068												  "    vs_tcs_result = result;\n"
13069												  "}\n"
13070												  "\n";
13071
13072	const GLchar* shader_template = 0;
13073
13074	switch (in_stage)
13075	{
13076	case Utils::COMPUTE_SHADER:
13077		shader_template = compute_shader_template;
13078		break;
13079	case Utils::FRAGMENT_SHADER:
13080		shader_template = fragment_shader_template;
13081		break;
13082	case Utils::GEOMETRY_SHADER:
13083		shader_template = geometry_shader_template;
13084		break;
13085	case Utils::TESS_CTRL_SHADER:
13086		shader_template = tess_ctrl_shader_template;
13087		break;
13088	case Utils::TESS_EVAL_SHADER:
13089		shader_template = tess_eval_shader_template;
13090		break;
13091	case Utils::VERTEX_SHADER:
13092		shader_template = vertex_shader_template;
13093		break;
13094	default:
13095		TCU_FAIL("Invalid enum");
13096	}
13097
13098	out_source.m_parts[0].m_code = shader_template;
13099
13100	size_t position = 0;
13101
13102	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
13103						out_source.m_parts[0].m_code);
13104
13105	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
13106
13107	Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
13108							out_source.m_parts[0].m_code);
13109
13110	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
13111}
13112
13113/** Overwritte of prepareUniforms method, set up values for unit_left and unit_right
13114 *
13115 * @param program Current program
13116 **/
13117void BindingImageAPIOverrideTest::prepareUniforms(Utils::program& program)
13118{
13119	static const GLuint goku_data   = 0x000000ff;
13120	static const GLint  new_binding = 7;
13121
13122	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
13123
13124	const GLint uniform_location = program.getUniformLocation("goku");
13125	if (-1 == uniform_location)
13126	{
13127		TCU_FAIL("Uniform is inactive");
13128	}
13129
13130	gl.uniform1i(uniform_location, new_binding);
13131
13132	GLint binding = -1;
13133
13134	gl.getUniformiv(program.m_program_object_id, uniform_location, &binding);
13135	GLU_EXPECT_NO_ERROR(gl.getError(), "getUniformiv");
13136
13137	if (new_binding != binding)
13138	{
13139		TCU_FAIL("Wrong binding value");
13140		return;
13141	}
13142
13143	prepareTexture(m_goku_texture, Utils::buffer(m_context), Utils::TEX_2D, goku_data, new_binding);
13144}
13145
13146/** Overwrite of releaseResource method, release extra texture
13147 *
13148 * @param ignored
13149 **/
13150void BindingImageAPIOverrideTest::releaseResource()
13151{
13152	m_goku_texture.release();
13153}
13154
13155/** Constructor
13156 *
13157 * @param context Test context
13158 **/
13159BindingImageInvalidTest::BindingImageInvalidTest(deqp::Context& context)
13160	: NegativeTestBase(context, "binding_image_invalid", "Test verifies invalid binding values")
13161{
13162	/* Nothing to be done here */
13163}
13164
13165/** Set up next test case
13166 *
13167 * @param test_case_index Index of next test case
13168 *
13169 * @return false if there is no more test cases, true otherwise
13170 **/
13171bool BindingImageInvalidTest::prepareNextTestCase(glw::GLuint test_case_index)
13172{
13173	switch (test_case_index)
13174	{
13175	case (glw::GLuint)-1:
13176		m_case = TEST_CASES_MAX;
13177		break;
13178	case NEGATIVE_VALUE:
13179	case VARIABLE_NAME:
13180	case STD140:
13181	case MISSING:
13182		m_case = (TESTCASES)test_case_index;
13183		break;
13184	default:
13185		return false;
13186	}
13187
13188	return true;
13189}
13190
13191/** Prepare source for given shader stage
13192 *
13193 * @param in_stage           Shader stage, compute shader will use 430
13194 * @param in_use_version_400 Select if 400 or 420 should be used
13195 * @param out_source         Prepared shader source instance
13196 **/
13197void BindingImageInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
13198												  Utils::shaderSource& out_source)
13199{
13200	static const GLchar* uni_goku = "layout(binding BINDING, rgba8) uniform image2D goku;\n";
13201
13202	static const GLchar* verification_snippet = "    vec4 goku_color = imageLoad(goku, ivec2(0,0));\n"
13203												"\n"
13204												"    if (vec4(1, 0, 0, 0) != goku_color)\n"
13205												"    {\n"
13206												"        result = vec4(1, 0, 0, 1);\n"
13207												"    }\n";
13208
13209	static const GLchar* compute_shader_template =
13210		"VERSION\n"
13211		"#extension GL_ARB_shader_image_load_store : enable\n"
13212		"\n"
13213		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
13214		"\n"
13215		"writeonly uniform image2D uni_image;\n"
13216		"\n"
13217		"UNI_GOKU\n"
13218		"\n"
13219		"void main()\n"
13220		"{\n"
13221		"    vec4 result = vec4(0, 1, 0, 1);\n"
13222		"\n"
13223		"VERIFICATION"
13224		"\n"
13225		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
13226		"}\n"
13227		"\n";
13228
13229	static const GLchar* fragment_shader_template = "VERSION\n"
13230													"#extension GL_ARB_shader_image_load_store : enable\n"
13231													"\n"
13232													"in  vec4 gs_fs_result;\n"
13233													"out vec4 fs_out_result;\n"
13234													"\n"
13235													"UNI_GOKU\n"
13236													"\n"
13237													"void main()\n"
13238													"{\n"
13239													"    vec4 result = vec4(0, 1, 0, 1);\n"
13240													"\n"
13241													"VERIFICATION"
13242													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
13243													"    {\n"
13244													"         result = vec4(1, 0, 0, 1);\n"
13245													"    }\n"
13246													"\n"
13247													"    fs_out_result = result;\n"
13248													"}\n"
13249													"\n";
13250
13251	static const GLchar* geometry_shader_template = "VERSION\n"
13252													"#extension GL_ARB_shader_image_load_store : enable\n"
13253													"\n"
13254													"layout(points)                           in;\n"
13255													"layout(triangle_strip, max_vertices = 4) out;\n"
13256													"\n"
13257													"in  vec4 tes_gs_result[];\n"
13258													"out vec4 gs_fs_result;\n"
13259													"\n"
13260													"UNI_GOKU\n"
13261													"\n"
13262													"void main()\n"
13263													"{\n"
13264													"    vec4 result = vec4(0, 1, 0, 1);\n"
13265													"\n"
13266													"VERIFICATION"
13267													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
13268													"    {\n"
13269													"         result = vec4(1, 0, 0, 1);\n"
13270													"    }\n"
13271													"\n"
13272													"    gs_fs_result = result;\n"
13273													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
13274													"    EmitVertex();\n"
13275													"    gs_fs_result = result;\n"
13276													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
13277													"    EmitVertex();\n"
13278													"    gs_fs_result = result;\n"
13279													"    gl_Position  = vec4(1, -1, 0, 1);\n"
13280													"    EmitVertex();\n"
13281													"    gs_fs_result = result;\n"
13282													"    gl_Position  = vec4(1, 1, 0, 1);\n"
13283													"    EmitVertex();\n"
13284													"}\n"
13285													"\n";
13286
13287	static const GLchar* tess_ctrl_shader_template =
13288		"VERSION\n"
13289		"#extension GL_ARB_shader_image_load_store : enable\n"
13290		"\n"
13291		"layout(vertices = 1) out;\n"
13292		"\n"
13293		"in  vec4 vs_tcs_result[];\n"
13294		"out vec4 tcs_tes_result[];\n"
13295		"\n"
13296		"UNI_GOKU\n"
13297		"\n"
13298		"void main()\n"
13299		"{\n"
13300		"    vec4 result = vec4(0, 1, 0, 1);\n"
13301		"\n"
13302		"VERIFICATION"
13303		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
13304		"    {\n"
13305		"         result = vec4(1, 0, 0, 1);\n"
13306		"    }\n"
13307		"\n"
13308		"    tcs_tes_result[gl_InvocationID] = result;\n"
13309		"\n"
13310		"    gl_TessLevelOuter[0] = 1.0;\n"
13311		"    gl_TessLevelOuter[1] = 1.0;\n"
13312		"    gl_TessLevelOuter[2] = 1.0;\n"
13313		"    gl_TessLevelOuter[3] = 1.0;\n"
13314		"    gl_TessLevelInner[0] = 1.0;\n"
13315		"    gl_TessLevelInner[1] = 1.0;\n"
13316		"}\n"
13317		"\n";
13318
13319	static const GLchar* tess_eval_shader_template = "VERSION\n"
13320													 "#extension GL_ARB_shader_image_load_store : enable\n"
13321													 "\n"
13322													 "layout(isolines, point_mode) in;\n"
13323													 "\n"
13324													 "in  vec4 tcs_tes_result[];\n"
13325													 "out vec4 tes_gs_result;\n"
13326													 "\n"
13327													 "UNI_GOKU\n"
13328													 "\n"
13329													 "void main()\n"
13330													 "{\n"
13331													 "    vec4 result = vec4(0, 1, 0, 1);\n"
13332													 "\n"
13333													 "VERIFICATION"
13334													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
13335													 "    {\n"
13336													 "         result = vec4(1, 0, 0, 1);\n"
13337													 "    }\n"
13338													 "\n"
13339													 "    tes_gs_result = result;\n"
13340													 "}\n"
13341													 "\n";
13342
13343	static const GLchar* vertex_shader_template = "VERSION\n"
13344												  "#extension GL_ARB_shader_image_load_store : enable\n"
13345												  "\n"
13346												  "out vec4 vs_tcs_result;\n"
13347												  "\n"
13348												  "UNI_GOKU\n"
13349												  "\n"
13350												  "void main()\n"
13351												  "{\n"
13352												  "    vec4 result = vec4(0, 1, 0, 1);\n"
13353												  "\n"
13354												  "VERIFICATION"
13355												  "\n"
13356												  "    vs_tcs_result = result;\n"
13357												  "}\n"
13358												  "\n";
13359
13360	const GLchar* shader_template = 0;
13361
13362	switch (in_stage)
13363	{
13364	case Utils::COMPUTE_SHADER:
13365		shader_template = compute_shader_template;
13366		break;
13367	case Utils::FRAGMENT_SHADER:
13368		shader_template = fragment_shader_template;
13369		break;
13370	case Utils::GEOMETRY_SHADER:
13371		shader_template = geometry_shader_template;
13372		break;
13373	case Utils::TESS_CTRL_SHADER:
13374		shader_template = tess_ctrl_shader_template;
13375		break;
13376	case Utils::TESS_EVAL_SHADER:
13377		shader_template = tess_eval_shader_template;
13378		break;
13379	case Utils::VERTEX_SHADER:
13380		shader_template = vertex_shader_template;
13381		break;
13382	default:
13383		TCU_FAIL("Invalid enum");
13384	}
13385
13386	out_source.m_parts[0].m_code = shader_template;
13387
13388	size_t position = 0;
13389
13390	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
13391						out_source.m_parts[0].m_code);
13392
13393	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
13394
13395	Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
13396
13397	Utils::replaceAllTokens("BINDING", getCaseString(m_case), out_source.m_parts[0].m_code);
13398}
13399
13400const GLchar* BindingImageInvalidTest::getCaseString(TESTCASES test_case)
13401{
13402	(void)test_case;
13403	const GLchar* binding = 0;
13404
13405	switch (m_case)
13406	{
13407	case NEGATIVE_VALUE:
13408		binding = "= -1";
13409		break;
13410	case VARIABLE_NAME:
13411		binding = "= goku";
13412		break;
13413	case STD140:
13414		binding = "= std140";
13415		break;
13416	case MISSING:
13417		binding = "";
13418		break;
13419	case TEST_CASES_MAX:
13420		binding = "= 0";
13421		break;
13422	default:
13423		TCU_FAIL("Invalid enum");
13424	}
13425
13426	return binding;
13427}
13428
13429/* Constants used by InitializerListTest */
13430const GLfloat InitializerListTest::m_value = 0.0625f;
13431
13432/** Constructor
13433 *
13434 * @param context Test context
13435 **/
13436InitializerListTest::InitializerListTest(deqp::Context& context)
13437	: GLSLTestBase(context, "initializer_list", "Test verifies initializer lists")
13438	, m_current_test_case_index(0)
13439{
13440	/* Nothing to be done here */
13441}
13442
13443/** Set up next test case
13444 *
13445 * @param test_case_index Index of next test case
13446 *
13447 * @return false if there is no more test cases, true otherwise
13448 **/
13449bool InitializerListTest::prepareNextTestCase(glw::GLuint test_case_index)
13450{
13451	m_current_test_case_index = test_case_index;
13452
13453	if ((glw::GLuint)-1 == test_case_index)
13454	{
13455		m_current_test_case_index = 0;
13456		return true;
13457	}
13458	else if (m_test_cases.size() <= test_case_index)
13459	{
13460		return false;
13461	}
13462
13463	logTestCaseName();
13464
13465	return true;
13466}
13467
13468/** Overwritte of prepareUniforms method
13469 *
13470 * @param program Current program
13471 **/
13472void InitializerListTest::prepareUniforms(Utils::program& program)
13473{
13474	static const GLfloat float_data[16] = { m_value, m_value, m_value, m_value, m_value, m_value, m_value, m_value,
13475											m_value, m_value, m_value, m_value, m_value, m_value, m_value, m_value };
13476
13477	program.uniform("uni_matrix", Utils::FLOAT, 4, 4, float_data);
13478}
13479
13480/** Prepare source for given shader stage
13481 *
13482 * @param in_stage           Shader stage, compute shader will use 430
13483 * @param in_use_version_400 Select if 400 or 420 should be used
13484 * @param out_source         Prepared shader source instance
13485 **/
13486void InitializerListTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
13487											  Utils::shaderSource& out_source)
13488{
13489	static const GLchar* verification_snippet = "    TYPE_NAME variableARRAY_DEFINITION = INITIALIZATION;\n"
13490												"\n"
13491												"    float sum = SUM;\n"
13492												"\n"
13493												"    if (EXPECTED_VALUE != sum)\n"
13494												"    {\n"
13495												"        result = vec4(1, 0, 0, 1);\n"
13496												"    }\n";
13497
13498	static const GLchar* compute_shader_template =
13499		"VERSION\n"
13500		"\n"
13501		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
13502		"\n"
13503		"writeonly uniform image2D uni_image;\n"
13504		"          uniform mat4    uni_matrix;\n"
13505		"\n"
13506		"TYPE_DEFINITION\n"
13507		"\n"
13508		"void main()\n"
13509		"{\n"
13510		"    vec4 result = vec4(0, 1, 0, 1);\n"
13511		"\n"
13512		"VERIFICATION"
13513		"\n"
13514		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
13515		"}\n"
13516		"\n";
13517
13518	static const GLchar* fragment_shader_template = "VERSION\n"
13519													"\n"
13520													"in  vec4 gs_fs_result;\n"
13521													"out vec4 fs_out_result;\n"
13522													"\n"
13523													"uniform mat4 uni_matrix;\n"
13524													"\n"
13525													"TYPE_DEFINITION\n"
13526													"\n"
13527													"void main()\n"
13528													"{\n"
13529													"    vec4 result = vec4(0, 1, 0, 1);\n"
13530													"\n"
13531													"VERIFICATION"
13532													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
13533													"    {\n"
13534													"         result = vec4(1, 0, 0, 1);\n"
13535													"    }\n"
13536													"\n"
13537													"    fs_out_result = result;\n"
13538													"}\n"
13539													"\n";
13540
13541	static const GLchar* geometry_shader_template = "VERSION\n"
13542													"\n"
13543													"layout(points)                           in;\n"
13544													"layout(triangle_strip, max_vertices = 4) out;\n"
13545													"\n"
13546													"in  vec4 tes_gs_result[];\n"
13547													"out vec4 gs_fs_result;\n"
13548													"\n"
13549													"uniform mat4 uni_matrix;\n"
13550													"\n"
13551													"TYPE_DEFINITION\n"
13552													"\n"
13553													"void main()\n"
13554													"{\n"
13555													"    vec4 result = vec4(0, 1, 0, 1);\n"
13556													"\n"
13557													"VERIFICATION"
13558													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
13559													"    {\n"
13560													"         result = vec4(1, 0, 0, 1);\n"
13561													"    }\n"
13562													"\n"
13563													"    gs_fs_result = result;\n"
13564													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
13565													"    EmitVertex();\n"
13566													"    gs_fs_result = result;\n"
13567													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
13568													"    EmitVertex();\n"
13569													"    gs_fs_result = result;\n"
13570													"    gl_Position  = vec4(1, -1, 0, 1);\n"
13571													"    EmitVertex();\n"
13572													"    gs_fs_result = result;\n"
13573													"    gl_Position  = vec4(1, 1, 0, 1);\n"
13574													"    EmitVertex();\n"
13575													"}\n"
13576													"\n";
13577
13578	static const GLchar* tess_ctrl_shader_template =
13579		"VERSION\n"
13580		"\n"
13581		"layout(vertices = 1) out;\n"
13582		"\n"
13583		"in  vec4 vs_tcs_result[];\n"
13584		"out vec4 tcs_tes_result[];\n"
13585		"\n"
13586		"uniform mat4 uni_matrix;\n"
13587		"\n"
13588		"TYPE_DEFINITION\n"
13589		"\n"
13590		"void main()\n"
13591		"{\n"
13592		"    vec4 result = vec4(0, 1, 0, 1);\n"
13593		"\n"
13594		"VERIFICATION"
13595		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
13596		"    {\n"
13597		"         result = vec4(1, 0, 0, 1);\n"
13598		"    }\n"
13599		"\n"
13600		"    tcs_tes_result[gl_InvocationID] = result;\n"
13601		"\n"
13602		"    gl_TessLevelOuter[0] = 1.0;\n"
13603		"    gl_TessLevelOuter[1] = 1.0;\n"
13604		"    gl_TessLevelOuter[2] = 1.0;\n"
13605		"    gl_TessLevelOuter[3] = 1.0;\n"
13606		"    gl_TessLevelInner[0] = 1.0;\n"
13607		"    gl_TessLevelInner[1] = 1.0;\n"
13608		"}\n"
13609		"\n";
13610
13611	static const GLchar* tess_eval_shader_template = "VERSION\n"
13612													 "\n"
13613													 "layout(isolines, point_mode) in;\n"
13614													 "\n"
13615													 "in  vec4 tcs_tes_result[];\n"
13616													 "out vec4 tes_gs_result;\n"
13617													 "\n"
13618													 "uniform mat4 uni_matrix;\n"
13619													 "\n"
13620													 "TYPE_DEFINITION\n"
13621													 "\n"
13622													 "void main()\n"
13623													 "{\n"
13624													 "    vec4 result = vec4(0, 1, 0, 1);\n"
13625													 "\n"
13626													 "VERIFICATION"
13627													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
13628													 "    {\n"
13629													 "         result = vec4(1, 0, 0, 1);\n"
13630													 "    }\n"
13631													 "\n"
13632													 "    tes_gs_result = result;\n"
13633													 "}\n"
13634													 "\n";
13635
13636	static const GLchar* vertex_shader_template = "VERSION\n"
13637												  "\n"
13638												  "out vec4 vs_tcs_result;\n"
13639												  "\n"
13640												  "uniform mat4 uni_matrix;\n"
13641												  "\n"
13642												  "TYPE_DEFINITION\n"
13643												  "\n"
13644												  "void main()\n"
13645												  "{\n"
13646												  "    vec4 result = vec4(0, 1, 0, 1);\n"
13647												  "\n"
13648												  "VERIFICATION"
13649												  "\n"
13650												  "    vs_tcs_result = result;\n"
13651												  "}\n"
13652												  "\n";
13653
13654	const std::string& array_definition = getArrayDefinition();
13655	const std::string& expected_value   = getExpectedValue();
13656	const std::string& initialization   = getInitialization();
13657	const GLchar*	  shader_template  = 0;
13658	const std::string& sum				= getSum();
13659	const std::string& type_definition  = getTypeDefinition();
13660	const std::string& type_name		= getTypeName();
13661
13662	switch (in_stage)
13663	{
13664	case Utils::COMPUTE_SHADER:
13665		shader_template = compute_shader_template;
13666		break;
13667	case Utils::FRAGMENT_SHADER:
13668		shader_template = fragment_shader_template;
13669		break;
13670	case Utils::GEOMETRY_SHADER:
13671		shader_template = geometry_shader_template;
13672		break;
13673	case Utils::TESS_CTRL_SHADER:
13674		shader_template = tess_ctrl_shader_template;
13675		break;
13676	case Utils::TESS_EVAL_SHADER:
13677		shader_template = tess_eval_shader_template;
13678		break;
13679	case Utils::VERTEX_SHADER:
13680		shader_template = vertex_shader_template;
13681		break;
13682	default:
13683		TCU_FAIL("Invalid enum");
13684	}
13685
13686	out_source.m_parts[0].m_code = shader_template;
13687
13688	size_t position = 0;
13689	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
13690						out_source.m_parts[0].m_code);
13691
13692	Utils::replaceToken("TYPE_DEFINITION", position, type_definition.c_str(), out_source.m_parts[0].m_code);
13693
13694	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
13695
13696	position -= strlen(verification_snippet);
13697
13698	Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code);
13699
13700	Utils::replaceToken("ARRAY_DEFINITION", position, array_definition.c_str(), out_source.m_parts[0].m_code);
13701
13702	Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code);
13703
13704	Utils::replaceToken("SUM", position, sum.c_str(), out_source.m_parts[0].m_code);
13705
13706	Utils::replaceToken("EXPECTED_VALUE", position, expected_value.c_str(), out_source.m_parts[0].m_code);
13707}
13708
13709/** Prepare test cases
13710 *
13711 * @return true
13712 **/
13713bool InitializerListTest::testInit()
13714{
13715	for (GLuint i = 0; i < TESTED_INITIALIZERS_MAX; ++i)
13716	{
13717		const TESTED_INITIALIZERS l_init = (TESTED_INITIALIZERS)i;
13718
13719		testCase test_case = { l_init, 1, 1 };
13720
13721		switch (l_init)
13722		{
13723		case VECTOR:
13724		case ARRAY_VECTOR_CTR:
13725		case ARRAY_VECTOR_LIST:
13726		case UNSIZED_ARRAY_VECTOR:
13727			for (GLuint row = 2; row <= 4; ++row)
13728			{
13729				test_case.m_n_rows = row;
13730
13731				m_test_cases.push_back(test_case);
13732			}
13733
13734			break;
13735
13736		case MATRIX:
13737		case MATRIX_ROWS:
13738		case ARRAY_MATRIX_CTR:
13739		case ARRAY_MATRIX_LIST:
13740		case UNSIZED_ARRAY_MATRIX:
13741			for (GLuint col = 2; col <= 4; ++col)
13742			{
13743				for (GLuint row = 2; row <= 4; ++row)
13744				{
13745					test_case.m_n_cols = col;
13746					test_case.m_n_rows = row;
13747
13748					m_test_cases.push_back(test_case);
13749				}
13750			}
13751
13752			break;
13753
13754		case ARRAY_SCALAR:
13755		case UNSIZED_ARRAY_SCALAR:
13756			m_test_cases.push_back(test_case);
13757
13758			break;
13759
13760		case STRUCT:
13761		case ARRAY_STRUCT:
13762		case NESTED_STRUCT_CTR:
13763		case NESTED_STRUCT_LIST:
13764		case NESTED_STURCT_ARRAYS_STRUCT_LIST:
13765		case NESTED_STURCT_ARRAYS_STRUCT_MIX:
13766		case NESTED_ARRAY_STRUCT_STRUCT_LIST:
13767		case NESTED_ARRAY_STRUCT_STRUCT_MIX:
13768		case NESTED_STRUCT_STRUCT_ARRAY_LIST:
13769		case NESTED_STRUCT_STRUCT_ARRAY_MIX:
13770		case UNSIZED_ARRAY_STRUCT:
13771			test_case.m_n_rows = 4;
13772			m_test_cases.push_back(test_case);
13773
13774			break;
13775		default:
13776			DE_ASSERT(0);
13777			break;
13778		}
13779	}
13780
13781	return true;
13782}
13783
13784/** Get string representing "[SIZE]" for current test case
13785 *
13786 * @return String
13787 **/
13788std::string InitializerListTest::getArrayDefinition()
13789{
13790	const testCase& test_case = m_test_cases[m_current_test_case_index];
13791
13792	std::string array_definition;
13793
13794	switch (test_case.m_initializer)
13795	{
13796	case VECTOR:
13797	case MATRIX:
13798	case MATRIX_ROWS:
13799	case STRUCT:
13800	case NESTED_STRUCT_CTR:
13801	case NESTED_STRUCT_LIST:
13802	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
13803	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
13804	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
13805	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
13806		array_definition = "";
13807		break;
13808	case ARRAY_SCALAR:
13809	case ARRAY_VECTOR_CTR:
13810	case ARRAY_VECTOR_LIST:
13811	case ARRAY_MATRIX_CTR:
13812	case ARRAY_MATRIX_LIST:
13813	case ARRAY_STRUCT:
13814	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
13815	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
13816		array_definition = "[4]";
13817		break;
13818	case UNSIZED_ARRAY_SCALAR:
13819	case UNSIZED_ARRAY_VECTOR:
13820	case UNSIZED_ARRAY_MATRIX:
13821	case UNSIZED_ARRAY_STRUCT:
13822		array_definition = "[]";
13823		break;
13824	default:
13825		TCU_FAIL("Invalid enum");
13826	}
13827
13828	return array_definition;
13829}
13830
13831/** Get string representing expected value of sum for current test case
13832 *
13833 * @return String
13834 **/
13835std::string InitializerListTest::getExpectedValue()
13836{
13837	const testCase& test_case = m_test_cases[m_current_test_case_index];
13838
13839	GLfloat value = 0.0f;
13840
13841	switch (test_case.m_initializer)
13842	{
13843	case VECTOR:
13844	case MATRIX:
13845	case MATRIX_ROWS:
13846		value = (GLfloat)(test_case.m_n_cols * test_case.m_n_rows);
13847		break;
13848	case ARRAY_VECTOR_CTR:
13849	case ARRAY_VECTOR_LIST:
13850	case ARRAY_MATRIX_CTR:
13851	case ARRAY_MATRIX_LIST:
13852	case UNSIZED_ARRAY_VECTOR:
13853	case UNSIZED_ARRAY_MATRIX:
13854		value = (GLfloat)(test_case.m_n_cols * test_case.m_n_rows) * 4.0f;
13855		break;
13856	case ARRAY_SCALAR:
13857	case UNSIZED_ARRAY_SCALAR:
13858		value = 4.0f;
13859		break;
13860	case STRUCT:
13861		value = 8.0f;
13862		break;
13863	case NESTED_STRUCT_CTR:
13864	case NESTED_STRUCT_LIST:
13865		value = 12.0f;
13866		break;
13867	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
13868	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
13869		value = 16.0f;
13870		break;
13871	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
13872	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
13873		value = 28.0f;
13874		break;
13875	case ARRAY_STRUCT:
13876	case UNSIZED_ARRAY_STRUCT:
13877		value = 32.0f;
13878		break;
13879	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
13880	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
13881		value = 48.0f;
13882		break;
13883	default:
13884		TCU_FAIL("Invalid enum");
13885	}
13886
13887	value *= m_value;
13888
13889	std::string expected_value;
13890	expected_value.resize(64, 0);
13891
13892	sprintf(&expected_value[0], "%f", value);
13893
13894	return expected_value;
13895}
13896
13897/** Get string representing initialization list for current test case
13898 *
13899 * @return String
13900 **/
13901std::string InitializerListTest::getInitialization()
13902{
13903	const testCase& test_case = m_test_cases[m_current_test_case_index];
13904
13905	std::string initialization;
13906
13907	switch (test_case.m_initializer)
13908	{
13909	case VECTOR:
13910		initialization.append(getVectorInitializer(0 /*column*/, test_case.m_n_rows));
13911
13912		break;
13913
13914	case MATRIX:
13915		initialization = "{ ";
13916		initialization.append(getVectorArrayList(test_case.m_n_cols, test_case.m_n_rows));
13917		initialization.append(" }");
13918
13919		break;
13920
13921	case MATRIX_ROWS:
13922	{
13923		initialization = "{ ";
13924		initialization.append(getVectorArrayCtr(test_case.m_n_cols, test_case.m_n_rows));
13925		initialization.append(" }");
13926	}
13927	break;
13928
13929	case STRUCT:
13930		initialization = "{ ";
13931		initialization.append(getVectorInitializer(0 /* column */, test_case.m_n_rows));
13932		initialization.append(", ");
13933		initialization.append(getVectorInitializer(2 /* column */, test_case.m_n_rows));
13934		initialization.append(" }");
13935
13936		break;
13937
13938	case ARRAY_SCALAR:
13939	case UNSIZED_ARRAY_SCALAR:
13940		initialization = "{ ";
13941		initialization.append(getVectorValues(0 /* column */, 4 /* size */));
13942		initialization.append(" }");
13943
13944		break;
13945
13946	case ARRAY_VECTOR_LIST:
13947	case UNSIZED_ARRAY_VECTOR:
13948		initialization = "{ ";
13949		initialization.append(getVectorArrayList(4 /* columns */, test_case.m_n_rows));
13950		initialization.append(" }");
13951
13952		break;
13953
13954	case ARRAY_VECTOR_CTR:
13955		initialization = "{ ";
13956		initialization.append(getVectorArrayCtr(4 /* columns */, test_case.m_n_rows));
13957		initialization.append(" }");
13958
13959		break;
13960
13961	case ARRAY_MATRIX_LIST:
13962	case UNSIZED_ARRAY_MATRIX:
13963		initialization = "{ ";
13964
13965		for (GLuint i = 0; i < 4; ++i)
13966		{
13967			initialization.append("{ ");
13968			initialization.append(getVectorArrayList(test_case.m_n_cols, test_case.m_n_rows));
13969			initialization.append(" }");
13970
13971			if (i + 1 < 4)
13972			{
13973				initialization.append(", ");
13974			}
13975		}
13976
13977		initialization.append(" }");
13978
13979		break;
13980
13981	case ARRAY_MATRIX_CTR:
13982	{
13983		const std::string& type_name = Utils::getTypeName(Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows);
13984
13985		initialization = "{ ";
13986
13987		for (GLuint i = 0; i < 4; ++i)
13988		{
13989			initialization.append(type_name);
13990			initialization.append("(");
13991			for (GLuint col = 0; col < test_case.m_n_cols; ++col)
13992			{
13993				initialization.append(getVectorValues(col, test_case.m_n_rows));
13994
13995				if (col + 1 < test_case.m_n_cols)
13996				{
13997					initialization.append(", ");
13998				}
13999			}
14000			initialization.append(")");
14001
14002			if (i + 1 < 4)
14003			{
14004				initialization.append(", ");
14005			}
14006		}
14007
14008		initialization.append(" }");
14009	}
14010	break;
14011
14012	case ARRAY_STRUCT:
14013	case UNSIZED_ARRAY_STRUCT:
14014		initialization = "{ ";
14015
14016		for (GLuint i = 0; i < 4; ++i)
14017		{
14018			initialization.append("{ ");
14019			initialization.append(getVectorInitializer(0 /* column */, test_case.m_n_rows));
14020			initialization.append(", ");
14021			initialization.append(getVectorInitializer(2 /* column */, test_case.m_n_rows));
14022			initialization.append(" }");
14023
14024			if (i + 1 < 4)
14025			{
14026				initialization.append(", ");
14027			}
14028		}
14029
14030		initialization.append(" }");
14031
14032		break;
14033
14034	case NESTED_STRUCT_CTR:
14035		initialization = "StructureWithStructure(BasicStructure(";
14036		initialization.append(getVectorConstructor(0 /* column */, 4));
14037		initialization.append(", ");
14038		initialization.append(getVectorConstructor(2 /* column */, 4));
14039		initialization.append("), ");
14040		initialization.append(getVectorConstructor(3 /* column */, 4));
14041		initialization.append(")");
14042
14043		break;
14044
14045	case NESTED_STRUCT_LIST:
14046		initialization = "{ { ";
14047		initialization.append(getVectorInitializer(0 /* column */, 4));
14048		initialization.append(", ");
14049		initialization.append(getVectorInitializer(2 /* column */, 4));
14050		initialization.append(" }, ");
14051		initialization.append(getVectorInitializer(3 /* column */, 4));
14052		initialization.append(" }");
14053
14054		break;
14055
14056	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
14057		initialization = "{ ";
14058		initialization.append(getVectorInitializer(0 /* column */, 4));
14059		initialization.append(", { ");
14060
14061		for (GLuint i = 0; i < 3; ++i)
14062		{
14063			initialization.append("{ ");
14064			initialization.append(getVectorInitializer(2 /* column */, 4));
14065			initialization.append(", ");
14066			initialization.append(getVectorInitializer(3 /* column */, 4));
14067			initialization.append(" }");
14068
14069			if (i + 1 < 3)
14070			{
14071				initialization.append(", ");
14072			}
14073		}
14074
14075		initialization.append(" } }");
14076
14077		break;
14078
14079	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
14080		initialization = "{ ";
14081		initialization.append(getVectorConstructor(0 /* column */, 4));
14082		initialization.append(", { ");
14083
14084		for (GLuint i = 0; i < 3; ++i)
14085		{
14086			initialization.append("{ ");
14087			initialization.append(getVectorInitializer(2 /* column */, 4));
14088			initialization.append(", ");
14089			initialization.append(getVectorConstructor(3 /* column */, 4));
14090			initialization.append(" }");
14091
14092			if (i + 1 < 3)
14093			{
14094				initialization.append(", ");
14095			}
14096		}
14097
14098		initialization.append(" } }");
14099
14100		break;
14101
14102	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
14103		initialization = "{ ";
14104
14105		for (GLuint i = 0; i < 4; ++i)
14106		{
14107			initialization.append("{ { ");
14108
14109			initialization.append(getVectorInitializer(0 /* column */, 4));
14110			initialization.append(", ");
14111			initialization.append(getVectorInitializer(1 /* column */, 4));
14112
14113			initialization.append(" }, ");
14114
14115			initialization.append(getVectorInitializer(2 /* column */, 4));
14116
14117			initialization.append(" }");
14118
14119			if (i + 1 < 4)
14120			{
14121				initialization.append(", ");
14122			}
14123		}
14124
14125		initialization.append(" }");
14126
14127		break;
14128
14129	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
14130		initialization = "{\n";
14131
14132		for (GLuint i = 0; i < 2; ++i)
14133		{
14134			initialization.append("StructureWithStructure(\n");
14135			initialization.append("BasicStructure(");
14136
14137			initialization.append(getVectorConstructor(0 /* column */, 4));
14138			initialization.append(" , ");
14139			initialization.append(getVectorConstructor(1 /* column */, 4));
14140
14141			initialization.append("), ");
14142
14143			initialization.append(getVectorConstructor(2 /* column */, 4));
14144
14145			initialization.append(")");
14146
14147			initialization.append(" , ");
14148
14149			initialization.append("{ { ");
14150
14151			initialization.append(getVectorInitializer(0 /* column */, 4));
14152			initialization.append(", ");
14153			initialization.append(getVectorInitializer(1 /* column */, 4));
14154
14155			initialization.append(" }, ");
14156
14157			initialization.append(getVectorInitializer(2 /* column */, 4));
14158
14159			initialization.append(" }");
14160
14161			if (i + 1 < 2)
14162			{
14163				initialization.append(" , ");
14164			}
14165		}
14166
14167		initialization.append(" }");
14168
14169		break;
14170
14171	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
14172		initialization = "{ ";
14173		initialization.append("{ ");
14174		initialization.append(getVectorInitializer(0 /* column */, 4));
14175		initialization.append(", ");
14176		initialization.append("{ ");
14177		initialization.append(getVectorInitializer(1 /* column */, 4));
14178		initialization.append(", ");
14179		initialization.append(getVectorInitializer(2 /* column */, 4));
14180		initialization.append(" }");
14181		initialization.append(" }");
14182		initialization.append(", ");
14183		initialization.append(getVectorInitializer(3 /* column */, 4));
14184		initialization.append(" }");
14185
14186		break;
14187
14188	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
14189		initialization = "StructureWithStructureWithArray(";
14190		initialization.append("StructureWithArray(");
14191		initialization.append(getVectorConstructor(0 /* column */, 4));
14192		initialization.append(" , vec4[2]( ");
14193		initialization.append(getVectorConstructor(1 /* column */, 4));
14194		initialization.append(" , ");
14195		initialization.append(getVectorConstructor(2 /* column */, 4));
14196		initialization.append(" )");
14197		initialization.append(")");
14198		initialization.append(" , ");
14199		initialization.append(getVectorConstructor(3 /* column */, 4));
14200		initialization.append(")");
14201
14202		break;
14203
14204	default:
14205		TCU_FAIL("Invalid enum");
14206	}
14207
14208	return initialization;
14209}
14210
14211/** Logs description of current test case
14212 *
14213 **/
14214void InitializerListTest::logTestCaseName()
14215{
14216	const testCase& test_case = m_test_cases[m_current_test_case_index];
14217
14218	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
14219
14220	switch (test_case.m_initializer)
14221	{
14222	case VECTOR:
14223		message << "List. Single vec" << test_case.m_n_rows;
14224		break;
14225	case MATRIX:
14226		message << "List. Single mat" << test_case.m_n_cols << "x" << test_case.m_n_rows;
14227		break;
14228	case MATRIX_ROWS:
14229		message << "Ctr. Single mat" << test_case.m_n_cols << "x" << test_case.m_n_rows;
14230		break;
14231	case STRUCT:
14232		message << "List. Structure";
14233		break;
14234	case NESTED_STRUCT_CTR:
14235		message << "Ctr. Nested structure";
14236		break;
14237	case NESTED_STRUCT_LIST:
14238		message << "List. Nested structure";
14239		break;
14240	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
14241		message << "List. Structure with structure array";
14242		break;
14243	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
14244		message << "Mix. Structure with structure array";
14245		break;
14246	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
14247		message << "List. Structure with structure with array";
14248		break;
14249	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
14250		message << "Mix. Structure with structure with array";
14251		break;
14252	case ARRAY_SCALAR:
14253		message << "List. Array of scalars";
14254		break;
14255	case ARRAY_VECTOR_CTR:
14256		message << "Ctr. Array of vec" << test_case.m_n_rows;
14257		break;
14258	case ARRAY_VECTOR_LIST:
14259		message << "List. Array of vec" << test_case.m_n_rows;
14260		break;
14261	case ARRAY_MATRIX_CTR:
14262		message << "Ctr. Array of mat" << test_case.m_n_cols << "x" << test_case.m_n_rows;
14263		break;
14264	case ARRAY_MATRIX_LIST:
14265		message << "List. Array of mat" << test_case.m_n_cols << "x" << test_case.m_n_rows;
14266		break;
14267	case ARRAY_STRUCT:
14268		message << "List. Array of structures";
14269		break;
14270	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
14271		message << "List. Array of structures with structures";
14272		break;
14273	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
14274		message << "Mix. Array of structures with structures";
14275		break;
14276	case UNSIZED_ARRAY_SCALAR:
14277		message << "List. Unsized array of scalars";
14278		break;
14279	case UNSIZED_ARRAY_VECTOR:
14280		message << "List. Unsized array of vec" << test_case.m_n_rows;
14281		break;
14282	case UNSIZED_ARRAY_MATRIX:
14283		message << "List. Unsized array of mat" << test_case.m_n_cols << "x" << test_case.m_n_rows;
14284		break;
14285	case UNSIZED_ARRAY_STRUCT:
14286		message << "List. Unsized array of structures";
14287		break;
14288	default:
14289		TCU_FAIL("Invalid enum");
14290	}
14291
14292	message << tcu::TestLog::EndMessage;
14293}
14294
14295/** Get string representing sum for current test case
14296 *
14297 * @return String
14298 **/
14299std::string InitializerListTest::getSum()
14300{
14301	static const GLchar* var = "variable";
14302
14303	const testCase& test_case = m_test_cases[m_current_test_case_index];
14304
14305	std::string sum;
14306
14307	switch (test_case.m_initializer)
14308	{
14309	case VECTOR:
14310		sum = getVectorSum(var, test_case.m_n_rows);
14311
14312		break;
14313
14314	case MATRIX:
14315	case MATRIX_ROWS:
14316		sum = getVectorArraySum("variable[INDEX]", test_case.m_n_cols, test_case.m_n_rows);
14317
14318		break;
14319
14320	case STRUCT:
14321		sum = getVectorSum("variable.member_a", test_case.m_n_rows);
14322		sum.append(" + ");
14323		sum.append(getVectorSum("variable.member_b", test_case.m_n_rows));
14324
14325		break;
14326
14327	case ARRAY_SCALAR:
14328	case UNSIZED_ARRAY_SCALAR:
14329		sum = "variable[0] + variable[1] + variable[2] + variable[3]";
14330
14331		break;
14332
14333	case ARRAY_VECTOR_LIST:
14334	case ARRAY_VECTOR_CTR:
14335	case UNSIZED_ARRAY_VECTOR:
14336		sum = getVectorArraySum("variable[INDEX]", 4 /* columns */, test_case.m_n_rows);
14337
14338		break;
14339
14340	case ARRAY_MATRIX_LIST:
14341	case ARRAY_MATRIX_CTR:
14342	case UNSIZED_ARRAY_MATRIX:
14343		sum.append(getVectorArraySum("variable[0][INDEX]", test_case.m_n_cols, test_case.m_n_rows));
14344		sum.append(" + ");
14345		sum.append(getVectorArraySum("variable[1][INDEX]", test_case.m_n_cols, test_case.m_n_rows));
14346		sum.append(" + ");
14347		sum.append(getVectorArraySum("variable[2][INDEX]", test_case.m_n_cols, test_case.m_n_rows));
14348		sum.append(" + ");
14349		sum.append(getVectorArraySum("variable[3][INDEX]", test_case.m_n_cols, test_case.m_n_rows));
14350
14351		break;
14352
14353	case ARRAY_STRUCT:
14354	case UNSIZED_ARRAY_STRUCT:
14355		sum.append(getVectorArraySum("variable[INDEX].member_a", 4, test_case.m_n_rows));
14356		sum.append(" + ");
14357		sum.append(getVectorArraySum("variable[INDEX].member_b", 4, test_case.m_n_rows));
14358
14359		break;
14360
14361	case NESTED_STRUCT_CTR:
14362	case NESTED_STRUCT_LIST:
14363		sum.append(getVectorSum("variable.member_a.member_a", 4));
14364		sum.append(" + ");
14365		sum.append(getVectorSum("variable.member_a.member_b", 4));
14366		sum.append(" + ");
14367		sum.append(getVectorSum("variable.member_b", 4));
14368
14369		break;
14370
14371	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
14372	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
14373		sum.append(getVectorSum("variable.member_a", 4));
14374		sum.append(" + ");
14375		sum.append(getVectorArraySum("variable.member_b[INDEX].member_a", 3, 4));
14376		sum.append(" + ");
14377		sum.append(getVectorArraySum("variable.member_b[INDEX].member_b", 3, 4));
14378
14379		break;
14380
14381	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
14382	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
14383		sum.append(getVectorArraySum("variable[INDEX].member_a.member_a", 4, 4));
14384		sum.append(" + ");
14385		sum.append(getVectorArraySum("variable[INDEX].member_a.member_b", 4, 4));
14386		sum.append(" + ");
14387		sum.append(getVectorArraySum("variable[INDEX].member_b", 4, 4));
14388
14389		break;
14390
14391	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
14392	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
14393		sum.append(getVectorSum("variable.member_a.member_a", 4));
14394		sum.append(" + ");
14395		sum.append(getVectorArraySum("variable.member_a.member_b[INDEX]", 2, 4));
14396		sum.append(" + ");
14397		sum.append(getVectorSum("variable.member_b", 4));
14398
14399		break;
14400
14401	default:
14402		TCU_FAIL("Invalid enum");
14403	}
14404
14405	return sum;
14406}
14407
14408/** Get string representing types definition for current test case
14409 *
14410 * @return String
14411 **/
14412std::string InitializerListTest::getTypeDefinition()
14413{
14414	const testCase& test_case = m_test_cases[m_current_test_case_index];
14415
14416	static const GLchar* basic_struct = "struct BasicStructure {\n"
14417										"    vec4 member_a;\n"
14418										"    vec4 member_b;\n"
14419										"};\n";
14420
14421	static const GLchar* struct_with_array = "struct StructureWithArray {\n"
14422											 "    vec4 member_a;\n"
14423											 "    vec4 member_b[2];\n"
14424											 "};\n";
14425
14426	static const GLchar* struct_with_struct = "struct StructureWithStructure {\n"
14427											  "    BasicStructure member_a;\n"
14428											  "    vec4           member_b;\n"
14429											  "};\n";
14430
14431	static const GLchar* struct_with_struct_array = "struct StructureWithStructArray {\n"
14432													"    vec4           member_a;\n"
14433													"    BasicStructure member_b[3];\n"
14434													"};\n";
14435
14436	static const GLchar* struct_with_struct_with_array = "struct StructureWithStructureWithArray {\n"
14437														 "    StructureWithArray member_a;\n"
14438														 "    vec4               member_b;\n"
14439														 "};\n";
14440
14441	std::string type_definition;
14442
14443	switch (test_case.m_initializer)
14444	{
14445	case VECTOR:
14446	case MATRIX:
14447	case MATRIX_ROWS:
14448	case ARRAY_SCALAR:
14449	case ARRAY_VECTOR_CTR:
14450	case ARRAY_VECTOR_LIST:
14451	case ARRAY_MATRIX_CTR:
14452	case ARRAY_MATRIX_LIST:
14453	case UNSIZED_ARRAY_SCALAR:
14454	case UNSIZED_ARRAY_VECTOR:
14455	case UNSIZED_ARRAY_MATRIX:
14456		type_definition = "";
14457		break;
14458	case STRUCT:
14459	case ARRAY_STRUCT:
14460	case UNSIZED_ARRAY_STRUCT:
14461		type_definition = basic_struct;
14462		break;
14463	case NESTED_STRUCT_CTR:
14464	case NESTED_STRUCT_LIST:
14465	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
14466	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
14467		type_definition = basic_struct;
14468		type_definition.append(struct_with_struct);
14469		break;
14470	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
14471	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
14472		type_definition = basic_struct;
14473		type_definition.append(struct_with_struct_array);
14474		break;
14475	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
14476	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
14477		type_definition = struct_with_array;
14478		type_definition.append(struct_with_struct_with_array);
14479		break;
14480	default:
14481		TCU_FAIL("Invalid enum");
14482	}
14483
14484	return type_definition;
14485}
14486
14487/** Get string representing name of variable's type for current test case
14488 *
14489 * @return String
14490 **/
14491std::string InitializerListTest::getTypeName()
14492{
14493	const testCase& test_case = m_test_cases[m_current_test_case_index];
14494
14495	static const GLchar* basic_struct = "BasicStructure";
14496
14497	static const GLchar* struct_with_struct = "StructureWithStructure";
14498
14499	static const GLchar* struct_with_struct_array = "StructureWithStructArray";
14500
14501	static const GLchar* struct_with_struct_with_array = "StructureWithStructureWithArray";
14502
14503	std::string type_name;
14504
14505	switch (test_case.m_initializer)
14506	{
14507	case VECTOR:
14508	case MATRIX:
14509	case MATRIX_ROWS:
14510	case ARRAY_VECTOR_CTR:
14511	case ARRAY_VECTOR_LIST:
14512	case ARRAY_MATRIX_CTR:
14513	case ARRAY_MATRIX_LIST:
14514	case UNSIZED_ARRAY_VECTOR:
14515	case UNSIZED_ARRAY_MATRIX:
14516		type_name = Utils::getTypeName(Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows);
14517		break;
14518	case STRUCT:
14519	case ARRAY_STRUCT:
14520	case UNSIZED_ARRAY_STRUCT:
14521		type_name = basic_struct;
14522		break;
14523	case NESTED_STRUCT_CTR:
14524	case NESTED_STRUCT_LIST:
14525	case NESTED_ARRAY_STRUCT_STRUCT_LIST:
14526	case NESTED_ARRAY_STRUCT_STRUCT_MIX:
14527		type_name = struct_with_struct;
14528		break;
14529	case NESTED_STURCT_ARRAYS_STRUCT_LIST:
14530	case NESTED_STURCT_ARRAYS_STRUCT_MIX:
14531		type_name = struct_with_struct_array;
14532		break;
14533	case NESTED_STRUCT_STRUCT_ARRAY_LIST:
14534	case NESTED_STRUCT_STRUCT_ARRAY_MIX:
14535		type_name = struct_with_struct_with_array;
14536		break;
14537	case ARRAY_SCALAR:
14538	case UNSIZED_ARRAY_SCALAR:
14539		type_name = "float";
14540		break;
14541	default:
14542		TCU_FAIL("Invalid enum");
14543	}
14544
14545	return type_name;
14546}
14547
14548/** Get string representing array of vector constructors
14549 *
14550 * @param columns Number of columns
14551 * @param size    Size of vector
14552 *
14553 * @return String
14554 **/
14555std::string InitializerListTest::getVectorArrayCtr(GLuint columns, GLuint size)
14556{
14557	std::string result;
14558
14559	for (GLuint col = 0; col < columns; ++col)
14560	{
14561		result.append(getVectorConstructor(col, size));
14562
14563		if (col + 1 < columns)
14564		{
14565			result.append(", ");
14566		}
14567	}
14568
14569	return result;
14570}
14571
14572/** Get string representing array of vector initializers
14573 *
14574 * @param columns Number of columns
14575 * @param size    Size of vector
14576 *
14577 * @return String
14578 **/
14579std::string InitializerListTest::getVectorArrayList(GLuint columns, GLuint size)
14580{
14581	std::string result;
14582
14583	for (GLuint col = 0; col < columns; ++col)
14584	{
14585		result.append(getVectorInitializer(col, size));
14586
14587		if (col + 1 < columns)
14588		{
14589			result.append(", ");
14590		}
14591	}
14592
14593	return result;
14594}
14595
14596/** Get string representing vector constructor
14597 *
14598 * @param column Index of column of uni_matrix to use as data source
14599 * @param size   Size of vector
14600 *
14601 * @return String
14602 **/
14603std::string InitializerListTest::getVectorConstructor(GLuint column, GLuint size)
14604{
14605	const std::string& type_name = Utils::getTypeName(Utils::FLOAT, 1 /*n_cols*/, size);
14606
14607	std::string result;
14608
14609	result.append(type_name);
14610	result.append("(");
14611	result.append(getVectorValues(column, size));
14612	result.append(")");
14613
14614	return result;
14615}
14616
14617/** Get string representing vector initializer
14618 *
14619 * @param column Index of column of uni_matrix to use as data source
14620 * @param size   Size of vector
14621 *
14622 * @return String
14623 **/
14624std::string InitializerListTest::getVectorInitializer(GLuint column, GLuint size)
14625{
14626	std::string result;
14627
14628	result.append("{");
14629	result.append(getVectorValues(column, size));
14630	result.append("}");
14631
14632	return result;
14633}
14634
14635/** Get string representing sum of vector array. Token INDEX in name will be replaced with element index.
14636 *
14637 * @param array_name Name of array variable
14638 * @param columns    Number of columns to sum
14639 * @param size       Size of vector
14640 *
14641 * @return String
14642 **/
14643std::string InitializerListTest::getVectorArraySum(const GLchar* array_name, GLuint columns, GLuint size)
14644{
14645	static const GLchar* lut[] = { "0", "1", "2", "3" };
14646
14647	std::string sum;
14648
14649	for (GLuint i = 0; i < columns; ++i)
14650	{
14651		size_t		position = 0;
14652		std::string name	 = array_name;
14653
14654		Utils::replaceToken("INDEX", position, lut[i], name);
14655
14656		sum.append(getVectorSum(name.c_str(), size));
14657
14658		if (i + 1 < columns)
14659		{
14660			sum.append(" + ");
14661		}
14662	}
14663
14664	return sum;
14665}
14666
14667/** Get string representing sum of vectors' elements
14668 *
14669 * @param vector_name Name of vector variable
14670 * @param size        Size of vector
14671 *
14672 * @return String
14673 **/
14674std::string InitializerListTest::getVectorSum(const GLchar* vector_name, GLuint size)
14675{
14676	static const GLchar* lut[] = {
14677		".x", ".y", ".z", ".w",
14678	};
14679
14680	std::string sum;
14681
14682	for (GLuint i = 0; i < size; ++i)
14683	{
14684		sum.append(vector_name);
14685		sum.append(lut[i]);
14686
14687		if (i + 1 < size)
14688		{
14689			sum.append(" + ");
14690		}
14691	}
14692
14693	return sum;
14694}
14695
14696/** Get string representing vector values
14697 *
14698 * @param column Index of column of uni_matrix to use as data source
14699 * @param size   Size of vector
14700 *
14701 * @return String
14702 **/
14703std::string InitializerListTest::getVectorValues(GLuint column, GLuint size)
14704{
14705	const GLchar* init_template = 0;
14706	const GLchar* column_index  = 0;
14707
14708	switch (size)
14709	{
14710	case 2:
14711		init_template = "uni_matrix[COLUMN].x, uni_matrix[COLUMN].y";
14712		break;
14713	case 3:
14714		init_template = "uni_matrix[COLUMN].x, uni_matrix[COLUMN].y, uni_matrix[COLUMN].z";
14715		break;
14716	case 4:
14717		init_template = "uni_matrix[COLUMN].z, uni_matrix[COLUMN].y, uni_matrix[COLUMN].z, uni_matrix[COLUMN].w";
14718		break;
14719	}
14720
14721	switch (column)
14722	{
14723	case 0:
14724		column_index = "0";
14725		break;
14726	case 1:
14727		column_index = "1";
14728		break;
14729	case 2:
14730		column_index = "2";
14731		break;
14732	case 3:
14733		column_index = "3";
14734		break;
14735	}
14736
14737	std::string initializer = init_template;
14738
14739	Utils::replaceAllTokens("COLUMN", column_index, initializer);
14740
14741	return initializer;
14742}
14743
14744/** Constructor
14745 *
14746 * @param context Test context
14747 **/
14748InitializerListNegativeTest::InitializerListNegativeTest(deqp::Context& context)
14749	: NegativeTestBase(context, "initializer_list_negative", "Verifies invalid initializers")
14750	, m_current_test_case_index(0)
14751{
14752	/* Nothing to be done here */
14753}
14754
14755/** Set up next test case
14756 *
14757 * @param test_case_index Index of next test case
14758 *
14759 * @return false if there is no more test cases, true otherwise
14760 **/
14761bool InitializerListNegativeTest::prepareNextTestCase(glw::GLuint test_case_index)
14762{
14763	m_current_test_case_index = test_case_index;
14764
14765	if ((glw::GLuint)-1 == test_case_index)
14766	{
14767		m_current_test_case_index = 0;
14768		return true;
14769	}
14770	else if (m_test_cases.size() <= test_case_index)
14771	{
14772		return false;
14773	}
14774
14775	logTestCaseName();
14776
14777	return true;
14778}
14779
14780/** Prepare source for given shader stage
14781 *
14782 * @param in_stage           Shader stage, compute shader will use 430
14783 * @param in_use_version_400 Select if 400 or 420 should be used
14784 * @param out_source         Prepared shader source instance
14785 **/
14786void InitializerListNegativeTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
14787													  Utils::shaderSource& out_source)
14788{
14789	static const GLchar* verification_snippet = "    TYPE_NAME variable = INITIALIZATION;\n"
14790												"\n"
14791												"    float sum = SUM;\n"
14792												"\n"
14793												"    if (0 != sum)\n"
14794												"    {\n"
14795												"        result = vec4(1, 0, 0, 1);\n"
14796												"    }\n";
14797
14798	static const GLchar* compute_shader_template =
14799		"VERSION\n"
14800		"\n"
14801		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
14802		"\n"
14803		"writeonly uniform image2D uni_image;\n"
14804		"\n"
14805		"TYPE_DEFINITION\n"
14806		"\n"
14807		"void main()\n"
14808		"{\n"
14809		"    vec4 result = vec4(0, 1, 0, 1);\n"
14810		"\n"
14811		"VERIFICATION"
14812		"\n"
14813		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
14814		"}\n"
14815		"\n";
14816
14817	static const GLchar* fragment_shader_template = "VERSION\n"
14818													"\n"
14819													"in  vec4 gs_fs_result;\n"
14820													"out vec4 fs_out_result;\n"
14821													"\n"
14822													"TYPE_DEFINITION\n"
14823													"\n"
14824													"void main()\n"
14825													"{\n"
14826													"    vec4 result = vec4(0, 1, 0, 1);\n"
14827													"\n"
14828													"VERIFICATION"
14829													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
14830													"    {\n"
14831													"         result = vec4(1, 0, 0, 1);\n"
14832													"    }\n"
14833													"\n"
14834													"    fs_out_result = result;\n"
14835													"}\n"
14836													"\n";
14837
14838	static const GLchar* geometry_shader_template = "VERSION\n"
14839													"\n"
14840													"layout(points)                           in;\n"
14841													"layout(triangle_strip, max_vertices = 4) out;\n"
14842													"\n"
14843													"in  vec4 tes_gs_result[];\n"
14844													"out vec4 gs_fs_result;\n"
14845													"\n"
14846													"TYPE_DEFINITION\n"
14847													"\n"
14848													"void main()\n"
14849													"{\n"
14850													"    vec4 result = vec4(0, 1, 0, 1);\n"
14851													"\n"
14852													"VERIFICATION"
14853													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
14854													"    {\n"
14855													"         result = vec4(1, 0, 0, 1);\n"
14856													"    }\n"
14857													"\n"
14858													"    gs_fs_result = result;\n"
14859													"    gl_Position  = vec4(-1, -1, 0, 1);\n"
14860													"    EmitVertex();\n"
14861													"    gs_fs_result = result;\n"
14862													"    gl_Position  = vec4(-1, 1, 0, 1);\n"
14863													"    EmitVertex();\n"
14864													"    gs_fs_result = result;\n"
14865													"    gl_Position  = vec4(1, -1, 0, 1);\n"
14866													"    EmitVertex();\n"
14867													"    gs_fs_result = result;\n"
14868													"    gl_Position  = vec4(1, 1, 0, 1);\n"
14869													"    EmitVertex();\n"
14870													"}\n"
14871													"\n";
14872
14873	static const GLchar* tess_ctrl_shader_template =
14874		"VERSION\n"
14875		"\n"
14876		"layout(vertices = 1) out;\n"
14877		"\n"
14878		"in  vec4 vs_tcs_result[];\n"
14879		"out vec4 tcs_tes_result[];\n"
14880		"\n"
14881		"TYPE_DEFINITION\n"
14882		"\n"
14883		"void main()\n"
14884		"{\n"
14885		"    vec4 result = vec4(0, 1, 0, 1);\n"
14886		"\n"
14887		"VERIFICATION"
14888		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
14889		"    {\n"
14890		"         result = vec4(1, 0, 0, 1);\n"
14891		"    }\n"
14892		"\n"
14893		"    tcs_tes_result[gl_InvocationID] = result;\n"
14894		"\n"
14895		"    gl_TessLevelOuter[0] = 1.0;\n"
14896		"    gl_TessLevelOuter[1] = 1.0;\n"
14897		"    gl_TessLevelOuter[2] = 1.0;\n"
14898		"    gl_TessLevelOuter[3] = 1.0;\n"
14899		"    gl_TessLevelInner[0] = 1.0;\n"
14900		"    gl_TessLevelInner[1] = 1.0;\n"
14901		"}\n"
14902		"\n";
14903
14904	static const GLchar* tess_eval_shader_template = "VERSION\n"
14905													 "\n"
14906													 "layout(isolines, point_mode) in;\n"
14907													 "\n"
14908													 "in  vec4 tcs_tes_result[];\n"
14909													 "out vec4 tes_gs_result;\n"
14910													 "\n"
14911													 "TYPE_DEFINITION\n"
14912													 "\n"
14913													 "void main()\n"
14914													 "{\n"
14915													 "    vec4 result = vec4(0, 1, 0, 1);\n"
14916													 "\n"
14917													 "VERIFICATION"
14918													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
14919													 "    {\n"
14920													 "         result = vec4(1, 0, 0, 1);\n"
14921													 "    }\n"
14922													 "\n"
14923													 "    tes_gs_result = result;\n"
14924													 "}\n"
14925													 "\n";
14926
14927	static const GLchar* vertex_shader_template = "VERSION\n"
14928												  "\n"
14929												  "out vec4 vs_tcs_result;\n"
14930												  "\n"
14931												  "TYPE_DEFINITION\n"
14932												  "\n"
14933												  "void main()\n"
14934												  "{\n"
14935												  "    vec4 result = vec4(0, 1, 0, 1);\n"
14936												  "\n"
14937												  "VERIFICATION"
14938												  "\n"
14939												  "    vs_tcs_result = result;\n"
14940												  "}\n"
14941												  "\n";
14942
14943	const std::string& initialization  = getInitialization();
14944	const GLchar*	  shader_template = 0;
14945	const std::string& sum			   = getSum();
14946	const std::string& type_definition = getTypeDefinition();
14947	const std::string& type_name	   = getTypeName();
14948
14949	switch (in_stage)
14950	{
14951	case Utils::COMPUTE_SHADER:
14952		shader_template = compute_shader_template;
14953		break;
14954	case Utils::FRAGMENT_SHADER:
14955		shader_template = fragment_shader_template;
14956		break;
14957	case Utils::GEOMETRY_SHADER:
14958		shader_template = geometry_shader_template;
14959		break;
14960	case Utils::TESS_CTRL_SHADER:
14961		shader_template = tess_ctrl_shader_template;
14962		break;
14963	case Utils::TESS_EVAL_SHADER:
14964		shader_template = tess_eval_shader_template;
14965		break;
14966	case Utils::VERTEX_SHADER:
14967		shader_template = vertex_shader_template;
14968		break;
14969	default:
14970		TCU_FAIL("Invalid enum");
14971	}
14972
14973	out_source.m_parts[0].m_code = shader_template;
14974
14975	size_t position = 0;
14976	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
14977						out_source.m_parts[0].m_code);
14978
14979	Utils::replaceToken("TYPE_DEFINITION", position, type_definition.c_str(), out_source.m_parts[0].m_code);
14980
14981	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
14982
14983	position -= strlen(verification_snippet);
14984
14985	Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code);
14986
14987	Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code);
14988
14989	Utils::replaceToken("SUM", position, sum.c_str(), out_source.m_parts[0].m_code);
14990}
14991
14992/** Prepare test cases
14993 *
14994 * @return true
14995 **/
14996bool InitializerListNegativeTest::testInit()
14997{
14998	for (GLuint i = 0; i < TESTED_ERRORS_MAX; ++i)
14999	{
15000		const TESTED_ERRORS error = (TESTED_ERRORS)i;
15001
15002		m_test_cases.push_back(error);
15003	}
15004
15005	return true;
15006}
15007
15008/** Get string representing initialization list for current test case
15009 *
15010 * @return String
15011 **/
15012std::string InitializerListNegativeTest::getInitialization()
15013{
15014	const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index];
15015
15016	std::string initialization;
15017
15018	switch (error)
15019	{
15020	case TYPE_UIVEC_BOOL:
15021		initialization = "{ true, 0, 1, 2 }";
15022
15023		break;
15024
15025	case TYPE_IVEC_BOOL:
15026		initialization = "{ true, 0, -1, 2 }";
15027
15028		break;
15029
15030	case TYPE_VEC_BOOL:
15031		initialization = "{ true, 0.125, 0.25, 0.375 }";
15032
15033		break;
15034
15035	case TYPE_MAT_BOOL:
15036		initialization = "{ {false, 0, 1, 1}, {0, 1, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1} }";
15037
15038		break;
15039
15040	case COMPONENTS_VEC_LESS:
15041	case COMPONENTS_VEC_MORE:
15042		initialization = "{ 0, 0.25, 0.375 }";
15043
15044		break;
15045
15046	case COMPONENTS_MAT_LESS_ROWS:
15047		initialization = "{ {0, 0, 1, 1}, {0, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1} }";
15048
15049		break;
15050
15051	case COMPONENTS_MAT_MORE_ROWS:
15052		initialization = "{ {0, 0, 1}, {0, 0, 1}, {1, 0, 1, 0}, {1, 0, 1} }";
15053
15054		break;
15055
15056	case COMPONENTS_MAT_LESS_COLUMNS:
15057		initialization = "{ {0, 0, 1, 1}, {1, 0, 1, 0}, {0, 1, 0, 1} }";
15058
15059		break;
15060
15061	case COMPONENTS_MAT_MORE_COLUMNS:
15062		initialization = "{ {0, 0, 1}, {0, 0, 1}, {1, 0, 1}, {1, 0, 1} }";
15063
15064		break;
15065
15066	case LIST_IN_CONSTRUCTOR:
15067		initialization = "Struct( { vec4(0, 1, 0, 1), vec3(0, 1, 0) }, vec4(1, 0, 1, 0) )";
15068
15069		break;
15070
15071	case STRUCT_LAYOUT_MEMBER_TYPE:
15072		initialization = "{ { {0, 1, 0, 1}, vec4(0, 1, 0, 1) }, vec4(1, 0, 1, 0) }";
15073
15074		break;
15075
15076	case STRUCT_LAYOUT_MEMBER_COUNT_MORE:
15077		initialization = "{ { {0, 1, 0, 1}, vec3(0, 1, 0) } , vec4(1, 0, 1, 0), vec4(1, 0, 1, 0) }";
15078
15079		break;
15080
15081	case STRUCT_LAYOUT_MEMBER_COUNT_LESS:
15082		initialization = "{ { {0, 1, 0, 1}, vec3(0, 1, 0) } }";
15083
15084		break;
15085
15086	case STRUCT_LAYOUT_MEMBER_ORDER:
15087		initialization = "{ vec4(1, 0, 1, 0), { vec3(0, 1, 0) , {0, 1, 0, 1} } }";
15088
15089		break;
15090
15091	default:
15092		TCU_FAIL("Invalid enum");
15093	}
15094
15095	return initialization;
15096}
15097
15098/** Logs description of current test case
15099 *
15100 **/
15101void InitializerListNegativeTest::logTestCaseName()
15102{
15103	const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index];
15104
15105	tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message;
15106
15107	switch (error)
15108	{
15109	case TYPE_UIVEC_BOOL:
15110		message << "Wrong type in uvec initializer list";
15111		break;
15112	case TYPE_IVEC_BOOL:
15113		message << "Wrong type in ivec initializer list";
15114		break;
15115	case TYPE_VEC_BOOL:
15116		message << "Wrong type in vec initializer list";
15117		break;
15118	case TYPE_MAT_BOOL:
15119		message << "Wrong type in mat initializer list";
15120		break;
15121	case COMPONENTS_VEC_LESS:
15122		message << "Wrong number of componenets in vec initialize list - less";
15123		break;
15124	case COMPONENTS_VEC_MORE:
15125		message << "Wrong number of componenets in vec initialize list - more";
15126		break;
15127	case COMPONENTS_MAT_LESS_ROWS:
15128		message << "Wrong number of componenets in mat initialize list - less rows";
15129		break;
15130	case COMPONENTS_MAT_LESS_COLUMNS:
15131		message << "Wrong number of componenets in mat initialize list - less columns";
15132		break;
15133	case COMPONENTS_MAT_MORE_ROWS:
15134		message << "Wrong number of componenets in mat initialize list - more rows";
15135		break;
15136	case COMPONENTS_MAT_MORE_COLUMNS:
15137		message << "Wrong number of componenets in mat initialize list - more columns";
15138		break;
15139	case LIST_IN_CONSTRUCTOR:
15140		message << "Initializer list in constructor";
15141		break;
15142	case STRUCT_LAYOUT_MEMBER_TYPE:
15143		message << "Wrong type of structure member";
15144		break;
15145	case STRUCT_LAYOUT_MEMBER_COUNT_MORE:
15146		message << "Wrong number of structure members - more";
15147		break;
15148	case STRUCT_LAYOUT_MEMBER_COUNT_LESS:
15149		message << "Wrong number of structure members - less";
15150		break;
15151	case STRUCT_LAYOUT_MEMBER_ORDER:
15152		message << "Wrong order of structure members";
15153		break;
15154	default:
15155		TCU_FAIL("Invalid enum");
15156	}
15157
15158	message << tcu::TestLog::EndMessage;
15159}
15160
15161/** Get string representing sum for current test case
15162 *
15163 * @return String
15164 **/
15165std::string InitializerListNegativeTest::getSum()
15166{
15167	const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index];
15168
15169	std::string sum;
15170
15171	switch (error)
15172	{
15173	case TYPE_UIVEC_BOOL:
15174	case TYPE_IVEC_BOOL:
15175	case TYPE_VEC_BOOL:
15176	case COMPONENTS_VEC_LESS:
15177		sum = "variable.x + variable.y + variable.z + variable.w";
15178		break;
15179	case TYPE_MAT_BOOL:
15180	case COMPONENTS_MAT_LESS_ROWS:
15181	case COMPONENTS_MAT_LESS_COLUMNS:
15182		sum = "variable[0].x + variable[0].y + variable[0].z + variable[0].w + "
15183			  "variable[1].x + variable[1].y + variable[1].z + variable[1].w + "
15184			  "variable[2].x + variable[2].y + variable[2].z + variable[2].w + "
15185			  "variable[3].x + variable[3].y + variable[3].z + variable[3].w";
15186		break;
15187	case COMPONENTS_VEC_MORE:
15188		sum = "variable.x + variable.y + variable.z";
15189		break;
15190	case COMPONENTS_MAT_MORE_ROWS:
15191	case COMPONENTS_MAT_MORE_COLUMNS:
15192		sum = "variable[0].x + variable[0].y + variable[0].z"
15193			  "variable[1].x + variable[1].y + variable[1].z"
15194			  "variable[2].x + variable[2].y + variable[2].z";
15195		break;
15196	case LIST_IN_CONSTRUCTOR:
15197	case STRUCT_LAYOUT_MEMBER_TYPE:
15198	case STRUCT_LAYOUT_MEMBER_COUNT_MORE:
15199	case STRUCT_LAYOUT_MEMBER_COUNT_LESS:
15200	case STRUCT_LAYOUT_MEMBER_ORDER:
15201		sum = "variable.member_a.member_a.x + variable.member_a.member_a.y + variable.member_a.member_a.z + "
15202			  "variable.member_a.member_a.w + "
15203			  "variable.member_a.member_b.x + variable.member_a.member_b.y + variable.member_a.member_b.z + "
15204			  "variable.member_b.x + variable.member_b.y + variable.member_b.z + variable.member_b.w";
15205		break;
15206	default:
15207		TCU_FAIL("Invalid enum");
15208	}
15209
15210	return sum;
15211}
15212
15213/** Get string representing types definition for current test case
15214 *
15215 * @return String
15216 **/
15217std::string InitializerListNegativeTest::getTypeDefinition()
15218{
15219	const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index];
15220
15221	static const GLchar* struct_def = "struct BasicStructure {\n"
15222									  "    vec4 member_a;\n"
15223									  "    vec3 member_b;\n"
15224									  "};\n"
15225									  "\n"
15226									  "struct StructureWithStructure {\n"
15227									  "    BasicStructure member_a;\n"
15228									  "    vec4           member_b;\n"
15229									  "};\n";
15230
15231	std::string type_definition;
15232
15233	switch (error)
15234	{
15235	case TYPE_UIVEC_BOOL:
15236	case TYPE_IVEC_BOOL:
15237	case TYPE_VEC_BOOL:
15238	case TYPE_MAT_BOOL:
15239	case COMPONENTS_VEC_LESS:
15240	case COMPONENTS_VEC_MORE:
15241	case COMPONENTS_MAT_LESS_ROWS:
15242	case COMPONENTS_MAT_LESS_COLUMNS:
15243	case COMPONENTS_MAT_MORE_ROWS:
15244	case COMPONENTS_MAT_MORE_COLUMNS:
15245		type_definition = "";
15246		break;
15247	case LIST_IN_CONSTRUCTOR:
15248	case STRUCT_LAYOUT_MEMBER_TYPE:
15249	case STRUCT_LAYOUT_MEMBER_COUNT_MORE:
15250	case STRUCT_LAYOUT_MEMBER_COUNT_LESS:
15251	case STRUCT_LAYOUT_MEMBER_ORDER:
15252		type_definition = struct_def;
15253		break;
15254	default:
15255		TCU_FAIL("Invalid enum");
15256	}
15257
15258	return type_definition;
15259}
15260
15261/** Get string representing name of variable's type for current test case
15262 *
15263 * @return String
15264 **/
15265std::string InitializerListNegativeTest::getTypeName()
15266{
15267	const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index];
15268
15269	static const GLchar* struct_with_struct = "StructureWithStructure";
15270
15271	std::string type_name;
15272
15273	switch (error)
15274	{
15275	case TYPE_UIVEC_BOOL:
15276		type_name = "uvec4";
15277		break;
15278	case TYPE_IVEC_BOOL:
15279		type_name = "ivec4";
15280		break;
15281	case TYPE_VEC_BOOL:
15282	case COMPONENTS_VEC_LESS:
15283		type_name = "vec4";
15284		break;
15285	case COMPONENTS_VEC_MORE:
15286		type_name = "vec2";
15287		break;
15288	case TYPE_MAT_BOOL:
15289	case COMPONENTS_MAT_LESS_ROWS:
15290	case COMPONENTS_MAT_LESS_COLUMNS:
15291		type_name = "mat4";
15292		break;
15293	case COMPONENTS_MAT_MORE_ROWS:
15294	case COMPONENTS_MAT_MORE_COLUMNS:
15295		type_name = "mat3";
15296		break;
15297	case LIST_IN_CONSTRUCTOR:
15298	case STRUCT_LAYOUT_MEMBER_TYPE:
15299	case STRUCT_LAYOUT_MEMBER_COUNT_MORE:
15300	case STRUCT_LAYOUT_MEMBER_COUNT_LESS:
15301	case STRUCT_LAYOUT_MEMBER_ORDER:
15302		type_name = struct_with_struct;
15303		break;
15304	default:
15305		TCU_FAIL("Invalid enum");
15306	}
15307
15308	return type_name;
15309}
15310
15311/** Constructor
15312 *
15313 * @param context Test context
15314 **/
15315LengthOfVectorAndMatrixTest::LengthOfVectorAndMatrixTest(deqp::Context& context)
15316	: GLSLTestBase(context, "length_of_vector_and_matrix", "Test verifies .length() for vectors and matrices")
15317{
15318	/* Nothing to be done here */
15319}
15320
15321/** Set up next test case
15322 *
15323 * @param test_case_index Index of next test case
15324 *
15325 * @return false if there is no more test cases, true otherwise
15326 **/
15327bool LengthOfVectorAndMatrixTest::prepareNextTestCase(glw::GLuint test_case_index)
15328{
15329	m_current_test_case_index = test_case_index;
15330
15331	if ((glw::GLuint)-1 == test_case_index)
15332	{
15333		m_current_test_case_index = 0;
15334		return true;
15335	}
15336	else if (m_test_cases.size() <= test_case_index)
15337	{
15338		return false;
15339	}
15340
15341	const testCase& test_case = m_test_cases[m_current_test_case_index];
15342
15343	m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested type: "
15344										<< Utils::getTypeName(test_case.m_type, test_case.m_n_cols, test_case.m_n_rows)
15345										<< tcu::TestLog::EndMessage;
15346
15347	return true;
15348}
15349
15350/** Prepare source for given shader stage
15351 *
15352 * @param in_stage           Shader stage, compute shader will use 430
15353 * @param in_use_version_400 Select if 400 or 420 should be used
15354 * @param out_source         Prepared shader source instance
15355 **/
15356void LengthOfVectorAndMatrixTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
15357													  Utils::shaderSource& out_source)
15358{
15359	if (Utils::COMPUTE_SHADER == in_stage)
15360	{
15361		m_is_compute_program = true;
15362		prepareComputeShaderSource(out_source);
15363	}
15364	else
15365	{
15366		m_is_compute_program = false;
15367		prepareDrawShaderSource(in_stage, in_use_version_400, out_source);
15368	}
15369}
15370
15371/** Overwritte of prepareUniforms method
15372 *
15373 * @param program Current program
15374 **/
15375void LengthOfVectorAndMatrixTest::prepareUniforms(Utils::program& program)
15376{
15377	static const GLfloat float_value = 0.125;
15378	static const GLint   int_value   = -1;
15379	static const GLuint  uint_value  = 1;
15380
15381	static const GLfloat float_data[16] = { float_value, float_value, float_value, float_value,
15382											float_value, float_value, float_value, float_value,
15383											float_value, float_value, float_value, float_value,
15384											float_value, float_value, float_value, float_value };
15385
15386	static const GLint int_data[4] = { int_value, int_value, int_value, int_value };
15387
15388	static const GLuint uint_data[4] = { uint_value, uint_value, uint_value, uint_value };
15389
15390	if (false == m_is_compute_program)
15391	{
15392		return;
15393	}
15394
15395	const testCase& test_case = m_test_cases[m_current_test_case_index];
15396
15397	switch (test_case.m_type)
15398	{
15399	case Utils::FLOAT:
15400		program.uniform("uni_variable", Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows, float_data);
15401		break;
15402	case Utils::INT:
15403		program.uniform("uni_variable", Utils::INT, 1 /* columns */, test_case.m_n_rows, int_data);
15404		break;
15405	case Utils::UINT:
15406		program.uniform("uni_variable", Utils::UINT, 1 /* columns */, test_case.m_n_rows, uint_data);
15407		break;
15408	default:
15409		TCU_FAIL("Invalid enum");
15410	}
15411}
15412
15413/** Prepare vertex buffer
15414 *
15415 * @param program Program object
15416 * @param buffer  Vertex buffer
15417 * @param vao     Vertex array object
15418 *
15419 * @return 0
15420 **/
15421void LengthOfVectorAndMatrixTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer,
15422													  Utils::vertexArray& vao)
15423{
15424	static const GLfloat float_value = 0.125f;
15425	static const GLint   int_value   = -1;
15426	static const GLuint  uint_value  = 1;
15427
15428	static const GLfloat float_data[16] = { float_value, float_value, float_value, float_value,
15429											float_value, float_value, float_value, float_value,
15430											float_value, float_value, float_value, float_value,
15431											float_value, float_value, float_value, float_value };
15432
15433	static const GLint int_data[4] = { int_value, int_value, int_value, int_value };
15434
15435	static const GLuint uint_data[4] = { uint_value, uint_value, uint_value, uint_value };
15436
15437	const testCase& test_case = m_test_cases[m_current_test_case_index];
15438
15439	std::string variable_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "variable");
15440	GLint		variable_loc  = program.getAttribLocation(variable_name.c_str());
15441
15442	if (-1 == variable_loc)
15443	{
15444		TCU_FAIL("Vertex attribute location is invalid");
15445	}
15446
15447	vao.generate();
15448	vao.bind();
15449
15450	buffer.generate(GL_ARRAY_BUFFER);
15451
15452	GLvoid*	data_ptr  = 0;
15453	GLsizeiptr data_size = 0;
15454
15455	switch (test_case.m_type)
15456	{
15457	case Utils::FLOAT:
15458		data_ptr  = (GLvoid*)float_data;
15459		data_size = sizeof(float_data);
15460		break;
15461	case Utils::INT:
15462		data_ptr  = (GLvoid*)int_data;
15463		data_size = sizeof(int_data);
15464		break;
15465	case Utils::UINT:
15466		data_ptr  = (GLvoid*)uint_data;
15467		data_size = sizeof(uint_data);
15468		break;
15469	default:
15470		TCU_FAIL("Invalid enum");
15471	}
15472
15473	buffer.update(data_size, data_ptr, GL_STATIC_DRAW);
15474
15475	/* GL entry points */
15476	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
15477
15478	/* Set up vao */
15479	switch (test_case.m_type)
15480	{
15481	case Utils::FLOAT:
15482		for (GLuint col = 0; col < test_case.m_n_cols; ++col)
15483		{
15484			const GLuint  index  = variable_loc + col;
15485			const GLint   size   = test_case.m_n_rows;
15486			const GLvoid* offset = (const GLvoid*)(test_case.m_n_rows * sizeof(GLfloat) * col);
15487
15488			gl.vertexAttribPointer(index, size, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0, offset);
15489			GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer");
15490		}
15491		break;
15492	case Utils::INT:
15493		gl.vertexAttribIPointer(variable_loc, test_case.m_n_rows /* size */, GL_INT /* type */, 0 /* stride */,
15494								0 /* offset */);
15495		GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribIPointer");
15496		break;
15497	case Utils::UINT:
15498		gl.vertexAttribIPointer(variable_loc, test_case.m_n_rows /* size */, GL_UNSIGNED_INT /* type */, 0 /* stride */,
15499								0 /* offset */);
15500		GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribIPointer");
15501		break;
15502	default:
15503		DE_ASSERT(0);
15504		break;
15505	}
15506
15507	/* Enable attribute */
15508	for (GLuint col = 0; col < test_case.m_n_cols; ++col)
15509	{
15510		gl.enableVertexAttribArray(variable_loc + col);
15511		GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray");
15512	}
15513}
15514
15515/** Prepare test cases
15516 *
15517 * @return true
15518 **/
15519bool LengthOfVectorAndMatrixTest::testInit()
15520{
15521	/* Vectors */
15522	for (GLuint row = 2; row <= 4; ++row)
15523	{
15524		testCase test_case = { Utils::UINT, 1 /* n_cols */, row };
15525
15526		m_test_cases.push_back(test_case);
15527	}
15528
15529	for (GLuint row = 2; row <= 4; ++row)
15530	{
15531		testCase test_case = { Utils::INT, 1 /* n_cols */, row };
15532
15533		m_test_cases.push_back(test_case);
15534	}
15535
15536	for (GLuint row = 2; row <= 4; ++row)
15537	{
15538		testCase test_case = { Utils::FLOAT, 1 /* n_cols */, row };
15539
15540		m_test_cases.push_back(test_case);
15541	}
15542
15543	/* Matrices */
15544	for (GLuint col = 2; col <= 4; ++col)
15545	{
15546		for (GLuint row = 2; row <= 4; ++row)
15547		{
15548			testCase test_case = { Utils::FLOAT, col, row };
15549
15550			m_test_cases.push_back(test_case);
15551		}
15552	}
15553
15554	return true;
15555}
15556
15557/** Get string representing value that should be placed at token EXPECTED_VALUE
15558 *
15559 * @param in_stage Shader stage
15560 *
15561 * @return String with value
15562 **/
15563std::string LengthOfVectorAndMatrixTest::getExpectedValue(Utils::SHADER_STAGES in_stage)
15564{
15565	const testCase& test_case = m_test_cases[m_current_test_case_index];
15566
15567	GLuint count = 0;
15568
15569	switch (in_stage)
15570	{
15571	case Utils::FRAGMENT_SHADER:
15572		count = 3;
15573		break;
15574	case Utils::COMPUTE_SHADER:
15575		count = 2;
15576		break;
15577	default:
15578		count = 4;
15579	}
15580
15581	if (1 == test_case.m_n_cols)
15582	{
15583		count *= test_case.m_n_rows;
15584	}
15585	else
15586	{
15587		count *= test_case.m_n_cols;
15588	}
15589
15590	std::string expected_value;
15591	expected_value.resize(64, 0);
15592
15593	switch (test_case.m_type)
15594	{
15595	case Utils::FLOAT:
15596	{
15597		GLfloat value = 0.125f * (GLfloat)count;
15598		sprintf(&expected_value[0], "%f", value);
15599	}
15600	break;
15601	case Utils::INT:
15602	{
15603		GLint value = -1 * (GLint)count;
15604		sprintf(&expected_value[0], "%d", value);
15605	}
15606	break;
15607	case Utils::UINT:
15608	{
15609		GLuint value = 1 * (GLuint)count;
15610		sprintf(&expected_value[0], "%d", value);
15611	}
15612	break;
15613	default:
15614		DE_ASSERT(0);
15615		break;
15616	}
15617
15618	return expected_value;
15619}
15620
15621/** Get string reresenting initialization of local variables for current test case
15622 *
15623 * @return String with initialization
15624 **/
15625std::string LengthOfVectorAndMatrixTest::getInitialization()
15626{
15627	const testCase& test_case = m_test_cases[m_current_test_case_index];
15628
15629	std::string initialization;
15630
15631	if (1 == test_case.m_n_cols)
15632	{
15633		initialization = getVectorInitializer(test_case.m_type, test_case.m_n_rows);
15634	}
15635	else
15636	{
15637		initialization = getMatrixInitializer(test_case.m_n_cols, test_case.m_n_rows);
15638	}
15639
15640	return initialization;
15641}
15642
15643/** Get string reresenting initialization of local matrix variables
15644 *
15645 * @param n_cols Number of columns
15646 * @param n_rows Number of rows
15647 *
15648 * @return String with initialization
15649 **/
15650std::string LengthOfVectorAndMatrixTest::getMatrixInitializer(GLuint n_cols, GLuint n_rows)
15651{
15652	std::string result;
15653
15654	result.append("{ ");
15655
15656	for (GLuint col = 0; col < n_cols; ++col)
15657	{
15658		result.append(getVectorInitializer(Utils::FLOAT, n_rows));
15659
15660		if (col + 1 < n_cols)
15661		{
15662			result.append(", ");
15663		}
15664	}
15665
15666	result.append(" }");
15667
15668	return result;
15669}
15670
15671/** Get string reresenting initialization of local vector variables
15672 *
15673 * @param type   Basic type of vector
15674 * @param n_rows Number of rows
15675 *
15676 * @return String with initialization
15677 **/
15678std::string LengthOfVectorAndMatrixTest::getVectorInitializer(Utils::TYPES type, glw::GLuint n_rows)
15679{
15680	std::string   result;
15681	const GLchar* value = 0;
15682
15683	switch (type)
15684	{
15685	case Utils::FLOAT:
15686		value = "0.125";
15687		break;
15688	case Utils::UINT:
15689		value = "1";
15690		break;
15691	case Utils::INT:
15692		value = "-1";
15693		break;
15694	default:
15695		TCU_FAIL("Invalid enum");
15696	}
15697
15698	result.append("{");
15699
15700	for (GLuint row = 0; row < n_rows; ++row)
15701	{
15702		result.append(value);
15703
15704		if (row + 1 < n_rows)
15705		{
15706			result.append(", ");
15707		}
15708	}
15709
15710	result.append("}");
15711
15712	return result;
15713}
15714
15715/** Prepare source for given shader stage
15716 *
15717 * @param in_stage           Shader stage, compute shader will use 430
15718 * @param in_use_version_400 Select if 400 or 420 should be used
15719 * @param out_source         Prepared shader source instance
15720 **/
15721void LengthOfVectorAndMatrixTest::prepareDrawShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
15722														  Utils::shaderSource& out_source)
15723{
15724	static const GLchar* verification_snippet =
15725		"    VARIABLE_TYPE variable  = INITIALIZATION;\n"
15726		"    Structure     structure = { { 0, 1, 0, 1 } , INITIALIZATION };\n"
15727		"\n"
15728		"    const uint variable_length           = variable.length();\n"
15729		"    const uint structure_member_b_length = structure.member_b.length();\n"
15730		"    const uint input_member_length       = INPUT_VARIABLE_NAME.length();\n"
15731		"#ifndef FRAGMENT\n"
15732		"    const uint output_member_length      = OUTPUT_VARIABLE_NAME.length();\n"
15733		"#endif // FRAGMENT\n"
15734		"\n"
15735		"    BASE_TYPE array_var[variable.length()];\n"
15736		"    BASE_TYPE array_str[structure.member_b.length()];\n"
15737		"    BASE_TYPE array_in [INPUT_VARIABLE_NAME.length()];\n"
15738		"#ifndef FRAGMENT\n"
15739		"    BASE_TYPE array_out[OUTPUT_VARIABLE_NAME.length()];\n"
15740		"#endif // FRAGMENT\n"
15741		"\n"
15742		"    BASE_TYPE sum = 0;\n"
15743		"\n"
15744		"    for (uint i = 0; i < variable_length; ++i)\n"
15745		"    {\n"
15746		"        array_var[i] = variableARRAY_INDEX.x;\n"
15747		"    }\n"
15748		"\n"
15749		"    for (uint i = 0; i < structure_member_b_length; ++i)\n"
15750		"    {\n"
15751		"        array_str[i] = structure.member_bARRAY_INDEX.y;\n"
15752		"    }\n"
15753		"\n"
15754		"    for (uint i = 0; i < input_member_length; ++i)\n"
15755		"    {\n"
15756		"        array_in[i]  = INPUT_VARIABLE_NAMEARRAY_INDEX.x;\n"
15757		"    }\n"
15758		"\n"
15759		"#ifndef FRAGMENT\n"
15760		"    for (uint i = 0; i < output_member_length; ++i)\n"
15761		"    {\n"
15762		"        array_out[i] = INPUT_VARIABLE_NAMEARRAY_INDEX.y;\n"
15763		"    }\n"
15764		"#endif // FRAGMENT\n"
15765		"\n"
15766		"    for (uint i = 0; i < array_var.length(); ++i)\n"
15767		"    {\n"
15768		"         sum += array_var[i];\n"
15769		"    }\n"
15770		"\n"
15771		"    for (uint i = 0; i < array_str.length(); ++i)\n"
15772		"    {\n"
15773		"         sum += array_str[i];\n"
15774		"    }\n"
15775		"\n"
15776		"    for (uint i = 0; i < array_in.length(); ++i)\n"
15777		"    {\n"
15778		"         sum += array_in[i];\n"
15779		"    }\n"
15780		"\n"
15781		"#ifndef FRAGMENT\n"
15782		"    for (uint i = 0; i < array_out.length(); ++i)\n"
15783		"    {\n"
15784		"         sum += array_out[i];\n"
15785		"    }\n"
15786		"#endif // FRAGMENT\n"
15787		"\n"
15788		"    if (EXPECTED_VALUE != sum)\n"
15789		"    {\n"
15790		"        result = vec4(1, 0, 0, 1);\n"
15791		"    }\n";
15792
15793	static const GLchar* fragment_shader_template = "VERSION\n"
15794													"\n"
15795													"#define FRAGMENT\n"
15796													"\n"
15797													"in  vec4 gs_fs_result;\n"
15798													"out vec4 fs_out_result;\n"
15799													"\n"
15800													"in GSOutputBlock {\n"
15801													"    VARIABLE_DECLARATION;\n"
15802													"} input_block;\n"
15803													"\n"
15804													"struct Structure {\n"
15805													"    vec4 member_a;\n"
15806													"    TYPE_NAME member_b;\n"
15807													"};\n"
15808													"\n"
15809													"void main()\n"
15810													"{\n"
15811													"    vec4 result = vec4(0, 1, 0, 1);\n"
15812													"\n"
15813													"VERIFICATION"
15814													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
15815													"    {\n"
15816													"         result = vec4(1, 0, 0, 1);\n"
15817													"    }\n"
15818													"\n"
15819													"    fs_out_result = result;\n"
15820													"}\n"
15821													"\n";
15822
15823	static const GLchar* geometry_shader_template = "VERSION\n"
15824													"\n"
15825													"layout(points)                           in;\n"
15826													"layout(triangle_strip, max_vertices = 4) out;\n"
15827													"\n"
15828													"in  vec4 tes_gs_result[];\n"
15829													"out vec4 gs_fs_result;\n"
15830													"\n"
15831													"in TCSOutputBlock {\n"
15832													"    VARIABLE_DECLARATION;\n"
15833													"} input_block[];\n"
15834													"out GSOutputBlock {\n"
15835													"    VARIABLE_DECLARATION;\n"
15836													"} output_block;\n"
15837													"\n"
15838													"struct Structure {\n"
15839													"    vec4 member_a;\n"
15840													"    TYPE_NAME member_b;\n"
15841													"};\n"
15842													"\n"
15843													"void main()\n"
15844													"{\n"
15845													"    vec4 result = vec4(0, 1, 0, 1);\n"
15846													"\n"
15847													"VERIFICATION"
15848													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
15849													"    {\n"
15850													"         result = vec4(1, 0, 0, 1);\n"
15851													"    }\n"
15852													"\n"
15853													"    gs_fs_result  = result;\n"
15854													"    gl_Position   = vec4(-1, -1, 0, 1);\n"
15855													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15856													"    EmitVertex();\n"
15857													"    gs_fs_result  = result;\n"
15858													"    gl_Position   = vec4(-1, 1, 0, 1);\n"
15859													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15860													"    EmitVertex();\n"
15861													"    gs_fs_result  = result;\n"
15862													"    gl_Position   = vec4(1, -1, 0, 1);\n"
15863													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15864													"    EmitVertex();\n"
15865													"    gs_fs_result  = result;\n"
15866													"    gl_Position   = vec4(1, 1, 0, 1);\n"
15867													"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15868													"    EmitVertex();\n"
15869													"}\n"
15870													"\n";
15871
15872	static const GLchar* tess_ctrl_shader_template =
15873		"VERSION\n"
15874		"\n"
15875		"layout(vertices = 1) out;\n"
15876		"\n"
15877		"in  vec4 vs_tcs_result[];\n"
15878		"out vec4 tcs_tes_result[];\n"
15879		"\n"
15880		"in VSOutputBlock {\n"
15881		"    VARIABLE_DECLARATION;\n"
15882		"} input_block[];\n"
15883		"out TCSOutputBlock {\n"
15884		"    VARIABLE_DECLARATION;\n"
15885		"} output_block[];\n"
15886		"\n"
15887		"struct Structure {\n"
15888		"    vec4 member_a;\n"
15889		"    TYPE_NAME member_b;\n"
15890		"};\n"
15891		"\n"
15892		"void main()\n"
15893		"{\n"
15894		"    vec4 result = vec4(0, 1, 0, 1);\n"
15895		"\n"
15896		"VERIFICATION"
15897		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
15898		"    {\n"
15899		"         result = vec4(1, 0, 0, 1);\n"
15900		"    }\n"
15901		"\n"
15902		"    tcs_tes_result[gl_InvocationID] = result;\n"
15903		"    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15904		"\n"
15905		"    gl_TessLevelOuter[0] = 1.0;\n"
15906		"    gl_TessLevelOuter[1] = 1.0;\n"
15907		"    gl_TessLevelOuter[2] = 1.0;\n"
15908		"    gl_TessLevelOuter[3] = 1.0;\n"
15909		"    gl_TessLevelInner[0] = 1.0;\n"
15910		"    gl_TessLevelInner[1] = 1.0;\n"
15911		"}\n"
15912		"\n";
15913
15914	static const GLchar* tess_eval_shader_template = "VERSION\n"
15915													 "\n"
15916													 "layout(isolines, point_mode) in;\n"
15917													 "\n"
15918													 "in  vec4 tcs_tes_result[];\n"
15919													 "out vec4 tes_gs_result;\n"
15920													 "\n"
15921													 "in TCSOutputBlock {\n"
15922													 "    VARIABLE_DECLARATION;\n"
15923													 "} input_block[];\n"
15924													 "out TCSOutputBlock {\n"
15925													 "    VARIABLE_DECLARATION;\n"
15926													 "} output_block;\n"
15927													 "\n"
15928													 "struct Structure {\n"
15929													 "    vec4 member_a;\n"
15930													 "    TYPE_NAME member_b;\n"
15931													 "};\n"
15932													 "\n"
15933													 "void main()\n"
15934													 "{\n"
15935													 "    vec4 result = vec4(0, 1, 0, 1);\n"
15936													 "\n"
15937													 "VERIFICATION"
15938													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
15939													 "    {\n"
15940													 "         result = vec4(1, 0, 0, 1);\n"
15941													 "    }\n"
15942													 "\n"
15943													 "    tes_gs_result = result;\n"
15944													 "    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15945													 "}\n"
15946													 "\n";
15947
15948	static const GLchar* vertex_shader_template = "VERSION\n"
15949												  "\n"
15950												  "out vec4 vs_tcs_result;\n"
15951												  "\n"
15952												  "in VARIABLE_DECLARATION;\n"
15953												  "out VSOutputBlock {\n"
15954												  "    VARIABLE_DECLARATION;\n"
15955												  "} output_block;\n"
15956												  "\n"
15957												  "struct Structure {\n"
15958												  "    vec4 member_a;\n"
15959												  "    TYPE_NAME member_b;\n"
15960												  "};\n"
15961												  "\n"
15962												  "void main()\n"
15963												  "{\n"
15964												  "    vec4 result = vec4(0, 1, 0, 1);\n"
15965												  "\n"
15966												  "VERIFICATION"
15967												  "\n"
15968												  "    vs_tcs_result = result;\n"
15969												  "    OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n"
15970												  "}\n"
15971												  "\n";
15972
15973	const GLchar*   array_index		  = "";
15974	const testCase& test_case		  = m_test_cases[m_current_test_case_index];
15975	const GLchar*   shader_template   = 0;
15976	const GLchar*   input_block_name  = "input_block";
15977	const GLchar*   output_block_name = "output_block";
15978
15979	const std::string& base_type_name = Utils::getTypeName(test_case.m_type, 1 /* cols */, 1 /* rows */);
15980	const std::string& expected_value = getExpectedValue(in_stage);
15981	const std::string& initialization = getInitialization();
15982	const std::string& type_name	  = Utils::getTypeName(test_case.m_type, test_case.m_n_cols, test_case.m_n_rows);
15983
15984	std::string input_decl;
15985	std::string input_ref;
15986	std::string output_decl;
15987	std::string output_ref;
15988
15989	Utils::qualifierSet in_qualifiers;
15990	Utils::qualifierSet out_qualifiers;
15991
15992	if ((Utils::UINT == test_case.m_type) || (Utils::INT == test_case.m_type))
15993	{
15994		if (Utils::VERTEX_SHADER != in_stage)
15995		{
15996			in_qualifiers.push_back(Utils::QUAL_FLAT);
15997		}
15998
15999		out_qualifiers.push_back(Utils::QUAL_FLAT);
16000	}
16001
16002	switch (in_stage)
16003	{
16004	case Utils::COMPUTE_SHADER:
16005		shader_template = 0;
16006		break;
16007	case Utils::FRAGMENT_SHADER:
16008		shader_template = fragment_shader_template;
16009		break;
16010	case Utils::GEOMETRY_SHADER:
16011		shader_template = geometry_shader_template;
16012		break;
16013	case Utils::TESS_CTRL_SHADER:
16014		shader_template = tess_ctrl_shader_template;
16015		break;
16016	case Utils::TESS_EVAL_SHADER:
16017		shader_template = tess_eval_shader_template;
16018		break;
16019	case Utils::VERTEX_SHADER:
16020		shader_template = vertex_shader_template;
16021		break;
16022	default:
16023		TCU_FAIL("Invalid enum");
16024	}
16025
16026	if (Utils::VERTEX_SHADER != in_stage)
16027	{
16028		Utils::prepareBlockVariableStrings(in_stage, Utils::INPUT, in_qualifiers, type_name.c_str(), "variable",
16029										   input_block_name, input_decl, input_ref);
16030	}
16031	else
16032	{
16033		Utils::prepareVariableStrings(in_stage, Utils::INPUT, in_qualifiers, type_name.c_str(), "variable", input_decl,
16034									  input_ref);
16035	}
16036	if (Utils::FRAGMENT_SHADER != in_stage)
16037	{
16038		Utils::prepareBlockVariableStrings(in_stage, Utils::OUTPUT, out_qualifiers, type_name.c_str(), "variable",
16039										   output_block_name, output_decl, output_ref);
16040	}
16041	else
16042	{
16043		Utils::prepareVariableStrings(in_stage, Utils::OUTPUT, out_qualifiers, type_name.c_str(), "variable",
16044									  output_decl, output_ref);
16045	}
16046
16047	if (1 != test_case.m_n_cols)
16048	{
16049		array_index = "[i]";
16050	}
16051
16052	out_source.m_parts[0].m_code = shader_template;
16053
16054	size_t position = 0;
16055	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
16056						out_source.m_parts[0].m_code);
16057
16058	Utils::replaceToken("VARIABLE_DECLARATION", position, input_decl.c_str(), out_source.m_parts[0].m_code);
16059
16060	if (Utils::FRAGMENT_SHADER != in_stage)
16061	{
16062		Utils::replaceToken("VARIABLE_DECLARATION", position, output_decl.c_str(), out_source.m_parts[0].m_code);
16063	}
16064
16065	Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code);
16066
16067	size_t temp = position;
16068
16069	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
16070
16071	position = temp;
16072
16073	Utils::replaceToken("VARIABLE_TYPE", position, type_name.c_str(), out_source.m_parts[0].m_code);
16074
16075	Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code);
16076
16077	Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code);
16078
16079	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16080
16081	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16082
16083	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16084
16085	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16086
16087	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16088
16089	Utils::replaceToken("EXPECTED_VALUE", position, expected_value.c_str(), out_source.m_parts[0].m_code);
16090
16091	Utils::replaceAllTokens("INPUT_VARIABLE_NAME", input_ref.c_str(), out_source.m_parts[0].m_code);
16092
16093	Utils::replaceAllTokens("OUTPUT_VARIABLE_NAME", output_ref.c_str(), out_source.m_parts[0].m_code);
16094
16095	Utils::replaceAllTokens("ARRAY_INDEX", array_index, out_source.m_parts[0].m_code);
16096}
16097
16098/** Prepare source for compute shader stage
16099 *
16100 * @param out_source Prepared shader source instance
16101 **/
16102void LengthOfVectorAndMatrixTest::prepareComputeShaderSource(Utils::shaderSource& out_source)
16103{
16104	static const GLchar* verification_snippet =
16105		"    VARIABLE_TYPE variable  = uni_variable;\n"
16106		"    Structure     structure = { { 0, 1, 0, 1 } , uni_variable };\n"
16107		"\n"
16108		"    const uint variable_length           = variable.length();\n"
16109		"    const uint structure_member_b_length = structure.member_b.length();\n"
16110		"\n"
16111		"    BASE_TYPE array_var[variable.length()];\n"
16112		"    BASE_TYPE array_str[structure.member_b.length()];\n"
16113		"\n"
16114		"    BASE_TYPE sum = 0;\n"
16115		"\n"
16116		"    for (uint i = 0; i < variable_length; ++i)\n"
16117		"    {\n"
16118		"        array_var[i] = variableARRAY_INDEX.x;\n"
16119		"    }\n"
16120		"\n"
16121		"    for (uint i = 0; i < structure_member_b_length; ++i)\n"
16122		"    {\n"
16123		"        array_str[i] = structure.member_bARRAY_INDEX.y;\n"
16124		"    }\n"
16125		"\n"
16126		"    for (uint i = 0; i < array_var.length(); ++i)\n"
16127		"    {\n"
16128		"         sum += array_var[i];\n"
16129		"    }\n"
16130		"\n"
16131		"    for (uint i = 0; i < array_str.length(); ++i)\n"
16132		"    {\n"
16133		"         sum += array_str[i];\n"
16134		"    }\n"
16135		"\n"
16136		"    if (EXPECTED_VALUE != sum)\n"
16137		"    {\n"
16138		"        result = vec4(1, 0, 0, 1);\n"
16139		"    }\n";
16140
16141	static const GLchar* compute_shader_template =
16142		"VERSION\n"
16143		"\n"
16144		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
16145		"\n"
16146		"writeonly uniform image2D uni_image;\n"
16147		"          uniform TYPE_NAME    uni_variable;\n"
16148		"\n"
16149		"struct Structure {\n"
16150		"    vec4 member_a;\n"
16151		"    TYPE_NAME member_b;\n"
16152		"};\n"
16153		"\n"
16154		"void main()\n"
16155		"{\n"
16156		"    vec4 result = vec4(0, 1, 0, 1);\n"
16157		"\n"
16158		"VERIFICATION"
16159		"\n"
16160		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
16161		"}\n"
16162		"\n";
16163
16164	const testCase& test_case   = m_test_cases[m_current_test_case_index];
16165	const GLchar*   array_index = "";
16166
16167	const std::string& base_type_name = Utils::getTypeName(test_case.m_type, 1 /* cols */, 1 /* rows */);
16168	const std::string& expected_value = getExpectedValue(Utils::COMPUTE_SHADER);
16169	const std::string& type_name	  = Utils::getTypeName(test_case.m_type, test_case.m_n_cols, test_case.m_n_rows);
16170
16171	if (1 != test_case.m_n_cols)
16172	{
16173		array_index = "[i]";
16174	}
16175
16176	out_source.m_parts[0].m_code = compute_shader_template;
16177
16178	size_t position = 0;
16179	Utils::replaceToken("VERSION", position, getVersionString(Utils::COMPUTE_SHADER, false),
16180						out_source.m_parts[0].m_code);
16181
16182	Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code);
16183
16184	Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code);
16185
16186	size_t temp = position;
16187
16188	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
16189
16190	position = temp;
16191
16192	Utils::replaceToken("VARIABLE_TYPE", position, type_name.c_str(), out_source.m_parts[0].m_code);
16193
16194	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16195
16196	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16197
16198	Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code);
16199
16200	Utils::replaceToken("ARRAY_INDEX", position, array_index, out_source.m_parts[0].m_code);
16201
16202	Utils::replaceToken("ARRAY_INDEX", position, array_index, out_source.m_parts[0].m_code);
16203
16204	Utils::replaceToken("EXPECTED_VALUE", position, expected_value.c_str(), out_source.m_parts[0].m_code);
16205}
16206
16207/** Constructor
16208 *
16209 * @param context Test context
16210 **/
16211LengthOfComputeResultTest::LengthOfComputeResultTest(deqp::Context& context)
16212	: GLSLTestBase(context, "length_of_compute_result", "Test verifies .length() for results of computation")
16213{
16214	/* Nothing to be done here */
16215}
16216
16217/** Prepare source for given shader stage
16218 *
16219 * @param in_stage           Shader stage, compute shader will use 430
16220 * @param in_use_version_400 Select if 400 or 420 should be used
16221 * @param out_source         Prepared shader source instance
16222 **/
16223void LengthOfComputeResultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
16224													Utils::shaderSource& out_source)
16225{
16226	static const GLchar* uniforms = "uniform mat2x4 goten;\n"
16227									"uniform uvec4  indices;\n"
16228									"uniform uvec4  expected_lengths;\n"
16229									"uniform mat4x3 gohan;\n"
16230									"uniform vec3   vegeta;\n"
16231									"uniform vec3   trunks;\n"
16232									"uniform uint   variable;\n"
16233									"uniform float  expected_sum;\n";
16234
16235	static const GLchar* verification_snippet =
16236		"    uint lengths[4];\n"
16237		"    float x[(gohan * goten).length()];\n"
16238		"    float y[(gohan * goten)[variable - 1].length()];\n"
16239		"\n"
16240		"    lengths[indices.x] = gohan[variable].length();\n"
16241		"    lengths[indices.y] = (gohan * goten).length();\n"
16242		"    lengths[indices.z] = (gohan * goten)[variable].length();\n"
16243		"    lengths[indices.w] = (vegeta * trunks).length();\n"
16244		"\n"
16245		"    float  dot_result = dot(vegeta, trunks);\n"
16246		"    mat2x3 mul_result = gohan * goten;\n"
16247		"\n"
16248		"#ifdef TESS_CTRL\n"
16249		"    const uint position_length        = gl_out[gl_InvocationID].gl_Position.length();\n"
16250		"#endif\n"
16251		"#ifndef COMPUTE\n"
16252		"#ifndef FRAGMENT\n"
16253		"#ifndef TESS_CTRL\n"
16254		"    const uint position_length        = gl_Position.length();\n"
16255		"#endif  /*TESS_CTRL */\n"
16256		"#endif /* FRAGMENT */\n"
16257		"#endif /* COMPUTE */\n"
16258		"#ifdef FRAGMENT\n"
16259		"    const uint point_coord_length     = gl_PointCoord.length();\n"
16260		"    const uint sample_position_length = gl_SamplePosition.length();\n"
16261		"#endif /* FRAGMENT */\n"
16262		"    const uint outer_length           = outerProduct(vegeta, trunks).length();\n"
16263		"\n"
16264		"    for (uint i = 0; i < x.length(); ++i)\n"
16265		"    {\n"
16266		"        x[i] = mul_result[i].x;\n"
16267		"    }\n"
16268		"\n"
16269		"    for (uint i = 0; i < y.length(); ++i)\n"
16270		"    {\n"
16271		"        y[i] = mul_result[0][i];\n"
16272		"    }\n"
16273		"\n"
16274		"    if ( (expected_lengths.x != lengths[0])                   ||\n"
16275		"         (expected_lengths.y != lengths[1])                   ||\n"
16276		"         (expected_lengths.z != lengths[2])                   ||\n"
16277		"         (expected_lengths.w != lengths[3])                   ||\n"
16278		"#ifndef COMPUTE\n"
16279		"#ifndef FRAGMENT\n"
16280		"         (4 /* vec4 */       != position_length)              ||\n"
16281		"#endif /* FRAGMENT */\n"
16282		"#endif /* COMPUTE */\n"
16283		"#ifdef FRAGMENT\n"
16284		"         (2 /* vec2 */       != point_coord_length)           ||\n"
16285		"         (2 /* vec2 */       != sample_position_length)       ||\n"
16286		"#endif /* FRAGMENT */\n"
16287		"         (0.5                != dot_result)                   ||\n"
16288		"         (3 /* mat3 */       != outer_length)                 ||\n"
16289		"         (expected_sum       != x[variable] + y[variable])    )\n"
16290		"    {\n"
16291		"        result = vec4(1, 0, 0, 1);\n"
16292		"    }\n";
16293
16294	static const GLchar* compute_shader_template =
16295		"VERSION\n"
16296		"\n"
16297		"#define COMPUTE\n"
16298		"\n"
16299		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
16300		"\n"
16301		"writeonly uniform image2D uni_image;\n"
16302		"\n"
16303		"UNIFORMS"
16304		"\n"
16305		"void main()\n"
16306		"{\n"
16307		"    vec4 result = vec4(0, 1, 0, 1);\n"
16308		"\n"
16309		"VERIFICATION"
16310		"\n"
16311		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
16312		"}\n"
16313		"\n";
16314
16315	static const GLchar* fragment_shader_template = "VERSION\n"
16316													"\n"
16317													"#define FRAGMENT\n"
16318													"\n"
16319													"in  vec4 gs_fs_result;\n"
16320													"out vec4 fs_out_result;\n"
16321													"\n"
16322													"UNIFORMS"
16323													"\n"
16324													"void main()\n"
16325													"{\n"
16326													"    vec4 result = vec4(0, 1, 0, 1);\n"
16327													"\n"
16328													"VERIFICATION"
16329													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
16330													"    {\n"
16331													"         result = vec4(1, 0, 0, 1);\n"
16332													"    }\n"
16333													"\n"
16334													"    fs_out_result = result;\n"
16335													"}\n"
16336													"\n";
16337
16338	static const GLchar* geometry_shader_template = "VERSION\n"
16339													"\n"
16340													"layout(points)                           in;\n"
16341													"layout(triangle_strip, max_vertices = 4) out;\n"
16342													"\n"
16343													"in  vec4 tes_gs_result[];\n"
16344													"out vec4 gs_fs_result;\n"
16345													"\n"
16346													"UNIFORMS"
16347													"\n"
16348													"void main()\n"
16349													"{\n"
16350													"    vec4 result = vec4(0, 1, 0, 1);\n"
16351													"\n"
16352													"VERIFICATION"
16353													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
16354													"    {\n"
16355													"         result = vec4(1, 0, 0, 1);\n"
16356													"    }\n"
16357													"\n"
16358													"    gs_fs_result  = result;\n"
16359													"    gl_Position   = vec4(-1, -1, 0, 1);\n"
16360													"    EmitVertex();\n"
16361													"    gs_fs_result  = result;\n"
16362													"    gl_Position   = vec4(-1, 1, 0, 1);\n"
16363													"    EmitVertex();\n"
16364													"    gs_fs_result  = result;\n"
16365													"    gl_Position   = vec4(1, -1, 0, 1);\n"
16366													"    EmitVertex();\n"
16367													"    gs_fs_result  = result;\n"
16368													"    gl_Position   = vec4(1, 1, 0, 1);\n"
16369													"    EmitVertex();\n"
16370													"}\n"
16371													"\n";
16372
16373	static const GLchar* tess_ctrl_shader_template =
16374		"VERSION\n"
16375		"#define TESS_CTRL\n"
16376		"\n"
16377		"layout(vertices = 1) out;\n"
16378		"\n"
16379		"in  vec4 vs_tcs_result[];\n"
16380		"out vec4 tcs_tes_result[];\n"
16381		"\n"
16382		"UNIFORMS"
16383		"\n"
16384		"void main()\n"
16385		"{\n"
16386		"    vec4 result = vec4(0, 1, 0, 1);\n"
16387		"\n"
16388		"VERIFICATION"
16389		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
16390		"    {\n"
16391		"         result = vec4(1, 0, 0, 1);\n"
16392		"    }\n"
16393		"\n"
16394		"    tcs_tes_result[gl_InvocationID] = result;\n"
16395		"\n"
16396		"    gl_TessLevelOuter[0] = 1.0;\n"
16397		"    gl_TessLevelOuter[1] = 1.0;\n"
16398		"    gl_TessLevelOuter[2] = 1.0;\n"
16399		"    gl_TessLevelOuter[3] = 1.0;\n"
16400		"    gl_TessLevelInner[0] = 1.0;\n"
16401		"    gl_TessLevelInner[1] = 1.0;\n"
16402		"}\n"
16403		"\n";
16404
16405	static const GLchar* tess_eval_shader_template = "VERSION\n"
16406													 "\n"
16407													 "layout(isolines, point_mode) in;\n"
16408													 "\n"
16409													 "in  vec4 tcs_tes_result[];\n"
16410													 "out vec4 tes_gs_result;\n"
16411													 "\n"
16412													 "UNIFORMS"
16413													 "\n"
16414													 "void main()\n"
16415													 "{\n"
16416													 "    vec4 result = vec4(0, 1, 0, 1);\n"
16417													 "\n"
16418													 "VERIFICATION"
16419													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
16420													 "    {\n"
16421													 "         result = vec4(1, 0, 0, 1);\n"
16422													 "    }\n"
16423													 "\n"
16424													 "    tes_gs_result = result;\n"
16425													 "}\n"
16426													 "\n";
16427
16428	static const GLchar* vertex_shader_template = "VERSION\n"
16429												  "\n"
16430												  "out vec4 vs_tcs_result;\n"
16431												  "\n"
16432												  "UNIFORMS"
16433												  "\n"
16434												  "void main()\n"
16435												  "{\n"
16436												  "    vec4 result = vec4(0, 1, 0, 1);\n"
16437												  "\n"
16438												  "VERIFICATION"
16439												  "\n"
16440												  "    vs_tcs_result = result;\n"
16441												  "}\n"
16442												  "\n";
16443
16444	const GLchar* shader_template = 0;
16445
16446	switch (in_stage)
16447	{
16448	case Utils::COMPUTE_SHADER:
16449		shader_template = compute_shader_template;
16450		break;
16451	case Utils::FRAGMENT_SHADER:
16452		shader_template = fragment_shader_template;
16453		break;
16454	case Utils::GEOMETRY_SHADER:
16455		shader_template = geometry_shader_template;
16456		break;
16457	case Utils::TESS_CTRL_SHADER:
16458		shader_template = tess_ctrl_shader_template;
16459		break;
16460	case Utils::TESS_EVAL_SHADER:
16461		shader_template = tess_eval_shader_template;
16462		break;
16463	case Utils::VERTEX_SHADER:
16464		shader_template = vertex_shader_template;
16465		break;
16466	default:
16467		TCU_FAIL("Invalid enum");
16468	}
16469
16470	out_source.m_parts[0].m_code = shader_template;
16471
16472	size_t position = 0;
16473	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
16474						out_source.m_parts[0].m_code);
16475
16476	Utils::replaceToken("UNIFORMS", position, uniforms, out_source.m_parts[0].m_code);
16477
16478	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
16479}
16480
16481/** Overwritte of prepareUniforms method
16482 *
16483 * @param program Current program
16484 **/
16485void LengthOfComputeResultTest::prepareUniforms(Utils::program& program)
16486{
16487	static const GLfloat gohan_data[12] = { 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f,
16488											0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f };
16489
16490	static const GLfloat goten_data[8] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
16491
16492	static const GLfloat vegeta_data[3] = { 0.5f, 0.5f, 0.0f };
16493
16494	static const GLfloat trunks_data[3] = { 0.5f, 0.5f, 0.0f };
16495
16496	static const GLuint indices_data[4] = { 2, 1, 0, 3 };
16497
16498	static const GLuint variable_data[1] = { 1 };
16499
16500	static const GLuint expected_lengths_data[4] = { 3, 2, 3, 3 };
16501
16502	static const GLfloat expected_sum_data[1] = { 1.0f };
16503
16504	program.uniform("gohan", Utils::FLOAT, 4 /* n_cols */, 3 /* n_rows */, gohan_data);
16505	program.uniform("goten", Utils::FLOAT, 2 /* n_cols */, 4 /* n_rows */, goten_data);
16506	program.uniform("vegeta", Utils::FLOAT, 1 /* n_cols */, 3 /* n_rows */, vegeta_data);
16507	program.uniform("trunks", Utils::FLOAT, 1 /* n_cols */, 3 /* n_rows */, trunks_data);
16508	program.uniform("indices", Utils::UINT, 1 /* n_cols */, 4 /* n_rows */, indices_data);
16509	program.uniform("variable", Utils::UINT, 1 /* n_cols */, 1 /* n_rows */, variable_data);
16510	program.uniform("expected_lengths", Utils::UINT, 1 /* n_cols */, 4 /* n_rows */, expected_lengths_data);
16511	program.uniform("expected_sum", Utils::FLOAT, 1 /* n_cols */, 1 /* n_rows */, expected_sum_data);
16512}
16513
16514/** Constructor
16515 *
16516 * @param context Test context
16517 **/
16518ScalarSwizzlersTest::ScalarSwizzlersTest(deqp::Context& context)
16519	: GLSLTestBase(context, "scalar_swizzlers", "Verifies that swizzlers can be used on scalars")
16520{
16521	/* Nothing to be done here */
16522}
16523
16524/** Prepare source for given shader stage
16525 *
16526 * @param in_stage           Shader stage, compute shader will use 430
16527 * @param in_use_version_400 Select if 400 or 420 should be used
16528 * @param out_source         Prepared shader source instance
16529 **/
16530void ScalarSwizzlersTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
16531											  Utils::shaderSource& out_source)
16532{
16533	static const GLchar* uniforms = "uniform float variable;\n"
16534									"uniform vec3  expected_values;\n";
16535
16536	static const GLchar* literal = "#define LITERAL 0.375\n";
16537
16538	static const GLchar* structure = "struct Structure {\n"
16539									 "    vec2 m_xx;\n"
16540									 "    vec3 m_xxx;\n"
16541									 "    vec4 m_xxxx;\n"
16542									 "    vec2 m_nested_xx;\n"
16543									 "    vec3 m_nested_xxx;\n"
16544									 "    vec4 m_nested_xxxx;\n"
16545									 "};\n";
16546
16547	static const GLchar* function = "bool check_values(in Structure structure, in float value)\n"
16548									"{\n"
16549									"    const vec2 xx   = vec2(value, value);\n"
16550									"    const vec3 xxx  = vec3(value, value, value);\n"
16551									"    const vec4 xxxx = vec4(value, value, value, value);\n"
16552									"\n"
16553									"    bool result = true;\n"
16554									"\n"
16555									"    if ((xx   != structure.m_xx)         ||\n"
16556									"        (xxx  != structure.m_xxx)        ||\n"
16557									"        (xxxx != structure.m_xxxx)       ||\n"
16558									"        (xx   != structure.m_nested_xx)  ||\n"
16559									"        (xxx  != structure.m_nested_xxx) ||\n"
16560									"        (xxxx != structure.m_nested_xxxx) )\n"
16561									"    {\n"
16562									"        result = false;\n"
16563									"    }\n"
16564									"\n"
16565									"    return result;\n"
16566									"}\n";
16567
16568	static const GLchar* verification_snippet =
16569		"    Structure literal_result;\n"
16570		"    Structure constant_result;\n"
16571		"    Structure variable_result;\n"
16572		"\n"
16573		"    literal_result.m_xx          = LITERAL.xx  ;\n"
16574		"    literal_result.m_xxx         = LITERAL.xxx ;\n"
16575		"    literal_result.m_xxxx        = LITERAL.xxxx;\n"
16576		"    literal_result.m_nested_xx   = LITERAL.x.rr.sss.rr  ;\n"
16577		"    literal_result.m_nested_xxx  = LITERAL.s.xx.rrr.xxx ;\n"
16578		"    literal_result.m_nested_xxxx = LITERAL.r.ss.xxx.ssss;\n"
16579		"\n"
16580		"    const float constant = 0.125;\n"
16581		"\n"
16582		"    constant_result.m_xx          = constant.xx  ;\n"
16583		"    constant_result.m_xxx         = constant.xxx ;\n"
16584		"    constant_result.m_xxxx        = constant.xxxx;\n"
16585		"    constant_result.m_nested_xx   = constant.x.rr.sss.rr  ;\n"
16586		"    constant_result.m_nested_xxx  = constant.s.xx.rrr.xxx ;\n"
16587		"    constant_result.m_nested_xxxx = constant.r.ss.xxx.ssss;\n"
16588		"\n"
16589		"    variable_result.m_xx          = variable.xx  ;\n"
16590		"    variable_result.m_xxx         = variable.xxx ;\n"
16591		"    variable_result.m_xxxx        = variable.xxxx;\n"
16592		"    variable_result.m_nested_xx   = variable.x.rr.sss.rr  ;\n"
16593		"    variable_result.m_nested_xxx  = variable.s.xx.rrr.xxx ;\n"
16594		"    variable_result.m_nested_xxxx = variable.r.ss.xxx.ssss;\n"
16595		"\n"
16596		"    if ((false == check_values(literal_result,  expected_values.x)) ||\n"
16597		"        (false == check_values(constant_result, expected_values.y)) ||\n"
16598		"        (false == check_values(variable_result, expected_values.z)) )\n"
16599		"    {\n"
16600		"        result = vec4(1, 0, 0, 1);\n"
16601		"    }\n";
16602
16603	static const GLchar* compute_shader_template =
16604		"VERSION\n"
16605		"\n"
16606		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
16607		"\n"
16608		"writeonly uniform image2D uni_image;\n"
16609		"\n"
16610		"STRUCTURE"
16611		"\n"
16612		"UNIFORMS"
16613		"\n"
16614		"FUNCTION"
16615		"\n"
16616		"LITERAL"
16617		"\n"
16618		"void main()\n"
16619		"{\n"
16620		"    vec4 result = vec4(0, 1, 0, 1);\n"
16621		"\n"
16622		"VERIFICATION"
16623		"\n"
16624		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
16625		"}\n"
16626		"\n";
16627
16628	static const GLchar* fragment_shader_template = "VERSION\n"
16629													"\n"
16630													"#define FRAGMENT\n"
16631													"\n"
16632													"in  vec4 gs_fs_result;\n"
16633													"out vec4 fs_out_result;\n"
16634													"\n"
16635													"STRUCTURE"
16636													"\n"
16637													"UNIFORMS"
16638													"\n"
16639													"FUNCTION"
16640													"\n"
16641													"LITERAL"
16642													"\n"
16643													"void main()\n"
16644													"{\n"
16645													"    vec4 result = vec4(0, 1, 0, 1);\n"
16646													"\n"
16647													"VERIFICATION"
16648													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
16649													"    {\n"
16650													"         result = vec4(1, 0, 0, 1);\n"
16651													"    }\n"
16652													"\n"
16653													"    fs_out_result = result;\n"
16654													"}\n"
16655													"\n";
16656
16657	static const GLchar* geometry_shader_template = "VERSION\n"
16658													"\n"
16659													"layout(points)                           in;\n"
16660													"layout(triangle_strip, max_vertices = 4) out;\n"
16661													"\n"
16662													"in  vec4 tes_gs_result[];\n"
16663													"out vec4 gs_fs_result;\n"
16664													"\n"
16665													"STRUCTURE"
16666													"\n"
16667													"UNIFORMS"
16668													"\n"
16669													"FUNCTION"
16670													"\n"
16671													"LITERAL"
16672													"\n"
16673													"void main()\n"
16674													"{\n"
16675													"    vec4 result = vec4(0, 1, 0, 1);\n"
16676													"\n"
16677													"VERIFICATION"
16678													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
16679													"    {\n"
16680													"         result = vec4(1, 0, 0, 1);\n"
16681													"    }\n"
16682													"\n"
16683													"    gs_fs_result  = result;\n"
16684													"    gl_Position   = vec4(-1, -1, 0, 1);\n"
16685													"    EmitVertex();\n"
16686													"    gs_fs_result  = result;\n"
16687													"    gl_Position   = vec4(-1, 1, 0, 1);\n"
16688													"    EmitVertex();\n"
16689													"    gs_fs_result  = result;\n"
16690													"    gl_Position   = vec4(1, -1, 0, 1);\n"
16691													"    EmitVertex();\n"
16692													"    gs_fs_result  = result;\n"
16693													"    gl_Position   = vec4(1, 1, 0, 1);\n"
16694													"    EmitVertex();\n"
16695													"}\n"
16696													"\n";
16697
16698	static const GLchar* tess_ctrl_shader_template =
16699		"VERSION\n"
16700		"\n"
16701		"layout(vertices = 1) out;\n"
16702		"\n"
16703		"in  vec4 vs_tcs_result[];\n"
16704		"out vec4 tcs_tes_result[];\n"
16705		"\n"
16706		"STRUCTURE"
16707		"\n"
16708		"UNIFORMS"
16709		"\n"
16710		"FUNCTION"
16711		"\n"
16712		"LITERAL"
16713		"\n"
16714		"void main()\n"
16715		"{\n"
16716		"    vec4 result = vec4(0, 1, 0, 1);\n"
16717		"\n"
16718		"VERIFICATION"
16719		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
16720		"    {\n"
16721		"         result = vec4(1, 0, 0, 1);\n"
16722		"    }\n"
16723		"\n"
16724		"    tcs_tes_result[gl_InvocationID] = result;\n"
16725		"\n"
16726		"    gl_TessLevelOuter[0] = 1.0;\n"
16727		"    gl_TessLevelOuter[1] = 1.0;\n"
16728		"    gl_TessLevelOuter[2] = 1.0;\n"
16729		"    gl_TessLevelOuter[3] = 1.0;\n"
16730		"    gl_TessLevelInner[0] = 1.0;\n"
16731		"    gl_TessLevelInner[1] = 1.0;\n"
16732		"}\n"
16733		"\n";
16734
16735	static const GLchar* tess_eval_shader_template = "VERSION\n"
16736													 "\n"
16737													 "layout(isolines, point_mode) in;\n"
16738													 "\n"
16739													 "in  vec4 tcs_tes_result[];\n"
16740													 "out vec4 tes_gs_result;\n"
16741													 "\n"
16742													 "STRUCTURE"
16743													 "\n"
16744													 "UNIFORMS"
16745													 "\n"
16746													 "FUNCTION"
16747													 "\n"
16748													 "LITERAL"
16749													 "\n"
16750													 "void main()\n"
16751													 "{\n"
16752													 "    vec4 result = vec4(0, 1, 0, 1);\n"
16753													 "\n"
16754													 "VERIFICATION"
16755													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
16756													 "    {\n"
16757													 "         result = vec4(1, 0, 0, 1);\n"
16758													 "    }\n"
16759													 "\n"
16760													 "    tes_gs_result = result;\n"
16761													 "}\n"
16762													 "\n";
16763
16764	static const GLchar* vertex_shader_template = "VERSION\n"
16765												  "\n"
16766												  "out vec4 vs_tcs_result;\n"
16767												  "\n"
16768												  "STRUCTURE"
16769												  "\n"
16770												  "UNIFORMS"
16771												  "\n"
16772												  "FUNCTION"
16773												  "\n"
16774												  "LITERAL"
16775												  "\n"
16776												  "void main()\n"
16777												  "{\n"
16778												  "    vec4 result = vec4(0, 1, 0, 1);\n"
16779												  "\n"
16780												  "VERIFICATION"
16781												  "\n"
16782												  "    vs_tcs_result = result;\n"
16783												  "}\n"
16784												  "\n";
16785
16786	const GLchar* shader_template = 0;
16787
16788	switch (in_stage)
16789	{
16790	case Utils::COMPUTE_SHADER:
16791		shader_template = compute_shader_template;
16792		break;
16793	case Utils::FRAGMENT_SHADER:
16794		shader_template = fragment_shader_template;
16795		break;
16796	case Utils::GEOMETRY_SHADER:
16797		shader_template = geometry_shader_template;
16798		break;
16799	case Utils::TESS_CTRL_SHADER:
16800		shader_template = tess_ctrl_shader_template;
16801		break;
16802	case Utils::TESS_EVAL_SHADER:
16803		shader_template = tess_eval_shader_template;
16804		break;
16805	case Utils::VERTEX_SHADER:
16806		shader_template = vertex_shader_template;
16807		break;
16808	default:
16809		TCU_FAIL("Invalid enum");
16810	}
16811
16812	out_source.m_parts[0].m_code = shader_template;
16813
16814	size_t position = 0;
16815	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
16816						out_source.m_parts[0].m_code);
16817
16818	Utils::replaceToken("STRUCTURE", position, structure, out_source.m_parts[0].m_code);
16819
16820	Utils::replaceToken("UNIFORMS", position, uniforms, out_source.m_parts[0].m_code);
16821
16822	Utils::replaceToken("FUNCTION", position, function, out_source.m_parts[0].m_code);
16823
16824	Utils::replaceToken("LITERAL", position, literal, out_source.m_parts[0].m_code);
16825
16826	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
16827}
16828
16829/** Overwritte of prepareUniforms method
16830 *
16831 * @param program Current program
16832 **/
16833void ScalarSwizzlersTest::prepareUniforms(Utils::program& program)
16834{
16835	static const GLfloat variable_data[4]		 = { 0.75f };
16836	static const GLfloat expected_values_data[3] = { 0.375f, 0.125f, 0.75f };
16837
16838	program.uniform("variable", Utils::FLOAT, 1 /* n_cols */, 1 /* n_rows */, variable_data);
16839	program.uniform("expected_values", Utils::FLOAT, 1 /* n_cols */, 3 /* n_rows */, expected_values_data);
16840}
16841
16842/** Constructor
16843 *
16844 * @param context Test context
16845 **/
16846ScalarSwizzlersInvalidTest::ScalarSwizzlersInvalidTest(deqp::Context& context)
16847	: NegativeTestBase(context, "scalar_swizzlers_invalid",
16848					   "Verifies if invalid use of swizzlers on scalars is reported as error")
16849{
16850	/* Nothing to be done here */
16851}
16852
16853/** Set up next test case
16854 *
16855 * @param test_case_index Index of next test case
16856 *
16857 * @return false if there is no more test cases, true otherwise
16858 **/
16859bool ScalarSwizzlersInvalidTest::prepareNextTestCase(glw::GLuint test_case_index)
16860{
16861	switch (test_case_index)
16862	{
16863	case (glw::GLuint)-1:
16864	case INVALID_Y:
16865	case INVALID_B:
16866	case INVALID_Q:
16867	case INVALID_XY:
16868	case INVALID_XRS:
16869	case WRONG:
16870	case MISSING_PARENTHESIS:
16871		m_case = (TESTED_CASES)test_case_index;
16872		break;
16873	default:
16874		return false;
16875	}
16876
16877	return true;
16878}
16879
16880/** Prepare source for given shader stage
16881 *
16882 * @param in_stage           Shader stage, compute shader will use 430
16883 * @param in_use_version_400 Select if 400 or 420 should be used
16884 * @param out_source         Prepared shader source instance
16885 **/
16886void ScalarSwizzlersInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
16887													 Utils::shaderSource& out_source)
16888{
16889	static const GLchar* uniforms = "uniform float variable;\n";
16890
16891	static const GLchar* verification_invalid_y = "\n"
16892												  "    if (0.125 != variable.y) )\n"
16893												  "    {\n"
16894												  "        result = vec4(1, 0, 0, 1);\n"
16895												  "    }\n";
16896
16897	static const GLchar* verification_invalid_b = "\n"
16898												  "    if (0.125 != variable.b) )\n"
16899												  "    {\n"
16900												  "        result = vec4(1, 0, 0, 1);\n"
16901												  "    }\n";
16902
16903	static const GLchar* verification_invalid_q = "\n"
16904												  "    if (0.125 != variable.q) )\n"
16905												  "    {\n"
16906												  "        result = vec4(1, 0, 0, 1);\n"
16907												  "    }\n";
16908
16909	static const GLchar* verification_invalid_xy = "\n"
16910												   "    if (vec2(0.125, 0.25) != variable.xy) )\n"
16911												   "    {\n"
16912												   "        result = vec4(1, 0, 0, 1);\n"
16913												   "    }\n";
16914
16915	static const GLchar* verification_invalid_xrs = "\n"
16916													"    if (vec3(0.125, 0.125, 0.25) != variable.xrs) )\n"
16917													"    {\n"
16918													"        result = vec4(1, 0, 0, 1);\n"
16919													"    }\n";
16920
16921	static const GLchar* verification_wrong_u = "\n"
16922												"    if (0.125 != variable.u) )\n"
16923												"    {\n"
16924												"        result = vec4(1, 0, 0, 1);\n"
16925												"    }\n";
16926
16927	static const GLchar* verification_missing_parenthesis = "\n"
16928															"    if (variable != 1.x) )\n"
16929															"    {\n"
16930															"        result = vec4(1, 0, 0, 1);\n"
16931															"    }\n";
16932
16933	static const GLchar* compute_shader_template =
16934		"VERSION\n"
16935		"\n"
16936		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
16937		"\n"
16938		"writeonly uniform image2D uni_image;\n"
16939		"\n"
16940		"UNIFORMS"
16941		"\n"
16942		"void main()\n"
16943		"{\n"
16944		"    vec4 result = vec4(0, 1, 0, 1);\n"
16945		"\n"
16946		"VERIFICATION"
16947		"\n"
16948		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
16949		"}\n"
16950		"\n";
16951
16952	static const GLchar* fragment_shader_template = "VERSION\n"
16953													"\n"
16954													"#define FRAGMENT\n"
16955													"\n"
16956													"in  vec4 gs_fs_result;\n"
16957													"out vec4 fs_out_result;\n"
16958													"\n"
16959													"UNIFORMS"
16960													"\n"
16961													"void main()\n"
16962													"{\n"
16963													"    vec4 result = vec4(0, 1, 0, 1);\n"
16964													"\n"
16965													"VERIFICATION"
16966													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
16967													"    {\n"
16968													"         result = vec4(1, 0, 0, 1);\n"
16969													"    }\n"
16970													"\n"
16971													"    fs_out_result = result;\n"
16972													"}\n"
16973													"\n";
16974
16975	static const GLchar* geometry_shader_template = "VERSION\n"
16976													"\n"
16977													"layout(points)                           in;\n"
16978													"layout(triangle_strip, max_vertices = 4) out;\n"
16979													"\n"
16980													"in  vec4 tes_gs_result[];\n"
16981													"out vec4 gs_fs_result;\n"
16982													"\n"
16983													"UNIFORMS"
16984													"\n"
16985													"void main()\n"
16986													"{\n"
16987													"    vec4 result = vec4(0, 1, 0, 1);\n"
16988													"\n"
16989													"VERIFICATION"
16990													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
16991													"    {\n"
16992													"         result = vec4(1, 0, 0, 1);\n"
16993													"    }\n"
16994													"\n"
16995													"    gs_fs_result  = result;\n"
16996													"    gl_Position   = vec4(-1, -1, 0, 1);\n"
16997													"    EmitVertex();\n"
16998													"    gs_fs_result  = result;\n"
16999													"    gl_Position   = vec4(-1, 1, 0, 1);\n"
17000													"    EmitVertex();\n"
17001													"    gs_fs_result  = result;\n"
17002													"    gl_Position   = vec4(1, -1, 0, 1);\n"
17003													"    EmitVertex();\n"
17004													"    gs_fs_result  = result;\n"
17005													"    gl_Position   = vec4(1, 1, 0, 1);\n"
17006													"    EmitVertex();\n"
17007													"}\n"
17008													"\n";
17009
17010	static const GLchar* tess_ctrl_shader_template =
17011		"VERSION\n"
17012		"\n"
17013		"layout(vertices = 1) out;\n"
17014		"\n"
17015		"in  vec4 vs_tcs_result[];\n"
17016		"out vec4 tcs_tes_result[];\n"
17017		"\n"
17018		"UNIFORMS"
17019		"\n"
17020		"void main()\n"
17021		"{\n"
17022		"    vec4 result = vec4(0, 1, 0, 1);\n"
17023		"\n"
17024		"VERIFICATION"
17025		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
17026		"    {\n"
17027		"         result = vec4(1, 0, 0, 1);\n"
17028		"    }\n"
17029		"\n"
17030		"    tcs_tes_result[gl_InvocationID] = result;\n"
17031		"\n"
17032		"    gl_TessLevelOuter[0] = 1.0;\n"
17033		"    gl_TessLevelOuter[1] = 1.0;\n"
17034		"    gl_TessLevelOuter[2] = 1.0;\n"
17035		"    gl_TessLevelOuter[3] = 1.0;\n"
17036		"    gl_TessLevelInner[0] = 1.0;\n"
17037		"    gl_TessLevelInner[1] = 1.0;\n"
17038		"}\n"
17039		"\n";
17040
17041	static const GLchar* tess_eval_shader_template = "VERSION\n"
17042													 "\n"
17043													 "layout(isolines, point_mode) in;\n"
17044													 "\n"
17045													 "in  vec4 tcs_tes_result[];\n"
17046													 "out vec4 tes_gs_result;\n"
17047													 "\n"
17048													 "UNIFORMS"
17049													 "\n"
17050													 "void main()\n"
17051													 "{\n"
17052													 "    vec4 result = vec4(0, 1, 0, 1);\n"
17053													 "\n"
17054													 "VERIFICATION"
17055													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
17056													 "    {\n"
17057													 "         result = vec4(1, 0, 0, 1);\n"
17058													 "    }\n"
17059													 "\n"
17060													 "    tes_gs_result = result;\n"
17061													 "}\n"
17062													 "\n";
17063
17064	static const GLchar* vertex_shader_template = "VERSION\n"
17065												  "\n"
17066												  "out vec4 vs_tcs_result;\n"
17067												  "\n"
17068												  "UNIFORMS"
17069												  "\n"
17070												  "void main()\n"
17071												  "{\n"
17072												  "    vec4 result = vec4(0, 1, 0, 1);\n"
17073												  "\n"
17074												  "VERIFICATION"
17075												  "\n"
17076												  "    vs_tcs_result = result;\n"
17077												  "}\n"
17078												  "\n";
17079
17080	const GLchar* shader_template	  = 0;
17081	const GLchar* verification_snippet = 0;
17082
17083	switch (in_stage)
17084	{
17085	case Utils::COMPUTE_SHADER:
17086		shader_template = compute_shader_template;
17087		break;
17088	case Utils::FRAGMENT_SHADER:
17089		shader_template = fragment_shader_template;
17090		break;
17091	case Utils::GEOMETRY_SHADER:
17092		shader_template = geometry_shader_template;
17093		break;
17094	case Utils::TESS_CTRL_SHADER:
17095		shader_template = tess_ctrl_shader_template;
17096		break;
17097	case Utils::TESS_EVAL_SHADER:
17098		shader_template = tess_eval_shader_template;
17099		break;
17100	case Utils::VERTEX_SHADER:
17101		shader_template = vertex_shader_template;
17102		break;
17103	default:
17104		TCU_FAIL("Invalid enum");
17105	}
17106
17107	switch (m_case)
17108	{
17109	case INVALID_Y:
17110		verification_snippet = verification_invalid_y;
17111		break;
17112	case INVALID_B:
17113		verification_snippet = verification_invalid_b;
17114		break;
17115	case INVALID_Q:
17116		verification_snippet = verification_invalid_q;
17117		break;
17118	case INVALID_XY:
17119		verification_snippet = verification_invalid_xy;
17120		break;
17121	case INVALID_XRS:
17122		verification_snippet = verification_invalid_xrs;
17123		break;
17124	case WRONG:
17125		verification_snippet = verification_wrong_u;
17126		break;
17127	case MISSING_PARENTHESIS:
17128		verification_snippet = verification_missing_parenthesis;
17129		break;
17130	default:
17131		TCU_FAIL("Invalid enum");
17132	}
17133
17134	out_source.m_parts[0].m_code = shader_template;
17135
17136	size_t position = 0;
17137	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
17138						out_source.m_parts[0].m_code);
17139
17140	Utils::replaceToken("UNIFORMS", position, uniforms, out_source.m_parts[0].m_code);
17141
17142	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
17143}
17144
17145/* Constants used by BuiltInValuesTest */
17146const GLint BuiltInValuesTest::m_min_program_texel_offset_limit = -8;
17147const GLint BuiltInValuesTest::m_max_program_texel_offset_limit = 7;
17148
17149/** Constructor
17150 *
17151 * @param context Test context
17152 **/
17153BuiltInValuesTest::BuiltInValuesTest(deqp::Context& context)
17154	: GLSLTestBase(context, "built_in_values", "Test verifies values of gl_Min/Max_ProgramTexelOffset")
17155{
17156	/* Nothing to be done here */
17157}
17158
17159/** Prepare source for given shader stage
17160 *
17161 * @param in_stage           Shader stage, compute shader will use 430
17162 * @param in_use_version_400 Select if 400 or 420 should be used
17163 * @param out_source         Prepared shader source instance
17164 **/
17165void BuiltInValuesTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
17166											Utils::shaderSource& out_source)
17167{
17168	static const GLchar* verification_snippet = "    if ((expected_values.x != gl_MinProgramTexelOffset) ||\n"
17169												"        (expected_values.y != gl_MaxProgramTexelOffset) )\n"
17170												"    {\n"
17171												"        result = vec4(1, 0, 0, 1);\n"
17172												"    }\n";
17173
17174	static const GLchar* compute_shader_template =
17175		"VERSION\n"
17176		"\n"
17177		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
17178		"\n"
17179		"writeonly uniform image2D uni_image;\n"
17180		"          uniform ivec2   expected_values;\n"
17181		"\n"
17182		"void main()\n"
17183		"{\n"
17184		"    vec4 result = vec4(0, 1, 0, 1);\n"
17185		"\n"
17186		"VERIFICATION"
17187		"\n"
17188		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
17189		"}\n"
17190		"\n";
17191
17192	static const GLchar* fragment_shader_template = "VERSION\n"
17193													"\n"
17194													"in  vec4 gs_fs_result;\n"
17195													"out vec4 fs_out_result;\n"
17196													"\n"
17197													"uniform ivec2 expected_values;\n"
17198													"\n"
17199													"void main()\n"
17200													"{\n"
17201													"    vec4 result = vec4(0, 1, 0, 1);\n"
17202													"\n"
17203													"VERIFICATION"
17204													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
17205													"    {\n"
17206													"         result = vec4(1, 0, 0, 1);\n"
17207													"    }\n"
17208													"\n"
17209													"    fs_out_result = result;\n"
17210													"}\n"
17211													"\n";
17212
17213	static const GLchar* geometry_shader_template = "VERSION\n"
17214													"\n"
17215													"layout(points)                           in;\n"
17216													"layout(triangle_strip, max_vertices = 4) out;\n"
17217													"\n"
17218													"in  vec4 tes_gs_result[];\n"
17219													"out vec4 gs_fs_result;\n"
17220													"\n"
17221													"uniform ivec2 expected_values;\n"
17222													"\n"
17223													"void main()\n"
17224													"{\n"
17225													"    vec4 result = vec4(0, 1, 0, 1);\n"
17226													"\n"
17227													"VERIFICATION"
17228													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
17229													"    {\n"
17230													"         result = vec4(1, 0, 0, 1);\n"
17231													"    }\n"
17232													"\n"
17233													"    gs_fs_result  = result;\n"
17234													"    gl_Position   = vec4(-1, -1, 0, 1);\n"
17235													"    EmitVertex();\n"
17236													"    gs_fs_result  = result;\n"
17237													"    gl_Position   = vec4(-1, 1, 0, 1);\n"
17238													"    EmitVertex();\n"
17239													"    gs_fs_result  = result;\n"
17240													"    gl_Position   = vec4(1, -1, 0, 1);\n"
17241													"    EmitVertex();\n"
17242													"    gs_fs_result  = result;\n"
17243													"    gl_Position   = vec4(1, 1, 0, 1);\n"
17244													"    EmitVertex();\n"
17245													"}\n"
17246													"\n";
17247
17248	static const GLchar* tess_ctrl_shader_template =
17249		"VERSION\n"
17250		"\n"
17251		"layout(vertices = 1) out;\n"
17252		"\n"
17253		"in  vec4 vs_tcs_result[];\n"
17254		"out vec4 tcs_tes_result[];\n"
17255		"\n"
17256		"uniform ivec2 expected_values;\n"
17257		"\n"
17258		"void main()\n"
17259		"{\n"
17260		"    vec4 result = vec4(0, 1, 0, 1);\n"
17261		"\n"
17262		"VERIFICATION"
17263		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
17264		"    {\n"
17265		"         result = vec4(1, 0, 0, 1);\n"
17266		"    }\n"
17267		"\n"
17268		"    tcs_tes_result[gl_InvocationID] = result;\n"
17269		"\n"
17270		"    gl_TessLevelOuter[0] = 1.0;\n"
17271		"    gl_TessLevelOuter[1] = 1.0;\n"
17272		"    gl_TessLevelOuter[2] = 1.0;\n"
17273		"    gl_TessLevelOuter[3] = 1.0;\n"
17274		"    gl_TessLevelInner[0] = 1.0;\n"
17275		"    gl_TessLevelInner[1] = 1.0;\n"
17276		"}\n"
17277		"\n";
17278
17279	static const GLchar* tess_eval_shader_template = "VERSION\n"
17280													 "\n"
17281													 "layout(isolines, point_mode) in;\n"
17282													 "\n"
17283													 "in  vec4 tcs_tes_result[];\n"
17284													 "out vec4 tes_gs_result;\n"
17285													 "\n"
17286													 "uniform ivec2 expected_values;\n"
17287													 "\n"
17288													 "void main()\n"
17289													 "{\n"
17290													 "    vec4 result = vec4(0, 1, 0, 1);\n"
17291													 "\n"
17292													 "VERIFICATION"
17293													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
17294													 "    {\n"
17295													 "         result = vec4(1, 0, 0, 1);\n"
17296													 "    }\n"
17297													 "\n"
17298													 "    tes_gs_result = result;\n"
17299													 "}\n"
17300													 "\n";
17301
17302	static const GLchar* vertex_shader_template = "VERSION\n"
17303												  "\n"
17304												  "out vec4 vs_tcs_result;\n"
17305												  "\n"
17306												  "uniform ivec2 expected_values;\n"
17307												  "\n"
17308												  "void main()\n"
17309												  "{\n"
17310												  "    vec4 result = vec4(0, 1, 0, 1);\n"
17311												  "\n"
17312												  "VERIFICATION"
17313												  "\n"
17314												  "    vs_tcs_result = result;\n"
17315												  "}\n"
17316												  "\n";
17317
17318	const GLchar* shader_template = 0;
17319
17320	switch (in_stage)
17321	{
17322	case Utils::COMPUTE_SHADER:
17323		shader_template = compute_shader_template;
17324		break;
17325	case Utils::FRAGMENT_SHADER:
17326		shader_template = fragment_shader_template;
17327		break;
17328	case Utils::GEOMETRY_SHADER:
17329		shader_template = geometry_shader_template;
17330		break;
17331	case Utils::TESS_CTRL_SHADER:
17332		shader_template = tess_ctrl_shader_template;
17333		break;
17334	case Utils::TESS_EVAL_SHADER:
17335		shader_template = tess_eval_shader_template;
17336		break;
17337	case Utils::VERTEX_SHADER:
17338		shader_template = vertex_shader_template;
17339		break;
17340	default:
17341		TCU_FAIL("Invalid enum");
17342	}
17343
17344	out_source.m_parts[0].m_code = shader_template;
17345
17346	size_t position = 0;
17347	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
17348						out_source.m_parts[0].m_code);
17349
17350	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
17351}
17352
17353/** Overwritte of prepareUniforms method
17354 *
17355 * @param program Current program
17356 **/
17357void BuiltInValuesTest::prepareUniforms(Utils::program& program)
17358{
17359	const GLint expected_values_data[2] = { m_min_program_texel_offset, m_max_program_texel_offset };
17360
17361	program.uniform("expected_values", Utils::INT, 1 /* n_cols */, 2 /* n_rows */, expected_values_data);
17362}
17363
17364/** Prepare test cases
17365 *
17366 * @return true
17367 **/
17368bool BuiltInValuesTest::testInit()
17369{
17370	const Functions& gl = m_context.getRenderContext().getFunctions();
17371
17372	gl.getIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &m_min_program_texel_offset);
17373	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
17374
17375	gl.getIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &m_max_program_texel_offset);
17376	GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
17377
17378	if ((m_min_program_texel_offset_limit > m_min_program_texel_offset) ||
17379		(m_max_program_texel_offset_limit > m_max_program_texel_offset))
17380	{
17381		m_context.getTestContext().getLog()
17382			<< tcu::TestLog::Message << "Invalid GL_PROGRAM_TEXEL_OFFSET values."
17383			<< " Min: " << m_min_program_texel_offset << " expected at top: " << m_min_program_texel_offset_limit
17384			<< " Max: " << m_min_program_texel_offset << " expected at least: " << m_max_program_texel_offset_limit
17385			<< tcu::TestLog::EndMessage;
17386
17387		return false;
17388	}
17389
17390	return true;
17391}
17392
17393/** Constructor
17394 *
17395 * @param context Test context
17396 **/
17397BuiltInAssignmentTest::BuiltInAssignmentTest(deqp::Context& context)
17398	: NegativeTestBase(context, "built_in_assignment",
17399					   "Test verifies that built in gl_Min/MaxProgramTexelOffset cannot be assigned")
17400{
17401	/* Nothing to be done here */
17402}
17403
17404/** Set up next test case
17405 *
17406 * @param test_case_index Index of next test case
17407 *
17408 * @return false if there is no more test cases, true otherwise
17409 **/
17410bool BuiltInAssignmentTest::prepareNextTestCase(glw::GLuint test_case_index)
17411{
17412	const GLchar* description = 0;
17413
17414	switch (test_case_index)
17415	{
17416	case (glw::GLuint)-1:
17417	case 0:
17418		description = "Testing gl_MinProgramTexelOffset";
17419		break;
17420	case 1:
17421		description = "Testing gl_MaxProgramTexelOffset";
17422		break;
17423	default:
17424		return false;
17425	}
17426
17427	m_case = test_case_index;
17428
17429	m_context.getTestContext().getLog() << tcu::TestLog::Message << description << tcu::TestLog::EndMessage;
17430
17431	return true;
17432}
17433
17434/** Prepare source for given shader stage
17435 *
17436 * @param in_stage           Shader stage, compute shader will use 430
17437 * @param in_use_version_400 Select if 400 or 420 should be used
17438 * @param out_source         Prepared shader source instance
17439 **/
17440void BuiltInAssignmentTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
17441												Utils::shaderSource& out_source)
17442{
17443	static const GLchar* min_verification_snippet = "    gl_MinProgramTexelOffset += gl_MaxProgramTexelOffset\n"
17444													"\n"
17445													"    if (expected_value != gl_MinProgramTexelOffset)\n"
17446													"    {\n"
17447													"        result = vec4(1, 0, 0, 1);\n"
17448													"    }\n";
17449
17450	static const GLchar* max_verification_snippet = "    gl_MaxProgramTexelOffset += gl_MinProgramTexelOffset\n"
17451													"\n"
17452													"    if (expected_value != gl_MaxProgramTexelOffset)\n"
17453													"    {\n"
17454													"        result = vec4(1, 0, 0, 1);\n"
17455													"    }\n";
17456
17457	static const GLchar* compute_shader_template =
17458		"VERSION\n"
17459		"\n"
17460		"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
17461		"\n"
17462		"writeonly uniform image2D uni_image;\n"
17463		"          uniform ivec2   expected_values;\n"
17464		"\n"
17465		"void main()\n"
17466		"{\n"
17467		"    vec4 result = vec4(0, 1, 0, 1);\n"
17468		"\n"
17469		"VERIFICATION"
17470		"\n"
17471		"    imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n"
17472		"}\n"
17473		"\n";
17474
17475	static const GLchar* fragment_shader_template = "VERSION\n"
17476													"\n"
17477													"in  vec4 gs_fs_result;\n"
17478													"out vec4 fs_out_result;\n"
17479													"\n"
17480													"uniform ivec2 expected_values;\n"
17481													"\n"
17482													"void main()\n"
17483													"{\n"
17484													"    vec4 result = vec4(0, 1, 0, 1);\n"
17485													"\n"
17486													"VERIFICATION"
17487													"    else if (vec4(0, 1, 0, 1) != gs_fs_result)\n"
17488													"    {\n"
17489													"         result = vec4(1, 0, 0, 1);\n"
17490													"    }\n"
17491													"\n"
17492													"    fs_out_result = result;\n"
17493													"}\n"
17494													"\n";
17495
17496	static const GLchar* geometry_shader_template = "VERSION\n"
17497													"\n"
17498													"layout(points)                           in;\n"
17499													"layout(triangle_strip, max_vertices = 4) out;\n"
17500													"\n"
17501													"in  vec4 tes_gs_result[];\n"
17502													"out vec4 gs_fs_result;\n"
17503													"\n"
17504													"uniform ivec2 expected_values;\n"
17505													"\n"
17506													"void main()\n"
17507													"{\n"
17508													"    vec4 result = vec4(0, 1, 0, 1);\n"
17509													"\n"
17510													"VERIFICATION"
17511													"    else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
17512													"    {\n"
17513													"         result = vec4(1, 0, 0, 1);\n"
17514													"    }\n"
17515													"\n"
17516													"    gs_fs_result  = result;\n"
17517													"    gl_Position   = vec4(-1, -1, 0, 1);\n"
17518													"    EmitVertex();\n"
17519													"    gs_fs_result  = result;\n"
17520													"    gl_Position   = vec4(-1, 1, 0, 1);\n"
17521													"    EmitVertex();\n"
17522													"    gs_fs_result  = result;\n"
17523													"    gl_Position   = vec4(1, -1, 0, 1);\n"
17524													"    EmitVertex();\n"
17525													"    gs_fs_result  = result;\n"
17526													"    gl_Position   = vec4(1, 1, 0, 1);\n"
17527													"    EmitVertex();\n"
17528													"}\n"
17529													"\n";
17530
17531	static const GLchar* tess_ctrl_shader_template =
17532		"VERSION\n"
17533		"\n"
17534		"layout(vertices = 1) out;\n"
17535		"\n"
17536		"in  vec4 vs_tcs_result[];\n"
17537		"out vec4 tcs_tes_result[];\n"
17538		"\n"
17539		"uniform ivec2 expected_values;\n"
17540		"\n"
17541		"void main()\n"
17542		"{\n"
17543		"    vec4 result = vec4(0, 1, 0, 1);\n"
17544		"\n"
17545		"VERIFICATION"
17546		"    else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
17547		"    {\n"
17548		"         result = vec4(1, 0, 0, 1);\n"
17549		"    }\n"
17550		"\n"
17551		"    tcs_tes_result[gl_InvocationID] = result;\n"
17552		"\n"
17553		"    gl_TessLevelOuter[0] = 1.0;\n"
17554		"    gl_TessLevelOuter[1] = 1.0;\n"
17555		"    gl_TessLevelOuter[2] = 1.0;\n"
17556		"    gl_TessLevelOuter[3] = 1.0;\n"
17557		"    gl_TessLevelInner[0] = 1.0;\n"
17558		"    gl_TessLevelInner[1] = 1.0;\n"
17559		"}\n"
17560		"\n";
17561
17562	static const GLchar* tess_eval_shader_template = "VERSION\n"
17563													 "\n"
17564													 "layout(isolines, point_mode) in;\n"
17565													 "\n"
17566													 "in  vec4 tcs_tes_result[];\n"
17567													 "out vec4 tes_gs_result;\n"
17568													 "\n"
17569													 "uniform ivec2 expected_values;\n"
17570													 "\n"
17571													 "void main()\n"
17572													 "{\n"
17573													 "    vec4 result = vec4(0, 1, 0, 1);\n"
17574													 "\n"
17575													 "VERIFICATION"
17576													 "    else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
17577													 "    {\n"
17578													 "         result = vec4(1, 0, 0, 1);\n"
17579													 "    }\n"
17580													 "\n"
17581													 "    tes_gs_result = result;\n"
17582													 "}\n"
17583													 "\n";
17584
17585	static const GLchar* vertex_shader_template = "VERSION\n"
17586												  "\n"
17587												  "out vec4 vs_tcs_result;\n"
17588												  "\n"
17589												  "uniform ivec2 expected_values;\n"
17590												  "\n"
17591												  "void main()\n"
17592												  "{\n"
17593												  "    vec4 result = vec4(0, 1, 0, 1);\n"
17594												  "\n"
17595												  "VERIFICATION"
17596												  "\n"
17597												  "    vs_tcs_result = result;\n"
17598												  "}\n"
17599												  "\n";
17600
17601	const GLchar* shader_template	  = 0;
17602	const GLchar* verification_snippet = 0;
17603
17604	switch (in_stage)
17605	{
17606	case Utils::COMPUTE_SHADER:
17607		shader_template = compute_shader_template;
17608		break;
17609	case Utils::FRAGMENT_SHADER:
17610		shader_template = fragment_shader_template;
17611		break;
17612	case Utils::GEOMETRY_SHADER:
17613		shader_template = geometry_shader_template;
17614		break;
17615	case Utils::TESS_CTRL_SHADER:
17616		shader_template = tess_ctrl_shader_template;
17617		break;
17618	case Utils::TESS_EVAL_SHADER:
17619		shader_template = tess_eval_shader_template;
17620		break;
17621	case Utils::VERTEX_SHADER:
17622		shader_template = vertex_shader_template;
17623		break;
17624	default:
17625		TCU_FAIL("Invalid enum");
17626	}
17627
17628	switch (m_case)
17629	{
17630	case (glw::GLuint)-1:
17631	case 0:
17632		verification_snippet = min_verification_snippet;
17633		break;
17634	case 1:
17635		verification_snippet = max_verification_snippet;
17636		break;
17637	}
17638
17639	out_source.m_parts[0].m_code = shader_template;
17640
17641	size_t position = 0;
17642	Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400),
17643						out_source.m_parts[0].m_code);
17644
17645	Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
17646}
17647
17648/** Constructor.
17649 *
17650 * @param context CTS context.
17651 **/
17652Utils::buffer::buffer(deqp::Context& context) : m_id(0), m_context(context), m_target(0)
17653{
17654}
17655
17656/** Destructor
17657 *
17658 **/
17659Utils::buffer::~buffer()
17660{
17661	release();
17662}
17663
17664/** Execute BindBuffer
17665 *
17666 **/
17667void Utils::buffer::bind() const
17668{
17669	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17670
17671	gl.bindBuffer(m_target, m_id);
17672	GLU_EXPECT_NO_ERROR(gl.getError(), "BindBuffer");
17673}
17674
17675/** Execute BindBufferRange
17676 *
17677 * @param index  <index> parameter
17678 * @param offset <offset> parameter
17679 * @param size   <size> parameter
17680 **/
17681void Utils::buffer::bindRange(glw::GLuint index, glw::GLintptr offset, glw::GLsizeiptr size)
17682{
17683	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17684
17685	gl.bindBufferRange(m_target, index, m_id, offset, size);
17686	GLU_EXPECT_NO_ERROR(gl.getError(), "BindBufferRange");
17687}
17688
17689/** Execute GenBuffer
17690 *
17691 * @param target Target that will be used by this buffer
17692 **/
17693void Utils::buffer::generate(glw::GLenum target)
17694{
17695	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17696
17697	m_target = target;
17698
17699	gl.genBuffers(1, &m_id);
17700	GLU_EXPECT_NO_ERROR(gl.getError(), "GenBuffers");
17701}
17702
17703/** Maps buffer content
17704 *
17705 * @param access Access rights for mapped region
17706 *
17707 * @return Mapped memory
17708 **/
17709void* Utils::buffer::map(GLenum access) const
17710{
17711	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17712
17713	gl.bindBuffer(m_target, m_id);
17714	GLU_EXPECT_NO_ERROR(gl.getError(), "bindBuffer");
17715
17716	void* result = gl.mapBuffer(m_target, access);
17717	GLU_EXPECT_NO_ERROR(gl.getError(), "MapBuffer");
17718
17719	return result;
17720}
17721
17722/** Unmaps buffer
17723 *
17724 **/
17725void Utils::buffer::unmap() const
17726{
17727	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17728
17729	gl.bindBuffer(m_target, m_id);
17730	GLU_EXPECT_NO_ERROR(gl.getError(), "bindBuffer");
17731
17732	gl.unmapBuffer(m_target);
17733	GLU_EXPECT_NO_ERROR(gl.getError(), "UnmapBuffer");
17734}
17735
17736/** Execute BufferData
17737 *
17738 * @param size   <size> parameter
17739 * @param data   <data> parameter
17740 * @param usage  <usage> parameter
17741 **/
17742void Utils::buffer::update(glw::GLsizeiptr size, glw::GLvoid* data, glw::GLenum usage)
17743{
17744	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17745
17746	gl.bindBuffer(m_target, m_id);
17747	GLU_EXPECT_NO_ERROR(gl.getError(), "bindBuffer");
17748
17749	gl.bufferData(m_target, size, data, usage);
17750	GLU_EXPECT_NO_ERROR(gl.getError(), "bufferData");
17751}
17752
17753/** Release buffer
17754 *
17755 **/
17756void Utils::buffer::release()
17757{
17758	if (0 != m_id)
17759	{
17760		const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17761
17762		gl.deleteBuffers(1, &m_id);
17763		m_id = 0;
17764	}
17765}
17766
17767/** Constructor
17768 *
17769 * @param context CTS context
17770 **/
17771Utils::framebuffer::framebuffer(deqp::Context& context) : m_id(0), m_context(context)
17772{
17773	/* Nothing to be done here */
17774}
17775
17776/** Destructor
17777 *
17778 **/
17779Utils::framebuffer::~framebuffer()
17780{
17781	if (0 != m_id)
17782	{
17783		const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17784
17785		gl.deleteFramebuffers(1, &m_id);
17786		m_id = 0;
17787	}
17788}
17789
17790/** Attach texture to specified attachment
17791 *
17792 * @param attachment Attachment
17793 * @param texture_id Texture id
17794 * @param width      Texture width
17795 * @param height     Texture height
17796 **/
17797void Utils::framebuffer::attachTexture(glw::GLenum attachment, glw::GLuint texture_id, glw::GLuint width,
17798									   glw::GLuint height)
17799{
17800	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17801
17802	bind();
17803
17804	gl.bindTexture(GL_TEXTURE_2D, texture_id);
17805	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
17806
17807	gl.framebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, GL_TEXTURE_2D, texture_id, 0 /* level */);
17808	GLU_EXPECT_NO_ERROR(gl.getError(), "FramebufferTexture2D");
17809
17810	gl.viewport(0 /* x */, 0 /* y */, width, height);
17811	GLU_EXPECT_NO_ERROR(gl.getError(), "Viewport");
17812}
17813
17814/** Binds framebuffer to DRAW_FRAMEBUFFER
17815 *
17816 **/
17817void Utils::framebuffer::bind()
17818{
17819	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17820
17821	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_id);
17822	GLU_EXPECT_NO_ERROR(gl.getError(), "BindFramebuffer");
17823}
17824
17825/** Clear framebuffer
17826 *
17827 * @param mask <mask> parameter of glClear. Decides which shall be cleared
17828 **/
17829void Utils::framebuffer::clear(glw::GLenum mask)
17830{
17831	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17832
17833	gl.clear(mask);
17834	GLU_EXPECT_NO_ERROR(gl.getError(), "Clear");
17835}
17836
17837/** Specifies clear color
17838 *
17839 * @param red   Red channel
17840 * @param green Green channel
17841 * @param blue  Blue channel
17842 * @param alpha Alpha channel
17843 **/
17844void Utils::framebuffer::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
17845{
17846	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17847
17848	gl.clearColor(red, green, blue, alpha);
17849	GLU_EXPECT_NO_ERROR(gl.getError(), "ClearColor");
17850}
17851
17852/** Generate framebuffer
17853 *
17854 **/
17855void Utils::framebuffer::generate()
17856{
17857	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17858
17859	gl.genFramebuffers(1, &m_id);
17860	GLU_EXPECT_NO_ERROR(gl.getError(), "GenFramebuffers");
17861}
17862
17863Utils::shaderSource::shaderSource()
17864{
17865}
17866
17867Utils::shaderSource::shaderSource(const shaderSource& source) : m_parts(source.m_parts), m_use_lengths(false)
17868{
17869}
17870
17871Utils::shaderSource::shaderSource(const glw::GLchar* source_code) : m_use_lengths(false)
17872{
17873	if (0 != source_code)
17874	{
17875		m_parts.resize(1);
17876
17877		m_parts[0].m_code = source_code;
17878	}
17879}
17880
17881Utils::shaderCompilationException::shaderCompilationException(const shaderSource& source, const glw::GLchar* message)
17882	: m_shader_source(source), m_error_message(message)
17883{
17884	/* Nothing to be done */
17885}
17886
17887const char* Utils::shaderCompilationException::what() const throw()
17888{
17889	return "Shader compilation failed";
17890}
17891
17892Utils::programLinkageException::programLinkageException(const glw::GLchar* message) : m_error_message(message)
17893{
17894	/* Nothing to be done */
17895}
17896
17897const char* Utils::programLinkageException::what() const throw()
17898{
17899	return "Program linking failed";
17900}
17901
17902const glw::GLenum Utils::program::ARB_COMPUTE_SHADER = 0x91B9;
17903
17904/** Constructor.
17905 *
17906 * @param context CTS context.
17907 **/
17908Utils::program::program(deqp::Context& context)
17909	: m_compute_shader_id(0)
17910	, m_fragment_shader_id(0)
17911	, m_geometry_shader_id(0)
17912	, m_program_object_id(0)
17913	, m_tesselation_control_shader_id(0)
17914	, m_tesselation_evaluation_shader_id(0)
17915	, m_vertex_shader_id(0)
17916	, m_context(context)
17917{
17918	/* Nothing to be done here */
17919}
17920
17921/** Destructor
17922 *
17923 **/
17924Utils::program::~program()
17925{
17926	remove();
17927}
17928
17929/** Build program
17930 *
17931 * @param compute_shader_code                Compute shader source code
17932 * @param fragment_shader_code               Fragment shader source code
17933 * @param geometry_shader_code               Geometry shader source code
17934 * @param tesselation_control_shader_code    Tesselation control shader source code
17935 * @param tesselation_evaluation_shader_code Tesselation evaluation shader source code
17936 * @param vertex_shader_code                 Vertex shader source code
17937 * @param varying_names                      Array of strings containing names of varyings to be captured with transfrom feedback
17938 * @param n_varying_names                    Number of varyings to be captured with transfrom feedback
17939 * @param is_separable                       Selects if monolithis or separable program should be built. Defaults to false
17940 **/
17941void Utils::program::build(const glw::GLchar* compute_shader_code, const glw::GLchar* fragment_shader_code,
17942						   const glw::GLchar* geometry_shader_code, const glw::GLchar* tesselation_control_shader_code,
17943						   const glw::GLchar* tesselation_evaluation_shader_code, const glw::GLchar* vertex_shader_code,
17944						   const glw::GLchar* const* varying_names, glw::GLuint n_varying_names, bool is_separable)
17945{
17946	const shaderSource compute_shader(compute_shader_code);
17947	const shaderSource fragment_shader(fragment_shader_code);
17948	const shaderSource geometry_shader(geometry_shader_code);
17949	const shaderSource tesselation_control_shader(tesselation_control_shader_code);
17950	const shaderSource tesselation_evaluation_shader(tesselation_evaluation_shader_code);
17951	const shaderSource vertex_shader(vertex_shader_code);
17952
17953	build(compute_shader, fragment_shader, geometry_shader, tesselation_control_shader, tesselation_evaluation_shader,
17954		  vertex_shader, varying_names, n_varying_names, is_separable);
17955}
17956
17957/** Build program
17958 *
17959 * @param compute_shader_code                Compute shader source code
17960 * @param fragment_shader_code               Fragment shader source code
17961 * @param geometry_shader_code               Geometry shader source code
17962 * @param tesselation_control_shader_code    Tesselation control shader source code
17963 * @param tesselation_evaluation_shader_code Tesselation evaluation shader source code
17964 * @param vertex_shader_code                 Vertex shader source code
17965 * @param varying_names                      Array of strings containing names of varyings to be captured with transfrom feedback
17966 * @param n_varying_names                    Number of varyings to be captured with transfrom feedback
17967 * @param is_separable                       Selects if monolithis or separable program should be built. Defaults to false
17968 **/
17969void Utils::program::build(const shaderSource& compute_shader, const shaderSource& fragment_shader,
17970						   const shaderSource& geometry_shader, const shaderSource& tesselation_control_shader,
17971						   const shaderSource& tesselation_evaluation_shader, const shaderSource& vertex_shader,
17972						   const glw::GLchar* const* varying_names, glw::GLuint n_varying_names, bool is_separable)
17973{
17974	/* GL entry points */
17975	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
17976
17977	/* Create shader objects and compile */
17978	if (false == compute_shader.m_parts.empty())
17979	{
17980		m_compute_shader_id = gl.createShader(ARB_COMPUTE_SHADER);
17981		GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader");
17982
17983		compile(m_compute_shader_id, compute_shader);
17984	}
17985
17986	if (false == fragment_shader.m_parts.empty())
17987	{
17988		m_fragment_shader_id = gl.createShader(GL_FRAGMENT_SHADER);
17989		GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader");
17990
17991		compile(m_fragment_shader_id, fragment_shader);
17992	}
17993
17994	if (false == geometry_shader.m_parts.empty())
17995	{
17996		m_geometry_shader_id = gl.createShader(GL_GEOMETRY_SHADER);
17997		GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader");
17998
17999		compile(m_geometry_shader_id, geometry_shader);
18000	}
18001
18002	if (false == tesselation_control_shader.m_parts.empty())
18003	{
18004		m_tesselation_control_shader_id = gl.createShader(GL_TESS_CONTROL_SHADER);
18005		GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader");
18006
18007		compile(m_tesselation_control_shader_id, tesselation_control_shader);
18008	}
18009
18010	if (false == tesselation_evaluation_shader.m_parts.empty())
18011	{
18012		m_tesselation_evaluation_shader_id = gl.createShader(GL_TESS_EVALUATION_SHADER);
18013		GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader");
18014
18015		compile(m_tesselation_evaluation_shader_id, tesselation_evaluation_shader);
18016	}
18017
18018	if (false == vertex_shader.m_parts.empty())
18019	{
18020		m_vertex_shader_id = gl.createShader(GL_VERTEX_SHADER);
18021		GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader");
18022
18023		compile(m_vertex_shader_id, vertex_shader);
18024	}
18025
18026	/* Create program object */
18027	m_program_object_id = gl.createProgram();
18028	GLU_EXPECT_NO_ERROR(gl.getError(), "CreateProgram");
18029
18030	/* Set up captyured varyings' names */
18031	if (0 != n_varying_names)
18032	{
18033		gl.transformFeedbackVaryings(m_program_object_id, n_varying_names, varying_names, GL_INTERLEAVED_ATTRIBS);
18034		GLU_EXPECT_NO_ERROR(gl.getError(), "TransformFeedbackVaryings");
18035	}
18036
18037	/* Set separable parameter */
18038	if (true == is_separable)
18039	{
18040		gl.programParameteri(m_program_object_id, GL_PROGRAM_SEPARABLE, GL_TRUE);
18041		GLU_EXPECT_NO_ERROR(gl.getError(), "ProgramParameteri");
18042	}
18043
18044	/* Link program */
18045	link();
18046}
18047
18048void Utils::program::compile(glw::GLuint shader_id, const Utils::shaderSource& source) const
18049{
18050	/* GL entry points */
18051	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18052
18053	/* Compilation status */
18054	glw::GLint status = GL_FALSE;
18055
18056	/* Source parts and lengths vectors */
18057	std::vector<const GLchar*> parts;
18058	std::vector<GLint>		   lengths_vector;
18059	GLint*					   lengths = 0;
18060
18061	/* Prepare storage */
18062	parts.resize(source.m_parts.size());
18063
18064	/* Prepare arrays */
18065	for (GLuint i = 0; i < source.m_parts.size(); ++i)
18066	{
18067		parts[i] = source.m_parts[i].m_code.c_str();
18068	}
18069
18070	if (true == source.m_use_lengths)
18071	{
18072		lengths_vector.resize(source.m_parts.size());
18073
18074		for (GLuint i = 0; i < source.m_parts.size(); ++i)
18075		{
18076			lengths_vector[i] = source.m_parts[i].m_length;
18077		}
18078
18079		lengths = &lengths_vector[0];
18080	}
18081
18082	/* Set source code */
18083	gl.shaderSource(shader_id, static_cast<GLsizei>(source.m_parts.size()), &parts[0], lengths);
18084	GLU_EXPECT_NO_ERROR(gl.getError(), "ShaderSource");
18085
18086	/* Compile */
18087	gl.compileShader(shader_id);
18088	GLU_EXPECT_NO_ERROR(gl.getError(), "CompileShader");
18089
18090	/* Get compilation status */
18091	gl.getShaderiv(shader_id, GL_COMPILE_STATUS, &status);
18092	GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderiv");
18093
18094	/* Log compilation error */
18095	if (GL_TRUE != status)
18096	{
18097		glw::GLint				 length = 0;
18098		std::vector<glw::GLchar> message;
18099
18100		/* Error log length */
18101		gl.getShaderiv(shader_id, GL_INFO_LOG_LENGTH, &length);
18102		GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderiv");
18103
18104		/* Prepare storage */
18105		message.resize(length);
18106
18107		/* Get error log */
18108		gl.getShaderInfoLog(shader_id, length, 0, &message[0]);
18109		GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderInfoLog");
18110
18111		throw shaderCompilationException(source, &message[0]);
18112	}
18113}
18114
18115/** Create program from provided binary
18116 *
18117 * @param binary        Buffer with binary form of program
18118 * @param binary_format Format of <binary> data
18119 **/
18120void Utils::program::createFromBinary(const std::vector<GLubyte>& binary, GLenum binary_format)
18121{
18122	/* GL entry points */
18123	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18124
18125	/* Create program object */
18126	m_program_object_id = gl.createProgram();
18127	GLU_EXPECT_NO_ERROR(gl.getError(), "CreateProgram");
18128
18129	gl.programBinary(m_program_object_id, binary_format, &binary[0], static_cast<GLsizei>(binary.size()));
18130	GLU_EXPECT_NO_ERROR(gl.getError(), "ProgramBinary");
18131}
18132
18133glw::GLint Utils::program::getAttribLocation(const glw::GLchar* name) const
18134{
18135	/* GL entry points */
18136	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18137
18138	GLint location = gl.getAttribLocation(m_program_object_id, name);
18139	GLU_EXPECT_NO_ERROR(gl.getError(), "GetAttribLocation");
18140
18141	return location;
18142}
18143
18144/** Get binary form of program
18145 *
18146 * @param binary        Buffer for binary data
18147 * @param binary_format Format of binary data
18148 **/
18149void Utils::program::getBinary(std::vector<GLubyte>& binary, GLenum& binary_format) const
18150{
18151	/* GL entry points */
18152	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18153
18154	/* Get binary size */
18155	GLint length = 0;
18156	gl.getProgramiv(m_program_object_id, GL_PROGRAM_BINARY_LENGTH, &length);
18157	GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv");
18158
18159	/* Allocate storage */
18160	binary.resize(length);
18161
18162	/* Get binary */
18163	gl.getProgramBinary(m_program_object_id, static_cast<GLsizei>(binary.size()), &length, &binary_format, &binary[0]);
18164	GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramBinary");
18165}
18166
18167/** Get subroutine index
18168 *
18169 * @param subroutine_name Subroutine name
18170 *
18171 * @return Index of subroutine
18172 **/
18173GLuint Utils::program::getSubroutineIndex(const glw::GLchar* subroutine_name, glw::GLenum shader_stage) const
18174{
18175	const glw::Functions& gl	= m_context.getRenderContext().getFunctions();
18176	GLuint				  index = -1;
18177
18178	index = gl.getSubroutineIndex(m_program_object_id, shader_stage, subroutine_name);
18179	GLU_EXPECT_NO_ERROR(gl.getError(), "GetSubroutineIndex");
18180
18181	if (GL_INVALID_INDEX == index)
18182	{
18183		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Subroutine: " << subroutine_name
18184											<< " is not available" << tcu::TestLog::EndMessage;
18185
18186		TCU_FAIL("Subroutine is not available");
18187	}
18188
18189	return index;
18190}
18191
18192/** Get subroutine uniform location
18193 *
18194 * @param uniform_name Subroutine uniform name
18195 *
18196 * @return Location of subroutine uniform
18197 **/
18198GLint Utils::program::getSubroutineUniformLocation(const glw::GLchar* uniform_name, glw::GLenum shader_stage) const
18199{
18200	const glw::Functions& gl	   = m_context.getRenderContext().getFunctions();
18201	GLint				  location = -1;
18202
18203	location = gl.getSubroutineUniformLocation(m_program_object_id, shader_stage, uniform_name);
18204	GLU_EXPECT_NO_ERROR(gl.getError(), "GetSubroutineUniformLocation");
18205
18206	if (-1 == location)
18207	{
18208		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Subroutine uniform: " << uniform_name
18209											<< " is not available" << tcu::TestLog::EndMessage;
18210
18211		TCU_FAIL("Subroutine uniform is not available");
18212	}
18213
18214	return location;
18215}
18216
18217/** Get integer uniform at given location
18218 *
18219 * @param location Uniform location
18220 *
18221 * @return Value
18222 **/
18223GLint Utils::program::getUniform1i(GLuint location) const
18224{
18225	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18226
18227	GLint result;
18228
18229	gl.getUniformiv(m_program_object_id, location, &result);
18230	GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformiv");
18231
18232	return result;
18233}
18234
18235/** Get uniform location
18236 *
18237 * @param uniform_name Subroutine uniform name
18238 *
18239 * @return Location of uniform
18240 **/
18241GLint Utils::program::getUniformLocation(const glw::GLchar* uniform_name) const
18242{
18243	const glw::Functions& gl	   = m_context.getRenderContext().getFunctions();
18244	GLint				  location = -1;
18245
18246	location = gl.getUniformLocation(m_program_object_id, uniform_name);
18247	GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformLocation");
18248
18249	if (-1 == location)
18250	{
18251		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Uniform: " << uniform_name
18252											<< " is not available" << tcu::TestLog::EndMessage;
18253
18254		TCU_FAIL("Uniform is not available");
18255	}
18256
18257	return location;
18258}
18259
18260/** Attach shaders and link program
18261 *
18262 **/
18263void Utils::program::link() const
18264{
18265	/* GL entry points */
18266	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18267
18268	/* Link status */
18269	glw::GLint status = GL_FALSE;
18270
18271	/* Attach shaders */
18272	if (0 != m_compute_shader_id)
18273	{
18274		gl.attachShader(m_program_object_id, m_compute_shader_id);
18275		GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader");
18276	}
18277
18278	if (0 != m_fragment_shader_id)
18279	{
18280		gl.attachShader(m_program_object_id, m_fragment_shader_id);
18281		GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader");
18282	}
18283
18284	if (0 != m_geometry_shader_id)
18285	{
18286		gl.attachShader(m_program_object_id, m_geometry_shader_id);
18287		GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader");
18288	}
18289
18290	if (0 != m_tesselation_control_shader_id)
18291	{
18292		gl.attachShader(m_program_object_id, m_tesselation_control_shader_id);
18293		GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader");
18294	}
18295
18296	if (0 != m_tesselation_evaluation_shader_id)
18297	{
18298		gl.attachShader(m_program_object_id, m_tesselation_evaluation_shader_id);
18299		GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader");
18300	}
18301
18302	if (0 != m_vertex_shader_id)
18303	{
18304		gl.attachShader(m_program_object_id, m_vertex_shader_id);
18305		GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader");
18306	}
18307
18308	/* Link */
18309	gl.linkProgram(m_program_object_id);
18310	GLU_EXPECT_NO_ERROR(gl.getError(), "LinkProgram");
18311
18312	/* Get link status */
18313	gl.getProgramiv(m_program_object_id, GL_LINK_STATUS, &status);
18314	GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv");
18315
18316	/* Log link error */
18317	if (GL_TRUE != status)
18318	{
18319		glw::GLint				 length = 0;
18320		std::vector<glw::GLchar> message;
18321
18322		/* Get error log length */
18323		gl.getProgramiv(m_program_object_id, GL_INFO_LOG_LENGTH, &length);
18324		GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv");
18325
18326		message.resize(length);
18327
18328		/* Get error log */
18329		gl.getProgramInfoLog(m_program_object_id, length, 0, &message[0]);
18330		GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramInfoLog");
18331
18332		throw programLinkageException(&message[0]);
18333	}
18334}
18335
18336/** Delete program object and all attached shaders
18337 *
18338 **/
18339void Utils::program::remove()
18340{
18341	/* GL entry points */
18342	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18343
18344	/* Make sure program object is no longer used by GL */
18345	gl.useProgram(0);
18346
18347	/* Clean program object */
18348	if (0 != m_program_object_id)
18349	{
18350		gl.deleteProgram(m_program_object_id);
18351		m_program_object_id = 0;
18352	}
18353
18354	/* Clean shaders */
18355	if (0 != m_compute_shader_id)
18356	{
18357		gl.deleteShader(m_compute_shader_id);
18358		m_compute_shader_id = 0;
18359	}
18360
18361	if (0 != m_fragment_shader_id)
18362	{
18363		gl.deleteShader(m_fragment_shader_id);
18364		m_fragment_shader_id = 0;
18365	}
18366
18367	if (0 != m_geometry_shader_id)
18368	{
18369		gl.deleteShader(m_geometry_shader_id);
18370		m_geometry_shader_id = 0;
18371	}
18372
18373	if (0 != m_tesselation_control_shader_id)
18374	{
18375		gl.deleteShader(m_tesselation_control_shader_id);
18376		m_tesselation_control_shader_id = 0;
18377	}
18378
18379	if (0 != m_tesselation_evaluation_shader_id)
18380	{
18381		gl.deleteShader(m_tesselation_evaluation_shader_id);
18382		m_tesselation_evaluation_shader_id = 0;
18383	}
18384
18385	if (0 != m_vertex_shader_id)
18386	{
18387		gl.deleteShader(m_vertex_shader_id);
18388		m_vertex_shader_id = 0;
18389	}
18390}
18391
18392void Utils::program::uniform(const glw::GLchar* uniform_name, TYPES type, glw::GLuint n_columns, glw::GLuint n_rows,
18393							 const void* data) const
18394{
18395	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18396
18397	GLuint location = getUniformLocation(uniform_name);
18398
18399	if ((glw::GLuint)-1 == location)
18400	{
18401		TCU_FAIL("Uniform is inactive");
18402	}
18403
18404	switch (type)
18405	{
18406	case DOUBLE:
18407		if (1 == n_columns)
18408		{
18409			getUniformNdv(gl, n_rows)(location, 1 /* count */, (const GLdouble*)data);
18410			GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNdv");
18411		}
18412		else
18413		{
18414			getUniformMatrixNdv(gl, n_columns, n_rows)(location, 1 /* count */, false, (const GLdouble*)data);
18415			GLU_EXPECT_NO_ERROR(gl.getError(), "UniformMatrixNdv");
18416		}
18417		break;
18418	case FLOAT:
18419		if (1 == n_columns)
18420		{
18421			getUniformNfv(gl, n_rows)(location, 1 /* count */, (const GLfloat*)data);
18422			GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNfv");
18423		}
18424		else
18425		{
18426			getUniformMatrixNfv(gl, n_columns, n_rows)(location, 1 /* count */, false, (const GLfloat*)data);
18427			GLU_EXPECT_NO_ERROR(gl.getError(), "UniformMatrixNfv");
18428		}
18429		break;
18430	case INT:
18431		getUniformNiv(gl, n_rows)(location, 1 /* count */, (const GLint*)data);
18432		GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNiv");
18433		break;
18434	case UINT:
18435		getUniformNuiv(gl, n_rows)(location, 1 /* count */, (const GLuint*)data);
18436		GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNuiv");
18437		break;
18438	default:
18439		TCU_FAIL("Invalid enum");
18440	}
18441}
18442
18443/** Execute UseProgram
18444 *
18445 **/
18446void Utils::program::use() const
18447{
18448	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18449
18450	gl.useProgram(m_program_object_id);
18451	GLU_EXPECT_NO_ERROR(gl.getError(), "UseProgram");
18452}
18453
18454void Utils::program::printShaderSource(const shaderSource& source, tcu::MessageBuilder& log)
18455{
18456	GLuint line_number = 0;
18457
18458	log << "Shader source.";
18459
18460	for (GLuint i = 0; i < source.m_parts.size(); ++i)
18461	{
18462		log << "\nLine||Part: " << (i + 1) << "/" << source.m_parts.size();
18463
18464		if (true == source.m_use_lengths)
18465		{
18466			log << " Length: " << source.m_parts[i].m_length;
18467		}
18468
18469		log << "\n";
18470
18471		const GLchar* part = source.m_parts[i].m_code.c_str();
18472
18473		while (0 != part)
18474		{
18475			std::string   line;
18476			const GLchar* next_line = strchr(part, '\n');
18477
18478			if (0 != next_line)
18479			{
18480				next_line += 1;
18481				line.assign(part, next_line - part);
18482			}
18483			else
18484			{
18485				line = part;
18486			}
18487
18488			if (0 != *part)
18489			{
18490				log << std::setw(4) << line_number << "||" << line;
18491			}
18492
18493			part = next_line;
18494			line_number += 1;
18495		}
18496	}
18497}
18498
18499/** Constructor.
18500 *
18501 * @param context CTS context.
18502 **/
18503Utils::texture::texture(deqp::Context& context) : m_id(0), m_buffer_id(0), m_context(context), m_texture_type(TEX_2D)
18504{
18505	/* Nothing to done here */
18506}
18507
18508/** Destructor
18509 *
18510 **/
18511Utils::texture::~texture()
18512{
18513	release();
18514}
18515
18516/** Bind texture to GL_TEXTURE_2D
18517 *
18518 **/
18519void Utils::texture::bind() const
18520{
18521	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18522
18523	GLenum target = getTextureTartet(m_texture_type);
18524
18525	gl.bindTexture(target, m_id);
18526	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
18527}
18528
18529/** Create 2d texture
18530 *
18531 * @param width           Width of texture
18532 * @param height          Height of texture
18533 * @param internal_format Internal format of texture
18534 **/
18535void Utils::texture::create(glw::GLuint width, glw::GLuint height, glw::GLenum internal_format)
18536{
18537	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18538
18539	release();
18540
18541	m_texture_type = TEX_2D;
18542
18543	gl.genTextures(1, &m_id);
18544	GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures");
18545
18546	bind();
18547
18548	gl.texStorage2D(GL_TEXTURE_2D, 1 /* levels */, internal_format, width, height);
18549	GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D");
18550}
18551
18552/** Create texture of given type
18553 *
18554 * @param width           Width of texture
18555 * @param height          Height of texture
18556 * @param depth           Depth of texture
18557 * @param internal_format Internal format of texture
18558 * @param texture_type    Type of texture
18559 **/
18560void Utils::texture::create(GLuint width, GLuint height, GLuint depth, GLenum internal_format,
18561							TEXTURE_TYPES texture_type)
18562{
18563	static const GLuint levels = 1;
18564
18565	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18566
18567	release();
18568
18569	m_texture_type = texture_type;
18570
18571	GLenum target = getTextureTartet(m_texture_type);
18572
18573	gl.genTextures(1, &m_id);
18574	GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures");
18575
18576	bind();
18577
18578	switch (m_texture_type)
18579	{
18580	case TEX_1D:
18581		gl.texStorage1D(target, levels, internal_format, width);
18582		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage1D");
18583		break;
18584	case TEX_2D:
18585	case TEX_1D_ARRAY:
18586	case TEX_2D_RECT:
18587	case TEX_CUBE:
18588		gl.texStorage2D(target, levels, internal_format, width, height);
18589		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D");
18590		break;
18591	case TEX_3D:
18592	case TEX_2D_ARRAY:
18593		gl.texStorage3D(target, levels, internal_format, width, height, depth);
18594		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage3D");
18595		break;
18596	default:
18597		TCU_FAIL("Invliad enum");
18598	}
18599}
18600
18601/** Create buffer texture
18602 *
18603 * @param internal_format Internal format of texture
18604 * @param buffer_id       Id of buffer that will be used as data source
18605 **/
18606void Utils::texture::createBuffer(GLenum internal_format, GLuint buffer_id)
18607{
18608	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18609
18610	release();
18611
18612	m_texture_type = TEX_BUFFER;
18613	m_buffer_id	= buffer_id;
18614
18615	gl.genTextures(1, &m_id);
18616	GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures");
18617
18618	bind();
18619
18620	gl.texBuffer(GL_TEXTURE_BUFFER, internal_format, buffer_id);
18621	GLU_EXPECT_NO_ERROR(gl.getError(), "TexBuffer");
18622}
18623
18624/** Get contents of texture
18625 *
18626 * @param format   Format of image
18627 * @param type     Type of image
18628 * @param out_data Buffer for image
18629 **/
18630void Utils::texture::get(glw::GLenum format, glw::GLenum type, glw::GLvoid* out_data) const
18631{
18632	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18633
18634	GLenum target = getTextureTartet(m_texture_type);
18635
18636	bind();
18637
18638	gl.memoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
18639	GLU_EXPECT_NO_ERROR(gl.getError(), "MemoryBarrier");
18640
18641	if (TEX_CUBE != m_texture_type)
18642	{
18643		gl.getTexImage(target, 0 /* level */, format, type, out_data);
18644		GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage");
18645	}
18646	else
18647	{
18648		GLint width;
18649		GLint height;
18650
18651		if ((GL_RGBA != format) && (GL_UNSIGNED_BYTE != type))
18652		{
18653			TCU_FAIL("Not implemented");
18654		}
18655
18656		GLuint texel_size = 4;
18657
18658		gl.getTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, GL_TEXTURE_WIDTH, &width);
18659		GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexLevelParameteriv");
18660
18661		gl.getTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, GL_TEXTURE_HEIGHT, &height);
18662		GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexLevelParameteriv");
18663
18664		const GLuint image_size = width * height * texel_size;
18665
18666		gl.getTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, format, type,
18667					   (GLvoid*)((GLchar*)out_data + (image_size * 0)));
18668		gl.getTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0 /* level */, format, type,
18669					   (GLvoid*)((GLchar*)out_data + (image_size * 1)));
18670		gl.getTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0 /* level */, format, type,
18671					   (GLvoid*)((GLchar*)out_data + (image_size * 2)));
18672		gl.getTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0 /* level */, format, type,
18673					   (GLvoid*)((GLchar*)out_data + (image_size * 3)));
18674		gl.getTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0 /* level */, format, type,
18675					   (GLvoid*)((GLchar*)out_data + (image_size * 4)));
18676		gl.getTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0 /* level */, format, type,
18677					   (GLvoid*)((GLchar*)out_data + (image_size * 5)));
18678		GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage");
18679	}
18680}
18681
18682/** Delete texture
18683 *
18684 **/
18685void Utils::texture::release()
18686{
18687	if (0 != m_id)
18688	{
18689		const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18690
18691		gl.deleteTextures(1, &m_id);
18692		m_id = 0;
18693
18694		if ((m_texture_type == TEX_BUFFER) && (0 != m_buffer_id))
18695		{
18696			gl.deleteBuffers(1, &m_buffer_id);
18697			m_buffer_id = 0;
18698		}
18699	}
18700}
18701
18702/** Update contents of texture
18703 *
18704 * @param width  Width of texture
18705 * @param height Height of texture
18706 * @param format Format of data
18707 * @param type   Type of data
18708 * @param data   Buffer with image
18709 **/
18710void Utils::texture::update(glw::GLuint width, glw::GLuint height, glw::GLuint depth, glw::GLenum format,
18711							glw::GLenum type, glw::GLvoid* data)
18712{
18713	static const GLuint level = 0;
18714
18715	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18716
18717	GLenum target = getTextureTartet(m_texture_type);
18718
18719	bind();
18720
18721	switch (m_texture_type)
18722	{
18723	case TEX_1D:
18724		gl.texSubImage1D(target, level, 0 /* x */, width, format, type, data);
18725		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage1D");
18726		break;
18727	case TEX_2D:
18728	case TEX_1D_ARRAY:
18729	case TEX_2D_RECT:
18730		gl.texSubImage2D(target, level, 0 /* x */, 0 /* y */, width, height, format, type, data);
18731		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D");
18732		break;
18733	case TEX_CUBE:
18734		gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, 0 /* x */, 0 /* y */, width, height, format, type,
18735						 data);
18736		gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, 0 /* x */, 0 /* y */, width, height, format, type,
18737						 data);
18738		gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, level, 0 /* x */, 0 /* y */, width, height, format, type,
18739						 data);
18740		gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, level, 0 /* x */, 0 /* y */, width, height, format, type,
18741						 data);
18742		gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, level, 0 /* x */, 0 /* y */, width, height, format, type,
18743						 data);
18744		gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, level, 0 /* x */, 0 /* y */, width, height, format, type,
18745						 data);
18746		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D");
18747		break;
18748	case TEX_3D:
18749	case TEX_2D_ARRAY:
18750		gl.texSubImage3D(target, level, 0 /* x */, 0 /* y */, 0 /* z */, width, height, depth, format, type, data);
18751		GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage3D");
18752		break;
18753	default:
18754		TCU_FAIL("Invliad enum");
18755	}
18756}
18757
18758/** Constructor.
18759 *
18760 * @param context CTS context.
18761 **/
18762Utils::vertexArray::vertexArray(deqp::Context& context) : m_id(0), m_context(context)
18763{
18764}
18765
18766/** Destructor
18767 *
18768 **/
18769Utils::vertexArray::~vertexArray()
18770{
18771	if (0 != m_id)
18772	{
18773		const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18774
18775		gl.deleteVertexArrays(1, &m_id);
18776
18777		m_id = 0;
18778	}
18779}
18780
18781/** Execute BindVertexArray
18782 *
18783 **/
18784void Utils::vertexArray::bind()
18785{
18786	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18787
18788	gl.bindVertexArray(m_id);
18789	GLU_EXPECT_NO_ERROR(gl.getError(), "BindVertexArray");
18790}
18791
18792/** Execute GenVertexArrays
18793 *
18794 **/
18795void Utils::vertexArray::generate()
18796{
18797	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
18798
18799	gl.genVertexArrays(1, &m_id);
18800	GLU_EXPECT_NO_ERROR(gl.getError(), "GenVertexArrays");
18801}
18802} /* GLSL420Pack namespace */
18803
18804/** Constructor.
18805 *
18806 *  @param context Rendering context.
18807 **/
18808ShadingLanguage420PackTests::ShadingLanguage420PackTests(deqp::Context& context)
18809	: TestCaseGroup(context, "shading_language_420pack", "Verifies \"shading_language_420pack\" functionality")
18810{
18811	/* Left blank on purpose */
18812}
18813
18814/** Initializes a texture_storage_multisample test group.
18815 *
18816 **/
18817void ShadingLanguage420PackTests::init(void)
18818{
18819	addChild(new GLSL420Pack::BindingSamplerSingleTest(m_context));
18820	addChild(new GLSL420Pack::BindingImageSingleTest(m_context));
18821	addChild(new GLSL420Pack::UTF8CharactersTest(m_context));
18822	addChild(new GLSL420Pack::UTF8InSourceTest(m_context));
18823	addChild(new GLSL420Pack::QualifierOrderTest(m_context));
18824	addChild(new GLSL420Pack::QualifierOrderBlockTest(m_context));
18825	addChild(new GLSL420Pack::LineContinuationTest(m_context));
18826	addChild(new GLSL420Pack::LineNumberingTest(m_context));
18827	addChild(new GLSL420Pack::ImplicitConversionsValidTest(m_context));
18828	addChild(new GLSL420Pack::ImplicitConversionsInvalidTest(m_context));
18829	addChild(new GLSL420Pack::ConstDynamicValueTest(m_context));
18830	addChild(new GLSL420Pack::ConstAssignmentTest(m_context));
18831	addChild(new GLSL420Pack::ConstDynamicValueAsConstExprTest(m_context));
18832	addChild(new GLSL420Pack::QualifierOrderUniformTest(m_context));
18833	addChild(new GLSL420Pack::QualifierOrderFunctionInoutTest(m_context));
18834	addChild(new GLSL420Pack::QualifierOrderFunctionInputTest(m_context));
18835	addChild(new GLSL420Pack::QualifierOrderFunctionOutputTest(m_context));
18836	addChild(new GLSL420Pack::QualifierOverrideLayoutTest(m_context));
18837	addChild(new GLSL420Pack::BindingUniformBlocksTest(m_context));
18838	addChild(new GLSL420Pack::BindingUniformSingleBlockTest(m_context));
18839	addChild(new GLSL420Pack::BindingUniformBlockArrayTest(m_context));
18840	addChild(new GLSL420Pack::BindingUniformDefaultTest(m_context));
18841	addChild(new GLSL420Pack::BindingUniformAPIOverirdeTest(m_context));
18842	addChild(new GLSL420Pack::BindingUniformGlobalBlockTest(m_context));
18843	addChild(new GLSL420Pack::BindingUniformInvalidTest(m_context));
18844	addChild(new GLSL420Pack::BindingSamplersTest(m_context));
18845	addChild(new GLSL420Pack::BindingSamplerArrayTest(m_context));
18846	addChild(new GLSL420Pack::BindingSamplerDefaultTest(m_context));
18847	addChild(new GLSL420Pack::BindingSamplerAPIOverrideTest(m_context));
18848	addChild(new GLSL420Pack::BindingSamplerInvalidTest(m_context));
18849	addChild(new GLSL420Pack::BindingImagesTest(m_context));
18850	addChild(new GLSL420Pack::BindingImageArrayTest(m_context));
18851	addChild(new GLSL420Pack::BindingImageDefaultTest(m_context));
18852	addChild(new GLSL420Pack::BindingImageAPIOverrideTest(m_context));
18853	addChild(new GLSL420Pack::BindingImageInvalidTest(m_context));
18854	addChild(new GLSL420Pack::InitializerListTest(m_context));
18855	addChild(new GLSL420Pack::InitializerListNegativeTest(m_context));
18856	addChild(new GLSL420Pack::LengthOfVectorAndMatrixTest(m_context));
18857	addChild(new GLSL420Pack::LengthOfComputeResultTest(m_context));
18858	addChild(new GLSL420Pack::ScalarSwizzlersTest(m_context));
18859	addChild(new GLSL420Pack::ScalarSwizzlersInvalidTest(m_context));
18860	addChild(new GLSL420Pack::BuiltInValuesTest(m_context));
18861	addChild(new GLSL420Pack::BuiltInAssignmentTest(m_context));
18862}
18863
18864} /* gl4cts namespace */
18865