• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GL4CSHADINGLANGUAGE420PACKTESTS_HPP
2 #define _GL4CSHADINGLANGUAGE420PACKTESTS_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2014-2016 The Khronos Group Inc.
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */ /*!
22  * \file
23  * \brief
24  */ /*-------------------------------------------------------------------*/
25 
26 /**
27  * \file  gl4cShadingLanguage420PackTests.hpp
28  * \brief Declares test classes for "Shading Language 420Pack" functionality.
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "glcTestCase.hpp"
32 #include "glwDefs.hpp"
33 
34 namespace tcu
35 {
36 class MessageBuilder;
37 } /* namespace tcu */
38 
39 namespace gl4cts
40 {
41 
42 namespace GLSL420Pack
43 {
44 class Utils
45 {
46 public:
47 	/* Public enums */
48 	enum TEXTURE_TYPES
49 	{
50 		TEX_BUFFER,
51 		TEX_2D,
52 		TEX_2D_RECT,
53 		TEX_2D_ARRAY,
54 		TEX_3D,
55 		TEX_CUBE,
56 		TEX_1D,
57 		TEX_1D_ARRAY,
58 
59 		/* */
60 		TEXTURE_TYPES_MAX
61 	};
62 
63 	enum SHADER_STAGES
64 	{
65 		COMPUTE_SHADER = 0,
66 		VERTEX_SHADER,
67 		TESS_CTRL_SHADER,
68 		TESS_EVAL_SHADER,
69 		GEOMETRY_SHADER,
70 		FRAGMENT_SHADER,
71 
72 		/* */
73 		SHADER_STAGES_MAX
74 	};
75 
76 	enum UTF8_CHARACTERS
77 	{
78 		TWO_BYTES,
79 		THREE_BYTES,
80 		FOUR_BYTES,
81 		FIVE_BYTES,
82 		SIX_BYTES,
83 		REDUNDANT_ASCII,
84 
85 		/* */
86 		EMPTY
87 	};
88 
89 	enum TYPES
90 	{
91 		FLOAT,
92 		DOUBLE,
93 		INT,
94 		UINT,
95 
96 		/* */
97 		TYPES_MAX
98 	};
99 
100 	enum QUALIFIER_CLASSES
101 	{
102 		QUAL_CLS_INVARIANCE = 0,
103 		QUAL_CLS_INTERPOLATION,
104 		QUAL_CLS_LAYOUT,
105 		QUAL_CLS_AUXILARY_STORAGE,
106 		QUAL_CLS_STORAGE,
107 		QUAL_CLS_PRECISION,
108 
109 		/* */
110 		QUAL_CLS_MAX
111 	};
112 
113 	enum QUALIFIERS
114 	{
115 		QUAL_NONE,
116 
117 		/* CONSTNESS */
118 		QUAL_CONST,
119 
120 		/* STORAGE */
121 		QUAL_IN,
122 		QUAL_OUT,
123 		QUAL_INOUT,
124 		QUAL_UNIFORM,
125 
126 		/* AUXILARY */
127 		QUAL_PATCH,
128 		QUAL_CENTROID,
129 		QUAL_SAMPLE,
130 
131 		/* INTERPOLATION */
132 		QUAL_FLAT,
133 		QUAL_NOPERSPECTIVE,
134 		QUAL_SMOOTH,
135 
136 		/* LAYOUT */
137 		QUAL_LOCATION,
138 
139 		/* PRECISION */
140 		QUAL_LOWP,
141 		QUAL_MEDIUMP,
142 		QUAL_HIGHP,
143 		QUAL_PRECISE,
144 
145 		/* INVARIANCE */
146 		QUAL_INVARIANT,
147 
148 		/* */
149 		QUAL_MAX
150 	};
151 
152 	enum VARIABLE_STORAGE
153 	{
154 		INPUT,
155 		OUTPUT,
156 		UNIFORM,
157 
158 		/* */
159 		STORAGE_MAX
160 	};
161 
162 	enum VARIABLE_FLAVOUR
163 	{
164 		BASIC,
165 		ARRAY,
166 		INDEXED_BY_INVOCATION_ID
167 	};
168 
169 	/* Public types */
170 	struct buffer
171 	{
172 		buffer(deqp::Context& context);
173 		~buffer();
174 
175 		void bind() const;
176 
177 		void bindRange(glw::GLuint index, glw::GLintptr offset, glw::GLsizeiptr size);
178 
179 		void generate(glw::GLenum target);
180 		void* map(glw::GLenum access) const;
181 		void unmap() const;
182 
183 		void update(glw::GLsizeiptr size, glw::GLvoid* data, glw::GLenum usage);
184 
185 		void		release();
186 		glw::GLuint m_id;
187 
188 	private:
189 		deqp::Context& m_context;
190 		glw::GLenum	m_target;
191 	};
192 
193 	struct framebuffer
194 	{
195 		framebuffer(deqp::Context& context);
196 		~framebuffer();
197 
198 		void attachTexture(glw::GLenum attachment, glw::GLuint texture_id, glw::GLuint width, glw::GLuint height);
199 
200 		void bind();
201 		void clear(glw::GLenum mask);
202 
203 		void clearColor(glw::GLfloat red, glw::GLfloat green, glw::GLfloat blue, glw::GLfloat alpha);
204 
205 		void generate();
206 
207 		glw::GLuint m_id;
208 
209 	private:
210 		deqp::Context& m_context;
211 	};
212 
213 	struct shaderSource
214 	{
215 		shaderSource();
216 		shaderSource(const shaderSource& source);
217 		shaderSource(const glw::GLchar* source_code);
218 
219 		struct shaderPart
220 		{
221 			std::string m_code;
222 			glw::GLint  m_length;
223 		};
224 
225 		std::vector<shaderPart> m_parts;
226 		bool					m_use_lengths;
227 	};
228 
229 	class shaderCompilationException : public std::exception
230 	{
231 	public:
232 		shaderCompilationException(const shaderSource& source, const glw::GLchar* message);
233 
~shaderCompilationException()234 		virtual ~shaderCompilationException() throw()
235 		{
236 		}
237 
238 		virtual const char* what() const throw();
239 
240 		shaderSource m_shader_source;
241 		std::string  m_error_message;
242 	};
243 
244 	class programLinkageException : public std::exception
245 	{
246 	public:
247 		programLinkageException(const glw::GLchar* error_message);
248 
~programLinkageException()249 		virtual ~programLinkageException() throw()
250 		{
251 		}
252 
253 		virtual const char* what() const throw();
254 
255 		std::string m_error_message;
256 	};
257 
258 	/** Store information about program object
259 	 *
260 	 **/
261 	struct program
262 	{
263 		program(deqp::Context& context);
264 		~program();
265 
266 		void build(const glw::GLchar* compute_shader_code, const glw::GLchar* fragment_shader_code,
267 				   const glw::GLchar* geometry_shader_code, const glw::GLchar* tesselation_control_shader_code,
268 				   const glw::GLchar* tesselation_evaluation_shader_code, const glw::GLchar* vertex_shader_code,
269 				   const glw::GLchar* const* varying_names, glw::GLuint n_varying_names, bool is_separable = false);
270 
271 		void build(const shaderSource& compute_shader, const shaderSource& fragment_shader,
272 				   const shaderSource& geometry_shader, const shaderSource& tesselation_control_shader,
273 				   const shaderSource& tesselation_evaluation_shader, const shaderSource& vertex_shader,
274 				   const glw::GLchar* const* varying_names, glw::GLuint n_varying_names, bool is_separable = false);
275 
276 		void compile(glw::GLuint shader_id, const shaderSource& source) const;
277 
278 		void createFromBinary(const std::vector<glw::GLubyte>& binary, glw::GLenum binary_format);
279 
280 		glw::GLint getAttribLocation(const glw::GLchar* name) const;
281 
282 		void getBinary(std::vector<glw::GLubyte>& binary, glw::GLenum& binary_format) const;
283 
284 		glw::GLuint getSubroutineIndex(const glw::GLchar* subroutine_name, glw::GLenum shader_stage) const;
285 
286 		glw::GLint getSubroutineUniformLocation(const glw::GLchar* uniform_name, glw::GLenum shader_stage) const;
287 
288 		glw::GLint getUniform1i(glw::GLuint location) const;
289 		glw::GLint getUniformLocation(const glw::GLchar* uniform_name) const;
290 
291 		void link() const;
292 		void remove();
293 
294 		void uniform(const glw::GLchar* uniform_name, TYPES type, glw::GLuint n_columns, glw::GLuint n_rows,
295 					 const void* data) const;
296 
297 		void use() const;
298 
299 		/* */
300 		static void printShaderSource(const shaderSource& source, tcu::MessageBuilder& log);
301 
302 		static const glw::GLenum ARB_COMPUTE_SHADER;
303 
304 		glw::GLuint m_compute_shader_id;
305 		glw::GLuint m_fragment_shader_id;
306 		glw::GLuint m_geometry_shader_id;
307 		glw::GLuint m_program_object_id;
308 		glw::GLuint m_tesselation_control_shader_id;
309 		glw::GLuint m_tesselation_evaluation_shader_id;
310 		glw::GLuint m_vertex_shader_id;
311 
312 	private:
313 		deqp::Context& m_context;
314 	};
315 
316 	struct texture
317 	{
318 		texture(deqp::Context& context);
319 		~texture();
320 
321 		void bind() const;
322 
323 		void create(glw::GLuint width, glw::GLuint height, glw::GLenum internal_format);
324 
325 		void create(glw::GLuint width, glw::GLuint height, glw::GLuint depth, glw::GLenum internal_format,
326 					TEXTURE_TYPES texture_type);
327 
328 		void createBuffer(glw::GLenum internal_format, glw::GLuint buffer_id);
329 
330 		void get(glw::GLenum format, glw::GLenum type, glw::GLvoid* out_data) const;
331 
332 		void release();
333 
334 		void update(glw::GLuint width, glw::GLuint height, glw::GLuint depth, glw::GLenum format, glw::GLenum type,
335 					glw::GLvoid* data);
336 
337 		glw::GLuint m_id;
338 
339 	private:
340 		glw::GLuint	m_buffer_id;
341 		deqp::Context& m_context;
342 		TEXTURE_TYPES  m_texture_type;
343 	};
344 
345 	struct vertexArray
346 	{
347 		vertexArray(deqp::Context& Context);
348 		~vertexArray();
349 
350 		void generate();
351 		void bind();
352 
353 		glw::GLuint m_id;
354 
355 	private:
356 		deqp::Context& m_context;
357 	};
358 
359 	/* Public typedefs */
360 	typedef std::vector<Utils::QUALIFIERS> qualifierSet;
361 
362 	/* UniformN*v prototypes */
363 	typedef GLW_APICALL void(GLW_APIENTRY* uniformNdv)(glw::GLint, glw::GLsizei, const glw::GLdouble*);
364 	typedef GLW_APICALL void(GLW_APIENTRY* uniformNfv)(glw::GLint, glw::GLsizei, const glw::GLfloat*);
365 	typedef GLW_APICALL void(GLW_APIENTRY* uniformNiv)(glw::GLint, glw::GLsizei, const glw::GLint*);
366 	typedef GLW_APICALL void(GLW_APIENTRY* uniformNuiv)(glw::GLint, glw::GLsizei, const glw::GLuint*);
367 	typedef GLW_APICALL void(GLW_APIENTRY* uniformMatrixNdv)(glw::GLint, glw::GLsizei, glw::GLboolean,
368 															 const glw::GLdouble*);
369 	typedef GLW_APICALL void(GLW_APIENTRY* uniformMatrixNfv)(glw::GLint, glw::GLsizei, glw::GLboolean,
370 															 const glw::GLfloat*);
371 
372 	/* Public static methods */
373 	/* UniformN*v routine getters */
374 	static uniformNdv getUniformNdv(const glw::Functions& gl, glw::GLuint n_rows);
375 
376 	static uniformNfv getUniformNfv(const glw::Functions& gl, glw::GLuint n_rows);
377 
378 	static uniformNiv getUniformNiv(const glw::Functions& gl, glw::GLuint n_rows);
379 
380 	static uniformNuiv getUniformNuiv(const glw::Functions& gl, glw::GLuint n_rows);
381 
382 	static uniformMatrixNdv getUniformMatrixNdv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows);
383 
384 	static uniformMatrixNfv getUniformMatrixNfv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows);
385 
386 	/* GLSL qualifiers */
387 	static bool doesContainQualifier(QUALIFIERS qualifier, const qualifierSet& qualifiers);
388 
389 	static bool doesStageSupportQualifier(SHADER_STAGES stage, VARIABLE_STORAGE storage, QUALIFIERS qualifier);
390 
391 	static const glw::GLchar* getQualifierString(QUALIFIERS qualifier);
392 	static std::string getQualifiersListString(const qualifierSet& qualifiers);
393 
394 	static qualifierSet prepareQualifiersSet(const qualifierSet& in_qualifiers, SHADER_STAGES stage,
395 											 VARIABLE_STORAGE storage);
396 
397 	/* Variable name */
398 	static std::string getBlockVariableDefinition(const Utils::qualifierSet& qualifiers, const glw::GLchar* type_name,
399 												  const glw::GLchar* variable_name);
400 
401 	static std::string getBlockVariableReference(VARIABLE_FLAVOUR flavour, const glw::GLchar* variable_name,
402 												 const glw::GLchar* block_name);
403 
404 	static std::string getVariableDefinition(VARIABLE_FLAVOUR flavour, const Utils::qualifierSet& qualifiers,
405 											 const glw::GLchar* type_name, const glw::GLchar* variable_name);
406 
407 	static VARIABLE_FLAVOUR getVariableFlavour(Utils::SHADER_STAGES stage, Utils::VARIABLE_STORAGE storage,
408 											   const Utils::qualifierSet& qualifiers);
409 
410 	static std::string getVariableName(Utils::SHADER_STAGES stage, Utils::VARIABLE_STORAGE storage,
411 									   const glw::GLchar* variable_name);
412 
413 	static std::string getVariableReference(VARIABLE_FLAVOUR flavour, const glw::GLchar* variable_name);
414 
415 	static void prepareBlockVariableStrings(Utils::SHADER_STAGES in_stage, Utils::VARIABLE_STORAGE in_storage,
416 											const Utils::qualifierSet& in_qualifiers, const glw::GLchar* in_type_name,
417 											const glw::GLchar* in_variable_name, const glw::GLchar* in_block_name,
418 											std::string& out_definition, std::string& out_reference);
419 
420 	static void prepareVariableStrings(Utils::SHADER_STAGES in_stage, Utils::VARIABLE_STORAGE in_storage,
421 									   const Utils::qualifierSet& in_qualifiers, const glw::GLchar* in_type_name,
422 									   const glw::GLchar* in_variable_name, std::string& out_definition,
423 									   std::string& out_reference);
424 
425 	/* Textures */
426 	static const glw::GLchar* getImageType(TEXTURE_TYPES type);
427 	static glw::GLuint getNumberOfCoordinates(TEXTURE_TYPES type);
428 	static const glw::GLchar* getSamplerType(TEXTURE_TYPES type);
429 	static glw::GLenum getTextureTartet(TEXTURE_TYPES type);
430 	static const glw::GLchar* getTextureTypeName(TEXTURE_TYPES type);
431 
432 	/* Stuff */
433 	static bool checkUniformBinding(Utils::program& program, const glw::GLchar* name, glw::GLint expected_binding);
434 	static bool checkUniformArrayBinding(Utils::program& program, const glw::GLchar* name, glw::GLuint index,
435 										 glw::GLint expected_binding);
436 	static bool doesTypeSupportMatrix(TYPES type);
437 	static const glw::GLchar* getShaderStageName(SHADER_STAGES stage);
438 	static const glw::GLchar* getTypeName(TYPES type, glw::GLuint n_columns, glw::GLuint n_rows);
439 	static const glw::GLchar* getUtf8Character(UTF8_CHARACTERS character);
440 	static bool isExtensionSupported(deqp::Context& context, const glw::GLchar* extension_name);
441 	static bool isGLVersionAtLeast(const glw::Functions& gl, glw::GLint required_major, glw::GLint required_minor);
442 	static void replaceToken(const glw::GLchar* token, size_t& search_position, const glw::GLchar* text,
443 							 std::string& string);
444 	static void replaceAllTokens(const glw::GLchar* token, const glw::GLchar* text, std::string& string);
445 };
446 
447 /** Base class for tests **/
448 class TestBase : public deqp::TestCase
449 {
450 public:
451 	/* Public methods */
452 	TestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
~TestBase()453 	virtual ~TestBase()
454 	{
455 	}
456 
457 	/* Public methods inherited from TestCase */
458 	virtual tcu::TestNode::IterateResult iterate(void);
459 
460 protected:
461 	/* Methods to be implemented by child class */
462 	virtual void getShaderSourceConfig(glw::GLuint& out_n_parts, bool& out_use_lengths);
463 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
464 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
465 									 Utils::shaderSource& out_source) = 0;
466 	virtual void prepareUniforms(Utils::program& program);
467 	virtual bool testInit();
468 	virtual bool testCompute()						 = 0;
469 	virtual bool testDrawArray(bool use_version_400) = 0;
470 
471 	/* Methods available to child classes */
472 	const glw::GLchar* getStageSpecificLayout(Utils::SHADER_STAGES stage) const;
473 	const glw::GLchar* getVersionString(Utils::SHADER_STAGES stage, bool use_version_400) const;
474 	void initShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, Utils::shaderSource& out_source);
475 	int maxImageUniforms(Utils::SHADER_STAGES stage) const;
476 
477 	/* Protected variables */
478 	bool m_is_compute_shader_supported;
479 	bool m_is_explicit_uniform_location;
480 	bool m_is_shader_language_420pack;
481 
482 private:
483 	/* Private methods */
484 	bool test();
485 };
486 
487 /** Base class for API tests */
488 class APITestBase : public TestBase
489 {
490 public:
491 	/* Public methods */
492 	APITestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
493 
~APITestBase()494 	virtual ~APITestBase()
495 	{
496 	}
497 
498 protected:
499 	/* Protected methods inherited from TestBase */
500 	virtual bool testCompute();
501 	virtual bool testDrawArray(bool use_version_400);
502 
503 	/* Protected methods to be implemented by child class */
504 	virtual bool checkResults(Utils::program& program) = 0;
505 
506 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
507 									 Utils::shaderSource& out_source) = 0;
508 };
509 
510 /** Base class for GLSL tests **/
511 class GLSLTestBase : public TestBase
512 {
513 public:
514 	/* Public methods */
515 	GLSLTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
516 
~GLSLTestBase()517 	virtual ~GLSLTestBase()
518 	{
519 	}
520 
521 protected:
522 	/* Protected methods inherited from TestBase */
523 	virtual bool testCompute();
524 	virtual bool testDrawArray(bool use_version_400);
525 
526 	/* Protected methods to be implemented by child class */
527 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
528 									 Utils::shaderSource& out_source) = 0;
529 
530 	virtual const glw::GLchar* prepareSourceTexture(Utils::texture& texture);
531 
532 	virtual void prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, Utils::vertexArray& vao);
533 
534 	virtual bool verifyAdditionalResults() const;
535 	virtual void releaseResource();
536 
537 private:
538 	/* Private methods */
539 	void bindTextureToimage(Utils::program& program, Utils::texture& texture, const glw::GLchar* uniform_name) const;
540 
541 	void bindTextureToSampler(Utils::program& program, Utils::texture& texture, const glw::GLchar* uniform_name) const;
542 
543 	bool checkResults(Utils::texture& color_texture) const;
544 
545 	void prepareFramebuffer(Utils::framebuffer& framebuffer, Utils::texture& color_texture) const;
546 
547 	void prepareImage(Utils::program& program, Utils::texture& color_texture) const;
548 
549 	/* Private constants */
550 	static const glw::GLenum m_color_texture_internal_format;
551 	static const glw::GLenum m_color_texture_format;
552 	static const glw::GLenum m_color_texture_type;
553 	static const glw::GLuint m_color_texture_width;
554 	static const glw::GLuint m_color_texture_height;
555 };
556 
557 /** Base class for negative tests **/
558 class NegativeTestBase : public TestBase
559 {
560 public:
561 	/* Public methods */
562 	NegativeTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
563 
~NegativeTestBase()564 	virtual ~NegativeTestBase()
565 	{
566 	}
567 
568 protected:
569 	/* Protected methods inherited from TestBase */
570 	virtual bool testCompute();
571 	virtual bool testDrawArray(bool use_version_400);
572 
573 	/* Protected methods to be implemented by child class */
574 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
575 									 Utils::shaderSource& out_source) = 0;
576 };
577 
578 /** Base class for "binding image" tests **/
579 class BindingImageTest : public GLSLTestBase
580 {
581 public:
582 	/* Public methods */
583 	BindingImageTest(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
584 
~BindingImageTest()585 	virtual ~BindingImageTest()
586 	{
587 	}
588 
589 protected:
590 	/* Protected methods */
591 	void prepareBuffer(Utils::buffer& buffer, glw::GLuint color);
592 
593 	void prepareTexture(Utils::texture& texture, const Utils::buffer& buffer, Utils::TEXTURE_TYPES texture_type,
594 						glw::GLuint color, glw::GLuint unit);
595 
596 	bool verifyBuffer(const Utils::buffer& buffer) const;
597 	bool verifyTexture(const Utils::texture& texture) const;
598 
599 	/* Protected constants */
600 	static const glw::GLuint m_width;
601 	static const glw::GLuint m_green_color;
602 	static const glw::GLuint m_height;
603 	static const glw::GLuint m_depth;
604 };
605 
606 /** Test implementation, description follows:
607  *
608  * GLSL Tests:
609  *
610  *   * Unix-style new line continuation:
611  *
612  *    Run test with shader that contains line continuation and Unix-style (LF)
613  *    new line characters inside:
614  *
615  *     - assignment expression (after and before '=' operator)
616  *
617  *     - vector variable initializer (after ',' in contructor)
618  *
619  *     - tokens (inside function name, inside type name, inside variable name).
620  *       These tokens are later used to generate some color value, that
621  *       is later verifed.
622  *
623  *     - preprocessor (#define) syntax  - inside and in between preprocessor
624  *       tokens. These tokens are later used to generate some color value,
625  *       that is later verifed.
626  *
627  *     - comments
628  *
629  *    For example test for line continuation inside preprocessor tokens may use
630  *    following GLSL code:
631  *
632  *        #define ADD_ONE(XX) (X\\
633          *        X + 1.0)
634  *        vec4 getColor(float f) {
635  *            return vec4(0.0, ADD_ONE(0.0), 0.0, 1.0);
636  *        }
637  *
638  *     Where returned color is verified agains some reference value.
639  *
640  *
641  *   * DOS-style line continuation:
642  *
643  *    Run same test with line continuation sign before DOS-style (CR+LF) new
644  *    line character.
645  *
646  *
647  *   * Multiple line continuations in same GLSL token:
648  *
649  *    Run test with shader that contains multiple (3 or more) line
650  *    continuation and newlines inside same GLSL tokens (function or variable
651  *    names).
652  *
653  *
654  *   * Line continuation near GLSL shader source null-termination:
655  *
656  *    Run test with shader that contains line continuation character as the
657  *    last character in null terminated shader string.
658  *
659  *
660  *   * Line continuation near GLSL shader source end:
661  *
662  *    Run test with shader that contains line continuation character as the
663  *    last character in not null terminated shader string (shader source length
664  *    parameter is specified in glShaderSource call).
665  *
666  *
667  *   * Line continuation near end of GLSL shader source string:
668  *
669  *    Run test with shader constructed by multple strings passed to
670  *    glShaderSource. New line continuation characters placed as:
671  *
672  *     - last character of passed null terminated string
673  *     - next-to-last character of passed null terminated string,
674  *       followed by newline
675  *     - last character of passed not null terminated string
676  *     - next-to-last character of passed not null terminated string,
677  *       followed by newline
678  *
679  *     Each string with line continuation should be followed by a next,
680  *     non-empty string.
681  **/
682 class LineContinuationTest : public GLSLTestBase
683 {
684 public:
685 	/* Public methods */
686 	LineContinuationTest(deqp::Context&);
687 
~LineContinuationTest()688 	virtual ~LineContinuationTest()
689 	{
690 	}
691 
692 protected:
693 	/* Protected methods inherited from GLSLTestBase */
694 	virtual void getShaderSourceConfig(glw::GLuint& out_n_parts, bool& out_use_lengths);
695 
696 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
697 
698 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
699 									 Utils::shaderSource& out_source);
700 
701 	virtual const glw::GLchar* prepareSourceTexture(Utils::texture& texture);
702 
703 	virtual void prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, Utils::vertexArray& vao);
704 
705 private:
706 	/* Private enums */
707 	enum CASES
708 	{
709 		ASSIGNMENT_BEFORE_OPERATOR = 0,
710 		ASSIGNMENT_AFTER_OPERATOR,
711 		VECTOR_VARIABLE_INITIALIZER,
712 		TOKEN_INSIDE_FUNCTION_NAME,
713 		TOKEN_INSIDE_TYPE_NAME,
714 		TOKEN_INSIDE_VARIABLE_NAME,
715 		PREPROCESSOR_TOKEN_INSIDE,
716 		PREPROCESSOR_TOKEN_BETWEEN,
717 		COMMENT,
718 		SOURCE_TERMINATION_NULL,
719 		SOURCE_TERMINATION_NON_NULL,
720 		PART_TERMINATION_NULL,
721 		PART_NEXT_TO_TERMINATION_NULL,
722 		PART_TERMINATION_NON_NULL,
723 		PART_NEXT_TO_TERMINATION_NON_NULL,
724 
725 		/* DEBUG: there will be no line continuations at all */
726 		DEBUG_CASE
727 	};
728 
729 	enum REPETITIONS
730 	{
731 		ONCE = 0,
732 		MULTIPLE_TIMES,
733 	};
734 
735 	enum LINE_ENDINGS
736 	{
737 		UNIX = 0,
738 		DOS,
739 	};
740 
741 	/* Private types */
742 	/** Declare test case
743 	 *
744 	 **/
745 	struct testCase
746 	{
747 		glw::GLuint m_case;
748 		glw::GLuint m_repetitions;
749 		glw::GLuint m_line_endings;
750 	};
751 
752 	/* Private methods */
753 	const glw::GLchar* casesToStr(CASES cases) const;
754 	const glw::GLchar* getExpectedValueString() const;
755 	std::string		   getLineContinuationString() const;
756 	bool			   isShaderMultipart() const;
757 	const glw::GLchar* lineEndingsToStr(LINE_ENDINGS line_ending) const;
758 	void prepareComputShaderSource(Utils::shaderSource& shaderSource);
759 
760 	void prepareShaderSourceForDraw(Utils::SHADER_STAGES stage, bool use_version_400, Utils::shaderSource& source);
761 
762 	const glw::GLchar* repetitionsToStr(REPETITIONS repetitions) const;
763 	void replaceAllCaseTokens(std::string& source) const;
764 	bool useSourceLengths() const;
765 
766 	/* Private constants */
767 	static const glw::GLuint  m_n_repetitions;
768 	static const glw::GLchar* m_texture_coordinates_name;
769 
770 	/* Private variables */
771 	testCase m_test_case;
772 };
773 
774 /** Test implementation, description follows:
775  *
776  * Correct numbering of lines with line continuations:
777  *
778  * Try to compile shader with line continuation schemes, followed
779  * by __LINE__ macro capturing the current line number.
780  * The value of __LINE__ is than validated against expected
781  * constant. Expected value must account for continued lines,
782  * for example in code below, they are two line continuations,
783  * so the expected value is N - 2 (where N is the "raw" line number).
784  *
785  *     ivec4 glsl\\
786          *     Test\\
787          *     Func(float f) {
788  *         obvious = error;
789  *         return vec4(__LINE__, 0, 0, 1);
790  *     }
791  **/
792 class LineNumberingTest : public GLSLTestBase
793 {
794 public:
795 	/* Public methods */
796 	LineNumberingTest(deqp::Context&);
797 
~LineNumberingTest()798 	virtual ~LineNumberingTest()
799 	{
800 	}
801 
802 protected:
803 	/* Protected methods inherited from GLSLTestBase */
804 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
805 									 Utils::shaderSource& out_source);
806 };
807 
808 /** Test implementation, description follows:
809  *
810  * * UTF-8 characters in comments:
811  *
812  *   Run test with shader that contains non-ASCII UTF-8 characters in comments.
813  *   Use 2-byte UTF-8 characters (Latin-1 supplements, Greek, Hebrew, Cyril),
814  *   3-byte (Chinese/Japanese/Korean), 4-byte (less common CJK).
815  *   Also test 5 and 6 byte codes.
816  *   Also test base plane ASCII characters encoded with redundant bytes,
817  *   such as 'a' or <whitespace> encoded by 4 bytes.
818  *
819  *   Encode UTF-8 strings manually in test, either by c-array or '\0xNN' escape
820  *   sequences.
821  *
822  *
823  *  * UTF-8 characters in preprocessor:
824  *
825  *   Run test with shader that contains non-ASCII UTF-8 characters (arbitrary
826  *   from above) in preprocessor tokens. Use preprocessor to strip these UTF-8
827  *   characters, so they does not occur in preprocessed GLSL shader source.
828  *
829  *
830  *  * Incomplete UTF-8 near GLSL shader source null-termination:
831  *
832  *   Run test with shader that contains comment with incomplete UTF-8
833  *   character as the last character in null terminated shader string.
834  *
835  *
836  *  * Incomplete UTF-8 near GLSL shader source end:
837  *
838  *   Run test with shader that contains comment with incomplete UTF-8
839  *   character as the last character in not-null terminated shader string.
840  *   Shader source length parameter is specified in glShaderSource call.
841  **/
842 class UTF8CharactersTest : public GLSLTestBase
843 {
844 public:
845 	/* Public methods */
846 	UTF8CharactersTest(deqp::Context&);
847 
~UTF8CharactersTest()848 	virtual ~UTF8CharactersTest()
849 	{
850 	}
851 
852 	/* Protected methods inherited from GLSLTestBase */
853 	virtual void getShaderSourceConfig(glw::GLuint& out_n_parts, bool& out_use_lengths);
854 
855 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
856 
857 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
858 									 Utils::shaderSource& out_source);
859 
860 	virtual const glw::GLchar* prepareSourceTexture(Utils::texture& texture);
861 
862 private:
863 	/* Private enums */
864 	enum CASES
865 	{
866 		IN_COMMENT = 0,
867 		IN_PREPROCESSOR,
868 		AS_LAST_CHARACTER_NULL_TERMINATED,
869 		AS_LAST_CHARACTER_NON_NULL_TERMINATED,
870 
871 		DEBUG_CASE
872 	};
873 
874 	/* Private types */
875 	struct testCase
876 	{
877 		CASES				   m_case;
878 		Utils::UTF8_CHARACTERS m_character;
879 	};
880 
881 	/* Private methods */
882 	const glw::GLchar* casesToStr() const;
883 
884 	/* Private variables */
885 	testCase m_test_case;
886 };
887 
888 /** Test implementation, description follows:
889  *
890  * * UTF-8 in after preprocessor, in GLSL syntax:
891  *
892  *   Try to compile shader that contains non-ASCII UTF-8 character after
893  *   preprocessing. Expect compilation error.
894  **/
895 class UTF8InSourceTest : public NegativeTestBase
896 {
897 public:
898 	/* Public methods */
899 	UTF8InSourceTest(deqp::Context&);
900 
~UTF8InSourceTest()901 	virtual ~UTF8InSourceTest()
902 	{
903 	}
904 
905 	/* Protected methods inherited from GLSLTestBase */
906 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
907 
908 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
909 									 Utils::shaderSource& out_source);
910 
911 private:
912 	/* Private variables */
913 	Utils::UTF8_CHARACTERS m_character;
914 };
915 
916 /** Test implementation, description follows:
917  *
918  * * Check all implicit conversions on function return:
919  *
920  *    Run test with shader that verifies value being return by following
921  *    function:
922  *
923  *        T1 f(T2 x, T2 y) { return x + y; }'
924  *
925  *   By substituting T1 and T2 typenames check following conversions:
926  *    - int to uint
927  *    - int to float
928  *    - uint to float
929  *    - int to double
930  *    - uint to double
931  *    - float to double
932  *   Use scalars and vector types (all vector sizes). For conversions not
933  *   involving ints or uints test also matrix types (all matrix sizes)
934  *
935  *   Call this function on literals, constant expressions and variables
936  *   (variables should contain values that cannot be constant folded during
937  *   compilation).
938  **/
939 class ImplicitConversionsValidTest : public GLSLTestBase
940 {
941 public:
942 	/* Public methods */
943 	ImplicitConversionsValidTest(deqp::Context&);
944 
~ImplicitConversionsValidTest()945 	virtual ~ImplicitConversionsValidTest()
946 	{
947 	}
948 
949 protected:
950 	/* Methods to be implemented by child class */
951 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
952 
953 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
954 									 Utils::shaderSource& out_source);
955 
956 	virtual void prepareUniforms(Utils::program& program);
957 	virtual bool testInit();
958 
959 private:
960 	/* Private types */
961 	struct typesPair
962 	{
963 		Utils::TYPES m_t1;
964 		Utils::TYPES m_t2;
965 	};
966 
967 	struct testCase
968 	{
969 		typesPair   m_types;
970 		glw::GLuint m_n_cols;
971 		glw::GLuint m_n_rows;
972 	};
973 
974 	/* Private methods */
975 	const testCase& getCurrentTestCase();
976 
977 	std::string getValueList(glw::GLuint n_columns, glw::GLuint n_rows);
978 
979 	/* Private variables */
980 	testCase			  m_debug_test_case;
981 	std::vector<testCase> m_test_cases;
982 	glw::GLuint			  m_current_test_case_index;
983 };
984 
985 /** Test implementation, description follows:
986  *
987  * * Check if uint to int conversion is forbidden:
988  *
989  *   Try to compile shader that returns uint value from function returning int.
990  *   Expect shader compilation error. Use scalars and vector types.
991  **/
992 class ImplicitConversionsInvalidTest : public NegativeTestBase
993 {
994 public:
995 	/* Public methods */
996 	ImplicitConversionsInvalidTest(deqp::Context&);
997 
~ImplicitConversionsInvalidTest()998 	virtual ~ImplicitConversionsInvalidTest()
999 	{
1000 	}
1001 
1002 protected:
1003 	/* Methods to be implemented by child class */
1004 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1005 
1006 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1007 									 Utils::shaderSource& out_source);
1008 
1009 private:
1010 	/* Private methods */
1011 	std::string getValueList(glw::GLuint n_rows);
1012 
1013 	/* Private variables */
1014 	glw::GLuint m_current_test_case_index;
1015 };
1016 
1017 /** Test implementation, description follows:
1018  *
1019  * * Read-only variables:
1020  *
1021  *   Run shader which contains and uses following read-only variables:
1022  *    const float c1 = X1;
1023  *    const vec4 c2 = X2;
1024  *    const mat2 c3 = X3;
1025  *    const S c4 = X4;
1026  *    const vec4 c5[15] = X5;
1027  *
1028  *   Where X1..X5 are non-constant initializer expressions (expressions which
1029  *   cannot be constant folded).  S is a struct of scalar, vector and matrix
1030  *   transparent types. Verify value of each read-only variable.
1031  **/
1032 class ConstDynamicValueTest : public GLSLTestBase
1033 {
1034 public:
1035 	/* Public methods */
1036 	ConstDynamicValueTest(deqp::Context&);
1037 
~ConstDynamicValueTest()1038 	virtual ~ConstDynamicValueTest()
1039 	{
1040 	}
1041 
1042 protected:
1043 	/* Methods to be implemented by child class */
1044 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1045 									 Utils::shaderSource& out_source);
1046 
1047 	virtual void prepareUniforms(Utils::program& program);
1048 };
1049 
1050 /** Test implementation, description follows:
1051  *
1052  * * Override value of read-only variable:
1053  *
1054  *   Try to compile shaders, that override value of constant variable.
1055  *   Use constant variable defined as:
1056  *     const float c1 = X1;
1057  *
1058  *   Where X1 is once a literal initializer and in another shader is a
1059  *   non-const-foldable non-constant variable.
1060  *
1061  *   Variable is non-const-foldable when it's value cannot be deduced during
1062  *   shader compilation. (As an example uniforms and varyings are non const
1063  *   foldable).
1064  *
1065  *   Expect compilation errors on any assignment to such variable.
1066  **/
1067 class ConstAssignmentTest : public NegativeTestBase
1068 {
1069 public:
1070 	/* Public methods */
1071 	ConstAssignmentTest(deqp::Context&);
1072 
~ConstAssignmentTest()1073 	virtual ~ConstAssignmentTest()
1074 	{
1075 	}
1076 
1077 protected:
1078 	/* Methods to be implemented by child class */
1079 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1080 
1081 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1082 									 Utils::shaderSource& out_source);
1083 
1084 private:
1085 	/* Private variables */
1086 	glw::GLuint m_current_test_case_index;
1087 };
1088 
1089 /** Test implementation, description follows:
1090  *
1091  * * Read-only variable use in place of constant expression:
1092  *
1093  *   Try to compile shader, that tries to force constant folding on const
1094  *   variable, when constant variable was initialized with non-constant,
1095  *   non const foldable expression. For example:
1096  *
1097  *   vec4 glslTestFunc(float f) {
1098  *        const float fConst1 = f;
1099  *        float a[f]; //force constant folding of f.
1100  *        return vec4(a[0]);
1101  *    }
1102  *    ...
1103  *    glslTestFunc(gl_FragCoord.x);
1104  **/
1105 class ConstDynamicValueAsConstExprTest : public NegativeTestBase
1106 {
1107 public:
1108 	/* Public methods */
1109 	ConstDynamicValueAsConstExprTest(deqp::Context&);
1110 
~ConstDynamicValueAsConstExprTest()1111 	virtual ~ConstDynamicValueAsConstExprTest()
1112 	{
1113 	}
1114 
1115 protected:
1116 	/* Methods to be implemented by child class */
1117 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1118 									 Utils::shaderSource& out_source);
1119 };
1120 
1121 /** Test implementation, description follows:
1122  *
1123  * * Input variable qualifier order:
1124  *
1125  *   Run shader which uses input variable, that is declared with all
1126  *   permutations of following qualifiers:
1127  *
1128  *    storage qualifiers: in
1129  *    interpolation qualifiers: (none), flat, noperespective, smooth
1130  *    auxaliary qualifiers: (none), patch, sample, centroid
1131  *    precision qualifiers: (none), precise
1132  *    invariance qualifiers: (none), invariant
1133  *    layout qualifiers: (none), layout(location = 0)
1134  *
1135  *   Test fragment, tessellation evaluation, tessellation control and geometry
1136  *   shader inputs.  Skip illegal permutations: flat interpolation qualifier
1137  *   used with non empty auxaliary qualifier, patch qualifier outside
1138  *   tessellation shaders. Also skip non-flat interpolation qualifiers for
1139  *   vertex, tessellation and geometry shaders.
1140  *
1141  * * Input variable qualifers used multiple times:
1142  *
1143  *   Same as above, but use some qualifiers multiple times.
1144  *
1145  * * Output variable qualifier order:
1146  *   Run shader which uses output variable, that is declared with all
1147  *    permutations of following qualifiers:
1148  *
1149  *     storage qualifiers: out
1150  *     interpolation qualifiers: (none), flat, noperespective, smooth
1151  *     auxaliary qualifiers: (none), patch, sample, centroid
1152  *     precision qualifiers: (none), precise
1153  *     invariance qualifiers: (none), invariant
1154  *     layout qualifiers: (none), layout(location = 0)
1155  *
1156  *    All permutations above following sets should be used (so all combinations
1157  *    of qualifiers are tested and all orderings of such combinations are tested).
1158  *    Used shader input must match output from earlier shader stage.
1159  *
1160  *    Test tessellation evaluation, tessellation control, geometry and vertex
1161  *    shader inputs. Skip illegal permutations: flat interpolation qualifier used
1162  *    with non empty auxaliary qualifier, patch qualifier outside tessellation
1163  *    shaders.
1164  *
1165  *
1166  * * Output variable qualifers used multiple times:
1167  *
1168  *   Same as above, but use some qualifiers multiple times.
1169  **/
1170 class QualifierOrderTest : public GLSLTestBase
1171 {
1172 public:
1173 	/* Public methods */
1174 	QualifierOrderTest(deqp::Context&);
1175 
~QualifierOrderTest()1176 	virtual ~QualifierOrderTest()
1177 	{
1178 	}
1179 
1180 protected:
1181 	/* Methods to be implemented by child class */
1182 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1183 
1184 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1185 									 Utils::shaderSource& out_source);
1186 
1187 	virtual void prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, Utils::vertexArray& vao);
1188 
1189 	virtual bool testInit();
1190 
1191 private:
1192 	/* Private methods */
1193 	const Utils::qualifierSet& getCurrentTestCase();
1194 
1195 	/* Private varaibles */
1196 	std::vector<Utils::qualifierSet> m_test_cases;
1197 	glw::GLuint						 m_current_test_case_index;
1198 };
1199 
1200 /** Test implementation, description follows:
1201  *
1202  * * Input block interface qualifier order:
1203  *
1204  *   Run shaders with same variable qualifications as above used for input
1205  *   interface block member.
1206  *
1207  *    Use following block declaration:
1208  *      in BLOCK {
1209  *          vec4 color;
1210  *      };
1211  *
1212  *   Test fragment shader, tessellation evaluation, tessellation control and
1213  *   geometry shader inputs. Skip illegal permutations, same as in previous
1214  *   test cases.
1215  *
1216  *
1217  * * Input block interface qualifers used multiple times:
1218  *
1219  *   Same as above, but use some qualifiers multiple times.
1220  *
1221  * * Output block interface qualifier order:
1222  *   Run shaders with same variable qualifications as above used for output
1223  *   interface block member.
1224  *
1225  *   Use following block declaration:
1226  *     out BLOCK {
1227  *         vec4 color;
1228  *     };
1229  *
1230  *   Test tessellation evaluation, tessellation control, geometry and vertex
1231  *   shader outputs. Skip illegal permutations, same as in previous test case.
1232  *
1233  *
1234  * * Output block interface qualifers used multiple times:
1235  *
1236  *   Same as above, but use some qualifiers multiple times.
1237  **/
1238 class QualifierOrderBlockTest : public GLSLTestBase
1239 {
1240 public:
1241 	/* Public methods */
1242 	QualifierOrderBlockTest(deqp::Context&);
1243 
~QualifierOrderBlockTest()1244 	virtual ~QualifierOrderBlockTest()
1245 	{
1246 	}
1247 
1248 protected:
1249 	/* Methods to be implemented by child class */
1250 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1251 
1252 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1253 									 Utils::shaderSource& out_source);
1254 
1255 	virtual void prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, Utils::vertexArray& vao);
1256 
1257 	virtual bool testInit();
1258 
1259 private:
1260 	/* Private methods */
1261 	const Utils::qualifierSet& getCurrentTestCase();
1262 
1263 	/* Private varaibles */
1264 	std::vector<Utils::qualifierSet> m_test_cases;
1265 	glw::GLuint						 m_current_test_case_index;
1266 };
1267 
1268 /** Test implementation, description follows:
1269  *
1270  * * Uniform variable qualifier order:
1271  *
1272  *   Run shaders which use uniform, that is declared with all permutations of
1273  *   'precise', 'uniform', and 'layout(...)' qualifiers.
1274  *
1275  *
1276  * * Uniform qualifers used multiple times:
1277  *
1278  *   Same as above, but use some qualifiers multiple times.
1279  **/
1280 class QualifierOrderUniformTest : public GLSLTestBase
1281 {
1282 public:
1283 	/* Public methods */
1284 	QualifierOrderUniformTest(deqp::Context&);
1285 
~QualifierOrderUniformTest()1286 	virtual ~QualifierOrderUniformTest()
1287 	{
1288 	}
1289 
1290 protected:
1291 	/* Methods to be implemented by child class */
1292 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1293 
1294 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1295 									 Utils::shaderSource& out_source);
1296 
1297 	virtual void prepareUniforms(Utils::program& program);
1298 
1299 	virtual bool testInit();
1300 
1301 private:
1302 	/* Private methods */
1303 	const Utils::qualifierSet& getCurrentTestCase();
1304 
1305 	/* Private varaibles */
1306 	std::vector<Utils::qualifierSet> m_test_cases;
1307 	glw::GLuint						 m_current_test_case_index;
1308 };
1309 
1310 /** Test implementation, description follows:
1311  *
1312  * * Function inout parameter qualifier order:
1313  *
1314  *   Run shaders which use function, that has inout parameter declared with all
1315  *   permutations of 'lowp' or 'mediump' or 'highp', 'precise' qualifiers.
1316  *
1317  *   Also run with some qualifiers used multiple times.
1318  **/
1319 class QualifierOrderFunctionInoutTest : public GLSLTestBase
1320 {
1321 public:
1322 	/* Public methods */
1323 	QualifierOrderFunctionInoutTest(deqp::Context&);
1324 
~QualifierOrderFunctionInoutTest()1325 	virtual ~QualifierOrderFunctionInoutTest()
1326 	{
1327 	}
1328 
1329 protected:
1330 	/* Methods to be implemented by child class */
1331 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1332 
1333 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1334 									 Utils::shaderSource& out_source);
1335 
1336 	virtual void prepareUniforms(Utils::program& program);
1337 	virtual bool testInit();
1338 
1339 private:
1340 	/* Private methods */
1341 	const Utils::qualifierSet& getCurrentTestCase();
1342 
1343 	/* Private varaibles */
1344 	std::vector<Utils::qualifierSet> m_test_cases;
1345 	glw::GLuint						 m_current_test_case_index;
1346 };
1347 
1348 /** Test implementation, description follows:
1349  *
1350  * * Function input parameter qualifier order:
1351  *
1352  *   Run shaders which use function, that has 'in' parameter declared with all
1353  *   permutations of 'in', 'lowp' or 'mediump' or 'highp', 'precise', 'const'
1354  *   qualifiers.
1355  *
1356  *   Also run with some qualifiers used multiple times.
1357  **/
1358 class QualifierOrderFunctionInputTest : public GLSLTestBase
1359 {
1360 public:
1361 	/* Public methods */
1362 	QualifierOrderFunctionInputTest(deqp::Context&);
1363 
~QualifierOrderFunctionInputTest()1364 	virtual ~QualifierOrderFunctionInputTest()
1365 	{
1366 	}
1367 
1368 protected:
1369 	/* Methods to be implemented by child class */
1370 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1371 
1372 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1373 									 Utils::shaderSource& out_source);
1374 
1375 	virtual void prepareUniforms(Utils::program& program);
1376 	virtual bool testInit();
1377 
1378 private:
1379 	/* Private methods */
1380 	const Utils::qualifierSet& getCurrentTestCase();
1381 
1382 	/* Private varaibles */
1383 	std::vector<Utils::qualifierSet> m_test_cases;
1384 	glw::GLuint						 m_current_test_case_index;
1385 };
1386 
1387 /** Test implementation, description follows:
1388  *
1389  * * Function output parameter qualifier order:
1390  *
1391  *   Run shaders which use function, that has out parameter declared with all
1392  *   permutations of  'lowp' or 'mediump' or 'highp', 'precise' qualifiers.
1393  *
1394  *   Also run with some qualifiers used multiple times.
1395  **/
1396 class QualifierOrderFunctionOutputTest : public GLSLTestBase
1397 {
1398 public:
1399 	/* Public methods */
1400 	QualifierOrderFunctionOutputTest(deqp::Context&);
1401 
~QualifierOrderFunctionOutputTest()1402 	virtual ~QualifierOrderFunctionOutputTest()
1403 	{
1404 	}
1405 
1406 protected:
1407 	/* Methods to be implemented by child class */
1408 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1409 
1410 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1411 									 Utils::shaderSource& out_source);
1412 
1413 	virtual void prepareUniforms(Utils::program& program);
1414 	virtual bool testInit();
1415 
1416 private:
1417 	/* Private methods */
1418 	const Utils::qualifierSet& getCurrentTestCase();
1419 
1420 	/* Private varaibles */
1421 	std::vector<Utils::qualifierSet> m_test_cases;
1422 	glw::GLuint						 m_current_test_case_index;
1423 };
1424 
1425 /** Test implementation, description follows:
1426  *
1427  * * Input variable layout qualifiers override:
1428  *
1429  *   Run shaders which use input variable, qualified with multiple layout
1430  *   qualifiers. For example:
1431  *
1432  *       layout(location = 3) layout(location = 2) out vec4 gColor
1433  *
1434  *
1435  * * Geometry shader layout qualifiers override:
1436  *
1437  *   Run shader which use multiple global geometry shader qualifiers.
1438  *   For example:
1439  *
1440  *       layout( triangle_strip, max_vertices = 2 ) layout( max_vertices = 3) out;'
1441  *
1442  *
1443  * * Tesselation shader layout qualifiers override:
1444  *
1445  *   Run shader which use multiple tesselation shader qualifiers, for example:
1446  *
1447  *       layout(vertices = 2) layout(vertices = 4) out;
1448  **/
1449 class QualifierOverrideLayoutTest : public GLSLTestBase
1450 {
1451 public:
1452 	/* Public methods */
1453 	QualifierOverrideLayoutTest(deqp::Context&);
1454 
~QualifierOverrideLayoutTest()1455 	virtual ~QualifierOverrideLayoutTest()
1456 	{
1457 	}
1458 
1459 protected:
1460 	/* Methods to be implemented by child class */
1461 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1462 									 Utils::shaderSource& out_source);
1463 
1464 	virtual void prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, Utils::vertexArray& vao);
1465 };
1466 
1467 /** Test implementation, description follows:
1468  *
1469  * * 'binding' qualified used for uniform block:
1470  *
1471  *   Create shader program which uses uniform block declaration
1472  *   with 'binding' layout qualifier specified. For example:
1473  *
1474  *        layout(std140, binding = 2) uniform BLOCK {
1475  *           vec4 color;
1476  *        } block;
1477  *
1478  *   Bind filled uniform buffer object to binding point 2.
1479  *
1480  *   Run shader program, validate uniform buffer contents in shader.
1481  *
1482  *
1483  * * 'binding' layout qualifier used for multiple uniform blocks in same shader:
1484  *
1485  *   Same as above, but use multiple uniform block declarations, each with
1486  *   different 'layout(binding = X)' qualifier. Validate contents of all
1487  *   uniform buffers in shader.
1488  *
1489  *
1490  * * 'binding' layout qualifier used for uniform block in different shader
1491  *    stages:
1492  *
1493  *   Link multiple shaders of different stage that use same uniform block.
1494  *   All uniform block declarations use same 'binding' layout qualifier.
1495  *
1496  *   Validate contents of uniform buffer in all shader stages.
1497  **/
1498 class BindingUniformBlocksTest : public GLSLTestBase
1499 {
1500 public:
1501 	/* Public methods */
1502 	BindingUniformBlocksTest(deqp::Context&);
1503 
~BindingUniformBlocksTest()1504 	virtual ~BindingUniformBlocksTest()
1505 	{
1506 	}
1507 
1508 protected:
1509 	/* Methods to be implemented by child class */
1510 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1511 									 Utils::shaderSource& out_source);
1512 
1513 	virtual void prepareUniforms(Utils::program& program);
1514 	virtual void releaseResource();
1515 
1516 private:
1517 	/* Private variables */
1518 	Utils::buffer m_goku_buffer;
1519 	Utils::buffer m_vegeta_buffer;
1520 	Utils::buffer m_children_buffer;
1521 };
1522 
1523 /** Test implementation, description follows:
1524  *
1525  * * 'binding' layout qualifier used only once for same uniform block in
1526  *   different shader stages:
1527 
1528  *   Link multiple shaders of different stage that use same uniform block.
1529  *   'binding' layout qualifier is used only in one shader stage, other shader
1530  *   stages does not specify layout qualifier.
1531  *
1532  *   Validate contents of uniform buffer in all shader stages.
1533  **/
1534 class BindingUniformSingleBlockTest : public GLSLTestBase
1535 {
1536 public:
1537 	/* Public methods */
1538 	BindingUniformSingleBlockTest(deqp::Context&);
1539 
~BindingUniformSingleBlockTest()1540 	virtual ~BindingUniformSingleBlockTest()
1541 	{
1542 	}
1543 
1544 protected:
1545 	/* Methods to be implemented by child class */
1546 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1547 
1548 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1549 									 Utils::shaderSource& out_source);
1550 
1551 	virtual void prepareUniforms(Utils::program& program);
1552 	virtual void releaseResource();
1553 
1554 private:
1555 	/* Private variables */
1556 	Utils::buffer		 m_goku_buffer;
1557 	Utils::SHADER_STAGES m_test_stage;
1558 };
1559 
1560 /** Test implementation, description follows:
1561  *
1562  * * 'binding' layout qualifier used with uniform block array.
1563  *
1564  *   Create shader program which uses uniform block array, with 'binding'
1565  *   layout qualifier specified, example:
1566  *
1567  *       layout(std140, binding = 2) uniform BLOCK {
1568  *          vec4 color;
1569  *       } block[14];
1570  *
1571  *   Bind filled uniform buffer objects to binding points 2..16. Validate
1572  *   contents of all uniform buffers in shader.
1573  *
1574  * * bindings of array of uniform blocks:
1575  *
1576  *   Check if uniform buffer array elements automatically get subsequent
1577  *   binding values, when their interface is specified using 'binding'
1578  *   layout qualifier. Use glGetActiveUniformBlockiv.
1579  **/
1580 class BindingUniformBlockArrayTest : public GLSLTestBase
1581 {
1582 public:
1583 	/* Public methods */
1584 	BindingUniformBlockArrayTest(deqp::Context&);
1585 
~BindingUniformBlockArrayTest()1586 	virtual ~BindingUniformBlockArrayTest()
1587 	{
1588 	}
1589 
1590 protected:
1591 	/* Methods to be implemented by child class */
1592 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1593 									 Utils::shaderSource& out_source);
1594 
1595 	virtual void prepareUniforms(Utils::program& program);
1596 	virtual void releaseResource();
1597 
1598 private:
1599 	/* Private methods */
1600 	void checkBinding(Utils::program& program, glw::GLuint index, glw::GLint expected_binding);
1601 
1602 	/* Private variables */
1603 	Utils::buffer m_goku_00_buffer;
1604 	Utils::buffer m_goku_01_buffer;
1605 	Utils::buffer m_goku_02_buffer;
1606 	Utils::buffer m_goku_03_buffer;
1607 	Utils::buffer m_goku_04_buffer;
1608 	Utils::buffer m_goku_05_buffer;
1609 	Utils::buffer m_goku_06_buffer;
1610 	Utils::buffer m_goku_07_buffer;
1611 	Utils::buffer m_goku_08_buffer;
1612 	Utils::buffer m_goku_09_buffer;
1613 	Utils::buffer m_goku_10_buffer;
1614 	Utils::buffer m_goku_11_buffer;
1615 	Utils::buffer m_goku_12_buffer;
1616 	Utils::buffer m_goku_13_buffer;
1617 };
1618 
1619 /** Test implementation, description follows:
1620  *
1621  * * Default binding value:
1622  *
1623  *   Create shader program, with uniform buffer interface declared without
1624  *   'binding' layout qualifier. Use glGetActiveUniformBlockiv to test if
1625  *   default 'binding' value is 0.
1626  **/
1627 class BindingUniformDefaultTest : public APITestBase
1628 {
1629 public:
1630 	/* Public methods */
1631 	BindingUniformDefaultTest(deqp::Context&);
1632 
~BindingUniformDefaultTest()1633 	virtual ~BindingUniformDefaultTest()
1634 	{
1635 	}
1636 
1637 protected:
1638 	/* Methods to be implemented by child class */
1639 	virtual bool checkResults(Utils::program& program);
1640 
1641 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1642 									 Utils::shaderSource& out_source);
1643 };
1644 
1645 /** Test implementation, description follows:
1646  *
1647  * * Override binding value from API:
1648  *
1649  *   Create a shader program with uniform buffer interface declared with
1650  *   'layout(..., binding = 3)'. Use glUniformBlockBinding to change binding
1651  *   value to 11. Test if binding point 11 is now used during rendering.
1652  *   Test if binding point 11 is returned when enumerating interface with
1653  *   glGetActiveUniformBlockiv.
1654  **/
1655 class BindingUniformAPIOverirdeTest : public GLSLTestBase
1656 {
1657 public:
1658 	/* Public methods */
1659 	BindingUniformAPIOverirdeTest(deqp::Context&);
1660 
~BindingUniformAPIOverirdeTest()1661 	virtual ~BindingUniformAPIOverirdeTest()
1662 	{
1663 	}
1664 
1665 protected:
1666 	/* Methods to be implemented by child class */
1667 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1668 									 Utils::shaderSource& out_source);
1669 
1670 	virtual void prepareUniforms(Utils::program& program);
1671 	virtual void releaseResource();
1672 
1673 private:
1674 	/* Private variables */
1675 	Utils::buffer m_goku_buffer;
1676 };
1677 
1678 /** Test implementation, description follows:
1679  *
1680  * * 'binding' layout qualifier used with global uniform
1681  *
1682  *   Use 'binding' layout qualifier on global (default block) uniform.
1683  *   Expect shader compilation error.
1684  **/
1685 class BindingUniformGlobalBlockTest : public NegativeTestBase
1686 {
1687 public:
1688 	/* Public methods */
1689 	BindingUniformGlobalBlockTest(deqp::Context&);
1690 
~BindingUniformGlobalBlockTest()1691 	virtual ~BindingUniformGlobalBlockTest()
1692 	{
1693 	}
1694 
1695 protected:
1696 	/* Methods to be implemented by child class */
1697 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1698 									 Utils::shaderSource& out_source);
1699 };
1700 
1701 /** Test implementation, description follows:
1702  *
1703  * * Wrong value for 'binding' layout qualifier.
1704  *
1705  *   Use -1, variable name, 'std140' as binding value.
1706  *   Expect shader compilation error in each case.
1707  *
1708  * * Missing value for 'binding' layout qualifier.
1709  *
1710  *   Expect shader compilation error in following declaration:
1711  *
1712  *       layout(std140, binding) uniform BLOCK {
1713  *          vec4 color;
1714  *       } block[14];
1715  **/
1716 class BindingUniformInvalidTest : public NegativeTestBase
1717 {
1718 public:
1719 	/* Public methods */
1720 	BindingUniformInvalidTest(deqp::Context&);
1721 
~BindingUniformInvalidTest()1722 	virtual ~BindingUniformInvalidTest()
1723 	{
1724 	}
1725 
1726 protected:
1727 	/* Methods to be implemented by child class */
1728 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1729 
1730 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1731 									 Utils::shaderSource& out_source);
1732 
1733 private:
1734 	/* Private enums */
1735 	enum TESTCASES
1736 	{
1737 		NEGATIVE_VALUE,
1738 		VARIABLE_NAME,
1739 		STD140,
1740 		MISSING,
1741 
1742 		/* */
1743 		TEST_CASES_MAX
1744 	};
1745 
1746 	/* Private methods */
1747 	const glw::GLchar* getCaseString(TESTCASES test_case);
1748 
1749 	/* Provate variables */
1750 	TESTCASES m_case;
1751 };
1752 
1753 /** Test implementation, description follows:
1754  *
1755  * * 'binding' qualified used for sampler uniform:
1756  *
1757  *   Create shader program which uses sampler uniform declaration with
1758  *   'binding' layout qualifier specified. For example:
1759  *
1760  *        layout(binding = 2) uniform sampler2D s;
1761  *
1762  *   Bind 2D texture to texture unit GL_TEXTURE2.
1763  *
1764  *   Run shader program, validate binding by sampling from texture in shader.
1765  *
1766  *
1767  * * 'binding' layout qualifier used for multiple sampler uniforms in same
1768  *   shader:
1769  *
1770  *   Same as above, but use multiple sampler uniform declarations, each with
1771  *   different 'layout(binding = X)' qualifier. Validate bindings of all
1772  *   samplers by sampling textures in shader.
1773  *
1774  *
1775  * * 'binding' layout qualifier used for sampler uniform in different shader
1776  *   stages:
1777  *
1778  *
1779  *   Link multiple shaders of different stages that use same sampler uniform.
1780  *   All sampler uniform declarations use same 'binding' layout qualifier.
1781  *
1782  *   Validate binding of sampler by sampling texture in shader.
1783  *
1784  * * 'binding layout qualifier used with sampler uniforms of various types.
1785  *
1786  *   Create shader program which uses samplers of type: samplerBuffer,
1787  *   sampler2D, sampler2DRect, sampler2DArray, sampler3D, samplerCubeMap,
1788  *   sampler1D, sampler1DArray.
1789  *
1790  *   Each sampler declaration uses 'binding' qualifier with different value.
1791  *
1792  *   Validate bindings of all samplers by sampling bound textures in shader.
1793  **/
1794 class BindingSamplersTest : public GLSLTestBase
1795 {
1796 public:
1797 	/* Public methods */
1798 	BindingSamplersTest(deqp::Context&);
1799 
~BindingSamplersTest()1800 	virtual ~BindingSamplersTest()
1801 	{
1802 	}
1803 
1804 protected:
1805 	/* Methods to be implemented by child class */
1806 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1807 
1808 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1809 									 Utils::shaderSource& out_source);
1810 
1811 	virtual void prepareUniforms(Utils::program& program);
1812 	virtual void releaseResource();
1813 
1814 private:
1815 	/* Private methods */
1816 	void prepareTexture(Utils::texture& texture, Utils::TEXTURE_TYPES texture_type, glw::GLuint color);
1817 
1818 	/* Private variables */
1819 	Utils::texture		 m_goku_texture;
1820 	Utils::texture		 m_vegeta_texture;
1821 	Utils::texture		 m_trunks_texture;
1822 	Utils::buffer		 m_buffer;
1823 	Utils::TEXTURE_TYPES m_test_case;
1824 };
1825 
1826 /** Test implementation, description follows:
1827  *
1828  * * 'binding' layout qualifier used only once for same sampler uniform in
1829  *   different shader stages:
1830  *
1831  *   Link multiple shaders of different stages that use same sampler uniform.
1832  *   'binding' layout qualifier is used only in one shader stage, other shader
1833  *   stages does not specify layout qualifier.
1834  *
1835  *   Validate binding of sampler by sampling texture in all shader stages.
1836  **/
1837 class BindingSamplerSingleTest : public GLSLTestBase
1838 {
1839 public:
1840 	/* Public methods */
1841 	BindingSamplerSingleTest(deqp::Context&);
1842 
~BindingSamplerSingleTest()1843 	virtual ~BindingSamplerSingleTest()
1844 	{
1845 	}
1846 
1847 protected:
1848 	/* Methods to be implemented by child class */
1849 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1850 
1851 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1852 									 Utils::shaderSource& out_source);
1853 
1854 	virtual void prepareUniforms(Utils::program& program);
1855 	virtual void releaseResource();
1856 
1857 private:
1858 	/* Private variables */
1859 	Utils::texture		 m_goku_texture;
1860 	Utils::SHADER_STAGES m_test_stage;
1861 };
1862 
1863 /** Test implementation, description follows:
1864  *
1865  * * 'binding' layout qualifier used with sampler uniform array.
1866  *
1867  *   Create shader program which uses sampler uniform array, with 'binding'
1868  *   layout qualifier specified, example:
1869  *
1870  *       layout(binding = 2) uniform sampler2D s[7];
1871  *
1872  *   Bind textures to texture units 2..9. Validate bindings of all samplers
1873  *   by sampling bound textures in shader.
1874  *
1875  * * bindings of array of sampler uniforms
1876  *
1877  *   Check if sampler uniform array elements automatically get subsequent
1878  *   binding values, when their interface is specified using 'binding'
1879  *   layout qualifier. Use glGetUniformiv.
1880  **/
1881 class BindingSamplerArrayTest : public GLSLTestBase
1882 {
1883 public:
1884 	/* Public methods */
1885 	BindingSamplerArrayTest(deqp::Context&);
1886 
~BindingSamplerArrayTest()1887 	virtual ~BindingSamplerArrayTest()
1888 	{
1889 	}
1890 
1891 protected:
1892 	/* Methods to be implemented by child class */
1893 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1894 									 Utils::shaderSource& out_source);
1895 
1896 	virtual void prepareUniforms(Utils::program& program);
1897 	virtual void releaseResource();
1898 
1899 private:
1900 	/* Private methods */
1901 	void checkBinding(Utils::program& program, glw::GLuint index, glw::GLint expected_binding);
1902 
1903 	/* Private variables */
1904 	Utils::texture m_goku_00_texture;
1905 	Utils::texture m_goku_01_texture;
1906 	Utils::texture m_goku_02_texture;
1907 	Utils::texture m_goku_03_texture;
1908 	Utils::texture m_goku_04_texture;
1909 	Utils::texture m_goku_05_texture;
1910 	Utils::texture m_goku_06_texture;
1911 };
1912 
1913 /** Test implementation, description follows:
1914  *
1915  * * Default binding value:
1916  *
1917  *   Create shader program, with sampler uniform declared without 'binding'
1918  *   layout qualifier. Use glGetUniformiv to test, if default 'binding' value
1919  *   is 0.
1920  **/
1921 class BindingSamplerDefaultTest : public APITestBase
1922 {
1923 public:
1924 	/* Public methods */
1925 	BindingSamplerDefaultTest(deqp::Context&);
1926 
~BindingSamplerDefaultTest()1927 	virtual ~BindingSamplerDefaultTest()
1928 	{
1929 	}
1930 
1931 protected:
1932 	/* Methods to be implemented by child class */
1933 	virtual bool checkResults(Utils::program& program);
1934 
1935 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1936 									 Utils::shaderSource& out_source);
1937 };
1938 
1939 /** Test implementation, description follows:
1940  *
1941  * * Override binding value from API:
1942  *
1943  *   Create a shader program with sampler uniform buffer declared with
1944  *   'layout(binding = 3)'. Use glUniform1i to change binding value to 11.
1945  *   Test if binding point 11 is now used during rendering.
1946  *   Test if binding point 11 is returned querying interface with
1947  *   glGetUniformiv.
1948  **/
1949 class BindingSamplerAPIOverrideTest : public GLSLTestBase
1950 {
1951 public:
1952 	/* Public methods */
1953 	BindingSamplerAPIOverrideTest(deqp::Context&);
1954 
~BindingSamplerAPIOverrideTest()1955 	virtual ~BindingSamplerAPIOverrideTest()
1956 	{
1957 	}
1958 
1959 protected:
1960 	/* Methods to be implemented by child class */
1961 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
1962 									 Utils::shaderSource& out_source);
1963 
1964 	virtual void prepareUniforms(Utils::program& program);
1965 	virtual void releaseResource();
1966 
1967 private:
1968 	/* Private variables */
1969 	Utils::texture m_goku_texture;
1970 };
1971 
1972 /** Test implementation, description follows:
1973  *
1974  * * Wrong value for 'binding' layout qualifier.
1975  *
1976  *   Use -1 or variable name as binding value. Expect shader compilation
1977  *   error in each case.
1978  *
1979  *
1980  * * Missing value for 'binding' layout qualifier.
1981  *
1982  *   Expect shader compilation error in following declaration:
1983  *
1984  *       layout(binding) uniform sampler2D s;
1985  **/
1986 class BindingSamplerInvalidTest : public NegativeTestBase
1987 {
1988 public:
1989 	/* Public methods */
1990 	BindingSamplerInvalidTest(deqp::Context&);
~BindingSamplerInvalidTest()1991 	virtual ~BindingSamplerInvalidTest()
1992 	{
1993 	}
1994 
1995 protected:
1996 	/* Methods to be implemented by child class */
1997 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
1998 
1999 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2000 									 Utils::shaderSource& out_source);
2001 
2002 private:
2003 	/* Private enums */
2004 	enum TESTCASES
2005 	{
2006 		NEGATIVE_VALUE,
2007 		VARIABLE_NAME,
2008 		STD140,
2009 		MISSING,
2010 
2011 		/* */
2012 		TEST_CASES_MAX
2013 	};
2014 
2015 	/* Private methods */
2016 	const glw::GLchar* getCaseString(TESTCASES test_case);
2017 
2018 	/* Provate variables */
2019 	TESTCASES m_case;
2020 };
2021 
2022 /** Test implementation, description follows:
2023  *
2024  * * 'binding' qualified used for image uniform:
2025  *
2026  *   Create shader program which uses image uniform declaration with
2027  *   'binding' layout qualifier specified. For example:
2028  *
2029  *       layout(rgba32f, binding = 2) image2D i;
2030  *
2031  *   Bind 2D texture to image unit 2.
2032  *
2033  *   Run shader program, validate binding by storing values to image in shader.
2034  *
2035  *
2036  * * 'binding' layout qualifier used for multiple image uniforms in same
2037  *   shader:
2038  *
2039  *   Same as above, but use multiple image uniform declarations, each with
2040  *   different 'layout(binding = X)' qualifier. Validate bindings of all
2041  *   samplers by storing values to textures in shader.
2042  *
2043  *
2044  * * 'binding' layout qualifier used for image uniform in different shader
2045  *   stages:
2046  *
2047  *   Link multiple shaders of different stages that use same image uniform.
2048  *   All uniform uniform declarations use same 'binding' layout qualifier.
2049  *
2050  *   Validate binding of image uniform by storing values to image in shader.
2051  *
2052  *
2053  * * 'binding' layout qualifier used with image uniforms of various types.
2054  *
2055  *   Create shader program which uses samplers of type: imageBuffer,
2056  *   image2D, image2DRect, image2DArray, image3D, imageCubeMap,
2057  *   image1D, image1DArray.
2058  *
2059  *   Each image declaration uses 'binding' qualifier with different value.
2060  *
2061  *   Validate bindings of all image uniforms by storing values to textures
2062  *   in shader.
2063  **/
2064 class BindingImagesTest : public BindingImageTest
2065 {
2066 public:
2067 	/* Public methods */
2068 	BindingImagesTest(deqp::Context&);
2069 
~BindingImagesTest()2070 	virtual ~BindingImagesTest()
2071 	{
2072 	}
2073 
2074 protected:
2075 	/* Methods to be implemented by child class */
2076 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2077 
2078 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2079 									 Utils::shaderSource& out_source);
2080 
2081 	virtual void prepareUniforms(Utils::program& program);
2082 	virtual bool verifyAdditionalResults() const;
2083 	virtual void releaseResource();
2084 
2085 private:
2086 	/* Private variables */
2087 	Utils::texture		 m_goku_texture;
2088 	Utils::texture		 m_vegeta_texture;
2089 	Utils::texture		 m_trunks_texture;
2090 	Utils::buffer		 m_goku_buffer;
2091 	Utils::buffer		 m_vegeta_buffer;
2092 	Utils::buffer		 m_trunks_buffer;
2093 	Utils::TEXTURE_TYPES m_test_case;
2094 
2095 	/* Private constant */
2096 	static const glw::GLuint m_goku_data;
2097 	static const glw::GLuint m_vegeta_data;
2098 	static const glw::GLuint m_trunks_data;
2099 };
2100 
2101 /** Test implementation, description follows:
2102  *
2103  * * 'binding' layout qualifier used only once for same image uniform in
2104  different shader stages:
2105  *
2106  *   Link multiple shaders of different stages that use same image uniform.
2107  *   'binding' layout qualifier is used only in one shader stage, other shader
2108  *   stages does not specify layout qualifier.
2109  *
2110  *   Validate binding of image uniform by storing values to image in shader.
2111  **/
2112 class BindingImageSingleTest : public BindingImageTest
2113 {
2114 public:
2115 	/* Public methods */
2116 	BindingImageSingleTest(deqp::Context&);
2117 
~BindingImageSingleTest()2118 	virtual ~BindingImageSingleTest()
2119 	{
2120 	}
2121 
2122 protected:
2123 	/* Methods to be implemented by child class */
2124 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2125 
2126 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2127 									 Utils::shaderSource& out_source);
2128 
2129 	virtual void prepareUniforms(Utils::program& program);
2130 	virtual bool verifyAdditionalResults() const;
2131 	virtual void releaseResource();
2132 
2133 private:
2134 	/* Private variables */
2135 	Utils::texture		 m_goku_texture;
2136 	Utils::SHADER_STAGES m_test_stage;
2137 };
2138 
2139 /** Test implementation, description follows:
2140  *
2141  * * 'binding' layout qualifier used with image uniform array.
2142  *
2143  *   Create shader program which uses image uniform array, with 'binding'
2144  *   layout qualifier specified, example:
2145  *
2146  *       layout(rgba32f, binding = 2) uniform image2D i[7];
2147  *
2148  *   Bind textures to image units 2..9. Validate bindings of all
2149  *   image uniforms by storing values to textures in shader.
2150  *
2151  *
2152  * * Bindings of array of image uniforms
2153  *
2154  *   Check if image uniform array elements automatically get subsequent
2155  *   binding values, when their interface is specified using 'binding'
2156  *   layout qualifier. Use glGetUniformiv.
2157  **/
2158 class BindingImageArrayTest : public BindingImageTest
2159 {
2160 public:
2161 	/* Public methods */
2162 	BindingImageArrayTest(deqp::Context&);
2163 
~BindingImageArrayTest()2164 	virtual ~BindingImageArrayTest()
2165 	{
2166 	}
2167 
2168 protected:
2169 	/* Methods to be implemented by child class */
2170 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2171 									 Utils::shaderSource& out_source);
2172 
2173 	virtual void prepareUniforms(Utils::program& program);
2174 	virtual void releaseResource();
2175 
2176 private:
2177 	/* Private methods */
2178 	void checkBinding(Utils::program& program, glw::GLuint index, glw::GLint expected_binding);
2179 
2180 	/* Private variables */
2181 	Utils::texture m_goku_00_texture;
2182 	Utils::texture m_goku_01_texture;
2183 	Utils::texture m_goku_02_texture;
2184 	Utils::texture m_goku_03_texture;
2185 	Utils::texture m_goku_04_texture;
2186 	Utils::texture m_goku_05_texture;
2187 	Utils::texture m_goku_06_texture;
2188 };
2189 
2190 /** Test implementation, description follows:
2191  *
2192  * * Default binding value:
2193  *
2194  *   Create shader program, with image uniform declared without 'binding'
2195  *   layout qualifier. Use glGetUniformiv to test if default 'binding' value
2196  *   is 0.
2197  **/
2198 class BindingImageDefaultTest : public APITestBase
2199 {
2200 public:
2201 	/* Public methods */
2202 	BindingImageDefaultTest(deqp::Context&);
2203 
~BindingImageDefaultTest()2204 	virtual ~BindingImageDefaultTest()
2205 	{
2206 	}
2207 
2208 protected:
2209 	/* Methods to be implemented by child class */
2210 	virtual bool checkResults(Utils::program& program);
2211 
2212 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2213 									 Utils::shaderSource& out_source);
2214 };
2215 
2216 /** Test implementation, description follows:
2217  *
2218  * * Override binding value from API:
2219  *
2220  *   Create a shader program with image uniform buffer declared with
2221  *   'layout(binding = 3)'. Use glUniform1i to change binding value to 11.
2222  *   Test if binding point 11 is now used during rendering.
2223  *   Test if binding point 11 is returned querying interface with
2224  *   glGetUniformiv.
2225  **/
2226 class BindingImageAPIOverrideTest : public BindingImageTest
2227 {
2228 public:
2229 	/* Public methods */
2230 	BindingImageAPIOverrideTest(deqp::Context&);
2231 
~BindingImageAPIOverrideTest()2232 	virtual ~BindingImageAPIOverrideTest()
2233 	{
2234 	}
2235 
2236 protected:
2237 	/* Methods to be implemented by child class */
2238 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2239 									 Utils::shaderSource& out_source);
2240 
2241 	virtual void prepareUniforms(Utils::program& program);
2242 	virtual void releaseResource();
2243 
2244 private:
2245 	/* Private variables */
2246 	Utils::texture m_goku_texture;
2247 };
2248 
2249 /** Test implementation, description follows:
2250  *
2251  * * Wrong value for 'binding' layout qualifier.
2252  *
2253  *   Use -1, 'rgba32f' or variable name as binding value. Expect shader
2254  *   compilation error in each case.
2255  *
2256  *
2257  * * Missing value for 'binding' layout qualifier.
2258  *
2259  *   Expect shader compilation error in following declaration:
2260  *
2261  *      layout(rgba32f, binding) uniform image2D s;
2262  **/
2263 class BindingImageInvalidTest : public NegativeTestBase
2264 {
2265 public:
2266 	/* Public methods */
2267 	BindingImageInvalidTest(deqp::Context&);
2268 
~BindingImageInvalidTest()2269 	virtual ~BindingImageInvalidTest()
2270 	{
2271 	}
2272 
2273 protected:
2274 	/* Methods to be implemented by child class */
2275 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2276 
2277 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2278 									 Utils::shaderSource& out_source);
2279 
2280 private:
2281 	/* Private enums */
2282 	enum TESTCASES
2283 	{
2284 		NEGATIVE_VALUE,
2285 		VARIABLE_NAME,
2286 		STD140,
2287 		MISSING,
2288 
2289 		/* */
2290 		TEST_CASES_MAX
2291 	};
2292 
2293 	/* Private methods */
2294 	const glw::GLchar* getCaseString(TESTCASES test_case);
2295 
2296 	/* Provate variables */
2297 	TESTCASES m_case;
2298 };
2299 
2300 /** Test implementation, description follows:
2301  *
2302  * * Vectors initialized using curly brace initializer lists:
2303  *
2304  *   Test expressions like:
2305  *       vec4 a = { 0.0, 1.0, 2.0, 3.0 };
2306  *
2307  *   Test all vector sizes.
2308  *   Verify if all components were set correctly.
2309  *
2310  *
2311  * * Matrices initialized using curly brace initializer lists:
2312  *
2313  *   Test expressions like:
2314  *       mat2   a = {{ 0.0, 1.0 }, { 2.0, 3.0 }};
2315  *       mat2x3 b = {{ 0.0, 1.0,  2.0 }, { 3.0, 4.0, 5.0 }};
2316  *
2317  *       Test all square matrix sizes. Check all non-square matrix sizes.
2318  *
2319  *       Verify if all components were set correctly.
2320  *
2321  *
2322  * * Matrix rows initialized using curly brace initializer lists:
2323  *
2324  *   Test expressions like:
2325  *       mat2   a = { vec2( 0.0, 1.0 ), vec2( 2.0, 3.0 ) };
2326  *       mat2x3 b = {vec3( 0.0, 1.0, 2.0), vec3( 3.0, 4.0, 5.0 )};
2327  *
2328  *       Test all square matrix sizes. Check all non-square matrix sizes.
2329  *
2330  *       Verify if all components were set correctly.
2331  *
2332  *
2333  * * Arrays initialized using curly brace initializer lists:
2334  *
2335  *   - Check arrays of scalars.
2336  *
2337  *   - Check arrays of vectors. Vectors initialized using *vec*(...) constructor.
2338  *
2339  *   - Check arrays of vectors. Vectors initialized initializer lists.
2340  *
2341  *   - Check arrays of matrices. Matrices initialized using *mat*(...) contructor.
2342  *
2343  *   - Check arrays of matrices. Matrices initialized initializer lists.
2344  *
2345  *   Verify if all components were set correctly.
2346  *
2347  *
2348  * * Structures of transparent types initialized using initializer lists:
2349  *
2350  *   Check arrays of structures also.
2351  *
2352  *   Test expressions like:
2353  *      struct S { float f; int i; uint u; }
2354  *      S a = {1.0, 2, -3};
2355  *      S b[3] = { S(1.0, 2, -3 ), { 3.0, 5, -6 }, { 7.0, 8, -9 } };
2356  *      S c[3] = { { 1.0, 2, -3 }, { 3.0, 5, -6 }, { 7.0, 8, -9 } };
2357  *
2358  *   Verify if all components were set correctly.
2359  *
2360  *
2361  * * Nested structures and arrays initialized using initializer lists:
2362  *
2363  *   - Check nested structures. Members initialized using <struct-type>(...)
2364  *     constructor.
2365  *
2366  *   - Check nested structures. Members initialized using initializer lists.\
2367          *
2368  *   - Check nested structures with multiple nesting levels.
2369  *
2370  *   - Check structures of arrays of structures. Initialize all members using
2371  *     initializer lists.
2372  *
2373  *   - Check structures of arrays of structures. Use mix of constructors and
2374  *     initializer lists to initialize members.
2375  *
2376  *   - Check arrays of structures, containing structures. Initialize all
2377  *     members using initializer lists.
2378  *
2379  *   - Check arrays of structures containing structures. Use mix of
2380  *     constructors and initializer lists to initialize members.
2381  *
2382  *   - Check structures containing structures, that contain arrays.
2383  *     Initialize all members using initializer lists.
2384  *
2385  *   - Check structures containing structures, that contain arrays. Use mix of
2386  *     constructors and initializer lists to initialize members.
2387  *
2388  *   Verify if all components were set correctly.
2389  *
2390  *
2391  * * Unsized arrays initialized with initialer lists:
2392  *
2393  *   Test expressions like:
2394  *       int i[] = { 1, 2, 3 };
2395  *       S b[] = { S(1.0, 2, -3 ), { 3.0, 5, -6 }, { 7.0, 8, -9 } };
2396  *       S c[] = { { 1.0, 2, -3 }, { 3.0, 5, -6 }, { 7.0, 8, -9 } };
2397  *
2398  *   Verify if all components were set correctly.
2399  **/
2400 class InitializerListTest : public GLSLTestBase
2401 {
2402 public:
2403 	/* Public methods */
2404 	InitializerListTest(deqp::Context&);
2405 
~InitializerListTest()2406 	virtual ~InitializerListTest()
2407 	{
2408 	}
2409 
2410 protected:
2411 	/* Methods to be implemented by child class */
2412 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2413 
2414 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2415 									 Utils::shaderSource& out_source);
2416 
2417 	virtual void prepareUniforms(Utils::program& program);
2418 	virtual bool testInit();
2419 
2420 private:
2421 	/* Private enums */
2422 	enum TESTED_INITIALIZERS
2423 	{
2424 		VECTOR,
2425 		MATRIX,
2426 		MATRIX_ROWS,
2427 		STRUCT,
2428 		ARRAY_SCALAR,
2429 		ARRAY_VECTOR_CTR,
2430 		ARRAY_VECTOR_LIST,
2431 		ARRAY_MATRIX_CTR,
2432 		ARRAY_MATRIX_LIST,
2433 		ARRAY_STRUCT,
2434 		NESTED_STRUCT_CTR,
2435 		NESTED_STRUCT_LIST,
2436 		NESTED_STURCT_ARRAYS_STRUCT_LIST,
2437 		NESTED_STURCT_ARRAYS_STRUCT_MIX,
2438 		NESTED_ARRAY_STRUCT_STRUCT_LIST,
2439 		NESTED_ARRAY_STRUCT_STRUCT_MIX,
2440 		NESTED_STRUCT_STRUCT_ARRAY_LIST,
2441 		NESTED_STRUCT_STRUCT_ARRAY_MIX,
2442 		UNSIZED_ARRAY_SCALAR,
2443 		UNSIZED_ARRAY_VECTOR,
2444 		UNSIZED_ARRAY_MATRIX,
2445 		UNSIZED_ARRAY_STRUCT,
2446 
2447 		/* */
2448 		TESTED_INITIALIZERS_MAX
2449 	};
2450 
2451 	/* Private types */
2452 	struct testCase
2453 	{
2454 		TESTED_INITIALIZERS m_initializer;
2455 
2456 		glw::GLuint m_n_cols;
2457 		glw::GLuint m_n_rows;
2458 	};
2459 
2460 	/* Private methods */
2461 	std::string getArrayDefinition();
2462 	std::string getExpectedValue();
2463 	std::string getInitialization();
2464 	void		logTestCaseName();
2465 	std::string getSum();
2466 	std::string getTypeDefinition();
2467 	std::string getTypeName();
2468 
2469 	std::string getVectorArrayCtr(glw::GLuint columns, glw::GLuint size);
2470 
2471 	std::string getVectorArrayList(glw::GLuint columns, glw::GLuint size);
2472 
2473 	std::string getVectorConstructor(glw::GLuint column, glw::GLuint size);
2474 
2475 	std::string getVectorInitializer(glw::GLuint column, glw::GLuint size);
2476 
2477 	std::string getVectorArraySum(const glw::GLchar* array_name, glw::GLuint columns, glw::GLuint size);
2478 
2479 	std::string getVectorSum(const glw::GLchar* vector_name, glw::GLuint size);
2480 
2481 	std::string getVectorValues(glw::GLuint column, glw::GLuint size);
2482 
2483 	/* Private variables */
2484 	std::vector<testCase> m_test_cases;
2485 	glw::GLint			  m_current_test_case_index;
2486 
2487 	/* Private constants */
2488 	static const glw::GLfloat m_value;
2489 };
2490 
2491 /** Test implementation, description follows:
2492  *
2493  * * Wrong type of component in initializer list.
2494  *
2495  *   Try to use wrong type of component. Expect compilation error. For example:
2496  *
2497  *       int a = { true };
2498  *
2499  *
2500  * * Wrong number of components in initializer list.
2501  *
2502  *   Try to wrong number of components. Expect compilation error. For example:
2503  *
2504  *       vec4 a = { 0.0, 0.0, 0.0 };
2505  *       vec3 a = { 0.0, 0.0, 0.0, 0.0 };
2506  *
2507  *
2508  * * Wrong matrix sizes in initializer lists:
2509  *
2510  *   Try to use wrong matrix row size or column count. Expect compilation error.
2511  *   For example:
2512  *
2513  *       mat2x3 b = {{ 0.0, 1.0,  2.0 }, { 3.0, 4.0}};
2514  *       mat2x3 b = {{ 0.0, 1.0}, { 2.0, 3.0}, { 4.0, 5.0 }};
2515  *       mat2x3 b = {{ 0.0, 1.0,  2.0 }, { 3.0, 4.0, 5.0 }};
2516  *       mat2x3 b = {{ 0.0, 1.0,  2.0 }, { 3.0, 4.0, 5.0 }};
2517  *
2518  *
2519  * * Initializer list inside constructor:
2520  *   Try to use initializer list inside constructor. Expect compilation error.
2521  *   For example:
2522  *
2523  *       struct S { vec2 v; };
2524  *       S s = S( {1.0, 2.0 } );
2525  *
2526  *
2527  * * Wrong struct layout in initializer list:
2528  *   Try to initialize struct with bad initializer list layout.
2529  *   Expect compilation error.
2530  *
2531  *   Check wrong member type, wrong member count and wrong member ordering.
2532  **/
2533 class InitializerListNegativeTest : public NegativeTestBase
2534 {
2535 public:
2536 	/* Public methods */
2537 	InitializerListNegativeTest(deqp::Context&);
2538 
~InitializerListNegativeTest()2539 	virtual ~InitializerListNegativeTest()
2540 	{
2541 	}
2542 
2543 protected:
2544 	/* Methods to be implemented by child class */
2545 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2546 
2547 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2548 									 Utils::shaderSource& out_source);
2549 
2550 	virtual bool testInit();
2551 
2552 private:
2553 	/* Private enums */
2554 	enum TESTED_ERRORS
2555 	{
2556 		TYPE_UIVEC_BOOL,
2557 		TYPE_IVEC_BOOL,
2558 		TYPE_VEC_BOOL,
2559 		TYPE_MAT_BOOL,
2560 		COMPONENTS_VEC_LESS,
2561 		COMPONENTS_VEC_MORE,
2562 		COMPONENTS_MAT_LESS_ROWS,
2563 		COMPONENTS_MAT_LESS_COLUMNS,
2564 		COMPONENTS_MAT_MORE_ROWS,
2565 		COMPONENTS_MAT_MORE_COLUMNS,
2566 		LIST_IN_CONSTRUCTOR,
2567 		STRUCT_LAYOUT_MEMBER_TYPE,
2568 		STRUCT_LAYOUT_MEMBER_COUNT_MORE,
2569 		STRUCT_LAYOUT_MEMBER_COUNT_LESS,
2570 		STRUCT_LAYOUT_MEMBER_ORDER,
2571 
2572 		/* */
2573 		TESTED_ERRORS_MAX
2574 	};
2575 
2576 	/* Private methods */
2577 	std::string getInitialization();
2578 	void		logTestCaseName();
2579 	std::string getSum();
2580 	std::string getTypeDefinition();
2581 	std::string getTypeName();
2582 
2583 	/* Private variables */
2584 	std::vector<TESTED_ERRORS> m_test_cases;
2585 	glw::GLint				   m_current_test_case_index;
2586 };
2587 
2588 /** Test implementation, description follows:
2589  *
2590  * * Apply .length() to various types:
2591  *
2592  *   Check value returned by .length(), when applied to vectors of all types.
2593  *   Check value returned by .length(), when applied to matrices of all types.
2594  *
2595  *   Check float, int and uint base types of vectors and matrices.
2596  *   Check all vector sizes, check all matrix dimensions.
2597  *
2598  *   Also check value returned by .length() when applied to vector or matrix
2599  *   members of a structures or interface blocks.
2600  *
2601  *
2602  * * Constant folding of .length() expressions:
2603  *
2604  *   Use value of .length() to set array size. For example:
2605  *
2606  *       vec4 a;
2607  *       float b[a.length()];
2608  **/
2609 class LengthOfVectorAndMatrixTest : public GLSLTestBase
2610 {
2611 public:
2612 	/* Public methods */
2613 	LengthOfVectorAndMatrixTest(deqp::Context&);
2614 
~LengthOfVectorAndMatrixTest()2615 	virtual ~LengthOfVectorAndMatrixTest()
2616 	{
2617 	}
2618 
2619 protected:
2620 	/* Methods to be implemented by child class */
2621 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2622 
2623 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2624 									 Utils::shaderSource& out_source);
2625 
2626 	virtual void prepareUniforms(Utils::program& program);
2627 
2628 	virtual void prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, Utils::vertexArray& vao);
2629 
2630 	virtual bool testInit();
2631 
2632 private:
2633 	/* Private types */
2634 	struct testCase
2635 	{
2636 		Utils::TYPES m_type;
2637 		glw::GLuint  m_n_cols;
2638 		glw::GLuint  m_n_rows;
2639 	};
2640 
2641 	/* Private methods */
2642 	std::string getExpectedValue(Utils::SHADER_STAGES in_stage);
2643 	std::string getInitialization();
2644 
2645 	std::string getMatrixInitializer(glw::GLuint n_cols, glw::GLuint n_rows);
2646 
2647 	std::string getVectorInitializer(Utils::TYPES type, glw::GLuint n_rows);
2648 
2649 	void prepareComputeShaderSource(Utils::shaderSource& out_source);
2650 
2651 	void prepareDrawShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2652 								 Utils::shaderSource& out_source);
2653 
2654 	glw::GLuint			  m_current_test_case_index;
2655 	bool				  m_is_compute_program;
2656 	std::vector<testCase> m_test_cases;
2657 };
2658 
2659 /** Test implementation, description follows:
2660  *
2661  * * .length() called on compute type:
2662  *
2663  *   Check value returned by .length(), when applied to computed types:
2664  *
2665  *   - rows of matrices
2666  *        mat4x3 a;
2667  *        a[<variable>].length()
2668  *
2669  *   - computed types: matrix multiplication
2670  *       mat4x2 a;
2671  *       mat3x4 b;
2672  *       (a * b).length()
2673  *       (a * b)[<variable>].length()
2674  *
2675  *   - computed types: vector multiplication
2676  *       vec3 a;
2677  *       vec3 b;
2678  *       (a * b).length()
2679  *
2680  *
2681  * * Constant folding of .length() expressions using computed type.
2682  *
2683  *   Use value of .length() to set array size, when called on computed type.
2684  *   For example:
2685  *      mat4x2 a;
2686  *      mat3x4 b;
2687  *      float c[a(a * b).length()];
2688  *      float d[(a * b)[<variable>].length()];
2689  *
2690  *
2691  * * .length() called on build-in values.
2692  *
2693  *   Check value returned by .length when called on gl_Position,
2694  *   gl_PointCoord, gl_SamplePosition
2695  *
2696  *
2697  * * .length() called on build-in functions
2698  *
2699  *   Check value returned by .length() when called on values returned from
2700  *   build in functions. For example:
2701  *      outerProduct(vec4(0.0), vec3(0.0)).length()
2702  **/
2703 class LengthOfComputeResultTest : public GLSLTestBase
2704 {
2705 public:
2706 	/* Public methods */
2707 	LengthOfComputeResultTest(deqp::Context&);
2708 
~LengthOfComputeResultTest()2709 	virtual ~LengthOfComputeResultTest()
2710 	{
2711 	}
2712 
2713 protected:
2714 	/* Methods to be implemented by child class */
2715 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2716 									 Utils::shaderSource& out_source);
2717 
2718 	virtual void prepareUniforms(Utils::program& program);
2719 };
2720 
2721 /** Test implementation, description follows:
2722  *
2723  * * All sizes of scalar swizzle
2724  *
2725  *   Test value returned by all sizes of scalar swizzlers: .x, .xx, .xxx and
2726  *   .xxx, when called on a float variable.
2727  *
2728  * * Scalar swizzling of literals
2729  *
2730  *   Call scalar swizzler .xxx on literal, for example (0.0).xxx.
2731  *
2732  * * Scalar swizzling of constant expressions
2733  *
2734  *   Call scalar swizzler .xxx on constant, for example:
2735  *
2736  *       const float x = 0.0;
2737  *       x.xxx
2738  *
2739  * * Mixed scalar swizzling
2740  *
2741  *   Check combinations of 'x', 'r', 's' swizzlers: .xx, .rr, .ss, .xrs
2742  *
2743  * * Nested swizzlers
2744  *
2745  *   Check nested swizzlers. For example:
2746  *       const float x = 0.0;
2747  *       x.r.s.x.ss
2748  **/
2749 class ScalarSwizzlersTest : public GLSLTestBase
2750 {
2751 public:
2752 	/* Public methods */
2753 	ScalarSwizzlersTest(deqp::Context&);
2754 
~ScalarSwizzlersTest()2755 	virtual ~ScalarSwizzlersTest()
2756 	{
2757 	}
2758 
2759 protected:
2760 	/* Methods to be implemented by child class */
2761 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2762 									 Utils::shaderSource& out_source);
2763 
2764 	virtual void prepareUniforms(Utils::program& program);
2765 };
2766 
2767 /** Test implementation, description follows:
2768  *
2769  * * Wrong swizzlers for scalars:
2770  *
2771  *   Swizzlers not applicable for scalars like .z, .xz, .q should fail
2772  *   shader compilation.
2773  *
2774  * * Wrong swizzlers:
2775  *
2776  *   Wrong swizzlers, like .u  should fail shader compilation.
2777  *
2778  * * Wrong syntax:
2779  *
2780  *   Literal swizzlers without parenthesis, like 1.x, should fail shader
2781  *   compilation.
2782  **/
2783 class ScalarSwizzlersInvalidTest : public NegativeTestBase
2784 {
2785 public:
2786 	/* Public methods */
2787 	ScalarSwizzlersInvalidTest(deqp::Context&);
2788 
~ScalarSwizzlersInvalidTest()2789 	virtual ~ScalarSwizzlersInvalidTest()
2790 	{
2791 	}
2792 
2793 protected:
2794 	/* Methods to be implemented by child class */
2795 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2796 
2797 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2798 									 Utils::shaderSource& out_source);
2799 
2800 private:
2801 	/* Private enums */
2802 	enum TESTED_CASES
2803 	{
2804 		INVALID_Y,
2805 		INVALID_B,
2806 		INVALID_Q,
2807 		INVALID_XY,
2808 		INVALID_XRS,
2809 		WRONG,
2810 		MISSING_PARENTHESIS,
2811 	};
2812 
2813 	TESTED_CASES m_case;
2814 };
2815 
2816 /** Test implementation, description follows:
2817  *
2818  * * Value of gl_MinProgramTexelOffset:
2819  *
2820  *   Check that gl_MinProgramTexelOffset matches the value of
2821  *   GL_MIN_PROGRAM_TEXEL_OFFSET from API.
2822  *
2823  *   Check that both values satisfy minimal requirement from OpenGL
2824  *   specification.
2825  *
2826  * * Value of gl_MinProgramTexelOffset:
2827  *
2828  *   Check that gl_MinProgramTexelOffset matches the value of
2829  *   GL_MAX_PROGRAM_TEXEL_OFFSET from API.
2830  *
2831  *   Check that both values satisfy minimal requirement from OpenGL
2832  *   specification.
2833  **/
2834 class BuiltInValuesTest : public GLSLTestBase
2835 {
2836 public:
2837 	/* Public methods */
2838 	BuiltInValuesTest(deqp::Context&);
2839 
~BuiltInValuesTest()2840 	virtual ~BuiltInValuesTest()
2841 	{
2842 	}
2843 
2844 protected:
2845 	/* Methods to be implemented by child class */
2846 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2847 									 Utils::shaderSource& out_source);
2848 
2849 	virtual void prepareUniforms(Utils::program& program);
2850 	virtual bool testInit();
2851 
2852 private:
2853 	/* Private constants */
2854 	static const glw::GLint m_min_program_texel_offset_limit;
2855 	static const glw::GLint m_max_program_texel_offset_limit;
2856 
2857 	/* Private variables */
2858 	glw::GLint m_min_program_texel_offset;
2859 	glw::GLint m_max_program_texel_offset;
2860 };
2861 
2862 /** Test implementation, description follows:
2863  *
2864  **/
2865 class BuiltInAssignmentTest : public NegativeTestBase
2866 {
2867 public:
2868 	/* Public methods */
2869 	BuiltInAssignmentTest(deqp::Context&);
2870 
~BuiltInAssignmentTest()2871 	virtual ~BuiltInAssignmentTest()
2872 	{
2873 	}
2874 
2875 protected:
2876 	/* Methods to be implemented by child class */
2877 	virtual bool prepareNextTestCase(glw::GLuint test_case_index);
2878 
2879 	virtual void prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400,
2880 									 Utils::shaderSource& out_source);
2881 
2882 private:
2883 	/* Private variables */
2884 	glw::GLuint m_case;
2885 };
2886 } /* GLSL420Pack namespace */
2887 
2888 /** Group class for Shader Language 420Pack conformance tests */
2889 class ShadingLanguage420PackTests : public deqp::TestCaseGroup
2890 {
2891 public:
2892 	/* Public methods */
2893 	ShadingLanguage420PackTests(deqp::Context& context);
2894 
~ShadingLanguage420PackTests(void)2895 	virtual ~ShadingLanguage420PackTests(void)
2896 	{
2897 	}
2898 
2899 	virtual void init(void);
2900 
2901 private:
2902 	/* Private methods */
2903 	ShadingLanguage420PackTests(const ShadingLanguage420PackTests& other);
2904 	ShadingLanguage420PackTests& operator=(const ShadingLanguage420PackTests& other);
2905 };
2906 
2907 } // gl4cts
2908 
2909 #endif // _GL4CSHADINGLANGUAGE420PACKTESTS_HPP
2910