• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GL4CENHANCEDLAYOUTSTESTS_HPP
2 #define _GL4CENHANCEDLAYOUTSTESTS_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2015-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  gl4cEnhancedLayoutsTests.hpp
28  * \brief Declares test classes for "Enhanced Layouts" 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 EnhancedLayouts
43 {
44 namespace Utils
45 {
46 /** Represents data type
47  *
48  **/
49 struct Type
50 {
51 public:
52 	enum TYPES
53 	{
54 		Float,
55 		Double,
56 		Int,
57 		Uint,
58 	};
59 
60 	/* Public methods */
61 	/* Functionality */
62 	std::vector<glw::GLubyte> GenerateData() const;
63 	std::vector<glw::GLubyte> GenerateDataPacked() const;
64 	glw::GLuint GetActualAlignment(glw::GLuint align, bool is_array) const;
65 	glw::GLuint GetBaseAlignment(bool is_array) const;
66 	std::string GetGLSLConstructor(const glw::GLvoid* data) const;
67 	const glw::GLchar* GetGLSLTypeName() const;
68 	glw::GLuint GetLocations(bool is_vs_input = false) const;
69 	glw::GLuint GetSize(const bool is_std140 = false) const;
70 	glw::GLenum GetTypeGLenum() const;
71 	glw::GLuint GetNumComponents() const;
72 
73 	/* Public static routines */
74 	/* Functionality */
75 	static glw::GLuint CalculateStd140Stride(glw::GLuint alignment, glw::GLuint n_columns,
76 											 glw::GLuint n_array_elements);
77 
78 	static bool DoesTypeSupportMatrix(TYPES type);
79 
80 	static glw::GLuint GetActualOffset(glw::GLuint start_offset, glw::GLuint actual_alignment);
81 
82 	static Type GetType(TYPES basic_type, glw::GLuint n_columns, glw::GLuint n_rows);
83 
84 	static glw::GLuint GetTypeSize(TYPES type);
85 
86 	/* GL gets */
87 	static glw::GLenum GetTypeGLenum(TYPES type);
88 
89 	/* Public fields */
90 	TYPES		m_basic_type;
91 	glw::GLuint m_n_columns;
92 	glw::GLuint m_n_rows;
93 
94 	/* Public constants */
95 	static const Type _double;
96 	static const Type dmat2;
97 	static const Type dmat2x3;
98 	static const Type dmat2x4;
99 	static const Type dmat3x2;
100 	static const Type dmat3;
101 	static const Type dmat3x4;
102 	static const Type dmat4x2;
103 	static const Type dmat4x3;
104 	static const Type dmat4;
105 	static const Type dvec2;
106 	static const Type dvec3;
107 	static const Type dvec4;
108 	static const Type _float;
109 	static const Type _int;
110 	static const Type ivec2;
111 	static const Type ivec3;
112 	static const Type ivec4;
113 	static const Type mat2;
114 	static const Type mat2x3;
115 	static const Type mat2x4;
116 	static const Type mat3x2;
117 	static const Type mat3;
118 	static const Type mat3x4;
119 	static const Type mat4x2;
120 	static const Type mat4x3;
121 	static const Type mat4;
122 	static const Type vec2;
123 	static const Type vec3;
124 	static const Type vec4;
125 	static const Type uint;
126 	static const Type uvec2;
127 	static const Type uvec3;
128 	static const Type uvec4;
129 };
130 
131 /** Represents buffer instance
132  * Provides basic buffer functionality
133  **/
134 class Buffer
135 {
136 public:
137 	/* Public enums */
138 	enum BUFFERS
139 	{
140 		Array,
141 		Element,
142 		Shader_Storage,
143 		Texture,
144 		Transform_feedback,
145 		Uniform,
146 	};
147 
148 	enum USAGE
149 	{
150 		DynamicCopy,
151 		DynamicDraw,
152 		DynamicRead,
153 		StaticCopy,
154 		StaticDraw,
155 		StaticRead,
156 		StreamCopy,
157 		StreamDraw,
158 		StreamRead,
159 	};
160 
161 	enum ACCESS
162 	{
163 		ReadOnly,
164 		WriteOnly,
165 		ReadWrite,
166 	};
167 
168 	/* Public methods */
169 	/* Ctr & Dtr */
170 	Buffer(deqp::Context& context);
171 	~Buffer();
172 
173 	/* Init & Release */
174 	void Init(BUFFERS buffer, USAGE usage, glw::GLsizeiptr size, glw::GLvoid* data);
175 	void Release();
176 
177 	/* Functionality */
178 	void Bind() const;
179 	void BindBase(glw::GLuint index) const;
180 
181 	void BindRange(glw::GLuint index, glw::GLintptr offset, glw::GLsizeiptr size) const;
182 
183 	void Data(USAGE usage, glw::GLsizeiptr size, glw::GLvoid* data);
184 
185 	glw::GLvoid* Map(ACCESS access);
186 
187 	void SubData(glw::GLintptr offset, glw::GLsizeiptr size, glw::GLvoid* data);
188 
189 	void UnMap();
190 
191 	/* Public static routines */
192 	/* Functionality */
193 	static void Bind(const glw::Functions& gl, glw::GLuint id, BUFFERS buffer);
194 
195 	static void BindBase(const glw::Functions& gl, glw::GLuint id, BUFFERS buffer, glw::GLuint index);
196 
197 	static void BindRange(const glw::Functions& gl, glw::GLuint id, BUFFERS buffer, glw::GLuint index,
198 						  glw::GLintptr offset, glw::GLsizeiptr size);
199 
200 	static void Data(const glw::Functions& gl, BUFFERS buffer, USAGE usage, glw::GLsizeiptr size, glw::GLvoid* data);
201 
202 	static void Generate(const glw::Functions& gl, glw::GLuint& out_id);
203 
204 	static void* Map(const glw::Functions& gl, BUFFERS buffer, ACCESS access);
205 
206 	static void SubData(const glw::Functions& gl, BUFFERS buffer, glw::GLintptr offset, glw::GLsizeiptr size,
207 						glw::GLvoid* data);
208 
209 	static void UnMap(const glw::Functions& gl, BUFFERS buffer);
210 
211 	/* GL gets */
212 	static glw::GLenum GetAccessGLenum(ACCESS access);
213 	static glw::GLenum GetBufferGLenum(BUFFERS buffer);
214 	static glw::GLenum GetUsageGLenum(USAGE usage);
215 
216 	/* Gets */
217 	static const glw::GLchar* GetBufferName(BUFFERS buffer);
218 
219 	/* Public fields */
220 	glw::GLuint m_id;
221 
222 	/* Public constants */
223 	static const glw::GLuint m_invalid_id;
224 
225 	/* Buffer type maybe changed for different cases*/
226 	BUFFERS m_buffer;
227 
228 private:
229 	/* Private fields */
230 	deqp::Context& m_context;
231 };
232 
233 /** Represents framebuffer
234  * Provides basic functionality
235  **/
236 class Framebuffer
237 {
238 public:
239 	/* Public methods */
240 	/* Ctr & Dtr */
241 	Framebuffer(deqp::Context& context);
242 	~Framebuffer();
243 
244 	/* Init & Release */
245 	void Init();
246 	void Release();
247 
248 	/* Functionality */
249 	void AttachTexture(glw::GLenum attachment, glw::GLuint texture_id, glw::GLuint width, glw::GLuint height);
250 
251 	void Bind();
252 	void Clear(glw::GLenum mask);
253 
254 	void ClearColor(glw::GLfloat red, glw::GLfloat green, glw::GLfloat blue, glw::GLfloat alpha);
255 
256 	/* Public static routines */
257 	static void AttachTexture(const glw::Functions& gl, glw::GLenum attachment, glw::GLuint texture_id,
258 							  glw::GLuint width, glw::GLuint height);
259 
260 	static void Bind(const glw::Functions& gl, glw::GLuint id);
261 
262 	static void Clear(const glw::Functions& gl, glw::GLenum mask);
263 
264 	static void ClearColor(const glw::Functions& gl, glw::GLfloat red, glw::GLfloat green, glw::GLfloat blue,
265 						   glw::GLfloat alpha);
266 
267 	static void Generate(const glw::Functions& gl, glw::GLuint& out_id);
268 
269 	/* Public fields */
270 	glw::GLuint m_id;
271 
272 	/* Public constants */
273 	static const glw::GLuint m_invalid_id;
274 
275 private:
276 	/* Private fields */
277 	deqp::Context& m_context;
278 };
279 
280 /** Represents shader instance.
281  * Provides basic functionality for shaders.
282  **/
283 class Shader
284 {
285 public:
286 	/* Public enums */
287 	enum STAGES
288 	{
289 		COMPUTE = 0,
290 		VERTEX,
291 		TESS_CTRL,
292 		TESS_EVAL,
293 		GEOMETRY,
294 		FRAGMENT,
295 
296 		/* */
297 		STAGE_MAX
298 	};
299 
300 	/* Public types */
301 
302 	class InvalidSourceException : public std::exception
303 	{
304 	public:
305 		InvalidSourceException(const glw::GLchar* error_message, const std::string& source, STAGES stage);
306 
~InvalidSourceException()307 		virtual ~InvalidSourceException() throw()
308 		{
309 		}
310 
311 		virtual const char* what() const throw();
312 
313 		void log(deqp::Context& context) const;
314 
315 		std::string m_message;
316 		std::string m_source;
317 		STAGES		m_stage;
318 	};
319 
320 	/* Public methods */
321 	/* Ctr & Dtr */
322 	Shader(deqp::Context& context);
323 	~Shader();
324 
325 	/* Init & Realese */
326 	void Init(STAGES stage, const std::string& source);
327 	void Release();
328 
329 	/* Public static routines */
330 	/* Functionality */
331 	static void Compile(const glw::Functions& gl, glw::GLuint id);
332 
333 	static void Create(const glw::Functions& gl, STAGES stage, glw::GLuint& out_id);
334 
335 	static void Source(const glw::Functions& gl, glw::GLuint id, const std::string& source);
336 
337 	/* GL gets */
338 	static glw::GLenum GetShaderStageGLenum(STAGES stage);
339 
340 	/* Get stage name */
341 	static const glw::GLchar* GetStageName(STAGES stage);
342 
343 	/* Logs sources */
344 	static void LogSource(deqp::Context& context, const std::string& source, STAGES stage);
345 
346 	/* Public fields */
347 	glw::GLuint m_id;
348 
349 	/* Public constants */
350 	static const glw::GLuint m_invalid_id;
351 
352 private:
353 	/* Private types */
354 	class CompilationException : public std::exception
355 	{
356 	public:
357 		CompilationException(const glw::GLchar* message);
358 
~CompilationException()359 		virtual ~CompilationException() throw()
360 		{
361 		}
362 
363 		virtual const char* what() const throw();
364 
365 		std::string m_message;
366 	};
367 
368 	/* Private fields */
369 	deqp::Context& m_context;
370 };
371 
372 /* Forward declaration */
373 struct Interface;
374 
375 /** Represents GLSL variable
376  *
377  **/
378 struct Variable
379 {
380 public:
381 	/* Typedefs */
382 	typedef std::vector<Variable>  Vector;
383 	typedef std::vector<Variable*> PtrVector;
384 
385 	/* Enums */
386 	enum STORAGE
387 	{
388 		VARYING_INPUT,
389 		VARYING_OUTPUT,
390 		UNIFORM,
391 		SSB,
392 		MEMBER,
393 
394 		/* */
395 		STORAGE_MAX
396 	};
397 
398 	enum VARYING_DIRECTION
399 	{
400 		INPUT,
401 		OUTPUT,
402 	};
403 
404 	enum FLAVOUR
405 	{
406 		BASIC,
407 		ARRAY,
408 		INDEXED_BY_INVOCATION_ID,
409 	};
410 
411 	/**/
412 	enum TYPE
413 	{
414 		BUILTIN,
415 		INTERFACE,
416 	};
417 
418 	/* Types */
419 	struct Descriptor
420 	{
421 		/* */
422 		typedef std::vector<Descriptor> Vector;
423 
424 		/* */
425 		Descriptor(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,
426 				   glw::GLint expected_location, const Type& type, glw::GLboolean normalized,
427 				   glw::GLuint n_array_elements, glw::GLint expected_stride_of_element, glw::GLuint offset);
428 
429 		Descriptor(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_componenet,
430 				   glw::GLint expected_location, Interface* interface, glw::GLuint n_array_elements,
431 				   glw::GLint expected_stride_of_element, glw::GLuint offset);
432 
433 		/* */
434 		std::string GetDefinition(FLAVOUR flavour, STORAGE storage) const;
435 
436 		/* */
437 		glw::GLint	 m_expected_component;
438 		glw::GLint	 m_expected_location;
439 		glw::GLint	 m_expected_stride_of_element;
440 		glw::GLuint	m_n_array_elements;
441 		std::string	m_name;
442 		glw::GLboolean m_normalized;
443 		glw::GLuint	m_offset;
444 		std::string	m_qualifiers;
445 
446 		TYPE m_type;
447 		union {
448 			Type	   m_builtin;
449 			Interface* m_interface;
450 		};
451 	};
452 
453 	/* Constructors */
454 	template <typename T>
Variablegl4cts::EnhancedLayouts::Utils::Variable455 	Variable(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,
456 			 glw::GLint expected_location, const Type& type, glw::GLboolean normalized, glw::GLuint n_array_elements,
457 			 glw::GLint expected_stride_of_element, glw::GLuint offset, const T* data, size_t data_size,
458 			 STORAGE storage)
459 		: m_data((glw::GLvoid*)data)
460 		, m_data_size(data_size)
461 		, m_descriptor(name, qualifiers, expected_component, expected_location, type, normalized, n_array_elements,
462 					   expected_stride_of_element, offset)
463 		, m_storage(storage)
464 	{
465 	}
466 
467 	template <typename T>
Variablegl4cts::EnhancedLayouts::Utils::Variable468 	Variable(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,
469 			 glw::GLint expected_location, Interface* interface, glw::GLuint n_array_elements,
470 			 glw::GLint expected_stride_of_element, glw::GLuint offset, const T* data, size_t data_size,
471 			 STORAGE storage)
472 		: m_data((glw::GLvoid*)data)
473 		, m_data_size(data_size)
474 		, m_descriptor(name, qualifiers, expected_component, expected_location, interface, n_array_elements,
475 					   expected_stride_of_element, offset)
476 		, m_storage(storage)
477 	{
478 	}
479 
480 	Variable(const Variable& var);
481 
482 	/* Functionality */
483 	std::string GetDefinition(FLAVOUR flavour) const;
484 	glw::GLuint GetSize() const;
485 	glw::GLuint GetStride() const;
486 	bool		IsBlock() const;
487 	bool		IsStruct() const;
488 	/* Static routines */
489 	static FLAVOUR GetFlavour(Shader::STAGES stage, VARYING_DIRECTION direction);
490 	static std::string GetReference(const std::string& parent_name, const Descriptor& variable, FLAVOUR flavour,
491 									glw::GLuint array_index);
492 
493 	/* Fields */
494 	glw::GLvoid* m_data;
495 	size_t		 m_data_size;
496 	Descriptor   m_descriptor;
497 	STORAGE		 m_storage;
498 
499 	/* Constants */
500 	static const glw::GLint m_automatic_location;
501 };
502 
503 /* Define the methods NAME, that will add new variable to VECTOR with STORAGE set		*/
504 #define DEFINE_VARIABLE_CLASS(NAME, STORAGE, VECTOR)                                                                  \
505 	template <typename T>                                                                                             \
506 	Variable* NAME(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,             \
507 				   glw::GLint expected_location, const Type& type, glw::GLboolean normalized,                         \
508 				   glw::GLuint n_array_elements, glw::GLint expected_stride_of_element, glw::GLuint offset,           \
509 				   const T* data, size_t data_size)                                                                   \
510 	{                                                                                                                 \
511 		Variable* var = new Variable(name, qualifiers, expected_component, expected_location, type, normalized,       \
512 									 n_array_elements, expected_stride_of_element, offset, data, data_size, STORAGE); \
513 		if (0 == var)                                                                                                 \
514 		{                                                                                                             \
515 			TCU_FAIL("Memory allocation");                                                                            \
516 		}                                                                                                             \
517 		VECTOR.push_back(var);                                                                                        \
518 		return VECTOR.back();                                                                                         \
519 	}                                                                                                                 \
520                                                                                                                       \
521 	template <typename T>                                                                                             \
522 	Variable* NAME(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,             \
523 				   glw::GLint expected_location, Interface* interface, glw::GLuint n_array_elements,                  \
524 				   glw::GLint expected_stride_of_element, glw::GLuint offset, const T* data, size_t data_size)        \
525 	{                                                                                                                 \
526 		Variable* var = new Variable(name, qualifiers, expected_component, expected_location, interface,              \
527 									 n_array_elements, expected_stride_of_element, offset, data, data_size, STORAGE); \
528 		if (0 == var)                                                                                                 \
529 		{                                                                                                             \
530 			TCU_FAIL("Memory allocation");                                                                            \
531 		}                                                                                                             \
532 		VECTOR.push_back(var);                                                                                        \
533 		return VECTOR.back();                                                                                         \
534 	}
535 
536 /** Represents structures and block
537  *
538  **/
539 struct Interface
540 {
541 public:
542 	/* Typedefs */
543 	typedef std::vector<Interface>  Vector;
544 	typedef std::vector<Interface*> PtrVector;
545 
546 	/**/
547 	enum TYPE
548 	{
549 		STRUCT,
550 		BLOCK
551 	};
552 
553 	/* Constructor */
554 	Interface(const glw::GLchar* name, TYPE type);
555 
556 	/*  */
557 	Variable::Descriptor* Member(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,
558 								 glw::GLint expected_location, const Type& type, glw::GLboolean normalized,
559 								 glw::GLuint n_array_elements, glw::GLint expected_stride_of_element,
560 								 glw::GLuint offset);
561 	Variable::Descriptor* Member(const glw::GLchar* name, const glw::GLchar* qualifiers, glw::GLint expected_component,
562 								 glw::GLint expected_location, Interface* interface, glw::GLuint n_array_elements,
563 								 glw::GLint expected_stride_of_element, glw::GLuint offset);
564 
565 	/**/
566 	Variable::Descriptor* AddMember(const Variable::Descriptor& member);
567 
568 	std::string GetDefinition() const;
569 
570 	/**/
571 	Variable::Descriptor::Vector m_members;
572 	std::string					 m_name;
573 	TYPE						 m_type;
574 };
575 
576 struct ShaderInterface
577 {
578 	ShaderInterface(Shader::STAGES stage);
579 
580 	DEFINE_VARIABLE_CLASS(Input, Variable::VARYING_INPUT, m_inputs);
581 	DEFINE_VARIABLE_CLASS(Output, Variable::VARYING_OUTPUT, m_outputs);
582 	DEFINE_VARIABLE_CLASS(Uniform, Variable::UNIFORM, m_uniforms);
583 	DEFINE_VARIABLE_CLASS(SSB, Variable::SSB, m_ssb_blocks);
584 
585 	/**/
586 	std::string GetDefinitionsGlobals() const;
587 	std::string GetDefinitionsInputs() const;
588 	std::string GetDefinitionsOutputs() const;
589 	std::string GetDefinitionsSSBs() const;
590 	std::string GetDefinitionsUniforms() const;
591 
592 	std::string			m_globals;
593 	Variable::PtrVector m_inputs;
594 	Variable::PtrVector m_outputs;
595 	Variable::PtrVector m_uniforms;
596 	Variable::PtrVector m_ssb_blocks;
597 
598 	Shader::STAGES m_stage;
599 };
600 
601 struct VaryingConnection
602 {
603 	/* */
604 	typedef std::vector<VaryingConnection> Vector;
605 
606 	/* */
607 	VaryingConnection(Variable* in, Variable* out);
608 
609 	/* */
610 	Variable* m_in;
611 	Variable* m_out;
612 };
613 
614 struct VaryingPassthrough
615 {
616 	/* */
617 	void Add(Shader::STAGES stage, Variable* in, Variable* out);
618 
619 	VaryingConnection::Vector& Get(Shader::STAGES stage);
620 
621 	/**/
622 	VaryingConnection::Vector m_fragment;
623 	VaryingConnection::Vector m_geometry;
624 	VaryingConnection::Vector m_tess_ctrl;
625 	VaryingConnection::Vector m_tess_eval;
626 	VaryingConnection::Vector m_vertex;
627 };
628 
629 struct ProgramInterface
630 {
631 
632 	/* */
633 	ProgramInterface();
634 	~ProgramInterface();
635 
636 	/* */
637 	Interface* AddInterface(const glw::GLchar* name, Interface::TYPE type);
638 	Interface* Block(const glw::GLchar* name);
639 	Interface* GetBlock(const glw::GLchar* name);
640 	ShaderInterface& GetShaderInterface(Shader::STAGES stage);
641 	const ShaderInterface& GetShaderInterface(Shader::STAGES stage) const;
642 	Interface* GetStructure(const glw::GLchar* name);
643 	Interface* Structure(const glw::GLchar* name);
644 
645 	/**/
646 	std::string GetDefinitionsStructures() const;
647 	std::string GetInterfaceForStage(Shader::STAGES stage) const;
648 
649 	/* */
650 	Interface* CloneBlockForStage(const Interface& block, Shader::STAGES stage, Variable::STORAGE storage,
651 								  const glw::GLchar* prefix);
652 	void CloneVertexInterface(VaryingPassthrough& variable_pass);
653 
654 	/* */
655 	static const glw::GLchar* GetStagePrefix(Shader::STAGES stage, Variable::STORAGE storage);
656 
657 	/* */
658 	Interface::PtrVector m_structures;
659 	Interface::PtrVector m_blocks;
660 
661 	ShaderInterface m_compute;
662 	ShaderInterface m_vertex;
663 	ShaderInterface m_tess_ctrl;
664 	ShaderInterface m_tess_eval;
665 	ShaderInterface m_geometry;
666 	ShaderInterface m_fragment;
667 
668 	//Variable::Vector     m_fragment_outputs;
669 	//Variable::PtrVector  m_captured_varyings;
670 
671 private:
672 	/* */
673 	void cloneVariableForStage(const Variable& variable, Shader::STAGES stage, const glw::GLchar* prefix,
674 							   VaryingPassthrough& varying_passthrough);
675 	Variable* cloneVariableForStage(const Variable& variable, Shader::STAGES stage, Variable::STORAGE storage,
676 									const glw::GLchar* prefix);
677 	void replaceBinding(Variable& variable, Shader::STAGES stage);
678 };
679 
680 /** Represents program pipeline
681  *
682  **/
683 class Pipeline
684 {
685 public:
686 	/* Public methods */
687 	/* Ctr & Dtr */
688 	Pipeline(deqp::Context& context);
689 	~Pipeline();
690 
691 	/* Init & Release */
692 	void Init();
693 	void Release();
694 
695 	/* Functionality */
696 	void Bind();
697 	void UseProgramStages(glw::GLuint program_id, glw::GLenum stages);
698 
699 	/* Public static routines */
700 	/* Functionality */
701 	void Bind(const glw::Functions& gl, glw::GLuint id);
702 	void UseProgramStages(const glw::Functions& gl, glw::GLuint id, glw::GLuint program_id, glw::GLenum stages);
703 
704 	/* Public fields */
705 	glw::GLuint m_id;
706 
707 	/* Public constants */
708 	static const glw::GLuint m_invalid_id;
709 
710 private:
711 	/* Private fields */
712 	deqp::Context& m_context;
713 };
714 
715 /** Represents program instance.
716  * Provides basic functionality
717  **/
718 class Program
719 {
720 public:
721 	/* Public types */
722 	class BuildException : public std::exception
723 	{
724 	public:
725 		BuildException(const glw::GLchar* error_message, const std::string compute_shader,
726 					   const std::string fragment_shader, const std::string geometry_shader,
727 					   const std::string tess_ctrl_shader, const std::string tess_eval_shader,
728 					   const std::string vertex_shader);
~BuildException()729 		virtual ~BuildException() throw()
730 		{
731 		}
732 
733 		virtual const char* what() const throw();
734 
735 		void log(deqp::Context& context) const;
736 
737 		std::string m_error_message;
738 		std::string m_compute_shader;
739 		std::string m_fragment_shader;
740 		std::string m_geometry_shader;
741 		std::string m_tess_ctrl_shader;
742 		std::string m_tess_eval_shader;
743 		std::string m_vertex_shader;
744 	};
745 
746 	typedef std::vector<std::string> NameVector;
747 
748 	/* Public methods */
749 	/* Ctr & Dtr */
750 	Program(deqp::Context& context);
751 	~Program();
752 
753 	/* Init & Release */
754 	void Init(const std::string& compute_shader, const std::string& fragment_shader, const std::string& geometry_shader,
755 			  const std::string& tessellation_control_shader, const std::string& tessellation_evaluation_shader,
756 			  const std::string& vertex_shader, const NameVector& captured_varyings, bool capture_interleaved,
757 			  bool is_separable);
758 
759 	void Init(const std::string& compute_shader, const std::string& fragment_shader, const std::string& geometry_shader,
760 			  const std::string& tessellation_control_shader, const std::string& tessellation_evaluation_shader,
761 			  const std::string& vertex_shader, bool is_separable);
762 
763 	void Release();
764 
765 	/* Functionality */
766 	void GetActiveUniformsiv(glw::GLsizei count, const glw::GLuint* indices, glw::GLenum pname,
767 							 glw::GLint* params) const;
768 
769 	glw::GLint GetAttribLocation(const std::string& name) const;
770 
771 	void GetResource(glw::GLenum interface, glw::GLuint index, glw::GLenum property, glw::GLsizei buf_size,
772 					 glw::GLint* params) const;
773 
774 	glw::GLuint GetResourceIndex(const std::string& name, glw::GLenum interface) const;
775 
776 	void GetUniformIndices(glw::GLsizei count, const glw::GLchar** names, glw::GLuint* indices) const;
777 
778 	glw::GLint GetUniformLocation(const std::string& name) const;
779 	void Use() const;
780 
781 	/* Public static routines */
782 	/* Functionality */
783 	static void Attach(const glw::Functions& gl, glw::GLuint program_id, glw::GLuint shader_id);
784 
785 	static void Capture(const glw::Functions& gl, glw::GLuint id, const NameVector& captured_varyings,
786 						bool capture_interleaved);
787 
788 	static void Create(const glw::Functions& gl, glw::GLuint& out_id);
789 
790 	static void GetActiveUniformsiv(const glw::Functions& gl, glw::GLuint program_id, glw::GLsizei count,
791 									const glw::GLuint* indices, glw::GLenum pname, glw::GLint* params);
792 
793 	static void GetUniformIndices(const glw::Functions& gl, glw::GLuint program_id, glw::GLsizei count,
794 								  const glw::GLchar** names, glw::GLuint* indices);
795 
796 	static void Link(const glw::Functions& gl, glw::GLuint id);
797 
798 	static void Uniform(const glw::Functions& gl, const Type& type, glw::GLsizei count, glw::GLint location,
799 						const glw::GLvoid* data);
800 
801 	static void Use(const glw::Functions& gl, glw::GLuint id);
802 
803 	/* Get locations */
804 	static glw::GLint GetAttribLocation(const glw::Functions& gl, glw::GLuint id, const std::string& name);
805 
806 	static void GetResource(const glw::Functions& gl, glw::GLuint id, glw::GLenum interface, glw::GLuint index,
807 							glw::GLenum property, glw::GLsizei buf_size, glw::GLint* params);
808 
809 	static glw::GLuint GetResourceIndex(const glw::Functions& gl, glw::GLuint id, const std::string& name,
810 										glw::GLenum interface);
811 
812 	static glw::GLint GetUniformLocation(const glw::Functions& gl, glw::GLuint id, const std::string& name);
813 
814 	/* Public fields */
815 	glw::GLuint m_id;
816 
817 	Shader m_compute;
818 	Shader m_fragment;
819 	Shader m_geometry;
820 	Shader m_tess_ctrl;
821 	Shader m_tess_eval;
822 	Shader m_vertex;
823 
824 	/* Public constants */
825 	static const glw::GLuint m_invalid_id;
826 
827 private:
828 	/* Private types */
829 	class LinkageException : public std::exception
830 	{
831 	public:
832 		LinkageException(const glw::GLchar* error_message);
833 
~LinkageException()834 		virtual ~LinkageException() throw()
835 		{
836 		}
837 
838 		virtual const char* what() const throw();
839 
840 		std::string m_error_message;
841 	};
842 
843 	/* Private fields */
844 	deqp::Context& m_context;
845 };
846 
847 class Texture
848 {
849 public:
850 	/* Public enums */
851 	enum TYPES
852 	{
853 		TEX_BUFFER,
854 		TEX_2D,
855 		TEX_2D_RECT,
856 		TEX_2D_ARRAY,
857 		TEX_3D,
858 		TEX_CUBE,
859 		TEX_1D,
860 		TEX_1D_ARRAY,
861 	};
862 
863 	/* Public methods */
864 	/* Ctr & Dtr */
865 	Texture(deqp::Context& context);
866 	~Texture();
867 
868 	/* Init & Release */
869 	void Init(TYPES tex_type, glw::GLuint width, glw::GLuint height, glw::GLuint depth, glw::GLenum internal_format,
870 			  glw::GLenum format, glw::GLenum type, glw::GLvoid* data);
871 
872 	void Init(glw::GLenum internal_format, glw::GLuint buffer_id);
873 
874 	void Release();
875 
876 	/* Functionality */
877 	void Bind() const;
878 	void Get(glw::GLenum format, glw::GLenum type, glw::GLvoid* out_data) const;
879 
880 	/* Public static routines */
881 	/* Functionality */
882 	static void Bind(const glw::Functions& gl, glw::GLuint id, TYPES tex_type);
883 
884 	static void Generate(const glw::Functions& gl, glw::GLuint& out_id);
885 
886 	static void Get(const glw::Functions& gl, TYPES tex_type, glw::GLenum format, glw::GLenum type,
887 					glw::GLvoid* out_data);
888 
889 	static void Storage(const glw::Functions& gl, TYPES tex_type, glw::GLuint width, glw::GLuint height,
890 						glw::GLuint depth, glw::GLenum internal_format);
891 
892 	static void TexBuffer(const glw::Functions& gl, glw::GLenum internal_format, glw::GLuint& buffer_id);
893 
894 	static void Update(const glw::Functions& gl, TYPES tex_type, glw::GLuint width, glw::GLuint height,
895 					   glw::GLuint depth, glw::GLenum format, glw::GLenum type, glw::GLvoid* data);
896 
897 	/* GL gets */
898 	static glw::GLenum GetTargetGLenum(TYPES tex_type);
899 
900 	/* Public fields */
901 	glw::GLuint m_id;
902 
903 	/* Public constants */
904 	static const glw::GLuint m_invalid_id;
905 
906 private:
907 	deqp::Context& m_context;
908 	TYPES		   m_type;
909 };
910 
911 /** Represents Vertex array object
912  * Provides basic functionality
913  **/
914 class VertexArray
915 {
916 public:
917 	/* Public methods */
918 	/* Ctr & Dtr */
919 	VertexArray(deqp::Context& Context);
920 	~VertexArray();
921 
922 	/* Init & Release */
923 	void Init();
924 	//void Init(const ProgramInterface& program_interface,
925 	//                glw::GLuint       vertex_buffer,
926 	//                glw::GLuint       index_buffer);
927 	void Release();
928 
929 	void Attribute(glw::GLuint index, const Type& type, glw::GLuint n_array_elements, glw::GLboolean normalized,
930 				   glw::GLsizei stride, const glw::GLvoid* pointer);
931 
932 	void Bind();
933 
934 	/* Public static methods */
935 	static void AttribPointer(const glw::Functions& gl, glw::GLuint index, const Type& type,
936 							  glw::GLuint n_array_elements, glw::GLboolean normalized, glw::GLsizei stride,
937 							  const glw::GLvoid* pointer);
938 
939 	static void Bind(const glw::Functions& gl, glw::GLuint id);
940 
941 	static void Disable(const glw::Functions& gl, glw::GLuint index, const Type& type, glw::GLuint n_array_elements);
942 
943 	static void Divisor(const glw::Functions& gl, glw::GLuint index, glw::GLuint divisor);
944 
945 	static void Enable(const glw::Functions& gl, glw::GLuint index, const Type& type, glw::GLuint n_array_elements);
946 
947 	static void Generate(const glw::Functions& gl, glw::GLuint& out_id);
948 
949 	/* Public fields */
950 	glw::GLuint m_id;
951 
952 	/* Public constants */
953 	static const glw::GLuint m_invalid_id;
954 
955 private:
956 	deqp::Context& m_context;
957 };
958 
959 /* UniformN*v prototypes */
960 typedef GLW_APICALL void(GLW_APIENTRY* uniformNdv)(glw::GLint, glw::GLsizei, const glw::GLdouble*);
961 typedef GLW_APICALL void(GLW_APIENTRY* uniformNfv)(glw::GLint, glw::GLsizei, const glw::GLfloat*);
962 typedef GLW_APICALL void(GLW_APIENTRY* uniformNiv)(glw::GLint, glw::GLsizei, const glw::GLint*);
963 typedef GLW_APICALL void(GLW_APIENTRY* uniformNuiv)(glw::GLint, glw::GLsizei, const glw::GLuint*);
964 typedef GLW_APICALL void(GLW_APIENTRY* uniformMatrixNdv)(glw::GLint, glw::GLsizei, glw::GLboolean,
965 														 const glw::GLdouble*);
966 typedef GLW_APICALL void(GLW_APIENTRY* uniformMatrixNfv)(glw::GLint, glw::GLsizei, glw::GLboolean, const glw::GLfloat*);
967 
968 /* Public static methods */
969 /* UniformN*v routine getters */
970 uniformNdv getUniformNdv(const glw::Functions& gl, glw::GLuint n_rows);
971 uniformNfv getUniformNfv(const glw::Functions& gl, glw::GLuint n_rows);
972 uniformNiv getUniformNiv(const glw::Functions& gl, glw::GLuint n_rows);
973 uniformNuiv getUniformNuiv(const glw::Functions& gl, glw::GLuint n_rows);
974 uniformMatrixNdv getUniformMatrixNdv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows);
975 uniformMatrixNfv getUniformMatrixNfv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows);
976 
977 /* Stuff */
978 bool checkProgramInterface(const ProgramInterface& program_interface, Program& program, std::stringstream& stream);
979 
980 bool isExtensionSupported(deqp::Context& context, const glw::GLchar* extension_name);
981 
982 bool isGLVersionAtLeast(const glw::Functions& gl, glw::GLint required_major, glw::GLint required_minor);
983 
984 void replaceToken(const glw::GLchar* token, size_t& search_position, const glw::GLchar* text, std::string& string);
985 
986 void replaceAllTokens(const glw::GLchar* token, const glw::GLchar* text, std::string& string);
987 
988 glw::GLuint roundUpToPowerOf2(glw::GLuint value);
989 
990 void insertElementOfList(const glw::GLchar* element, const glw::GLchar* separator, size_t& search_position,
991 						 std::string& string);
992 
993 void endList(const glw::GLchar* separator, size_t& search_position, std::string& string);
994 } /* Utils namespace */
995 
996 /** Base class for tests **/
997 class TestBase : public deqp::TestCase
998 {
999 public:
1000 	/* Public methods */
1001 	TestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
1002 
~TestBase()1003 	virtual ~TestBase()
1004 	{
1005 	}
1006 
1007 	/* Public methods inherited from TestCase */
1008 	virtual tcu::TestNode::IterateResult iterate(void);
1009 
1010 protected:
1011 	/* Methods to be implemented by child class */
1012 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1013 	virtual glw::GLuint getTestCaseNumber();
1014 	virtual bool testCase(glw::GLuint test_case_index) = 0;
1015 	virtual void testInit();
1016 
1017 	/* Routines avaiable for children */
1018 	glw::GLuint calculateStride(const Utils::Interface& interface) const;
1019 	void generateData(const Utils::Interface& interface, glw::GLuint offset, std::vector<glw::GLubyte>& out_data) const;
1020 
1021 	glw::GLint getLastInputLocation(Utils::Shader::STAGES stage, const Utils::Type& type, glw::GLuint array_lenth, bool ignore_prev_stage);
1022 
1023 	glw::GLint getLastOutputLocation(Utils::Shader::STAGES stage, const Utils::Type& type, glw::GLuint array_lenth, bool ignore_next_stage);
1024 
1025 	Utils::Type getType(glw::GLuint index) const;
1026 	std::string getTypeName(glw::GLuint index) const;
1027 	glw::GLuint getTypesNumber() const;
1028 
1029 	bool isFlatRequired(Utils::Shader::STAGES stage, const Utils::Type& type, Utils::Variable::STORAGE storage) const;
1030 
1031 private:
1032 	/* Private methods */
1033 	bool test();
1034 };
1035 
1036 /** Base class for test doing Buffer alghorithm **/
1037 class BufferTestBase : public TestBase
1038 {
1039 public:
1040 	/* Public methods */
1041 	BufferTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
1042 
~BufferTestBase()1043 	virtual ~BufferTestBase()
1044 	{
1045 	}
1046 
1047 protected:
1048 	/* */
1049 	struct bufferDescriptor
1050 	{
1051 		/* Typedefs */
1052 		typedef std::vector<bufferDescriptor> Vector;
1053 
1054 		/* Fileds */
1055 		std::vector<glw::GLubyte> m_expected_data;
1056 		std::vector<glw::GLubyte> m_initial_data;
1057 		glw::GLuint				  m_index;
1058 		Utils::Buffer::BUFFERS	m_target;
1059 
1060 		/* Constants */
1061 		static const glw::GLuint m_non_indexed;
1062 	};
1063 
1064 	class bufferCollection
1065 	{
1066 	public:
1067 		struct pair
1068 		{
1069 			Utils::Buffer*	m_buffer;
1070 			bufferDescriptor* m_descriptor;
1071 		};
1072 
1073 		~bufferCollection();
1074 
1075 		typedef std::vector<pair> Vector;
1076 
1077 		Vector m_vector;
1078 	};
1079 
1080 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
1081 
1082 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
1083 
1084 	virtual void getCapturedVaryings(glw::GLuint test_case_index, Utils::Program::NameVector& captured_varyings, glw::GLint* xfb_components);
1085 
1086 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
1087 							   std::string& out_calculations);
1088 
1089 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
1090 									std::string& out_interface);
1091 
1092 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1093 
1094 	virtual bool inspectProgram(glw::GLuint test_case_index, Utils::Program& program, std::stringstream& out_stream);
1095 
1096 	virtual bool testCase(glw::GLuint test_case_index);
1097 	virtual bool verifyBuffers(bufferCollection& buffers);
1098 
1099 private:
1100 	void		cleanBuffers();
1101 	std::string getShaderTemplate(Utils::Shader::STAGES stage);
1102 	void prepareBuffer(Utils::Buffer& buffer, bufferDescriptor& descriptor);
1103 	void prepareBuffers(bufferDescriptor::Vector& descriptors, bufferCollection& out_buffers);
1104 
1105 	/* */
1106 };
1107 
1108 class NegativeTestBase : public TestBase
1109 {
1110 public:
1111 	/* Public methods */
1112 	NegativeTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
1113 
~NegativeTestBase()1114 	virtual ~NegativeTestBase()
1115 	{
1116 	}
1117 
1118 protected:
1119 	/* Methods to be implemented by child class */
1120 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage) = 0;
1121 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1122 	virtual bool isFailureExpected(glw::GLuint test_case_index);
1123 	virtual bool testCase(glw::GLuint test_case_index);
1124 };
1125 
1126 /** Base class for test doing Texture alghorithm **/
1127 class TextureTestBase : public TestBase
1128 {
1129 public:
1130 	/* Public methods */
1131 	TextureTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
1132 
~TextureTestBase()1133 	virtual ~TextureTestBase()
1134 	{
1135 	}
1136 
1137 protected:
1138 	/* Methods to be implemented by child class */
1139 	virtual bool checkResults(glw::GLuint test_case_index, Utils::Texture& color_0);
1140 
1141 	virtual void executeDispatchCall(glw::GLuint test_case_index);
1142 	virtual void executeDrawCall(glw::GLuint test_case_index);
1143 
1144 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1145 									 Utils::VaryingPassthrough& varying_passthrough);
1146 
1147 	virtual std::string getPassSnippet(glw::GLuint test_case_index, Utils::VaryingPassthrough& varying_passthrough,
1148 									   Utils::Shader::STAGES stage);
1149 
1150 	virtual std::string getVerificationSnippet(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1151 											   Utils::Shader::STAGES stage);
1152 
1153 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1154 	virtual bool isDrawRelevant(glw::GLuint test_case_index);
1155 
1156 	virtual void prepareAttributes(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1157 								   Utils::Buffer& buffer, Utils::VertexArray& vao);
1158 
1159 	virtual void prepareAttribLocation(Utils::Program& program, Utils::ProgramInterface& program_interface);
1160 
1161 	virtual void prepareFragmentDataLoc(Utils::Program& program, Utils::ProgramInterface& program_interface);
1162 
1163 	virtual void prepareFramebuffer(Utils::Framebuffer& framebuffer, Utils::Texture& color_0_texture);
1164 
1165 	virtual void prepareImage(glw::GLint location, Utils::Texture& image_texture) const;
1166 
1167 	virtual void prepareSSBs(glw::GLuint test_case_index, Utils::ShaderInterface& si, Utils::Program& program,
1168 							 Utils::Buffer& buffer);
1169 
1170 	virtual void prepareSSBs(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1171 							 Utils::Program& program, Utils::Buffer& cs_buffer);
1172 
1173 	virtual void prepareSSBs(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1174 							 Utils::Program& program, Utils::Buffer& fs_buffer, Utils::Buffer& gs_buffer,
1175 							 Utils::Buffer& tcs_buffer, Utils::Buffer& tes_buffer, Utils::Buffer& vs_buffer);
1176 
1177 	virtual void prepareUniforms(glw::GLuint test_case_index, Utils::ShaderInterface& si, Utils::Program& program,
1178 								 Utils::Buffer& buffer);
1179 
1180 	virtual void prepareUniforms(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1181 								 Utils::Program& program, Utils::Buffer& cs_buffer);
1182 
1183 	virtual void prepareUniforms(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1184 								 Utils::Program& program, Utils::Buffer& fs_buffer, Utils::Buffer& gs_buffer,
1185 								 Utils::Buffer& tcs_buffer, Utils::Buffer& tes_buffer, Utils::Buffer& vs_buffer);
1186 
1187 	virtual void prepareUniforms(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1188 								 Utils::Program& fs_program, Utils::Program& gs_program, Utils::Program& tcs_program,
1189 								 Utils::Program& tes_program, Utils::Program& vs_program, Utils::Buffer& fs_buffer,
1190 								 Utils::Buffer& gs_buffer, Utils::Buffer& tcs_buffer, Utils::Buffer& tes_buffer,
1191 								 Utils::Buffer& vs_buffer);
1192 	//virtual void        prepareDrawPrograms   (glw::GLuint                 test_case_index,
1193 	//                                           Utils::Program&             fragment,
1194 	//                                           Utils::Program&             geometry,
1195 	//                                           Utils::Program&             tess_ctrl,
1196 	//                                           Utils::Program&             tess_eval,
1197 	//                                           Utils::Program&             vertex);
1198 	virtual bool testCase(glw::GLuint test_case_index);
1199 	virtual bool testMonolithic(glw::GLuint test_case_index);
1200 	virtual bool testSeparable(glw::GLuint test_case_index);
1201 	virtual bool useComponentQualifier(glw::GLuint test_case_index);
1202 	virtual bool useMonolithicProgram(glw::GLuint test_case_index);
1203 
1204 	/* Protected constants */
1205 	static const glw::GLuint m_width;
1206 	static const glw::GLuint m_height;
1207 
1208 private:
1209 	std::string getShaderSource(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1210 								Utils::VaryingPassthrough& varying_passthrough, Utils::Shader::STAGES stage);
1211 
1212 	const glw::GLchar* getShaderTemplate(Utils::Shader::STAGES stage);
1213 
1214 	std::string getVariablePassthrough(const std::string&				  in_parent_name,
1215 									   const Utils::Variable::Descriptor& in_variable,
1216 									   Utils::Variable::FLAVOUR in_flavour, const std::string& out_parent_name,
1217 									   const Utils::Variable::Descriptor& out_variable,
1218 									   Utils::Variable::FLAVOUR			  out_flavour);
1219 
1220 	std::string getVariableVerification(const std::string& parent_name, const glw::GLvoid* data,
1221 										const Utils::Variable::Descriptor& variable, Utils::Variable::FLAVOUR flavour);
1222 
1223 	void prepareSSB(Utils::Program& program, Utils::Variable& variable, Utils::Buffer& buffer);
1224 
1225 	void prepareUniform(Utils::Program& program, Utils::Variable& variable, Utils::Buffer& buffer);
1226 };
1227 
1228 /** Implementation of test APIConstantValues. Description follows:
1229  *
1230  *  Test verifies values of the following constants are at least as specified:
1231  * - MAX_TRANSFORM_FEEDBACK_BUFFERS                - 4,
1232  * - MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS - 64.
1233  **/
1234 class APIConstantValuesTest : public deqp::TestCase
1235 {
1236 public:
1237 	/* Public methods */
1238 	APIConstantValuesTest(deqp::Context& context);
~APIConstantValuesTest()1239 	virtual ~APIConstantValuesTest()
1240 	{
1241 	}
1242 
1243 	/* Public methods inherited from TestCase */
1244 	virtual tcu::TestNode::IterateResult iterate(void);
1245 };
1246 
1247 /** Implementation of test APIErrors. Description follows:
1248  *
1249  * Test verifies that errors are generated as specified:
1250  * - GetProgramInterfaceiv should generate INVALID_OPERATION when
1251  * <programInterface> is TRANSFORM_FEEDBACK_BUFFER and <pname> is
1252  * MAX_NAME_LENGTH;
1253  * - GetProgramResourceIndex should generate INVALID_ENUM when
1254  * <programInterface> is TRANSFORM_FEEDBACK_BUFFER;
1255  * - GetProgramResourceName should generate INVALID_ENUM when
1256  * <programInterface> is TRANSFORM_FEEDBACK_BUFFER;
1257  **/
1258 class APIErrorsTest : public deqp::TestCase
1259 {
1260 public:
1261 	/* Public methods */
1262 	APIErrorsTest(deqp::Context& context);
~APIErrorsTest()1263 	virtual ~APIErrorsTest()
1264 	{
1265 	}
1266 
1267 	/* Public methods inherited from TestCase */
1268 	virtual tcu::TestNode::IterateResult iterate(void);
1269 
1270 private:
1271 	void checkError(glw::GLenum expected_error, const glw::GLchar* message, bool& test_result);
1272 };
1273 
1274 /** Implementation of test GLSLContantValues. Description follows:
1275  *
1276  * Test verifies values of the following symbols:
1277  *
1278  *     GL_ARB_enhanced_layouts,
1279  *     gl_MaxTransformFeedbackBuffers,
1280  *     gl_MaxTransformFeedbackInterleavedComponents.
1281  *
1282  * This test implements Texture algorithm. Test following code snippet:
1283  *
1284  *     if (1 != GL_ARB_enhanced_layouts)
1285  *     {
1286  *         result = 0;
1287  *     }
1288  *     else if (MAX_TRANSFORM_FEEDBACK_BUFFERS
1289  *         != gl_MaxTransformFeedbackBuffers)
1290  *     {
1291  *         result = 0;
1292  *     }
1293  *     else if (MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS
1294  *         != gl_MaxTransformFeedbackInterleavedComponents)
1295  *     {
1296  *         result = 0;
1297  *     }
1298  **/
1299 class GLSLContantValuesTest : public TextureTestBase
1300 {
1301 public:
1302 	GLSLContantValuesTest(deqp::Context& context);
~GLSLContantValuesTest()1303 	~GLSLContantValuesTest()
1304 	{
1305 	}
1306 
1307 protected:
1308 	virtual std::string getVerificationSnippet(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1309 											   Utils::Shader::STAGES stage);
1310 
1311 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1312 };
1313 
1314 /** Implementation of test GLSLContantImmutablity. Description follows:
1315  *
1316  * Test verifies that values of the following symbols cannot be changed in
1317  * shader:
1318  *
1319  *     GL_ARB_enhanced_layouts,
1320  *     gl_MaxTransformFeedbackBuffers,
1321  *     gl_MaxTransformFeedbackInterleavedComponents.
1322  *
1323  * Compile following code snippet:
1324  *
1325  *     CONSTANT = 3;
1326  *
1327  * It is expected that compilation will fail. Test each shader stage
1328  * separately. Test each constant separately.
1329  **/
1330 class GLSLContantImmutablityTest : public NegativeTestBase
1331 {
1332 public:
1333 	/* Public methods */
1334 	GLSLContantImmutablityTest(deqp::Context& context);
1335 
~GLSLContantImmutablityTest()1336 	virtual ~GLSLContantImmutablityTest()
1337 	{
1338 	}
1339 
1340 protected:
1341 	/* Methods to be implemented by child class */
1342 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1343 
1344 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1345 	virtual glw::GLuint getTestCaseNumber();
1346 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1347 	virtual void testInit();
1348 
1349 private:
1350 	/* Private enums */
1351 	enum CONSTANTS
1352 	{
1353 		GL_ARB_ENHANCED_LAYOUTS,
1354 		GL_MAX_XFB,
1355 		GL_MAX_XFB_INT_COMP,
1356 
1357 		/* */
1358 		CONSTANTS_MAX,
1359 	};
1360 
1361 	/* Private types */
1362 	struct testCase
1363 	{
1364 		CONSTANTS			  m_constant;
1365 		Utils::Shader::STAGES m_stage;
1366 	};
1367 
1368 	/* Private methods */
1369 	const glw::GLchar* getConstantName(CONSTANTS constant);
1370 
1371 	/* Private fields */
1372 	std::vector<testCase> m_test_cases;
1373 };
1374 
1375 /** Implementation of test GLSLConstantIntegralExpression. Description follows:
1376  *
1377  * Check that following symbols can be used as integral constant expressions:
1378  *
1379  *     GL_ARB_enhanced_layouts,
1380  *     gl_MaxTransformFeedbackBuffers,
1381  *     gl_MaxTransformFeedbackInterleavedComponents.
1382  *
1383  * Test implement Texture algorithm. Test following code snippet:
1384  *
1385  *     uniform uint goku [GL_ARB_enhanced_layouts / GOKU_DIV];
1386  *     uniform uint gohan[gl_MaxTransformFeedbackBuffers / GOHAN_DIV];
1387  *     uniform uint goten[gl_MaxTransformFeedbackInterleavedComponents /
1388  *                         GOTEN_DIV];
1389  *
1390  *     for (i = 0; i < goku.length; ++i)
1391  *         goku_sum += goku[i];
1392  *
1393  *     for (i = 0; i < gohan.length; ++i)
1394  *         gohan_sum += gohan[i];
1395  *
1396  *     for (i = 0; i < goten.length; ++i)
1397  *         goten_sum += goten[i];
1398  *
1399  *     if ( (expected_goku_sum  == goku_sum)  &&
1400  *          (expected_gohan_sum == gohan_sum) &&
1401  *          (expected_goten_sum == goten_sum) )
1402  *         result = 1;
1403  *     else
1404  *         result = 0;
1405  *
1406  * Select DIV values so as array lengths are below 16.
1407  **/
1408 class GLSLConstantIntegralExpressionTest : public TextureTestBase
1409 {
1410 public:
1411 	/* Public methods */
1412 	GLSLConstantIntegralExpressionTest(deqp::Context& context);
1413 
~GLSLConstantIntegralExpressionTest()1414 	virtual ~GLSLConstantIntegralExpressionTest()
1415 	{
1416 	}
1417 
1418 protected:
1419 	/* Protected methods */
1420 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1421 									 Utils::VaryingPassthrough& varying_passthrough);
1422 
1423 	virtual std::string getVerificationSnippet(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1424 											   Utils::Shader::STAGES stage);
1425 
1426 	virtual void prepareUniforms(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1427 								 Utils::Program& program, Utils::Buffer& cs_buffer);
1428 
1429 	virtual void prepareUniforms(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1430 								 Utils::Program& program, Utils::Buffer& fs_buffer, Utils::Buffer& gs_buffer,
1431 								 Utils::Buffer& tcs_buffer, Utils::Buffer& tes_buffer, Utils::Buffer& vs_buffer);
1432 
1433 private:
1434 	glw::GLint m_gohan_length;
1435 	glw::GLint m_goten_length;
1436 };
1437 
1438 /** Implementation of test UniformBlockMemberOffsetAndAlign. Description follows:
1439  *
1440  * Test verifies that:
1441  *     - offset and align qualifiers are respected for uniform block members,
1442  *     - align qualifier is ignored if value is too small,
1443  *     - align qualifier accepts values bigger than size of base type,
1444  *     - manual and automatic offsets and alignments can be mixed.
1445  *
1446  * This test implement Texture algorithm. Test following code snippet:
1447  *
1448  *     const int basic_size = sizeof(basic_type_of(type));
1449  *     const int type_size  = sizeof(type);
1450  *     const int type_align = roundUpToPowerOf2(type_size);
1451  *
1452  *     layout (std140, offset = 0) uniform Block {
1453  *         layout(align = 8 * basic_size)  type at_first_offset;
1454  *         layout(offset = type_size, align = basic_size / 2)
1455  *                                         type at_second_offset;
1456  *         layout(align = 2 * type_align)  type at_third_offset;
1457  *         layout(offset = 3 * type_align + type_size)
1458  *                                         type at_fourth_offset;
1459  *                                         type at_fifth_offset;
1460  *                                         type at_sixth_offset[2];
1461  *         layout(align = 8 * basic_size)  type at_eight_offset;
1462  *     };
1463  *
1464  *     if ( (at_first_offset  == at_eight_offset   ) &&
1465  *          (at_second_offset == at_sixth_offset[1]) &&
1466  *          (at_third_offset  == at_sixth_offset[0]) &&
1467  *          (at_fourth_offset == at_fifth_offset   ) )
1468  *         result = 1;
1469  *     else
1470  *         result = 0;
1471  *
1472  * Additionally inspect program to verify that all block members:
1473  * - are reported,
1474  * - have correct offsets.
1475  *
1476  * Test should be executed for all types.
1477  **/
1478 class UniformBlockMemberOffsetAndAlignTest : public TextureTestBase
1479 {
1480 public:
1481 	/* Public methods */
1482 	UniformBlockMemberOffsetAndAlignTest(deqp::Context& context);
1483 
~UniformBlockMemberOffsetAndAlignTest()1484 	virtual ~UniformBlockMemberOffsetAndAlignTest()
1485 	{
1486 	}
1487 
1488 protected:
1489 	/* Protected methods */
1490 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1491 									 Utils::VaryingPassthrough& varying_passthrough);
1492 
1493 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1494 	virtual glw::GLuint getTestCaseNumber();
1495 
1496 	virtual std::string getVerificationSnippet(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1497 											   Utils::Shader::STAGES stage);
1498 
1499 private:
1500 	std::vector<glw::GLubyte> m_data;
1501 };
1502 
1503 /** Implementation of test UniformBlockLayoutQualifierConflict. Description follows:
1504  *
1505  * Test verifies that offset and align can only be used on members of blocks
1506  * declared as std140.
1507  *
1508  * Test following code snippet with all shader stages:
1509  *
1510  *     layout(QUALIFIER) uniform Block {
1511  *         layout(offset = 16) vec4 boy;
1512  *         layout(align  = 48) vec4 man;
1513  *     };
1514  *
1515  * Test following block qualifiers and all types:
1516  *
1517  *     default - meaning not declared by shader
1518  *     std140,
1519  *     shared,
1520  *     packed.
1521  *
1522  * Qualifier std430 is not allowed for uniform blocks.
1523  *
1524  * Test expect that only case using std140 will compile and link successfully,
1525  * while the rest will fail to compile or link.
1526  **/
1527 class UniformBlockLayoutQualifierConflictTest : public NegativeTestBase
1528 {
1529 public:
1530 	/* Public methods */
1531 	UniformBlockLayoutQualifierConflictTest(deqp::Context& context);
1532 
~UniformBlockLayoutQualifierConflictTest()1533 	virtual ~UniformBlockLayoutQualifierConflictTest()
1534 	{
1535 	}
1536 
1537 protected:
1538 	/* Methods to be implemented by child class */
1539 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1540 
1541 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1542 	virtual glw::GLuint getTestCaseNumber();
1543 
1544 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1545 	virtual bool isFailureExpected(glw::GLuint test_case_index);
1546 	virtual void testInit();
1547 
1548 private:
1549 	/* Private enums */
1550 	enum QUALIFIERS
1551 	{
1552 		DEFAULT,
1553 		STD140,
1554 		SHARED,
1555 		PACKED,
1556 
1557 		/* */
1558 		QUALIFIERS_MAX,
1559 	};
1560 
1561 	/* Private types */
1562 	struct testCase
1563 	{
1564 		QUALIFIERS			  m_qualifier;
1565 		Utils::Shader::STAGES m_stage;
1566 	};
1567 
1568 	/* Private methods */
1569 	const glw::GLchar* getQualifierName(QUALIFIERS qualifier);
1570 
1571 	/* Private fields */
1572 	std::vector<testCase> m_test_cases;
1573 };
1574 
1575 /** Implementation of test UniformBlockMemberInvalidOffsetAlignment. Description follows:
1576  *
1577  * Test verifies that offset alignment rules are enforced.
1578  *
1579  * Declare uniform block, which contains following member declaration:
1580  *
1581  *     layout(offset = X) type block_member
1582  *
1583  * Shader compilation is expected to fail for any X that is not a multiple of
1584  * the base alignment of type.
1585  * Test all offsets covering locations first and one before last:
1586  *
1587  *     <0, sizeof(type)>
1588  *     <MAX_UNIFORM_BLOCK_SIZE - 2 * sizeof(type),
1589  *         MAX_UNIFORM_BLOCK_SIZE - sizeof(type)>
1590  *
1591  * Test all shader stages. Test all types. Each case should be tested
1592  * separately.
1593  **/
1594 class UniformBlockMemberInvalidOffsetAlignmentTest : public NegativeTestBase
1595 {
1596 public:
1597 	/* Public methods */
1598 	UniformBlockMemberInvalidOffsetAlignmentTest(deqp::Context& context);
1599 
1600 	UniformBlockMemberInvalidOffsetAlignmentTest(deqp::Context& context, const glw::GLchar* name,
1601 												 const glw::GLchar* description);
1602 
~UniformBlockMemberInvalidOffsetAlignmentTest()1603 	virtual ~UniformBlockMemberInvalidOffsetAlignmentTest()
1604 	{
1605 	}
1606 
1607 protected:
1608 	/* Methods to be implemented by child class */
1609 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1610 
1611 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1612 	virtual glw::GLuint getTestCaseNumber();
1613 	virtual glw::GLint  getMaxBlockSize();
1614 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1615 	virtual bool isFailureExpected(glw::GLuint test_case_index);
1616 	virtual bool isStageSupported(Utils::Shader::STAGES stage);
1617 	virtual void testInit();
1618 
1619 protected:
1620 	/* Protected types */
1621 	struct testCase
1622 	{
1623 		glw::GLuint			  m_offset;
1624 		bool				  m_should_fail;
1625 		Utils::Shader::STAGES m_stage;
1626 		Utils::Type			  m_type;
1627 	};
1628 
1629 	/* Protected fields */
1630 	std::vector<testCase> m_test_cases;
1631 };
1632 
1633 /** Implementation of test UniformBlockMemberOverlappingOffsets. Description follows:
1634  *
1635  * Test verifies that block members cannot overlap.
1636  *
1637  * Use following code snippet:
1638  *
1639  *     layout (std140) uniform Block {
1640  *         layout (offset = boy_offset) boy_type boy;
1641  *         layout (offset = man_offset) man_type man;
1642  *     };
1643  *
1644  * It is expected that overlapping members will cause compilation failure.
1645  *
1646  * There are three cases to test:
1647  *
1648  *     - when member is declared with the same offset as already declared
1649  *     member,
1650  *     - when member is declared with offset that lay in the middle of already
1651  *     declared member,
1652  *     - when member is declared with offset just before already declared
1653  *     member and there is not enough space.
1654  *
1655  * Test all shader stages. Test all types. Test cases separately.
1656  *
1657  * Note that not all type combinations let to test all three cases, e.g.
1658  * vec4 and float.
1659  **/
1660 class UniformBlockMemberOverlappingOffsetsTest : public NegativeTestBase
1661 {
1662 public:
1663 	/* Public methods */
1664 	UniformBlockMemberOverlappingOffsetsTest(deqp::Context& context);
1665 
1666 	UniformBlockMemberOverlappingOffsetsTest(deqp::Context& context, const glw::GLchar* name,
1667 											 const glw::GLchar* description);
1668 
~UniformBlockMemberOverlappingOffsetsTest()1669 	virtual ~UniformBlockMemberOverlappingOffsetsTest()
1670 	{
1671 	}
1672 
1673 protected:
1674 	/* Methods to be implemented by child class */
1675 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1676 
1677 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1678 	virtual glw::GLuint getTestCaseNumber();
1679 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1680 	virtual bool isStageSupported(Utils::Shader::STAGES stage);
1681 	virtual void testInit();
1682 
1683 protected:
1684 	/* Protected types */
1685 	struct testCase
1686 	{
1687 		glw::GLuint			  m_boy_offset;
1688 		Utils::Type			  m_boy_type;
1689 		glw::GLuint			  m_man_offset;
1690 		Utils::Type			  m_man_type;
1691 		Utils::Shader::STAGES m_stage;
1692 	};
1693 
1694 	/* Protected methods */
1695 	glw::GLuint gcd(glw::GLuint a, glw::GLuint b);
1696 	glw::GLuint lcm(glw::GLuint a, glw::GLuint b);
1697 
1698 	/* Protected fields */
1699 	std::vector<testCase> m_test_cases;
1700 };
1701 
1702 /** Implementation of test UniformBlockMemberAlignNonPowerOf2. Description follows:
1703  *
1704  * Test verifies that align qualifier must use power of 2.
1705  *
1706  * Test following code snippet:
1707  *
1708  *     layout (std140, offset = 8) uniform Block {
1709  *         vec4 boy;
1710  *         layout (align = man_alignment) type man;
1711  *     };
1712  *
1713  * It is expected that compilation will fail whenever man_alignment is not
1714  * a power of 2.
1715  *
1716  * Test all alignment in range <0, sizeof(dmat4)>. Test all shader stages.
1717  * Test all types.
1718  **/
1719 class UniformBlockMemberAlignNonPowerOf2Test : public NegativeTestBase
1720 {
1721 public:
1722 	/* Public methods */
1723 	UniformBlockMemberAlignNonPowerOf2Test(deqp::Context& context);
1724 
1725 	UniformBlockMemberAlignNonPowerOf2Test(deqp::Context& context, const glw::GLchar* name,
1726 										   const glw::GLchar* description);
1727 
~UniformBlockMemberAlignNonPowerOf2Test()1728 	virtual ~UniformBlockMemberAlignNonPowerOf2Test()
1729 	{
1730 	}
1731 
1732 protected:
1733 	/* Methods to be implemented by child class */
1734 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1735 
1736 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1737 	virtual glw::GLuint getTestCaseNumber();
1738 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1739 	virtual bool isFailureExpected(glw::GLuint test_case_index);
1740 	virtual bool isStageSupported(Utils::Shader::STAGES stage);
1741 	virtual void testInit();
1742 
1743 protected:
1744 	/* Protected types */
1745 	struct testCase
1746 	{
1747 		glw::GLuint			  m_alignment;
1748 		Utils::Type			  m_type;
1749 		bool				  m_should_fail;
1750 		Utils::Shader::STAGES m_stage;
1751 	};
1752 
1753 	/* Protected methods */
1754 	bool isPowerOf2(glw::GLuint val);
1755 
1756 	/* Protected fields */
1757 	std::vector<testCase> m_test_cases;
1758 };
1759 
1760 /** Implementation of test UniformBlockAlignment. Description follows:
1761  *
1762  * UniformBlockAlignment
1763  *
1764  *   Test verifies that align qualifier is applied to block members as specified.
1765  *
1766  *   This test implements Texture algorithm. Test following code snippet:
1767  *
1768  *       struct Data {
1769  *           vec4  vector;
1770  *           float scalar;
1771  *       };
1772  *
1773  *       layout (std140, offset = 8, align = 64) uniform Block {
1774  *                               vec4 first;
1775  *                               Data second;
1776  *                               Data third[2];
1777  *                               vec4 fourth[3];
1778  *           layout (align = 16) vec4 fifth[2];
1779  *                               Data sixth;
1780  *       };
1781  *
1782  *   Verify that all uniforms have correct values. Additionally inspect program
1783  *   to check that all offsets are as expected.
1784  **/
1785 class UniformBlockAlignmentTest : public TextureTestBase
1786 {
1787 public:
1788 	/* Public methods */
1789 	UniformBlockAlignmentTest(deqp::Context& context);
1790 
~UniformBlockAlignmentTest()1791 	virtual ~UniformBlockAlignmentTest()
1792 	{
1793 	}
1794 
1795 protected:
1796 	/* Protected methods */
1797 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1798 									 Utils::VaryingPassthrough& varying_passthrough);
1799 
1800 private:
1801 	std::vector<glw::GLubyte> m_data;
1802 };
1803 
1804 /** Implementation of test SSBMemberOffsetAndAlign. Description follows:
1805  *
1806  * Test verifies that:
1807  *     - offset and align qualifiers are respected for shader storage block
1808  *     members,
1809  *     - align qualifier is ignored if value is too small,
1810  *     - align qualifier accepts values bigger than size of base type,
1811  *     - manual and automatic offsets and alignments can be mixed.
1812  *
1813  * Modify UniformBlockMemberOffsetAndAlign to test shader storage block instead
1814  * of uniform block.
1815  **/
1816 class SSBMemberOffsetAndAlignTest : public TextureTestBase
1817 {
1818 public:
1819 	/* Public methods */
1820 	SSBMemberOffsetAndAlignTest(deqp::Context& context);
~SSBMemberOffsetAndAlignTest()1821 	virtual ~SSBMemberOffsetAndAlignTest()
1822 	{
1823 	}
1824 
1825 protected:
1826 	/* Protected methods */
1827 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1828 									 Utils::VaryingPassthrough& varying_passthrough);
1829 
1830 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1831 	virtual glw::GLuint getTestCaseNumber();
1832 
1833 	virtual std::string getVerificationSnippet(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1834 											   Utils::Shader::STAGES stage);
1835 
1836 	virtual bool isDrawRelevant(glw::GLuint test_case_index);
1837 
1838 private:
1839 	std::vector<glw::GLubyte> m_data;
1840 };
1841 
1842 /** Implementation of test SSBLayoutQualifierConflict. Description follows:
1843  *
1844  * Test verifies that offset and align can only be used on members of blocks
1845  * declared as std140 or std430.
1846  *
1847  * Modify UniformBlockMemberOffsetAndAlign to test shader storage block instead
1848  * of uniform block.
1849  *
1850  * Qualifier std430 is allowed for shader storage blocks, it should be included
1851  * in test. It is expected that std430 case will build successfully.
1852  **/
1853 class SSBLayoutQualifierConflictTest : public NegativeTestBase
1854 {
1855 public:
1856 	/* Public methods */
1857 	SSBLayoutQualifierConflictTest(deqp::Context& context);
1858 
~SSBLayoutQualifierConflictTest()1859 	virtual ~SSBLayoutQualifierConflictTest()
1860 	{
1861 	}
1862 
1863 protected:
1864 	/* Methods to be implemented by child class */
1865 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1866 
1867 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
1868 	virtual glw::GLuint getTestCaseNumber();
1869 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
1870 	virtual bool isFailureExpected(glw::GLuint test_case_index);
1871 	virtual void testInit();
1872 
1873 private:
1874 	/* Private enums */
1875 	enum QUALIFIERS
1876 	{
1877 		DEFAULT,
1878 		STD140,
1879 		STD430,
1880 		SHARED,
1881 		PACKED,
1882 
1883 		/* */
1884 		QUALIFIERS_MAX,
1885 	};
1886 
1887 	/* Private types */
1888 	struct testCase
1889 	{
1890 		QUALIFIERS			  m_qualifier;
1891 		Utils::Shader::STAGES m_stage;
1892 	};
1893 
1894 	/* Private methods */
1895 	const glw::GLchar* getQualifierName(QUALIFIERS qualifier);
1896 	bool isStageSupported(Utils::Shader::STAGES stage);
1897 
1898 	/* Private fields */
1899 	std::vector<testCase> m_test_cases;
1900 };
1901 
1902 /** Implementation of test SSBMemberInvalidOffsetAlignment. Description follows:
1903  *
1904  * Test verifies that offset alignment rules are enforced.
1905  *
1906  * Modify UniformBlockMemberInvalidOffsetAlignment to test shader
1907  * storage block against MAX_SHADER_STORAGE_BLOCK_SIZE instead of
1908  * uniform block
1909  **/
1910 class SSBMemberInvalidOffsetAlignmentTest : public UniformBlockMemberInvalidOffsetAlignmentTest
1911 {
1912 public:
1913 	/* Public methods */
1914 	SSBMemberInvalidOffsetAlignmentTest(deqp::Context& context);
1915 
~SSBMemberInvalidOffsetAlignmentTest()1916 	virtual ~SSBMemberInvalidOffsetAlignmentTest()
1917 	{
1918 	}
1919 
1920 protected:
1921 	/* Methods to be implemented by child class */
1922 	virtual glw::GLint  getMaxBlockSize();
1923 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1924 
1925 	virtual bool isStageSupported(Utils::Shader::STAGES stage);
1926 };
1927 
1928 /** Implementation of test SSBMemberOverlappingOffsets. Description follows:
1929  *
1930  * Test verifies that block members cannot overlap.
1931  *
1932  * Modify UniformBlockMemberOverlappingOffsets to test shader storage block
1933  * instead of uniform block.
1934  **/
1935 class SSBMemberOverlappingOffsetsTest : public UniformBlockMemberOverlappingOffsetsTest
1936 {
1937 public:
1938 	/* Public methods */
1939 	SSBMemberOverlappingOffsetsTest(deqp::Context& context);
~SSBMemberOverlappingOffsetsTest()1940 	virtual ~SSBMemberOverlappingOffsetsTest()
1941 	{
1942 	}
1943 
1944 protected:
1945 	/* Methods to be implemented by child class */
1946 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1947 
1948 	virtual bool isStageSupported(Utils::Shader::STAGES stage);
1949 };
1950 
1951 /** Implementation of test SSBMemberAlignNonPowerOf2. Description follows:
1952  *
1953  * Test verifies that align qualifier must use power of 2.
1954  *
1955  * Modify UniformBlockMemberAlignNonPowerOf2 to test shader storage block
1956  * instead of uniform block.
1957  **/
1958 class SSBMemberAlignNonPowerOf2Test : public UniformBlockMemberAlignNonPowerOf2Test
1959 {
1960 public:
1961 	/* Public methods */
1962 	SSBMemberAlignNonPowerOf2Test(deqp::Context& context);
1963 
~SSBMemberAlignNonPowerOf2Test()1964 	virtual ~SSBMemberAlignNonPowerOf2Test()
1965 	{
1966 	}
1967 
1968 protected:
1969 	/* Methods to be implemented by child class */
1970 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
1971 
1972 	virtual bool isStageSupported(Utils::Shader::STAGES stage);
1973 };
1974 
1975 /** Implementation of test SSBAlignment. Description follows:
1976  *
1977  * Test verifies that align qualifier is applied to block members as specified.
1978  *
1979  * Modify UniformBlockAlignment to test shader storage block instead
1980  * of uniform block.
1981  **/
1982 class SSBAlignmentTest : public TextureTestBase
1983 {
1984 public:
1985 	/* Public methods */
1986 	SSBAlignmentTest(deqp::Context& context);
1987 
~SSBAlignmentTest()1988 	virtual ~SSBAlignmentTest()
1989 	{
1990 	}
1991 
1992 protected:
1993 	/* Protected methods */
1994 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
1995 									 Utils::VaryingPassthrough& varying_passthrough);
1996 
1997 	virtual bool isDrawRelevant(glw::GLuint test_case_index);
1998 
1999 private:
2000 	std::vector<glw::GLubyte> m_data;
2001 };
2002 
2003 /** Implementation of test VaryingLocations. Description follows:
2004  *
2005  * Test verifies that "varying" locations are assigned as declared in shader.
2006  *
2007  * This test implements Texture algorithm. Use separate shader objects instead
2008  * of monolithic program. Test following code snippet:
2009  *
2010  *     layout(location = 0)           in  type input_at_first_location;
2011  *     layout(location = last_input)  in  type input_at_last_location;
2012  *     layout(location = 1)           out type output_at_first_location;
2013  *     layout(location = last_output) out type output_at_last_location;
2014  *
2015  *     output_at_first_location = input_at_first_location;
2016  *     output_at_last_location  = input_at_last_location;
2017  *
2018  *     if ( (EXPECTED_VALUE == input_at_first_location) &&
2019  *          (EXPECTED_VALUE == input_at_last_location)  )
2020  *     {
2021  *         result = 1;
2022  *     }
2023  *
2024  * Additionally inspect program to check that all locations are as expected.
2025  *
2026  * Test all types. Test all shader stages.
2027  **/
2028 class VaryingLocationsTest : public TextureTestBase
2029 {
2030 public:
2031 	VaryingLocationsTest(deqp::Context& context);
2032 
2033 	VaryingLocationsTest(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
2034 
~VaryingLocationsTest()2035 	~VaryingLocationsTest()
2036 	{
2037 	}
2038 
2039 protected:
2040 	/* Protected methods */
2041 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2042 									 Utils::VaryingPassthrough& varying_passthrough);
2043 
2044 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2045 	virtual glw::GLuint getTestCaseNumber();
2046 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2047 	virtual bool useMonolithicProgram(glw::GLuint test_case_index);
2048 
2049 	/* To be implemented by children */
2050 	virtual void prepareShaderStage(Utils::Shader::STAGES stage, const Utils::Type& type,
2051 									Utils::ProgramInterface&   program_interface,
2052 									Utils::VaryingPassthrough& varying_passthrough);
2053 
2054 	/* Protected methods */
2055 	std::string prepareGlobals(glw::GLint last_in_loc, glw::GLint last_out_loc);
2056 
2057 	/* Protected fields */
2058 	std::vector<glw::GLubyte> m_first_data;
2059 	std::vector<glw::GLubyte> m_last_data;
2060 };
2061 
2062 /** Implementation of test VertexAttribLocations. Description follows:
2063  *
2064  * Test verifies that drawing operations provide vertex attributes at expected
2065  * locations.
2066  *
2067  * This test implements Texture algorithm. Use separate shader objects instead
2068  * of monolithic program. Tessellation stages are not necessary and can be
2069  * omitted. Test following code snippet:
2070  *
2071  *     layout (location = 2) in uint vertex_index;
2072  *     layout (location = 5) in uint instance_index;
2073  *
2074  *     if ( (gl_VertexID   == vertex_index)   &&
2075  *          (gl_InstanceID == instance_index) )
2076  *     {
2077  *         result = 1;
2078  *     }
2079  *
2080  * Test following Draw* operations:
2081  *     - DrawArrays,
2082  *     - DrawArraysInstanced,
2083  *     - DrawElements,
2084  *     - DrawElementsBaseVertex,
2085  *     - DrawElementsInstanced,
2086  *     - DrawElementsInstancedBaseInstance,
2087  *     - DrawElementsInstancedBaseVertex,
2088  *     - DrawElementsInstancedBaseVertexBaseInstance.
2089  *
2090  * Number of drawn instances should be equal 4. base_vertex parameter should be
2091  * set to 4. base_instance should be set to 2.
2092  *
2093  * Values provided for "vertex_index" should match index of vertex. Values
2094  * provided for "instance_index" should match index of instance
2095  * (use VertexAttribDivisor).
2096  **/
2097 class VertexAttribLocationsTest : public TextureTestBase
2098 {
2099 public:
2100 	VertexAttribLocationsTest(deqp::Context& context);
2101 
~VertexAttribLocationsTest()2102 	~VertexAttribLocationsTest()
2103 	{
2104 	}
2105 
2106 protected:
2107 	/* Protected methods */
2108 	virtual void executeDrawCall(glw::GLuint test_case_index);
2109 
2110 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2111 									 Utils::VaryingPassthrough& varying_passthrough);
2112 
2113 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2114 	virtual glw::GLuint getTestCaseNumber();
2115 
2116 	virtual std::string getVerificationSnippet(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2117 											   Utils::Shader::STAGES stage);
2118 
2119 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2120 
2121 	virtual void prepareAttributes(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2122 								   Utils::Buffer& buffer, Utils::VertexArray& vao);
2123 
2124 	virtual bool useMonolithicProgram(glw::GLuint test_case_index);
2125 
2126 private:
2127 	/* Private enums */
2128 	enum TESTCASES
2129 	{
2130 		DRAWARRAYS,
2131 		DRAWARRAYSINSTANCED,
2132 		DRAWELEMENTS,
2133 		DRAWELEMENTSBASEVERTEX,
2134 		DRAWELEMENTSINSTANCED,
2135 		DRAWELEMENTSINSTANCEDBASEINSTANCE,
2136 		DRAWELEMENTSINSTANCEDBASEVERTEX,
2137 		DRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCE,
2138 
2139 		/* */
2140 		TESTCASES_MAX
2141 	};
2142 
2143 	/* Private constants */
2144 	static const glw::GLuint m_base_vertex;
2145 	static const glw::GLuint m_base_instance;
2146 	static const glw::GLuint m_loc_vertex;
2147 	static const glw::GLuint m_loc_instance;
2148 	static const glw::GLuint m_n_instances;
2149 };
2150 
2151 /** Implementation of test VaryingArrayLocations. Description follows:
2152  *
2153  * VaryingArrayLocations
2154  *
2155  *   Test verifies that locations of arrays of "varying" are assigned as declared
2156  *   in shader.
2157  *
2158  *   This test implements Texture algorithm. Use separate shader objects instead
2159  *   of monolithic program. Test following code snippet:
2160  *
2161  *       layout(location = 0)           in  type in_at_first_loc[FIRST_LENGTH];
2162  *       layout(location = last_input)  in  type in_at_last_loc[LAST_LENGTH];
2163  *       layout(location = 1)           out type out_at_first_loc[FIRST_LENGTH];
2164  *       layout(location = last_output) out type out_at_last_loc[LAST_LENGTH];
2165  *
2166  *       for (uint i = 0u; i < in_at_first_loc.length(); ++i)
2167  *       {
2168  *           out_at_first_loc[i] = in_at_first_loc[i];
2169  *
2170  *           if (EXPECTED_VALUE[i] != in_at_first_loc[i])
2171  *           {
2172  *               result = 0;
2173  *           }
2174  *       }
2175  *
2176  *       for (uint i = 0u; i < in_at_last_loc.length(); ++i)
2177  *       {
2178  *           out_at_last_loc[i] = in_at_last_loc[i];
2179  *
2180  *           if (EXPECTED_VALUE[i] != in_at_last_loc[i])
2181  *           {
2182  *               result = 0;
2183  *           }
2184  *       }
2185  *
2186  *   FIRST_LENGTH and LAST_LENGTH values should be selected so as not to exceed
2187  *   limits.
2188  *
2189  *   Additionally inspect program to check that all locations are as expected.
2190  *
2191  *   Test all types. Test all shader stages.
2192  **/
2193 class VaryingArrayLocationsTest : public VaryingLocationsTest
2194 {
2195 public:
2196 	VaryingArrayLocationsTest(deqp::Context& context);
2197 
~VaryingArrayLocationsTest()2198 	~VaryingArrayLocationsTest()
2199 	{
2200 	}
2201 
2202 protected:
2203 	/* Protected methods */
2204 	virtual void prepareShaderStage(Utils::Shader::STAGES stage, const Utils::Type& type,
2205 									Utils::ProgramInterface&   program_interface,
2206 									Utils::VaryingPassthrough& varying_passthrough);
2207 };
2208 
2209 /** Implementation of test VaryingStructureLocations. Description follows:
2210  *
2211  * Test verifies that structures locations are as expected.
2212  *
2213  * This test implements Texture algorithm. Use separate shader objects instead
2214  * of monolithic program. Test following code snippet:
2215  *
2216  *     struct Data
2217  *     {
2218  *         type single;
2219  *         type array[ARRAY_LENGTH];
2220  *     };
2221  *
2222  *     layout (location = INPUT_LOCATION)  in  Data input[VARYING_LENGTH];
2223  *     layout (location = OUTPUT_LOCATION) out Data output[VARYING_LENGTH];
2224  *
2225  *     if ( (EXPECTED_VALUE == input[0].single)         &&
2226  *          (EXPECTED_VALUE == input[0].array[0])       &&
2227  *          (EXPECTED_VALUE == input[0].array[last])    &&
2228  *          (EXPECTED_VALUE == input[last].single)      &&
2229  *          (EXPECTED_VALUE == input[last].array[0])    &&
2230  *          (EXPECTED_VALUE == input[last].array[last]) )
2231  *     {
2232  *         result = 1;
2233  *     }
2234  *
2235  *     output[0].single         = input[0].single;
2236  *     output[0].array[0]       = input[0].array[0];
2237  *     output[0].array[last]    = input[0].array[last];
2238  *     output[last].single      = input[last].single;
2239  *     output[last].array[0]    = input[last].array[0];
2240  *     output[last].array[last] = input[last].array[last];
2241  *
2242  * Select array lengths and locations so as no limits are exceeded.
2243  **/
2244 
2245 class VaryingStructureLocationsTest : public TextureTestBase
2246 {
2247 public:
2248 	VaryingStructureLocationsTest(deqp::Context& context);
2249 
~VaryingStructureLocationsTest()2250 	~VaryingStructureLocationsTest()
2251 	{
2252 	}
2253 
2254 protected:
2255 	/* Protected methods */
2256 	virtual std::string getPassSnippet(glw::GLuint test_case_index, Utils::VaryingPassthrough& varying_passthrough,
2257 									   Utils::Shader::STAGES stage);
2258 
2259 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2260 									 Utils::VaryingPassthrough& varying_passthrough);
2261 
2262 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2263 	virtual glw::GLuint getTestCaseNumber();
2264 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2265 	virtual bool useMonolithicProgram(glw::GLuint test_case_index);
2266 
2267 	/* Protected fields */
2268 	std::vector<glw::GLubyte> m_single_data;
2269 	std::vector<glw::GLubyte> m_array_data;
2270 	std::vector<glw::GLubyte> m_data;
2271 };
2272 
2273 /** Implementation of test VaryingStructureMemberLocation. Description follows:
2274  *
2275  * Test verifies that it is not allowed to declare structure member at specific
2276  * location.
2277  *
2278  * Test following code snippet:
2279  *
2280  *     struct Data
2281  *     {
2282  *         vec4 gohan;
2283  *         layout (location = LOCATION) vec4 goten;
2284  *     }
2285  *
2286  *     in Data goku;
2287  *
2288  * Select LOCATION so as not to exceed limits. Test all shader stages. Test
2289  * both in and out varyings.
2290  *
2291  * It is expected that compilation will fail.
2292  **/
2293 class VaryingStructureMemberLocationTest : public NegativeTestBase
2294 {
2295 public:
2296 	VaryingStructureMemberLocationTest(deqp::Context& context);
2297 
~VaryingStructureMemberLocationTest()2298 	~VaryingStructureMemberLocationTest()
2299 	{
2300 	}
2301 
2302 protected:
2303 	/* Methods to be implemented by child class */
2304 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2305 
2306 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2307 	virtual glw::GLuint getTestCaseNumber();
2308 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2309 	virtual void testInit();
2310 
2311 private:
2312 	/* Private types */
2313 	struct testCase
2314 	{
2315 		bool				  m_is_input;
2316 		Utils::Shader::STAGES m_stage;
2317 	};
2318 
2319 	/* Private fields */
2320 	std::vector<testCase> m_test_cases;
2321 };
2322 
2323 /** Implementation of test VaryingBlockLocations. Description follows:
2324  *
2325  * Test verifies that "block varyings" locations are as expected.
2326  *
2327  * This test implements Texture algorithm. Use separate shader objects instead
2328  * of monolithic program. Test following code snippet:
2329  *
2330  *     layout (location = GOKU_LOCATION) in Goku
2331  *     {
2332  *                                            vec4 gohan;
2333  *         layout (location = GOTEN_LOCATION) vec4 goten;
2334  *                                            vec4 chichi;
2335  *     };
2336  *
2337  *     layout (location = VEGETA_LOCATION) out Vegeta
2338  *     {
2339  *                                          vec4 trunks;
2340  *         layout (location = BRA_LOCATION) vec4 bra;
2341  *                                          vec4 bulma;
2342  *     };
2343  *
2344  *     if ( (EXPECTED_VALUE == gohan) &&
2345  *          (EXPECTED_VALUE == goten) &&
2346  *          (EXPECTED_VALUE == chichi) )
2347  *     {
2348  *         result = 1;
2349  *     }
2350  *
2351  *     trunks = gohan;
2352  *     bra    = goten;
2353  *     bulma  = chichi;
2354  *
2355  * Select all locations so as not to cause any conflicts or exceed limits.
2356  **/
2357 class VaryingBlockLocationsTest : public TextureTestBase
2358 {
2359 public:
2360 	VaryingBlockLocationsTest(deqp::Context& context);
~VaryingBlockLocationsTest()2361 	~VaryingBlockLocationsTest()
2362 	{
2363 	}
2364 
2365 protected:
2366 	/* Protected methods */
2367 	virtual std::string getPassSnippet(glw::GLuint test_case_index, Utils::VaryingPassthrough& varying_passthrough,
2368 									   Utils::Shader::STAGES stage);
2369 
2370 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2371 									 Utils::VaryingPassthrough& varying_passthrough);
2372 
2373 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2374 	virtual bool useMonolithicProgram(glw::GLuint test_case_index);
2375 
2376 	/* Protected fields */
2377 	std::vector<glw::GLubyte> m_third_data;
2378 	std::vector<glw::GLubyte> m_fourth_data;
2379 	std::vector<glw::GLubyte> m_fifth_data;
2380 	std::vector<glw::GLubyte> m_data;
2381 };
2382 
2383 /** Implementation of test VaryingBlockMemberLocations. Description follows:
2384  *
2385  * Test verifies that it is a compilation error to declare some of block
2386  * members with location qualifier, but not all, when there is no "block level"
2387  * location qualifier.
2388  *
2389  * Test following code snippets:
2390  *
2391  *     in Goku
2392  *     {
2393  *         vec4 gohan;
2394  *         layout (location = GOTEN_LOCATION) vec4 goten;
2395  *         vec4 chichi;
2396  *     };
2397  *
2398  * ,
2399  *
2400  *     in Goku
2401  *     {
2402  *         layout (location = GOHAN_LOCATION)  vec4 gohan;
2403  *         layout (location = GOTEN_LOCATION)  vec4 goten;
2404  *         layout (location = CHICHI_LOCATION) vec4 chichi;
2405  *     };
2406  *
2407  * Select all locations so as not to exceed any limits.
2408  *
2409  * It is expected that compilation of first snippet will fail. Compilation of
2410  * second snippet should be successful.
2411  *
2412  * Test all shader stages. Test both in and out blocks.
2413  **/
2414 class VaryingBlockMemberLocationsTest : public NegativeTestBase
2415 {
2416 public:
2417 	/* Public methods */
2418 	VaryingBlockMemberLocationsTest(deqp::Context& context);
2419 
~VaryingBlockMemberLocationsTest()2420 	virtual ~VaryingBlockMemberLocationsTest()
2421 	{
2422 	}
2423 
2424 protected:
2425 	/* Methods to be implemented by child class */
2426 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2427 
2428 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2429 	virtual glw::GLuint getTestCaseNumber();
2430 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2431 	virtual bool isFailureExpected(glw::GLuint test_case_index);
2432 	virtual void testInit();
2433 
2434 private:
2435 	/* Private types */
2436 	struct testCase
2437 	{
2438 		bool				  m_is_input;
2439 		bool				  m_qualify_all;
2440 		Utils::Shader::STAGES m_stage;
2441 	};
2442 
2443 	/* Private fields */
2444 	std::vector<testCase> m_test_cases;
2445 };
2446 
2447 /** Implementation of test VaryingBlockAutomaticMemberLocations. Description follows:
2448  *
2449  * Test verifies that compiler will assign subsequent locations to block
2450  * members.
2451  *
2452  * Test following code snippet:
2453  *
2454  *     layout (location = 2) in DBZ
2455  *     {
2456  *         vec4 goku;                         // 2
2457  *         vec4 gohan[GOHAN_LENGTH];          // 3
2458  *         vec4 goten;                        // 3 + GOHAN_LENGTH
2459  *         layout (location = 1) vec4 chichi; // 1
2460  *         vec4 pan;                          // 2; ERROR location 2 used twice
2461  *     };
2462  *
2463  * Test all shader stages. Test both in and out blocks.
2464  *
2465  * It is expected that build process will fail.
2466  **/
2467 class VaryingBlockAutomaticMemberLocationsTest : public NegativeTestBase
2468 {
2469 public:
2470 	/* Public methods */
2471 	VaryingBlockAutomaticMemberLocationsTest(deqp::Context& context);
2472 
~VaryingBlockAutomaticMemberLocationsTest()2473 	virtual ~VaryingBlockAutomaticMemberLocationsTest()
2474 	{
2475 	}
2476 
2477 protected:
2478 	/* Methods to be implemented by child class */
2479 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2480 
2481 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2482 	virtual glw::GLuint getTestCaseNumber();
2483 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2484 	virtual void testInit();
2485 
2486 private:
2487 	/* Private types */
2488 	struct testCase
2489 	{
2490 		bool				  m_is_input;
2491 		Utils::Shader::STAGES m_stage;
2492 	};
2493 
2494 	/* Private fields */
2495 	std::vector<testCase> m_test_cases;
2496 };
2497 
2498 /** Implementation of test VaryingLocationLimit. Description follows:
2499  *
2500  * Test verifies that "location" qualifier cannot exceed limits.
2501  *
2502  * Test following code snippet:
2503  *
2504  *     layout (location = LAST + 1) in type goku;
2505  *
2506  * LAST should be set to index of last available location.
2507  *
2508  * Test all types. Test all shader stages. Test both in and out varyings.
2509  *
2510  * It is expected that shader compilation will fail.
2511  **/
2512 class VaryingLocationLimitTest : public NegativeTestBase
2513 {
2514 public:
2515 	/* Public methods */
2516 	VaryingLocationLimitTest(deqp::Context& context);
2517 
~VaryingLocationLimitTest()2518 	virtual ~VaryingLocationLimitTest()
2519 	{
2520 	}
2521 
2522 protected:
2523 	/* Methods to be implemented by child class */
2524 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2525 
2526 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2527 	virtual glw::GLuint getTestCaseNumber();
2528 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2529 	virtual void testInit();
2530 
2531 private:
2532 	/* Private types */
2533 	struct testCase
2534 	{
2535 		bool				  m_is_input;
2536 		Utils::Type			  m_type;
2537 		Utils::Shader::STAGES m_stage;
2538 	};
2539 
2540 	/* Private fields */
2541 	std::vector<testCase> m_test_cases;
2542 };
2543 
2544 /** Implementation of test VaryingComponents. Description follows:
2545  *
2546  * VaryingComponents
2547  *
2548  *   Test verifies that "varying" can be assigned to specific components.
2549  *
2550  *   Modify VaryingLocations to test all possible combinations of components
2551  *   layout:
2552  *       - gvec4
2553  *       - scalar, gvec3
2554  *       - gvec3, scalar
2555  *       - gvec2, gvec2
2556  *       - gvec2, scalar, scalar
2557  *       - scalar, gvec2, scalar
2558  *       - scalar, scalar, gvec2
2559  *       - scalar, scalar, scalar, scalar.
2560  *
2561  *   Additionally inspect program to check that all locations and components are
2562  *   as expected.
2563  **/
2564 class VaryingComponentsTest : public VaryingLocationsTest
2565 {
2566 public:
2567 	VaryingComponentsTest(deqp::Context& context);
2568 
2569 	VaryingComponentsTest(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description);
2570 
~VaryingComponentsTest()2571 	~VaryingComponentsTest()
2572 	{
2573 	}
2574 
2575 protected:
2576 	/* Protected methods */
2577 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
2578 									 Utils::VaryingPassthrough& varying_passthrough);
2579 
2580 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2581 	virtual glw::GLuint getTestCaseNumber();
2582 	virtual void		testInit();
2583 	virtual bool useComponentQualifier(glw::GLuint test_case_index);
2584 
2585 	/* To be implemented by children */
2586 	virtual glw::GLuint getArrayLength();
2587 
2588 private:
2589 	/* Private enums */
2590 	enum COMPONENTS_LAYOUT
2591 	{
2592 		GVEC4,
2593 		SCALAR_GVEC3,
2594 		GVEC3_SCALAR,
2595 		GVEC2_GVEC2,
2596 		GVEC2_SCALAR_SCALAR,
2597 		SCALAR_GVEC2_SCALAR,
2598 		SCALAR_SCALAR_GVEC2,
2599 		SCALAR_SCALAR_SCALAR_SCALAR,
2600 	};
2601 
2602 	/* Private struct */
2603 	struct descriptor
2604 	{
2605 		void assign(glw::GLint component, const glw::GLchar* component_str, glw::GLint location,
2606 					const glw::GLchar* location_str, glw::GLuint n_rows, const glw::GLchar* name);
2607 
2608 		glw::GLint		   m_component;
2609 		const glw::GLchar* m_component_str;
2610 		glw::GLint		   m_location;
2611 		const glw::GLchar* m_location_str;
2612 		glw::GLuint		   m_n_rows;
2613 		const glw::GLchar* m_name;
2614 	};
2615 
2616 	struct testCase
2617 	{
2618 		testCase(COMPONENTS_LAYOUT layout, Utils::Type::TYPES type);
2619 
2620 		COMPONENTS_LAYOUT  m_layout;
2621 		Utils::Type::TYPES m_type;
2622 	};
2623 
2624 	/* Private routines */
2625 	std::string prepareGlobals(glw::GLuint last_in_location, glw::GLuint last_out_location);
2626 
2627 	std::string prepareName(const glw::GLchar* name, glw::GLint location, glw::GLint component,
2628 							Utils::Shader::STAGES stage, Utils::Variable::STORAGE storage);
2629 
2630 	std::string prepareQualifiers(const glw::GLchar* location, const glw::GLchar* component,
2631 								  const glw::GLchar* interpolation);
2632 
2633 	using VaryingLocationsTest::prepareShaderStage;
2634 
2635 	void prepareShaderStage(Utils::Shader::STAGES stage, const Utils::Type& vector_type,
2636 							Utils::ProgramInterface& program_interface, const testCase& test_case,
2637 							Utils::VaryingPassthrough& varying_passthrough);
2638 
2639 	Utils::Variable* prepareVarying(const Utils::Type& basic_type, const descriptor& desc,
2640 									const glw::GLchar* interpolation, Utils::ShaderInterface& si,
2641 									Utils::Shader::STAGES stage, Utils::Variable::STORAGE storage);
2642 
2643 	/* Private fields */
2644 	std::vector<testCase>	 m_test_cases;
2645 	std::vector<glw::GLubyte> m_data;
2646 };
2647 
2648 /** Implementation of test VaryingArrayComponents. Description follows:
2649  *
2650  * Test verifies that arrays of "varyings" can be assigned to specific
2651  * components.
2652  *
2653  * Modify VaryingComponents similarly to VaryingArrayLocations.
2654  **/
2655 class VaryingArrayComponentsTest : public VaryingComponentsTest
2656 {
2657 public:
2658 	VaryingArrayComponentsTest(deqp::Context& context);
2659 
~VaryingArrayComponentsTest()2660 	~VaryingArrayComponentsTest()
2661 	{
2662 	}
2663 
2664 protected:
2665 	/* Protected methods */
2666 	virtual glw::GLuint getArrayLength();
2667 };
2668 
2669 /** Implementation of test VaryingExceedingComponents. Description follows:
2670  *
2671  * Test verifies that it is not allowed to exceed components.
2672  *
2673  * Test following code snippets:
2674  *
2675  *     layout (location = 1, component = COMPONENT) in type gohan;
2676  *
2677  * and
2678  *
2679  *     layout (location = 1, component = COMPONENT) in type gohan[LENGTH];
2680  *
2681  * Select COMPONENT so as to exceed space available at location, eg. 2 for
2682  * vec4. Select array length so as to not exceed limits of available locations.
2683  *
2684  * Test all types. Test all shader stages. Test both in and out varyings.
2685  *
2686  * It is expected that build process will fail.
2687  **/
2688 class VaryingExceedingComponentsTest : public NegativeTestBase
2689 {
2690 public:
2691 	/* Public methods */
2692 	VaryingExceedingComponentsTest(deqp::Context& context);
2693 
~VaryingExceedingComponentsTest()2694 	virtual ~VaryingExceedingComponentsTest()
2695 	{
2696 	}
2697 
2698 protected:
2699 	/* Methods to be implemented by child class */
2700 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2701 
2702 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2703 	virtual glw::GLuint getTestCaseNumber();
2704 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2705 	virtual void testInit();
2706 
2707 private:
2708 	/* Private types */
2709 	struct testCase
2710 	{
2711 		glw::GLuint			  m_component;
2712 		bool				  m_is_input;
2713 		bool				  m_is_array;
2714 		Utils::Shader::STAGES m_stage;
2715 		Utils::Type			  m_type;
2716 	};
2717 
2718 	/* Private fields */
2719 	std::vector<testCase> m_test_cases;
2720 };
2721 
2722 /** Implementation of test VaryingComponentWithoutLocation. Description follows:
2723  *
2724  * Test verifies that "component" qualifier cannot be used without "location"
2725  * qualifier.
2726  *
2727  * Test following code snippet:
2728  *
2729  *     layout (component = COMPONENT) in type goku;
2730  *
2731  * Test all types. Test all valid COMPONENT values. Test all shader stages.
2732  * Test both in and out varyings.
2733  *
2734  * It is expected that shader compilation will fail.
2735  **/
2736 class VaryingComponentWithoutLocationTest : public NegativeTestBase
2737 {
2738 public:
2739 	/* Public methods */
2740 	VaryingComponentWithoutLocationTest(deqp::Context& context);
2741 
~VaryingComponentWithoutLocationTest()2742 	virtual ~VaryingComponentWithoutLocationTest()
2743 	{
2744 	}
2745 
2746 protected:
2747 	/* Methods to be implemented by child class */
2748 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2749 
2750 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2751 	virtual glw::GLuint getTestCaseNumber();
2752 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2753 	virtual void testInit();
2754 
2755 private:
2756 	/* Private types */
2757 	struct testCase
2758 	{
2759 		glw::GLuint			  m_component;
2760 		bool				  m_is_input;
2761 		Utils::Shader::STAGES m_stage;
2762 		Utils::Type			  m_type;
2763 	};
2764 
2765 	/* Private fields */
2766 	std::vector<testCase> m_test_cases;
2767 };
2768 
2769 /** Implementation of test VaryingComponentOfInvalidType. Description follows:
2770  *
2771  * Test verifies that it is not allowed to declare matrix, struct, block and
2772  * array of those at specific component.
2773  *
2774  * Test following code snippets:
2775  *
2776  *     layout (location = 0, component = COMPONENT) in matrix_type varying;
2777  *
2778  * ,
2779  *
2780  *     layout (location = 0, component = COMPONENT)
2781  *         in matrix_type varying[LENGTH];
2782  *
2783  * ,
2784  *
2785  *     layout (location = 0, component = COMPONENT) in Block
2786  *     {
2787  *         type member;
2788  *     };
2789  *
2790  * ,
2791  *
2792  *     layout (location = 0, component = COMPONENT) in Block
2793  *     {
2794  *         type member;
2795  *     } block[LENGTH];
2796  *
2797  * ,
2798  *
2799  *     struct Data
2800  *     {
2801  *         type member;
2802  *     };
2803  *
2804  *     layout (location = 0, component = COMPONENT) in Data varying;
2805  *
2806  * and
2807  *
2808  *     struct Data
2809  *     {
2810  *         type member;
2811  *     };
2812  *
2813  *     layout (location = 0, component = COMPONENT) in Data varying[LENGTH];
2814  *
2815  * Test all types. Test all shader stages. Test both in and out varyings.
2816  *
2817  * It is expected that build process will fail.
2818  **/
2819 class VaryingComponentOfInvalidTypeTest : public NegativeTestBase
2820 {
2821 public:
2822 	/* Public methods */
2823 	VaryingComponentOfInvalidTypeTest(deqp::Context& context);
2824 
~VaryingComponentOfInvalidTypeTest()2825 	virtual ~VaryingComponentOfInvalidTypeTest()
2826 	{
2827 	}
2828 
2829 protected:
2830 	/* Methods to be implemented by child class */
2831 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2832 
2833 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2834 	virtual glw::GLuint getTestCaseNumber();
2835 
2836 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2837 	virtual void testInit();
2838 
2839 private:
2840 	/* Private enums */
2841 	enum CASES
2842 	{
2843 		MATRIX = 0,
2844 		BLOCK,
2845 		STRUCT,
2846 
2847 		/* */
2848 		MAX_CASES
2849 	};
2850 
2851 	/* Private types */
2852 	struct testCase
2853 	{
2854 		CASES				  m_case;
2855 		glw::GLuint			  m_component;
2856 		bool				  m_is_array;
2857 		bool				  m_is_input;
2858 		Utils::Shader::STAGES m_stage;
2859 		Utils::Type			  m_type;
2860 	};
2861 
2862 	/* Private fields */
2863 	std::vector<testCase> m_test_cases;
2864 };
2865 
2866 /** Implementation of test InputComponentAliasing. Description follows:
2867  *
2868  * Test verifies that component aliasing cause compilation or linking error.
2869  *
2870  * Test following code snippet:
2871  *
2872  *     layout (location = 1, component = GOHAN_COMPONENT) in type gohan;
2873  *     layout (location = 1, component = GOTEN_COMPONENT) in type goten;
2874  *
2875  *     if (EXPECTED_VALUE == gohan)
2876  *     {
2877  *         result = 1;
2878  *     }
2879  *
2880  * Test all components combinations that cause aliasing. Test all types. Test
2881  * all shader stages. It is expected that build process will fail.
2882  *
2883  * Vertex shader allows component aliasing on input as long as only one of the
2884  * attributes is used in each execution path. Test vertex shader stage with two
2885  * variants:
2886  *     - first as presented above,
2887  *     - second, where "result = 1;" is replaced with "result = goten;".
2888  * In first case build process should succeed, in the second case build process
2889  * should fail.
2890  **/
2891 class InputComponentAliasingTest : public NegativeTestBase
2892 {
2893 public:
2894 	/* Public methods */
2895 	InputComponentAliasingTest(deqp::Context& context);
2896 
~InputComponentAliasingTest()2897 	virtual ~InputComponentAliasingTest()
2898 	{
2899 	}
2900 
2901 protected:
2902 	/* Methods to be implemented by child class */
2903 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2904 
2905 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2906 	virtual glw::GLuint getTestCaseNumber();
2907 
2908 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2909 	virtual bool isFailureExpected(glw::GLuint test_case_index);
2910 	virtual void testInit();
2911 
2912 private:
2913 	/* Private types */
2914 	struct testCase
2915 	{
2916 		glw::GLuint			  m_component_gohan;
2917 		glw::GLuint			  m_component_goten;
2918 		Utils::Shader::STAGES m_stage;
2919 		Utils::Type			  m_type;
2920 	};
2921 
2922 	/* Private fields */
2923 	std::vector<testCase> m_test_cases;
2924 };
2925 
2926 /** Implementation of test OutputComponentAliasing. Description follows:
2927  *
2928  * Test verifies that component aliasing cause compilation or linking error.
2929  *
2930  * Test following code snippet:
2931  *
2932  *     layout (location = 1, component = GOHAN_COMPONENT) out type gohan;
2933  *     layout (location = 1, component = GOTEN_COMPONENT) out type goten;
2934  *
2935  *     gohan = GOHAN_VALUE;
2936  *     goten = GOTEN_VALUE;
2937  *
2938  * Test all components combinations that cause aliasing. Test all types. Test
2939  * all shader stages. It is expected that build process will fail.
2940  **/
2941 class OutputComponentAliasingTest : public NegativeTestBase
2942 {
2943 public:
2944 	/* Public methods */
2945 	OutputComponentAliasingTest(deqp::Context& context);
2946 
~OutputComponentAliasingTest()2947 	virtual ~OutputComponentAliasingTest()
2948 	{
2949 	}
2950 
2951 protected:
2952 	/* Methods to be implemented by child class */
2953 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
2954 
2955 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
2956 	virtual glw::GLuint getTestCaseNumber();
2957 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
2958 	virtual void testInit();
2959 
2960 private:
2961 	/* Private types */
2962 	struct testCase
2963 	{
2964 		glw::GLuint			  m_component_gohan;
2965 		glw::GLuint			  m_component_goten;
2966 		Utils::Shader::STAGES m_stage;
2967 		Utils::Type			  m_type;
2968 	};
2969 
2970 	/* Private fields */
2971 	std::vector<testCase> m_test_cases;
2972 };
2973 
2974 /** Implementation of test VaryingLocationAliasingWithMixedTypes. Description follows:
2975  *
2976  * Test verifies that it is not allowed to mix integer and float base types at
2977  * aliased location.
2978  *
2979  * Test following code snippet:
2980  *
2981  *     layout (location = 1, component = GOHAN_COMPONENT) in gohan_type gohan;
2982  *     layout (location = 1, component = GOTEN_COMPONENT) in goten_type goten;
2983  *
2984  * Test all components combinations that do not cause component aliasing. Test
2985  * all types combinations that cause float/integer conflict. Test all shader
2986  * stages. Test both in and out varyings.
2987  *
2988  * It is expected that build process will fail.
2989  **/
2990 class VaryingLocationAliasingWithMixedTypesTest : public NegativeTestBase
2991 {
2992 public:
2993 	/* Public methods */
2994 	VaryingLocationAliasingWithMixedTypesTest(deqp::Context& context);
2995 
~VaryingLocationAliasingWithMixedTypesTest()2996 	virtual ~VaryingLocationAliasingWithMixedTypesTest()
2997 	{
2998 	}
2999 
3000 protected:
3001 	/* Methods to be implemented by child class */
3002 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3003 
3004 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3005 	virtual glw::GLuint getTestCaseNumber();
3006 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3007 	virtual void testInit();
3008 
3009 private:
3010 	/* Private types */
3011 	struct testCase
3012 	{
3013 		glw::GLuint			  m_component_gohan;
3014 		glw::GLuint			  m_component_goten;
3015 		bool				  m_is_input;
3016 		Utils::Shader::STAGES m_stage;
3017 		Utils::Type			  m_type_gohan;
3018 		Utils::Type			  m_type_goten;
3019 	};
3020 
3021 	/* Private routines */
3022 	bool isFloatType(const Utils::Type& type);
3023 
3024 	/* Private fields */
3025 	std::vector<testCase> m_test_cases;
3026 };
3027 
3028 /** Implementation of test VaryingLocationAliasingWithMixedInterpolation. Description follows:
3029  *
3030  * Test verifies that it is not allowed to mix interpolation methods at aliased
3031  * location.
3032  *
3033  * Test following code snippet:
3034  *
3035  *     layout (location = 1, component = GOHAN_COMPONENT)
3036  *         GOHAN_INTERPOLATION in type gohan;
3037  *     layout (location = 1, component = GOTEN_COMPONENT)
3038  *         GOTEN_INTERPOLATION in type goten;
3039  *
3040  * Test all interpolation combinations that cause conflict. Select components
3041  * so as not to cause component aliasing. Test all types. Test all shader
3042  * stages. Test both in and out varyings.
3043  *
3044  * Note, that vertex shader's input and fragment shader's output cannot be
3045  * qualified with interpolation method.
3046  *
3047  * It is expected that build process will fail.
3048  **/
3049 class VaryingLocationAliasingWithMixedInterpolationTest : public NegativeTestBase
3050 {
3051 public:
3052 	/* Public methods */
3053 	VaryingLocationAliasingWithMixedInterpolationTest(deqp::Context& context);
3054 
~VaryingLocationAliasingWithMixedInterpolationTest()3055 	virtual ~VaryingLocationAliasingWithMixedInterpolationTest()
3056 	{
3057 	}
3058 
3059 protected:
3060 	/* Methods to be implemented by child class */
3061 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3062 
3063 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3064 	virtual glw::GLuint getTestCaseNumber();
3065 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3066 	virtual void testInit();
3067 
3068 private:
3069 	enum INTERPOLATIONS
3070 	{
3071 		SMOOTH = 0,
3072 		FLAT,
3073 		NO_PERSPECTIVE,
3074 
3075 		/* */
3076 		INTERPOLATION_MAX
3077 	};
3078 
3079 	/* Private types */
3080 	struct testCase
3081 	{
3082 		glw::GLuint			  m_component_gohan;
3083 		glw::GLuint			  m_component_goten;
3084 		INTERPOLATIONS		  m_interpolation_gohan;
3085 		INTERPOLATIONS		  m_interpolation_goten;
3086 		bool				  m_is_input;
3087 		Utils::Shader::STAGES m_stage;
3088 		Utils::Type			  m_type_gohan;
3089 		Utils::Type			  m_type_goten;
3090 	};
3091 
3092 	/* Private routines */
3093 	const glw::GLchar* getInterpolationQualifier(INTERPOLATIONS interpolation);
3094 	bool isFloatType(const Utils::Type& type);
3095 
3096 	/* Private fields */
3097 	std::vector<testCase> m_test_cases;
3098 };
3099 
3100 /** Implementation of test VaryingLocationAliasingWithMixedAuxiliaryStorage. Description follows:
3101  *
3102  * Test verifies that it is not allowed to mix auxiliary storage at aliased
3103  * location.
3104  *
3105  * Test following code snippet:
3106  *
3107  * layout (location = 1, component = GOHAN_COMPONENT)
3108  *     GOHAN_AUXILIARY in type gohan;
3109  * layout (location = 1, component = GOTEN_COMPONENT)
3110  *     GOTEN_AUXILIARY in type goten;
3111  *
3112  * Test all auxiliary storage combinations that cause conflict. Select
3113  * components so as not to cause component aliasing. Test all types. Test all
3114  * shader stages. Test both in and out varyings.
3115  *
3116  * It is expected that build process will fail.
3117  **/
3118 class VaryingLocationAliasingWithMixedAuxiliaryStorageTest : public NegativeTestBase
3119 {
3120 public:
3121 	/* Public methods */
3122 	VaryingLocationAliasingWithMixedAuxiliaryStorageTest(deqp::Context& context);
3123 
~VaryingLocationAliasingWithMixedAuxiliaryStorageTest()3124 	virtual ~VaryingLocationAliasingWithMixedAuxiliaryStorageTest()
3125 	{
3126 	}
3127 
3128 protected:
3129 	/* Methods to be implemented by child class */
3130 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3131 
3132 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3133 	virtual glw::GLuint getTestCaseNumber();
3134 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3135 	virtual void testInit();
3136 
3137 private:
3138 	enum AUXILIARIES
3139 	{
3140 		NONE = 0,
3141 		PATCH,
3142 		CENTROID,
3143 		SAMPLE,
3144 
3145 		/* */
3146 		AUXILIARY_MAX
3147 	};
3148 
3149 	/* Private types */
3150 	struct testCase
3151 	{
3152 		glw::GLuint			  m_component_gohan;
3153 		glw::GLuint			  m_component_goten;
3154 		AUXILIARIES			  m_aux_gohan;
3155 		AUXILIARIES			  m_aux_goten;
3156 		const glw::GLchar*	m_int_gohan;
3157 		const glw::GLchar*	m_int_goten;
3158 		bool				  m_is_input;
3159 		Utils::Shader::STAGES m_stage;
3160 		Utils::Type			  m_type_gohan;
3161 		Utils::Type			  m_type_goten;
3162 	};
3163 
3164 	/* Private routines */
3165 	const glw::GLchar* getAuxiliaryQualifier(AUXILIARIES aux);
3166 	bool isFloatType(const Utils::Type& type);
3167 
3168 	/* Private fields */
3169 	std::vector<testCase> m_test_cases;
3170 };
3171 
3172 /** Implementation of test VertexAttribLocationAPI. Description follows:
3173  *
3174  * Test verifies that vertex attribute location API works as expected.
3175  *
3176  * This test implements Texture algorithm. Tessellation shaders are not
3177  * necessary and can be omitted. Test following code snippet in vertex shader:
3178  *
3179  *     layout (location = GOKU_LOCATION) in vec4 goku;
3180  *                                       in vec4 gohan;
3181  *                                       in vec4 goten;
3182  *                                       in vec4 chichi;
3183  *
3184  *     if ( (EXPECTED_VALUE == goku)   &&
3185  *          (EXPECTED_VALUE == gohan)  &&
3186  *          (EXPECTED_VALUE == gotan)  &&
3187  *          (EXPECTED_VALUE == chichi) )
3188  *     {
3189  *         result = 1;
3190  *     }
3191  *
3192  * After compilation, before program is linked, specify locations for goku,
3193  * and goten with glBindAttribLocation. Specify different location than the one
3194  * used in shader.
3195  *
3196  * Select all locations so as not to exceed any limits.
3197  *
3198  * Additionally inspect program to verify that:
3199  *     - goku location is as specified in shader text,
3200  *     - goten location is as specified with API.
3201  **/
3202 class VertexAttribLocationAPITest : public TextureTestBase
3203 {
3204 public:
3205 	VertexAttribLocationAPITest(deqp::Context& context);
3206 
~VertexAttribLocationAPITest()3207 	~VertexAttribLocationAPITest()
3208 	{
3209 	}
3210 
3211 protected:
3212 	/* Protected methods */
3213 	virtual void prepareAttribLocation(Utils::Program& program, Utils::ProgramInterface& program_interface);
3214 
3215 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
3216 									 Utils::VaryingPassthrough& varying_passthrough);
3217 
3218 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3219 
3220 private:
3221 	/* Private fields */
3222 	std::vector<glw::GLubyte> m_goku_data;
3223 	std::vector<glw::GLubyte> m_gohan_data;
3224 	std::vector<glw::GLubyte> m_goten_data;
3225 	std::vector<glw::GLubyte> m_chichi_data;
3226 
3227 	/* Private constants */
3228 	static const glw::GLuint m_goten_location;
3229 };
3230 /** Implementation of test FragmentDataLocationAPI. Description follows:
3231  *
3232  * Test verifies that fragment data location API works as expected.
3233  *
3234  * This test implements Texture algorithm. Tessellation shaders are not
3235  * necessary and can be omitted. "result" is not necessary and can be omitted.
3236  * Test following code snippet in fragment shader:
3237  *
3238  *     layout (location = GOKU_LOCATION)  out vec4 goku;
3239  *                                        out vec4 gohan;
3240  *                                        out vec4 goten;
3241  *                                        out vec4 chichi;
3242  *
3243  *     goku   = EXPECTED_VALUE;
3244  *     gohan  = EXPECTED_VALUE;
3245  *     goten  = EXPECTED_VALUE;
3246  *     chichi = EXPECTED_VALUE;
3247  *
3248  * After compilation, before program is linked, specify locations for goku,
3249  * and goten with glBindFragDataLocation. Specify different location than the
3250  * one used in shader.
3251  *
3252  * Select all locations so as not to exceed any limits.
3253  *
3254  * Additionally inspect program to verify that:
3255  *     - goku location is as specified in shader text,
3256  *     - goten location is as specified with API.
3257  **/
3258 class FragmentDataLocationAPITest : public TextureTestBase
3259 {
3260 public:
3261 	FragmentDataLocationAPITest(deqp::Context& context);
3262 
~FragmentDataLocationAPITest()3263 	~FragmentDataLocationAPITest()
3264 	{
3265 	}
3266 
3267 protected:
3268 	/* Protected methods */
3269 	virtual bool checkResults(glw::GLuint test_case_index, Utils::Texture& color_0);
3270 
3271 	virtual std::string getPassSnippet(glw::GLuint test_case_index, Utils::VaryingPassthrough& varying_passthrough,
3272 									   Utils::Shader::STAGES stage);
3273 
3274 	virtual void getProgramInterface(glw::GLuint test_case_index, Utils::ProgramInterface& program_interface,
3275 									 Utils::VaryingPassthrough& varying_passthrough);
3276 
3277 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3278 
3279 	virtual void prepareFragmentDataLoc(Utils::Program& program, Utils::ProgramInterface& program_interface);
3280 
3281 	virtual void prepareFramebuffer(Utils::Framebuffer& framebuffer, Utils::Texture& color_0_texture);
3282 
3283 private:
3284 	/* Private fields */
3285 	Utils::Texture m_goku;
3286 	Utils::Texture m_gohan;
3287 	Utils::Texture m_goten;
3288 	Utils::Texture m_chichi;
3289 
3290 	glw::GLint m_goku_location;
3291 	glw::GLint m_gohan_location;
3292 	glw::GLint m_chichi_location;
3293 
3294 	/* Private constants */
3295 	static const glw::GLuint m_goten_location;
3296 };
3297 
3298 /** Implementation of test XFBInput. Description follows:
3299  *
3300  * Test verifies that using xfb_buffer, xfb_stride or xfb_offset qualifiers on
3301  * input variables will cause failure of build process.
3302  *
3303  * Test all shader stages.
3304  **/
3305 class XFBInputTest : public NegativeTestBase
3306 {
3307 public:
3308 	/* Public methods */
3309 	XFBInputTest(deqp::Context& context);
~XFBInputTest()3310 	virtual ~XFBInputTest()
3311 	{
3312 	}
3313 
3314 protected:
3315 	/* Methods to be implemented by child class */
3316 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3317 
3318 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3319 	virtual glw::GLuint getTestCaseNumber();
3320 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3321 	virtual void testInit();
3322 
3323 private:
3324 	enum QUALIFIERS
3325 	{
3326 		BUFFER = 0,
3327 		STRIDE,
3328 		OFFSET,
3329 
3330 		/* */
3331 		QUALIFIERS_MAX
3332 	};
3333 
3334 	/* Private types */
3335 	struct testCase
3336 	{
3337 		QUALIFIERS			  m_qualifier;
3338 		Utils::Shader::STAGES m_stage;
3339 	};
3340 
3341 	/* Private fields */
3342 	std::vector<testCase> m_test_cases;
3343 };
3344 
3345 /** Implementation of test XFBAllStages. Description follows:
3346  *
3347  * Test verifies that only outputs from last stage processing primitives can be
3348  * captured with XFB.
3349  *
3350  * This test implements Buffer algorithm. Rasterization can be discarded.
3351  *
3352  * At each stage declare a single active output variable qualified with
3353  * xfb_buffer and xfb_offset = 0. Use separate buffers for each stage.
3354  *
3355  * Test pass if outputs from geometry shader are captured, while outputs from:
3356  * vertex and tessellation stages are ignored.
3357  **/
3358 class XFBAllStagesTest : public BufferTestBase
3359 {
3360 public:
3361 	XFBAllStagesTest(deqp::Context& context);
3362 
~XFBAllStagesTest()3363 	~XFBAllStagesTest()
3364 	{
3365 	}
3366 
3367 protected:
3368 	/* Protected methods */
3369 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
3370 
3371 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
3372 							   std::string& out_calculations);
3373 
3374 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
3375 									std::string& out_interface);
3376 
3377 private:
3378 	/* Constants */
3379 	static const glw::GLuint m_gs_index;
3380 };
3381 
3382 /** Implementation of test XFBStrideOfEmptyList. Description follows:
3383  *
3384  * Test verifies correct behavior when xfb_stride qualifier is specified
3385  * but no variables are qualified with xfb_offset.
3386  *
3387  * Test implements Buffer algorithm. Rasterization can be discarded.
3388  *
3389  * Test following code snippet:
3390  *
3391  *     layout (xfb_buffer = 1, xfb_stride = 64) out;
3392  *
3393  * Moreover program should output something to xfb at index 0
3394  *
3395  * Test following cases:
3396  *     1 Provide buffers to XFB at index 0 and 1
3397  *     2 Provide buffer to XFB at index 1, index 0 should be missing
3398  *     3 Provide buffer to XFB at index 0, index 1 should be missing
3399  *
3400  * It is expected that:
3401  *     - BeginTransformFeedback operation will report GL_INVALID_OPERATION in case 2
3402  *     - XFB at index 1 will not be modified in cases 1 and 3.
3403  **/
3404 
3405 class XFBStrideOfEmptyListTest : public BufferTestBase
3406 {
3407 public:
3408 	XFBStrideOfEmptyListTest(deqp::Context& context);
3409 
~XFBStrideOfEmptyListTest()3410 	~XFBStrideOfEmptyListTest()
3411 	{
3412 	}
3413 
3414 protected:
3415 	/* Protected methods */
3416 	using BufferTestBase::executeDrawCall;
3417 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
3418 
3419 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
3420 
3421 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
3422 							   std::string& out_calculations);
3423 
3424 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
3425 									std::string& out_interface);
3426 
3427 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3428 	virtual glw::GLuint getTestCaseNumber();
3429 
3430 private:
3431 	enum CASES
3432 	{
3433 		VALID = 0,
3434 		FIRST_MISSING,
3435 		SECOND_MISSING,
3436 	};
3437 
3438 	/* Private constants */
3439 	static const glw::GLuint m_stride;
3440 };
3441 
3442 /** Implementation of test XFBStrideOfEmptyListAndAPI. Description follows:
3443  *
3444  * Test verifies that xfb_stride qualifier is not overridden by API.
3445  *
3446  * Test implements Buffer algorithm. Rasterization can be discarded.
3447  *
3448  * Test following code snippet:
3449  *
3450  *     layout (xfb_buffer = 0, xfb_stride = 64) out;
3451  *
3452  * Moreover program should output something to xfb at index 1
3453 
3454  * Use TransformFeedbackVaryings to declare a single vec4 output variable to be
3455  * captured.
3456  *
3457  * Test following cases:
3458  *     1 Provide buffers to XFB at index 0 and 1
3459  *     2 Provide buffer to XFB at index 1, index 0 should be missing
3460  *     3 Provide buffer to XFB at index 0, index 1 should be missing
3461  *
3462  * It is expected that:
3463  *     - BeginTransformFeedback operation will report GL_INVALID_OPERATION in cases
3464  *     2 and 3,
3465  *     - XFB at index 0 will not be modified in case 1.
3466  **/
3467 class XFBStrideOfEmptyListAndAPITest : public BufferTestBase
3468 {
3469 public:
3470 	XFBStrideOfEmptyListAndAPITest(deqp::Context& context);
3471 
~XFBStrideOfEmptyListAndAPITest()3472 	~XFBStrideOfEmptyListAndAPITest()
3473 	{
3474 	}
3475 
3476 protected:
3477 	/* Protected methods */
3478 	using BufferTestBase::executeDrawCall;
3479 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
3480 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
3481 
3482 	virtual void getCapturedVaryings(glw::GLuint test_case_index, Utils::Program::NameVector& captured_varyings, glw::GLint* xfb_components);
3483 
3484 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
3485 							   std::string& out_calculations);
3486 
3487 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
3488 									std::string& out_interface);
3489 
3490 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3491 	virtual glw::GLuint getTestCaseNumber();
3492 
3493 private:
3494 	enum CASES
3495 	{
3496 		VALID = 0,
3497 		FIRST_MISSING,
3498 		SECOND_MISSING,
3499 	};
3500 
3501 	/* Private constants */
3502 	static const glw::GLuint m_stride;
3503 };
3504 
3505 /** Implementation of test XFBTooSmallStride. Description follows:
3506  *
3507  * Test verifies that build process fails when xfb_stride qualifier sets not
3508  * enough space for all variables.
3509  *
3510  * Test following code snippets:
3511  *
3512  *     layout (xfb_buffer = 0, xfb_stride = 40) out;
3513  *
3514  *     layout (xfb_offset = 32) out vec4 goku;
3515  *
3516  *     goku = EXPECTED_VALUE.
3517  *
3518  * ,
3519  *
3520  *     layout (xfb_buffer = 0, xfb_stride = 32) out;
3521  *
3522  *     layout (xfb_offset = 16, xfb_stride = 32) out vec4 goku;
3523  *
3524  *     goku = EXPECTED_VALUE.
3525  *
3526  * ,
3527  *
3528  *     layout (xfb_buffer = 0, xfb_stride = 32) out;
3529  *
3530  *     layout (xfb_offset = 0) out Goku {
3531  *         vec4 gohan;
3532  *         vec4 goten;
3533  *         vec4 chichi;
3534  *     };
3535  *
3536  *     gohan  = EXPECTED_VALUE;
3537  *     goten  = EXPECTED_VALUE;
3538  *     chichi = EXPECTED_VALUE;
3539  *
3540  * ,
3541  *
3542  *     layout (xfb_buffer = 0, xfb_stride = 32) out;
3543  *
3544  *     layout (xfb_offset = 16) out vec4 goku[4];
3545  *
3546  *     goku[0] = EXPECTED_VALUE.
3547  *     goku[1] = EXPECTED_VALUE.
3548  *     goku[2] = EXPECTED_VALUE.
3549  *     goku[3] = EXPECTED_VALUE.
3550  *
3551  * It is expected that build process will fail.
3552  *
3553  * Test all shader stages.
3554  **/
3555 class XFBTooSmallStrideTest : public NegativeTestBase
3556 {
3557 public:
3558 	/* Public methods */
3559 	XFBTooSmallStrideTest(deqp::Context& context);
3560 
~XFBTooSmallStrideTest()3561 	virtual ~XFBTooSmallStrideTest()
3562 	{
3563 	}
3564 
3565 protected:
3566 	/* Methods to be implemented by child class */
3567 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3568 
3569 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3570 	virtual glw::GLuint getTestCaseNumber();
3571 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3572 	virtual void testInit();
3573 
3574 private:
3575 	enum CASES
3576 	{
3577 		OFFSET = 0,
3578 		STRIDE,
3579 		BLOCK,
3580 		ARRAY,
3581 
3582 		/* */
3583 		CASE_MAX
3584 	};
3585 
3586 	/* Private types */
3587 	struct testCase
3588 	{
3589 		CASES				  m_case;
3590 		Utils::Shader::STAGES m_stage;
3591 	};
3592 
3593 	/* Private fields */
3594 	std::vector<testCase> m_test_cases;
3595 };
3596 
3597 /** Implementation of test XFBVariableStride. Description follows:
3598  *
3599  * Test verifies that xfb_stride qualifier change stride of output variable.
3600  *
3601  * Test following code snippets:
3602  *
3603  *     layout (xfb_offset = 0, xfb_stride = 2 * sizeof(type)) out type goku;
3604  *
3605  * and
3606  *
3607  *     layout (xfb_offset = 0, xfb_stride = 2 * sizeof(type)) out type goku;
3608  *     layout (xfb_offset = sizeof(type))                     out type vegeta;
3609  *
3610  * It is expected that:
3611  *     - first snippet will build successfully,
3612  *     - second snippet will fail to build.
3613  *
3614  * Test all types. Test all shader stages.
3615  **/
3616 class XFBVariableStrideTest : public NegativeTestBase
3617 {
3618 public:
3619 	/* Public methods */
3620 	XFBVariableStrideTest(deqp::Context& context);
~XFBVariableStrideTest()3621 	virtual ~XFBVariableStrideTest()
3622 	{
3623 	}
3624 
3625 protected:
3626 	/* Methods to be implemented by child class */
3627 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3628 
3629 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3630 	virtual glw::GLuint getTestCaseNumber();
3631 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3632 	virtual bool isFailureExpected(glw::GLuint test_case_index);
3633 	virtual void testInit();
3634 
3635 private:
3636 	enum CASES
3637 	{
3638 		VALID = 0,
3639 		INVALID,
3640 
3641 		/* */
3642 		CASE_MAX
3643 	};
3644 
3645 	/* Private types */
3646 	struct testCase
3647 	{
3648 		CASES				  m_case;
3649 		Utils::Shader::STAGES m_stage;
3650 		Utils::Type			  m_type;
3651 	};
3652 
3653 	/* Private fields */
3654 	std::vector<testCase> m_test_cases;
3655 };
3656 
3657 /** Implementation of test XFBBlockStride. Description follows:
3658  *
3659  * Test verifies that xfb_stride qualifier change stride of output block.
3660  *
3661  * Test following code snippet:
3662  *
3663  *     layout (xfb_offset = 0, xfb_stride = 128) out Goku {
3664  *         vec4 gohan;
3665  *         vec4 goten;
3666  *         vec4 chichi;
3667  *     };
3668  *
3669  * Inspect program to check if Goku stride is 128 units.
3670  *
3671  * Test all shader stages.
3672  **/
3673 class XFBBlockStrideTest : public TestBase
3674 {
3675 public:
3676 	/* Public methods */
3677 	XFBBlockStrideTest(deqp::Context& context);
3678 
~XFBBlockStrideTest()3679 	virtual ~XFBBlockStrideTest()
3680 	{
3681 	}
3682 
3683 protected:
3684 	/* Methods to be implemented by child class */
3685 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3686 	virtual glw::GLuint getTestCaseNumber();
3687 	virtual bool testCase(glw::GLuint test_case_index);
3688 	virtual void testInit();
3689 
3690 private:
3691 	/* Private methods */
3692 	std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3693 
3694 	bool inspectProgram(Utils::Program& program);
3695 
3696 	/* Private fields */
3697 	std::vector<Utils::Shader::STAGES> m_test_cases;
3698 };
3699 
3700 /** Implementation of test XFBBlockMemberStride. Description follows:
3701  *
3702  * Test verifies that xfb_stride qualifier change stride of output block
3703  * member.
3704  *
3705  * This test implements Buffer algorithm. Rasterization can be discarded. Test
3706  * following code snippet:
3707  *
3708  *     layout (xfb_offset = 0) out Goku {
3709  *                                  vec4 gohan;
3710  *         layout (xfb_stride = 32) vec4 goten;
3711  *                                  vec4 chichi;
3712  *     };
3713  *
3714  *     gohan  = EXPECTED_VALUE;
3715  *     goten  = EXPECTED_VALUE;
3716  *     chichi = EXPECTED_VALUE;
3717  *
3718  * Test pass if:
3719  *     - goten stride is reported as 32,
3720  *     - chichi offset is reported as 48,
3721  *     - values captured for all members match expected values,
3722  *     - part of memory reserved for goten, that is not used, is not modified.
3723  **/
3724 class XFBBlockMemberStrideTest : public BufferTestBase
3725 {
3726 public:
3727 	XFBBlockMemberStrideTest(deqp::Context& context);
~XFBBlockMemberStrideTest()3728 	~XFBBlockMemberStrideTest()
3729 	{
3730 	}
3731 
3732 protected:
3733 	/* Protected methods */
3734 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
3735 
3736 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
3737 							   std::string& out_calculations);
3738 
3739 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
3740 									std::string& out_interface);
3741 
3742 	virtual bool inspectProgram(glw::GLuint test_case_index, Utils::Program& program, std::stringstream& out_stream);
3743 };
3744 
3745 /** Implementation of test XFBDuplicatedStride. Description follows:
3746  *
3747  * Test verifies that conflicting xfb_stride qualifiers cause build process
3748  * failure.
3749  *
3750  * Test following code snippets:
3751  *
3752  *     layout (xfb_buffer = 0, xfb_stride = 64) out;
3753  *     layout (xfb_buffer = 0, xfb_stride = 64) out;
3754  *
3755  * and
3756  *
3757  *     layout (xfb_buffer = 0, xfb_stride = 64)  out;
3758  *     layout (xfb_buffer = 0, xfb_stride = 128) out;
3759  *
3760  * It is expected that:
3761  *     - first snippet will build successfully,
3762  *     - second snippet will fail to build.
3763  **/
3764 class XFBDuplicatedStrideTest : public NegativeTestBase
3765 {
3766 public:
3767 	/* Public methods */
3768 	XFBDuplicatedStrideTest(deqp::Context& context);
3769 
~XFBDuplicatedStrideTest()3770 	virtual ~XFBDuplicatedStrideTest()
3771 	{
3772 	}
3773 
3774 protected:
3775 	/* Methods to be implemented by child class */
3776 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3777 
3778 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3779 	virtual glw::GLuint getTestCaseNumber();
3780 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
3781 	virtual bool isFailureExpected(glw::GLuint test_case_index);
3782 	virtual void testInit();
3783 
3784 private:
3785 	enum CASES
3786 	{
3787 		VALID = 0,
3788 		INVALID,
3789 
3790 		/* */
3791 		CASE_MAX
3792 	};
3793 
3794 	/* Private types */
3795 	struct testCase
3796 	{
3797 		CASES				  m_case;
3798 		Utils::Shader::STAGES m_stage;
3799 	};
3800 
3801 	/* Private fields */
3802 	std::vector<testCase> m_test_cases;
3803 };
3804 
3805 /** Implementation of test XFBGetProgramResourceAPI. Description follows:
3806  *
3807  * Test verifies that GetProgramResource* API work as expected for transform
3808  * feedback.
3809  *
3810  * Test results of following queries:
3811  *     - OFFSET,
3812  *     - TRANSFORM_FEEDBACK_BUFFER_INDEX,
3813  *     - TRANSFORM_FEEDBACK_BUFFER_STRIDE,
3814  *     - TYPE.
3815  *
3816  * Test following cases:
3817  *     - captured varyings are declared with API, TransformFeedbackVaryings
3818  *     with INTERLEAVED_ATTRIBS,
3819  *     - captured varyings are declared with API, TransformFeedbackVaryings
3820  *     with SEPARATE_ATTRIBS,
3821  *     - captured varyings are declared with "xfb" qualifiers.
3822  *
3823  * Following layout should be used in cases of INTERLEAVED_ATTRIBS and "xfb"
3824  * qualifiers:
3825  *              | var 0 | var 1 | var 2 | var 3
3826  *     buffer 0 | used  | used  | empty | used
3827  *     buffer 1 | empty | used  | empty | empty
3828  *
3829  * In "xfb" qualifiers case, use following snippet:
3830  *
3831  *     layout (xfb_buffer = 1, xfb_stride = 4 * sizeof(type)) out;
3832  *
3833  * Declaration in shader should use following order:
3834  *     buffer_0_var_1
3835  *     buffer_1_var_1
3836  *     buffer_0_var_3
3837  *     buffer_0_var_0
3838  *
3839  * To make sure that captured varyings are active, they should be assigned.
3840  *
3841  * Test all types. Test all shader stages.
3842  **/
3843 class XFBGetProgramResourceAPITest : public TestBase
3844 {
3845 public:
3846 	/* Public methods */
3847 	XFBGetProgramResourceAPITest(deqp::Context& context);
3848 
~XFBGetProgramResourceAPITest()3849 	virtual ~XFBGetProgramResourceAPITest()
3850 	{
3851 	}
3852 
3853 protected:
3854 	/* Methods to be implemented by child class */
3855 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3856 	virtual glw::GLuint getTestCaseNumber();
3857 	virtual bool testCase(glw::GLuint test_case_index);
3858 	virtual void testInit();
3859 	virtual void insertSkipComponents(int num_components, Utils::Program::NameVector& varyings);
3860 
3861 private:
3862 	/* Private enums */
3863 	enum CASES
3864 	{
3865 		INTERLEAVED,
3866 		SEPARATED,
3867 		XFB,
3868 	};
3869 
3870 	/* Private types */
3871 	struct test_Case
3872 	{
3873 		CASES				  m_case;
3874 		Utils::Shader::STAGES m_stage;
3875 		Utils::Type			  m_type;
3876 	};
3877 
3878 	/* Private methods */
3879 	std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
3880 
3881 	bool inspectProgram(glw::GLuint test_case_index, Utils::Program& program);
3882 
3883 	/* Private fields */
3884 	std::vector<test_Case> m_test_cases;
3885 };
3886 
3887 /** Implementation of test XFBOverrideQualifiersWithAPI. Description follows:
3888  *
3889  * Test verifies that API is ignored, when qualifiers are in use.
3890  *
3891  * This test follows Buffer algorithm. Rasterization can disabled. Test
3892  * following code snippet:
3893  *
3894  *     layout (xfb_offset = 2 * sizeof(type)) out type vegeta;
3895  *                                            out type trunks;
3896  *     layout (xfb_offset = 0)                out type goku;
3897  *                                            out type gohan;
3898  *
3899  *     vegeta = EXPECTED_VALUE;
3900  *     trunks = EXPECTED_VALUE;
3901  *     goku   = EXPECTED_VALUE;
3902  *     gohan  = EXPECTED_VALUE;
3903  *
3904  * Use API, TransformFeedbackVaryings, to specify trunks and gohan as outputs
3905  * to be captured.
3906  *
3907  * Test pass if:
3908  *     - correct values are captured for vegeta and goku,
3909  *     - trunks and gohan are not captured,
3910  *     - correct stride is reported.
3911  *
3912  * Test all types. Test all shader stages.
3913  **/
3914 class XFBOverrideQualifiersWithAPITest : public BufferTestBase
3915 {
3916 public:
3917 	XFBOverrideQualifiersWithAPITest(deqp::Context& context);
3918 
~XFBOverrideQualifiersWithAPITest()3919 	~XFBOverrideQualifiersWithAPITest()
3920 	{
3921 	}
3922 
3923 protected:
3924 	/* Protected methods */
3925 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
3926 
3927 	virtual void getCapturedVaryings(glw::GLuint test_case_index, Utils::Program::NameVector& captured_varyings, glw::GLint* xfb_components);
3928 
3929 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
3930 							   std::string& out_calculations);
3931 
3932 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
3933 									std::string& out_interface);
3934 
3935 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
3936 	virtual glw::GLuint getTestCaseNumber();
3937 
3938 	virtual bool inspectProgram(glw::GLuint test_case_index, Utils::Program& program, std::stringstream& out_stream);
3939 };
3940 
3941 /** Implementation of test XFBVertexStreams. Description follows:
3942  *
3943  * Test verifies that "xfb" qualifiers work as expected with multiple output
3944  * streams.
3945  *
3946  * Test implements Buffer algorithm. Rasterization can be discarded.
3947  *
3948  * Test following code snippet:
3949  *
3950  *     layout (xfb_buffer = 1, xfb_stride = 64) out;
3951  *     layout (xfb_buffer = 2, xfb_stride = 64) out;
3952  *     layout (xfb_buffer = 3, xfb_stride = 64) out;
3953  *
3954  *     layout (stream = 0, xfb_buffer = 1, xfb_offset = 48) out vec4 goku;
3955  *     layout (stream = 0, xfb_buffer = 1, xfb_offset = 32) out vec4 gohan;
3956  *     layout (stream = 0, xfb_buffer = 1, xfb_offset = 16) out vec4 goten;
3957  *     layout (stream = 1, xfb_buffer = 3, xfb_offset = 48) out vec4 picolo;
3958  *     layout (stream = 1, xfb_buffer = 3, xfb_offset = 32) out vec4 vegeta;
3959  *     layout (stream = 2, xfb_buffer = 2, xfb_offset = 32) out vec4 bulma;
3960  *
3961  *     goku   = EXPECTED_VALUE;
3962  *     gohan  = EXPECTED_VALUE;
3963  *     goten  = EXPECTED_VALUE;
3964  *     picolo = EXPECTED_VALUE;
3965  *     vegeta = EXPECTED_VALUE;
3966  *     bulma  = EXPECTED_VALUE;
3967  *
3968  * Test pass if all captured outputs have expected values.
3969  **/
3970 class XFBVertexStreamsTest : public BufferTestBase
3971 {
3972 public:
3973 	XFBVertexStreamsTest(deqp::Context& context);
3974 
~XFBVertexStreamsTest()3975 	~XFBVertexStreamsTest()
3976 	{
3977 	}
3978 
3979 protected:
3980 	/* Protected methods */
3981 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
3982 
3983 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
3984 							   std::string& out_calculations);
3985 
3986 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
3987 									std::string& out_interface);
3988 };
3989 
3990 /** Implementation of test XFBMultipleVertexStreams. Description follows:
3991  *
3992  * Test verifies that outputs from single stream must be captured with single
3993  * xfb binding.
3994  *
3995  * Test following code snippet:
3996  *
3997  *     layout (xfb_buffer = 1, xfb_stride = 64) out;
3998  *     layout (xfb_buffer = 3, xfb_stride = 64) out;
3999  *
4000  *     layout (stream = 0, xfb_buffer = 1, xfb_offset = 48) out vec4 goku;
4001  *     layout (stream = 1, xfb_buffer = 1, xfb_offset = 32) out vec4 gohan;
4002  *     layout (stream = 2, xfb_buffer = 1, xfb_offset = 16) out vec4 goten;
4003  *
4004  * It is expected that linking of program will fail.
4005  **/
4006 class XFBMultipleVertexStreamsTest : public NegativeTestBase
4007 {
4008 public:
4009 	/* Public methods */
4010 	XFBMultipleVertexStreamsTest(deqp::Context& context);
4011 
~XFBMultipleVertexStreamsTest()4012 	virtual ~XFBMultipleVertexStreamsTest()
4013 	{
4014 	}
4015 
4016 protected:
4017 	/* Methods to be implemented by child class */
4018 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4019 
4020 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4021 };
4022 
4023 /** Implementation of test XFBExceedBufferLimit. Description follows:
4024  *
4025  * Test verifies that MAX_TRANSFORM_FEEDBACK_BUFFERS limit is respected.
4026  *
4027  * Test following code snippets:
4028  *
4029  *     layout (xfb_buffer = MAX_TRANSFORM_FEEDBACK_BUFFERS) out;
4030  *
4031  * ,
4032  *
4033  *     layout (xfb_buffer = MAX_TRANSFORM_FEEDBACK_BUFFERS) out vec4 output;
4034  *
4035  * and
4036  *
4037  *     layout (xfb_buffer = MAX_TRANSFORM_FEEDBACK_BUFFERS) out Block {
4038  *         vec4 member;
4039  *     };
4040  *
4041  * It is expected that build process will fail.
4042  *
4043  * Test all shader stages.
4044  **/
4045 class XFBExceedBufferLimitTest : public NegativeTestBase
4046 {
4047 public:
4048 	/* Public methods */
4049 	XFBExceedBufferLimitTest(deqp::Context& context);
~XFBExceedBufferLimitTest()4050 	virtual ~XFBExceedBufferLimitTest()
4051 	{
4052 	}
4053 
4054 protected:
4055 	/* Methods to be implemented by child class */
4056 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4057 
4058 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4059 	virtual glw::GLuint getTestCaseNumber();
4060 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4061 	virtual void testInit();
4062 
4063 private:
4064 	enum CASES
4065 	{
4066 		BLOCK = 0,
4067 		GLOBAL,
4068 		VECTOR,
4069 
4070 		/* */
4071 		CASE_MAX
4072 	};
4073 
4074 	/* Private types */
4075 	struct testCase
4076 	{
4077 		CASES				  m_case;
4078 		Utils::Shader::STAGES m_stage;
4079 	};
4080 
4081 	/* Private fields */
4082 	std::vector<testCase> m_test_cases;
4083 };
4084 
4085 /** Implementation of test XFBExceedOffsetLimit. Description follows:
4086  *
4087  * Test verifies that MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS limit is
4088  * respected.
4089  *
4090  * Test following code snippets:
4091  *
4092  *     layout (xfb_buffer = 0, xfb_stride = MAX_SIZE + 16) out;
4093  *
4094  * ,
4095  *
4096  *     layout (xfb_buffer = 0, xfb_offset = MAX_SIZE) out vec4 output;
4097  *
4098  * and
4099  *
4100  *     layout (xfb_buffer = 0, xfb_offset = MAX_SIZE) out Block
4101  *     {
4102  *         vec4 member;
4103  *     };
4104  *
4105  * where MAX_SIZE is the maximum supported size of transform feedback buffer,
4106  * which should be equal to:
4107  *
4108  *     MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS * sizeof(float)
4109  *
4110  * It is expected that build process will fail.
4111  *
4112  * Test all shader stages.
4113  **/
4114 class XFBExceedOffsetLimitTest : public NegativeTestBase
4115 {
4116 public:
4117 	/* Public methods */
4118 	XFBExceedOffsetLimitTest(deqp::Context& context);
~XFBExceedOffsetLimitTest()4119 	virtual ~XFBExceedOffsetLimitTest()
4120 	{
4121 	}
4122 
4123 protected:
4124 	/* Methods to be implemented by child class */
4125 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4126 
4127 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4128 	virtual glw::GLuint getTestCaseNumber();
4129 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4130 	virtual void testInit();
4131 
4132 private:
4133 	enum CASES
4134 	{
4135 		BLOCK = 0,
4136 		GLOBAL,
4137 		VECTOR,
4138 
4139 		/* */
4140 		CASE_MAX
4141 	};
4142 
4143 	/* Private types */
4144 	struct testCase
4145 	{
4146 		CASES				  m_case;
4147 		Utils::Shader::STAGES m_stage;
4148 	};
4149 
4150 	/* Private fields */
4151 	std::vector<testCase> m_test_cases;
4152 };
4153 
4154 /** Implementation of test XFBGlobalBuffer. Description follows:
4155  *
4156  * Test verifies that global setting of xfb_buffer qualifier work as expected.
4157  *
4158  * This test implements Buffer algorithm. Rasterization can be discarded. Test
4159  * following code snippet:
4160  *
4161  *     layout (xfb_buffer = 3) out;
4162  *
4163  *     layout (                xfb_offset = 2 * sizeof(type)) out type chichi;
4164  *     layout (xfb_buffer = 1, xfb_offset = 0)                out type bulma;
4165  *     layout (xfb_buffer = 1, xfb_offset = sizeof(type))     out Vegeta {
4166  *         type trunks;
4167  *         type bra;
4168  *     };
4169  *     layout (                xfb_offset = 0)                out Goku {
4170  *         type gohan;
4171  *         type goten;
4172  *     };
4173  *
4174  *     chichi = EXPECTED_VALUE;
4175  *     bulma  = EXPECTED_VALUE;
4176  *     trunks = EXPECTED_VALUE;
4177  *     bra    = EXPECTED_VALUE;
4178  *     gohan  = EXPECTED_VALUE;
4179  *     goten  = EXPECTED_VALUE;
4180  *
4181  * Test pass if all captured outputs have expected values.
4182  *
4183  * Test all shader stages. Test all types.
4184  **/
4185 class XFBGlobalBufferTest : public BufferTestBase
4186 {
4187 public:
4188 	XFBGlobalBufferTest(deqp::Context& context);
4189 
~XFBGlobalBufferTest()4190 	~XFBGlobalBufferTest()
4191 	{
4192 	}
4193 
4194 protected:
4195 	/* Protected methods */
4196 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
4197 
4198 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4199 
4200 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4201 	virtual glw::GLuint getTestCaseNumber();
4202 	virtual void		testInit();
4203 
4204 private:
4205 	/* Private types */
4206 	struct _testCase
4207 	{
4208 		Utils::Shader::STAGES m_stage;
4209 		Utils::Type			  m_type;
4210 	};
4211 
4212 	/* Private fields */
4213 	std::vector<_testCase> m_test_cases;
4214 };
4215 
4216 /** Implementation of test XFBStride. Description follows:
4217  *
4218  * Test verifies that expected stride values are used.
4219  *
4220  * Test following code snippet:
4221  *
4222  *     layout (xfb_offset = 0) out type output;
4223  *
4224  *     output = EXPECTED_VALUE;
4225  *
4226  * Test all types. Test all shader stages.
4227  **/
4228 class XFBStrideTest : public BufferTestBase
4229 {
4230 public:
4231 	XFBStrideTest(deqp::Context& context);
~XFBStrideTest()4232 	~XFBStrideTest()
4233 	{
4234 	}
4235 
4236 protected:
4237 	/* Protected methods */
4238 	using BufferTestBase::executeDrawCall;
4239 
4240 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
4241 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
4242 
4243 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
4244 							   std::string& out_calculations);
4245 
4246 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
4247 									std::string& out_interface);
4248 
4249 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4250 
4251 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4252 	virtual glw::GLuint getTestCaseNumber();
4253 	virtual void		testInit();
4254 
4255 private:
4256 	/* Private types */
4257 	struct testCase
4258 	{
4259 		Utils::Shader::STAGES m_stage;
4260 		Utils::Type			  m_type;
4261 	};
4262 
4263 	/* Private fields */
4264 	std::vector<testCase> m_test_cases;
4265 };
4266 
4267 /** Implementation of test XFBBlockMemberBuffer. Description follows:
4268  *
4269  * Test verifies that member of block have to use same buffer as block.
4270  *
4271  * Test following code snippet:
4272  *
4273  *     layout (xfb_offset = 0) out Goku
4274  *     {
4275  *                                 vec4 gohan;
4276  *         layout (xfb_buffer = 1) vec4 goten;
4277  *     };
4278  *
4279  * It is expected that compilation will fail.
4280  *
4281  * Test all shader stages.
4282  **/
4283 class XFBBlockMemberBufferTest : public NegativeTestBase
4284 {
4285 public:
4286 	/* Public methods */
4287 	XFBBlockMemberBufferTest(deqp::Context& context);
4288 
~XFBBlockMemberBufferTest()4289 	virtual ~XFBBlockMemberBufferTest()
4290 	{
4291 	}
4292 
4293 protected:
4294 	/* Methods to be implemented by child class */
4295 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4296 
4297 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4298 	virtual glw::GLuint getTestCaseNumber();
4299 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4300 	virtual void testInit();
4301 
4302 private:
4303 	/* Private types */
4304 	struct testCase
4305 	{
4306 		Utils::Shader::STAGES m_stage;
4307 	};
4308 
4309 	/* Private fields */
4310 	std::vector<testCase> m_test_cases;
4311 };
4312 
4313 /** Implementation of test XFBOutputOverlapping. Description follows:
4314  *
4315  * Test verifies that overlapped outputs are reported as errors by compiler.
4316  *
4317  * Test following code snippet:
4318  *
4319  *     layout (xfb_offset = sizeof(type))       out type gohan;
4320  *     layout (xfb_offset = 1.5 * sizeof(type)) out type goten;
4321  *
4322  *     gohan = EXPECTED_VALUE;
4323  *     goten = EXPECTED_VALUE;
4324  *
4325  * It is expected that compilation will fail.
4326  *
4327  * Test all shader stages. Test all types.
4328  **/
4329 class XFBOutputOverlappingTest : public NegativeTestBase
4330 {
4331 public:
4332 	/* Public methods */
4333 	XFBOutputOverlappingTest(deqp::Context& context);
4334 
~XFBOutputOverlappingTest()4335 	virtual ~XFBOutputOverlappingTest()
4336 	{
4337 	}
4338 
4339 protected:
4340 	/* Methods to be implemented by child class */
4341 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4342 
4343 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4344 	virtual glw::GLuint getTestCaseNumber();
4345 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4346 	virtual void testInit();
4347 
4348 private:
4349 	/* Private types */
4350 	struct testCase
4351 	{
4352 		glw::GLuint			  m_offset_gohan;
4353 		glw::GLuint			  m_offset_goten;
4354 		Utils::Shader::STAGES m_stage;
4355 		Utils::Type			  m_type;
4356 	};
4357 
4358 	/* Private fields */
4359 	std::vector<testCase> m_test_cases;
4360 };
4361 
4362 /** Implementation of test XFBInvalidOffsetAlignment. Description follows:
4363  *
4364  * Test verifies that invalidly aligned outputs cause a failure to build
4365  * process.
4366  *
4367  * Test following code snippet:
4368  *
4369  *     layout (xfb_offset = OFFSET) out type goku;
4370  *
4371  *     goku = EXPECTED_VALUE;
4372  *
4373  * Select OFFSET values so as to cause invalid alignment. Inspect program to
4374  * verify offset of goku.
4375  *
4376  * Test all shader stages. Test all types. Test all offsets in range:
4377  * (sizeof(type), 2 * sizeof(type)).
4378  **/
4379 class XFBInvalidOffsetAlignmentTest : public NegativeTestBase
4380 {
4381 public:
4382 	/* Public methods */
4383 	XFBInvalidOffsetAlignmentTest(deqp::Context& context);
4384 
~XFBInvalidOffsetAlignmentTest()4385 	virtual ~XFBInvalidOffsetAlignmentTest()
4386 	{
4387 	}
4388 
4389 protected:
4390 	/* Methods to be implemented by child class */
4391 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4392 
4393 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4394 	virtual glw::GLuint getTestCaseNumber();
4395 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4396 	virtual void testInit();
4397 
4398 private:
4399 	/* Private types */
4400 	struct testCase
4401 	{
4402 		glw::GLuint			  m_offset;
4403 		Utils::Shader::STAGES m_stage;
4404 		Utils::Type			  m_type;
4405 	};
4406 
4407 	/* Private fields */
4408 	std::vector<testCase> m_test_cases;
4409 };
4410 
4411 /** Implementation of test XFBCaptureInactiveOutputVariable. Description follows:
4412  *
4413  * Test verifies behaviour of inactive outputs.
4414  *
4415  * This test implements Buffer algorithm. Rasterization can be disabled. Draw
4416  * two vertices instead of one. Test following code snippet:
4417  *
4418  *     layout (xfb_offset = 16) out vec4 goku;
4419  *     layout (xfb_offset = 32) out vec4 gohan;
4420  *     layout (xfb_offset = 0)  out vec4 goten;
4421  *
4422  *     gohan = EXPECTED_VALUE;
4423  *     goten = EXPECTED_VALUE;
4424  *
4425  * Test pass if:
4426  *     - values captured for goten and gohan are as expected,
4427  *     - goku value is undefined
4428  *     - stride is 3 * sizeof(vec4) - 48
4429  *
4430  * Test all shader stages.
4431  **/
4432 class XFBCaptureInactiveOutputVariableTest : public BufferTestBase
4433 {
4434 public:
4435 	XFBCaptureInactiveOutputVariableTest(deqp::Context& context);
~XFBCaptureInactiveOutputVariableTest()4436 	~XFBCaptureInactiveOutputVariableTest()
4437 	{
4438 	}
4439 
4440 protected:
4441 	/* Protected methods */
4442 	using BufferTestBase::executeDrawCall;
4443 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
4444 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
4445 
4446 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
4447 							   std::string& out_calculations);
4448 
4449 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
4450 									std::string& out_interface);
4451 
4452 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4453 
4454 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4455 	virtual glw::GLuint getTestCaseNumber();
4456 
4457 	virtual bool inspectProgram(glw::GLuint test_case_index, Utils::Program& program, std::stringstream& out_stream);
4458 
4459 	virtual bool verifyBuffers(bufferCollection& buffers);
4460 
4461 private:
4462 	enum test_cases
4463 	{
4464 		TEST_VS = 0,
4465 		TEST_TES,
4466 		TEST_GS,
4467 
4468 		/* */
4469 		TEST_MAX
4470 	};
4471 };
4472 
4473 /** Implementation of test XFBCaptureInactiveOutputComponent. Description follows:
4474  *
4475  * Test verifies behaviour of inactive component.
4476  *
4477  * This test implements Buffer algorithm. Rasterization can be disabled. Draw
4478  * two vertices instead of one. Test following code snippet:
4479  *
4480  *     layout (xfb_offset = 32)  out vec4 goku;
4481  *     layout (xfb_offset = 0)   out vec4 gohan;
4482  *     layout (xfb_offset = 16)  out vec4 goten;
4483  *     layout (xfb_offset = 48)  out vec4 chichi;
4484  *     layout (xfb_offset = 112) out vec4 vegeta;
4485  *     layout (xfb_offset = 96)  out vec4 trunks;
4486  *     layout (xfb_offset = 80)  out vec4 bra;
4487  *     layout (xfb_offset = 64)  out vec4 bulma;
4488  *
4489  *     goku.x   = EXPECTED_VALUE;
4490  *     goku.z   = EXPECTED_VALUE;
4491  *     gohan.y  = EXPECTED_VALUE;
4492  *     gohan.w  = EXPECTED_VALUE;
4493  *     goten.x  = EXPECTED_VALUE;
4494  *     goten.y  = EXPECTED_VALUE;
4495  *     chichi.z = EXPECTED_VALUE;
4496  *     chichi.w = EXPECTED_VALUE;
4497  *     vegeta.x = EXPECTED_VALUE;
4498  *     trunks.y = EXPECTED_VALUE;
4499  *     bra.z    = EXPECTED_VALUE;
4500  *     bulma.w  = EXPECTED_VALUE;
4501  *
4502  * Test pass when captured values of all assigned components match expected
4503  * values, while not assigned ones are undefined.
4504  *
4505  * Test all shader stages.
4506  **/
4507 class XFBCaptureInactiveOutputComponentTest : public BufferTestBase
4508 {
4509 public:
4510 	XFBCaptureInactiveOutputComponentTest(deqp::Context& context);
~XFBCaptureInactiveOutputComponentTest()4511 	~XFBCaptureInactiveOutputComponentTest()
4512 	{
4513 	}
4514 
4515 protected:
4516 	/* Protected methods */
4517 	using BufferTestBase::executeDrawCall;
4518 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
4519 
4520 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
4521 
4522 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
4523 							   std::string& out_calculations);
4524 
4525 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
4526 									std::string& out_interface);
4527 
4528 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4529 
4530 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4531 	virtual glw::GLuint getTestCaseNumber();
4532 	virtual bool verifyBuffers(bufferCollection& buffers);
4533 
4534 private:
4535 	enum test_cases
4536 	{
4537 		TEST_VS = 0,
4538 		TEST_TES,
4539 		TEST_GS,
4540 
4541 		/* */
4542 		TEST_MAX
4543 	};
4544 };
4545 
4546 /** Implementation of test XFBCaptureInactiveOutputBlockMember. Description follows:
4547  *
4548  * Test verifies behaviour of inactive block member.
4549  *
4550  * This test implements Buffer algorithm. Rasterization can be disabled. Draw
4551  * two vertices instead of one. Test following code snippet:
4552  *
4553  *     layout (xfb_offset = 16)  out Goku {
4554  *         vec4 gohan;
4555  *         vec4 goten;
4556  *         vec4 chichi;
4557  *     };
4558  *
4559  *     gohan  = EXPECTED_VALUE;
4560  *     chichi = EXPECTED_VALUE;
4561  *
4562  * Test pass when captured values of gohan and chichi match expected values.
4563  * It is expected that goten will receive undefined value.
4564  *
4565  * Test all shader stages.
4566  **/
4567 class XFBCaptureInactiveOutputBlockMemberTest : public BufferTestBase
4568 {
4569 public:
4570 	XFBCaptureInactiveOutputBlockMemberTest(deqp::Context& context);
4571 
~XFBCaptureInactiveOutputBlockMemberTest()4572 	~XFBCaptureInactiveOutputBlockMemberTest()
4573 	{
4574 	}
4575 
4576 protected:
4577 	/* Protected methods */
4578 	using BufferTestBase::executeDrawCall;
4579 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
4580 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
4581 
4582 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
4583 							   std::string& out_calculations);
4584 
4585 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
4586 									std::string& out_interface);
4587 
4588 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4589 
4590 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4591 	virtual glw::GLuint getTestCaseNumber();
4592 	virtual bool verifyBuffers(bufferCollection& buffers);
4593 
4594 private:
4595 	enum test_cases
4596 	{
4597 		TEST_VS = 0,
4598 		TEST_TES,
4599 		TEST_GS,
4600 
4601 		/* */
4602 		TEST_MAX
4603 	};
4604 };
4605 
4606 /** Implementation of test XFBCaptureStruct. Description follows:
4607  *
4608  * Test verifies that structures are captured as expected.
4609  *
4610  * This test implements Buffer algorithm. Rasterization can be disabled. Draw
4611  * two vertices instead of one. Test following code snippet:
4612  *
4613  *     struct Goku {
4614  *         vec4 gohan;
4615  *         vec4 goten;
4616  *         vec4 chichi;
4617  *     };
4618  *
4619  *     layout (xfb_offset = 16) out Goku goku;
4620  *
4621  *     goku.gohan  = EXPECTED_VALUE;
4622  *     goku.chichi = EXPECTED_VALUE;
4623  *
4624  * Test pass when captured values of gohan and chichi match expected values.
4625  * It is expected that goten will receive undefined value.
4626  *
4627  * Test all shader stages.
4628  **/
4629 class XFBCaptureStructTest : public BufferTestBase
4630 {
4631 public:
4632 	XFBCaptureStructTest(deqp::Context& context);
4633 
~XFBCaptureStructTest()4634 	~XFBCaptureStructTest()
4635 	{
4636 	}
4637 
4638 protected:
4639 	/* Protected methods */
4640 	using BufferTestBase::executeDrawCall;
4641 	virtual bool executeDrawCall(bool tesEnabled, glw::GLuint test_case_index);
4642 
4643 	virtual void getBufferDescriptors(glw::GLuint test_case_index, bufferDescriptor::Vector& out_descriptors);
4644 
4645 	virtual void getShaderBody(glw::GLuint test_case_index, Utils::Shader::STAGES stage, std::string& out_assignments,
4646 							   std::string& out_calculations);
4647 
4648 	virtual void getShaderInterface(glw::GLuint test_case_index, Utils::Shader::STAGES stage,
4649 									std::string& out_interface);
4650 
4651 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4652 
4653 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4654 	virtual glw::GLuint getTestCaseNumber();
4655 	virtual bool verifyBuffers(bufferCollection& buffers);
4656 
4657 private:
4658 	enum test_cases
4659 	{
4660 		TEST_VS = 0,
4661 		TEST_TES,
4662 		TEST_GS,
4663 
4664 		/* */
4665 		TEST_MAX
4666 	};
4667 };
4668 
4669 /** Implementation of test XFBCaptureUnsizedArray. Description follows:
4670  *
4671  * Test verifies this is not allowed to qualify unsized array with "xfb".
4672  *
4673  * Test following code snippet:
4674  *
4675  *     layout (xfb_offset = 0) out vec4 goku[];
4676  *
4677  *     goku[0] = EXPECTED_VALUE;
4678  *
4679  * It is expected that compilation will fail.
4680  *
4681  * Test all shader stages.
4682  **/
4683 class XFBCaptureUnsizedArrayTest : public NegativeTestBase
4684 {
4685 public:
4686 	/* Public methods */
4687 	XFBCaptureUnsizedArrayTest(deqp::Context& context);
~XFBCaptureUnsizedArrayTest()4688 	virtual ~XFBCaptureUnsizedArrayTest()
4689 	{
4690 	}
4691 
4692 protected:
4693 	/* Methods to be implemented by child class */
4694 	virtual std::string getShaderSource(glw::GLuint test_case_index, Utils::Shader::STAGES stage);
4695 
4696 	virtual std::string getTestCaseName(glw::GLuint test_case_index);
4697 	virtual glw::GLuint getTestCaseNumber();
4698 	virtual bool isComputeRelevant(glw::GLuint test_case_index);
4699 	virtual void testInit();
4700 
4701 private:
4702 	/* Private types */
4703 	struct testCase
4704 	{
4705 		Utils::Shader::STAGES m_stage;
4706 	};
4707 
4708 	/* Private fields */
4709 	std::vector<testCase> m_test_cases;
4710 };
4711 
4712 } /* EnhancedLayouts namespace */
4713 
4714 /** Group class for Shader Language 420Pack conformance tests */
4715 class EnhancedLayoutsTests : public deqp::TestCaseGroup
4716 {
4717 public:
4718 	/* Public methods */
4719 	EnhancedLayoutsTests(deqp::Context& context);
4720 
~EnhancedLayoutsTests(void)4721 	virtual ~EnhancedLayoutsTests(void)
4722 	{
4723 	}
4724 
4725 	virtual void init(void);
4726 
4727 private:
4728 	/* Private methods */
4729 	EnhancedLayoutsTests(const EnhancedLayoutsTests& other);
4730 	EnhancedLayoutsTests& operator=(const EnhancedLayoutsTests& other);
4731 };
4732 
4733 } // gl4cts
4734 
4735 #endif // _GL4CENHANCEDLAYOUTSTESTS_HPP
4736