1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2014-2016 The Khronos Group Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */ /*!
20  * \file
21  * \brief
22  */ /*-------------------------------------------------------------------*/
23 
24 #include "esextcTessellationShaderErrors.hpp"
25 #include "gluContextInfo.hpp"
26 #include "gluDefs.hpp"
27 #include "glwEnums.hpp"
28 #include "glwFunctions.hpp"
29 #include "tcuTestLog.hpp"
30 #include <cstdarg>
31 #include <cstdio>
32 #include <cstring>
33 
34 namespace glcts
35 {
36 
37 /** Constructor
38  *
39  * @param context       Test context
40  * @param name          Test case's name
41  * @param description   Test case's description
42  **/
TessellationShaderErrors(Context & context,const ExtParameters & extParams)43 TessellationShaderErrors::TessellationShaderErrors(Context& context, const ExtParameters& extParams)
44 	: TestCaseGroupBase(context, extParams, "compilation_and_linking_errors",
45 						"Checks that the implementation correctly responds to"
46 						"various errors in shaders which should result in compilation"
47 						"or linking errors")
48 {
49 	/* Left blank on purpose */
50 }
51 
52 /* Instantiates all tests and adds them as children to the node */
init(void)53 void TessellationShaderErrors::init(void)
54 {
55 	addChild(new glcts::TessellationShaderError1InputBlocks(m_context, m_extParams));
56 	addChild(new glcts::TessellationShaderError1InputVariables(m_context, m_extParams));
57 	addChild(new glcts::TessellationShaderError2OutputBlocks(m_context, m_extParams));
58 	addChild(new glcts::TessellationShaderError2OutputVariables(m_context, m_extParams));
59 	addChild(new glcts::TessellationShaderError3InputBlocks(m_context, m_extParams));
60 	addChild(new glcts::TessellationShaderError3InputVariables(m_context, m_extParams));
61 	addChild(new glcts::TessellationShaderError4InputBlocks(m_context, m_extParams));
62 	addChild(new glcts::TessellationShaderError4InputVariables(m_context, m_extParams));
63 	addChild(new glcts::TessellationShaderError5InputBlocks(m_context, m_extParams));
64 	addChild(new glcts::TessellationShaderError5InputVariables(m_context, m_extParams));
65 	addChild(new glcts::TessellationShaderError6(m_context, m_extParams));
66 	addChild(new glcts::TessellationShaderError7(m_context, m_extParams));
67 	addChild(new glcts::TessellationShaderError8(m_context, m_extParams));
68 	addChild(new glcts::TessellationShaderError9(m_context, m_extParams));
69 	addChild(new glcts::TessellationShaderError10(m_context, m_extParams));
70 	addChild(new glcts::TessellationShaderError11(m_context, m_extParams));
71 	addChild(new glcts::TessellationShaderError12(m_context, m_extParams));
72 	addChild(new glcts::TessellationShaderError13(m_context, m_extParams));
73 }
74 
75 /** Constructor
76  *
77  * @param context       Test context
78  * @param name          Test case's name
79  * @param description   Test case's description
80  **/
TessellationShaderErrorsTestCaseBase(Context & context,const ExtParameters & extParams,const char * name,const char * description)81 TessellationShaderErrorsTestCaseBase::TessellationShaderErrorsTestCaseBase(Context&				context,
82 																		   const ExtParameters& extParams,
83 																		   const char* name, const char* description)
84 	: TestCaseBase(context, extParams, name, description)
85 	, m_fs_ids(DE_NULL)
86 	, m_n_program_objects(0)
87 	, m_po_ids(DE_NULL)
88 	, m_tc_ids(DE_NULL)
89 	, m_te_ids(DE_NULL)
90 	, m_vs_ids(DE_NULL)
91 {
92 	/* Left blank intentionally */
93 }
94 
95 /** Deinitializes all ES objects that were created for the test */
deinit()96 void TessellationShaderErrorsTestCaseBase::deinit()
97 {
98 	/* Call base class' deinit() */
99 	TestCaseBase::deinit();
100 
101 	if (!m_is_tessellation_shader_supported)
102 	{
103 		return;
104 	}
105 
106 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
107 
108 	/* Release all shader objects created for the test */
109 	for (unsigned int n_program_object = 0; n_program_object < m_n_program_objects; ++n_program_object)
110 	{
111 		if (m_fs_ids != DE_NULL && m_fs_ids[n_program_object] != 0)
112 		{
113 			gl.deleteShader(m_fs_ids[n_program_object]);
114 
115 			m_fs_ids[n_program_object] = 0;
116 		}
117 
118 		if (m_po_ids != DE_NULL && m_po_ids[n_program_object] != 0)
119 		{
120 			gl.deleteProgram(m_po_ids[n_program_object]);
121 
122 			m_po_ids[n_program_object] = 0;
123 		}
124 
125 		if (m_tc_ids != DE_NULL && m_tc_ids[n_program_object] != 0)
126 		{
127 			gl.deleteShader(m_tc_ids[n_program_object]);
128 
129 			m_tc_ids[n_program_object] = 0;
130 		}
131 
132 		if (m_te_ids != DE_NULL && m_te_ids[n_program_object] != 0)
133 		{
134 			gl.deleteShader(m_te_ids[n_program_object]);
135 
136 			m_te_ids[n_program_object] = 0;
137 		}
138 
139 		if (m_vs_ids != DE_NULL && m_vs_ids[n_program_object] != 0)
140 		{
141 			gl.deleteShader(m_vs_ids[n_program_object]);
142 
143 			m_vs_ids[n_program_object] = 0;
144 		}
145 	} /* for (all shader objects) */
146 
147 	/* Release buffers allocated for the test */
148 	if (m_fs_ids != DE_NULL)
149 	{
150 		delete[] m_fs_ids;
151 
152 		m_fs_ids = DE_NULL;
153 	}
154 
155 	if (m_po_ids != DE_NULL)
156 	{
157 		delete[] m_po_ids;
158 
159 		m_po_ids = DE_NULL;
160 	}
161 
162 	if (m_tc_ids != DE_NULL)
163 	{
164 		delete[] m_tc_ids;
165 
166 		m_tc_ids = DE_NULL;
167 	}
168 
169 	if (m_te_ids != DE_NULL)
170 	{
171 		delete[] m_te_ids;
172 
173 		m_te_ids = DE_NULL;
174 	}
175 
176 	if (m_vs_ids != DE_NULL)
177 	{
178 		delete[] m_vs_ids;
179 
180 		m_vs_ids = DE_NULL;
181 	}
182 }
183 
184 /** Executes the test.
185  *
186  *  Sets the test result to QP_TEST_RESULT_FAIL if the test failed, QP_TEST_RESULT_PASS otherwise.
187  *
188  *  Note the function throws exception should an error occur!
189  *
190  *  @return STOP if the test has finished, CONTINUE to indicate iterate() should be called once again.
191  **/
iterate()192 tcu::TestNode::IterateResult TessellationShaderErrorsTestCaseBase::iterate()
193 {
194 	/* Do not execute if required extensions are not supported. */
195 	if (!m_is_tessellation_shader_supported)
196 	{
197 		throw tcu::NotSupportedError(TESSELLATION_SHADER_EXTENSION_NOT_SUPPORTED);
198 	}
199 
200 	/* Retrieve ES entry-points */
201 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
202 
203 	/* Create as many program objects as will be needed */
204 	m_n_program_objects = getAmountOfProgramObjects();
205 	m_po_ids			= new glw::GLuint[m_n_program_objects];
206 
207 	memset(m_po_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
208 
209 	for (unsigned int n_po = 0; n_po < m_n_program_objects; ++n_po)
210 	{
211 		m_po_ids[n_po] = gl.createProgram();
212 
213 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram() failed");
214 	}
215 
216 	/* Allocate space for shader IDs */
217 	bool is_fs_used = isPipelineStageUsed(PIPELINE_STAGE_FRAGMENT);
218 	bool is_tc_used = isPipelineStageUsed(PIPELINE_STAGE_TESSELLATION_CONTROL);
219 	bool is_te_used = isPipelineStageUsed(PIPELINE_STAGE_TESSELLATION_EVALUATION);
220 	bool is_vs_used = isPipelineStageUsed(PIPELINE_STAGE_VERTEX);
221 
222 	if (is_fs_used)
223 	{
224 		m_fs_ids = new glw::GLuint[m_n_program_objects];
225 
226 		memset(m_fs_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
227 	}
228 
229 	if (is_tc_used)
230 	{
231 		m_tc_ids = new glw::GLuint[m_n_program_objects];
232 
233 		memset(m_tc_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
234 	}
235 
236 	if (is_te_used)
237 	{
238 		m_te_ids = new glw::GLuint[m_n_program_objects];
239 
240 		memset(m_te_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
241 	}
242 
243 	if (is_vs_used)
244 	{
245 		m_vs_ids = new glw::GLuint[m_n_program_objects];
246 
247 		memset(m_vs_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
248 	}
249 
250 	/* Iterate through all program objects the test wants to check */
251 	for (unsigned int n_po = 0; n_po < m_n_program_objects; ++n_po)
252 	{
253 		_linking_result expected_linking_result = getLinkingResult();
254 		bool			should_try_to_link		= true;
255 
256 		/* Iterate through all shader types */
257 		for (int stage = static_cast<int>(PIPELINE_STAGE_FIRST); stage < static_cast<int>(PIPELINE_STAGE_COUNT);
258 			 stage++)
259 		{
260 			if (!isPipelineStageUsed(static_cast<_pipeline_stage>(stage)))
261 			{
262 				continue;
263 			}
264 
265 			_compilation_result expected_compilation_result = getCompilationResult(static_cast<_pipeline_stage>(stage));
266 			std::string			so_code;
267 			glw::GLuint*		so_id_ptr = DE_NULL;
268 			std::string			so_type;
269 
270 			switch (static_cast<_pipeline_stage>(stage))
271 			{
272 			case PIPELINE_STAGE_FRAGMENT:
273 			{
274 				so_code   = getFragmentShaderCode(n_po);
275 				so_id_ptr = m_fs_ids + n_po;
276 				so_type   = "fragment";
277 
278 				break;
279 			}
280 
281 			case PIPELINE_STAGE_TESSELLATION_CONTROL:
282 			{
283 				so_code   = getTessellationControlShaderCode(n_po);
284 				so_id_ptr = m_tc_ids + n_po;
285 				so_type   = "tessellation control";
286 
287 				break;
288 			}
289 
290 			case PIPELINE_STAGE_TESSELLATION_EVALUATION:
291 			{
292 				so_code   = getTessellationEvaluationShaderCode(n_po);
293 				so_id_ptr = m_te_ids + n_po;
294 				so_type   = "tessellation evaluation";
295 
296 				break;
297 			}
298 
299 			case PIPELINE_STAGE_VERTEX:
300 			{
301 				so_code   = getVertexShaderCode(n_po);
302 				so_id_ptr = m_vs_ids + n_po;
303 				so_type   = "vertex";
304 
305 				break;
306 			}
307 
308 			default:
309 			{
310 				TCU_FAIL("Unrecognized pipeline stage");
311 			}
312 			} /* switch (stage) */
313 
314 			/* Generate the shader object */
315 			*so_id_ptr = gl.createShader(getGLEnumForPipelineStage(static_cast<_pipeline_stage>(stage)));
316 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader() failed");
317 
318 			/* Assign source code to the object */
319 			const char* so_unspecialized_code_ptr = so_code.c_str();
320 			std::string so_specialized_code		  = specializeShader(1, &so_unspecialized_code_ptr);
321 			const char* so_code_ptr				  = so_specialized_code.c_str();
322 
323 			gl.shaderSource(*so_id_ptr, 1 /* count */, &so_code_ptr, NULL /* length */);
324 			GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() failed");
325 
326 			/* Try to compile the shader object */
327 			glw::GLint compile_status = GL_FALSE;
328 
329 			gl.compileShader(*so_id_ptr);
330 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader() failed");
331 
332 			/* Retrieve the compile status and make sure it matches the desired outcome */
333 			gl.getShaderiv(*so_id_ptr, GL_COMPILE_STATUS, &compile_status);
334 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() failed");
335 
336 			m_context.getTestContext().getLog() << tcu::TestLog::Message << so_type << " shader source:\n"
337 												<< so_code_ptr << tcu::TestLog::EndMessage;
338 
339 			glw::GLint length = 0;
340 			gl.getShaderiv(*so_id_ptr, GL_INFO_LOG_LENGTH, &length);
341 			if (length > 1)
342 			{
343 				std::vector<glw::GLchar> log(length);
344 				gl.getShaderInfoLog(*so_id_ptr, length, NULL, &log[0]);
345 				m_context.getTestContext().getLog() << tcu::TestLog::Message << "shader info log\n"
346 													<< &log[0] << tcu::TestLog::EndMessage;
347 			}
348 
349 			switch (expected_compilation_result)
350 			{
351 			case COMPILATION_RESULT_CAN_FAIL:
352 			{
353 				if (compile_status == GL_FALSE)
354 				{
355 					/* OK, this is valid. However, it no longer makes sense to try to
356 					 * link the program object at this point. */
357 					should_try_to_link = false;
358 					m_context.getTestContext().getLog()
359 						<< tcu::TestLog::Message << "Compilation failed as allowed." << tcu::TestLog::EndMessage;
360 				}
361 				else
362 				{
363 					/* That's fine. */
364 					m_context.getTestContext().getLog()
365 						<< tcu::TestLog::Message << "Compilation passed as allowed." << tcu::TestLog::EndMessage;
366 				}
367 
368 				break;
369 			}
370 
371 			case COMPILATION_RESULT_MUST_FAIL:
372 			{
373 				if (compile_status == GL_TRUE)
374 				{
375 					/* Test has failed */
376 					TCU_FAIL("A shader compiled successfully, even though it should have failed "
377 							 "to do so");
378 				}
379 				else
380 				{
381 					/* OK. Mark the program object as non-linkable */
382 					should_try_to_link = false;
383 					m_context.getTestContext().getLog()
384 						<< tcu::TestLog::Message << "Compilation failed as expected." << tcu::TestLog::EndMessage;
385 				}
386 
387 				break;
388 			}
389 
390 			case COMPILATION_RESULT_MUST_SUCCEED:
391 			{
392 				if (compile_status != GL_TRUE)
393 				{
394 					/* Test has failed */
395 					TCU_FAIL("A shader failed to compile, even though it should have succeeded "
396 							 "to do so");
397 				}
398 				else
399 				{
400 					/* That's fine. */
401 					m_context.getTestContext().getLog()
402 						<< tcu::TestLog::Message << "Compilation successful as expected." << tcu::TestLog::EndMessage;
403 				}
404 
405 				break;
406 			}
407 
408 			default:
409 			{
410 				TCU_FAIL("Unrecognized expected compilation result");
411 			}
412 			} /* switch (expected_compilation_result) */
413 
414 			/* If it still makes sense to do so, attach the shader object to
415 			 * the test program object */
416 			if (should_try_to_link)
417 			{
418 				gl.attachShader(m_po_ids[n_po], *so_id_ptr);
419 				GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader() failed");
420 			}
421 		} /* for (all pipeline stages) */
422 
423 		/* If it still makes sense, try to link the program object */
424 		if (should_try_to_link)
425 		{
426 			gl.linkProgram(m_po_ids[n_po]);
427 			GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() failed");
428 
429 			/* Retrieve the link status and compare it against the expected linking result */
430 			glw::GLint link_status = GL_FALSE;
431 
432 			gl.getProgramiv(m_po_ids[n_po], GL_LINK_STATUS, &link_status);
433 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() failed");
434 
435 			glw::GLint length = 0;
436 			gl.getProgramiv(m_po_ids[n_po], GL_INFO_LOG_LENGTH, &length);
437 			if (length > 1)
438 			{
439 				std::vector<glw::GLchar> log(length);
440 				gl.getProgramInfoLog(m_po_ids[n_po], length, NULL, &log[0]);
441 				m_context.getTestContext().getLog() << tcu::TestLog::Message << "program info log\n"
442 													<< &log[0] << tcu::TestLog::EndMessage;
443 			}
444 
445 			switch (expected_linking_result)
446 			{
447 			case LINKING_RESULT_MUST_FAIL:
448 			{
449 				if (link_status != GL_FALSE)
450 				{
451 					TCU_FAIL("Program object was expected not to link but linking operation succeeded.");
452 				}
453 				else
454 				{
455 					/* That's OK */
456 					m_context.getTestContext().getLog()
457 						<< tcu::TestLog::Message << "Linking failed as expected." << tcu::TestLog::EndMessage;
458 				}
459 
460 				break;
461 			}
462 
463 			case LINKING_RESULT_MUST_SUCCEED:
464 			{
465 				if (link_status != GL_TRUE)
466 				{
467 					TCU_FAIL("Program object was expected to link successfully but linking operation failed.");
468 				}
469 				else
470 				{
471 					/* That's OK */
472 					m_context.getTestContext().getLog()
473 						<< tcu::TestLog::Message << "Linking succeeded as expected." << tcu::TestLog::EndMessage;
474 				}
475 
476 				break;
477 			}
478 
479 			default:
480 			{
481 				TCU_FAIL("Unrecognized expected linking result");
482 			}
483 			} /* switch (expected_linking_result) */
484 		}	 /* if (should_try_to_link) */
485 	}		  /* for (all program objects) */
486 
487 	/* If this point was reached, the test executed successfully */
488 	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
489 
490 	return STOP;
491 }
492 
493 /** Retrieves amount of program objects the test that should be linked for
494  *  the prupose of the test.
495  *
496  *  @return As per description.
497  */
getAmountOfProgramObjects()498 unsigned int TessellationShaderErrorsTestCaseBase::getAmountOfProgramObjects()
499 {
500 	return 1;
501 }
502 
503 /** Retrieves source code of fragment shader that should be attached to the test
504  *  program object.
505  *
506  *  @param n_program_object Index of the program object the source code should
507  *                          be returned for.
508  *
509  *  @return Fragment shader source code to be used for user-specified program object.
510  */
getFragmentShaderCode(unsigned int n_program_object)511 std::string TessellationShaderErrorsTestCaseBase::getFragmentShaderCode(unsigned int n_program_object)
512 {
513 	DE_UNREF(n_program_object);
514 
515 	return "${VERSION}\n"
516 		   "\n"
517 		   "void main()\n"
518 		   "{\n"
519 		   "}\n";
520 }
521 
522 /** Retrieves GLenum equivalent of a pipeline stage value.
523  *
524  *  Throws TestError exception if @param stage is invalid.
525  *
526  *  @param stage Pipeline stage to convert from
527  *
528  *  @return GL_*_SHADER equivalent of the user-provided value.
529  **/
getGLEnumForPipelineStage(_pipeline_stage stage)530 glw::GLenum TessellationShaderErrorsTestCaseBase::getGLEnumForPipelineStage(_pipeline_stage stage)
531 {
532 	glw::GLenum result = GL_NONE;
533 
534 	switch (stage)
535 	{
536 	case PIPELINE_STAGE_FRAGMENT:
537 		result = GL_FRAGMENT_SHADER;
538 		break;
539 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
540 		result = m_glExtTokens.TESS_CONTROL_SHADER;
541 		break;
542 	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
543 		result = m_glExtTokens.TESS_EVALUATION_SHADER;
544 		break;
545 	case PIPELINE_STAGE_VERTEX:
546 		result = GL_VERTEX_SHADER;
547 		break;
548 
549 	default:
550 	{
551 		TCU_FAIL("Unrecognized pipeline stage");
552 	}
553 	}
554 
555 	return result;
556 }
557 
558 /** Retrieves source code of vertex shader that should be attached to the test
559  *  program object.
560  *
561  *  @param n_program_object Index of the program object the source code should
562  *                          be returned for.
563  *
564  *  @return Vertex shader source code to be used for user-specified program object.
565  */
getVertexShaderCode(unsigned int n_program_object)566 std::string TessellationShaderErrorsTestCaseBase::getVertexShaderCode(unsigned int n_program_object)
567 {
568 	DE_UNREF(n_program_object);
569 
570 	return "${VERSION}\n"
571 		   "\n"
572 		   "void main()\n"
573 		   "{\n"
574 		   "}\n";
575 }
576 
577 /** Constructor
578  *
579  * @param context Test context
580  **/
TessellationShaderError1InputBlocks(Context & context,const ExtParameters & extParams)581 TessellationShaderError1InputBlocks::TessellationShaderError1InputBlocks(Context&			  context,
582 																		 const ExtParameters& extParams)
583 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_input_blocks",
584 										   "Tries to use non-arrayed per-vertex input blocks"
585 										   "in a tessellation control shader")
586 {
587 	/* Left blank on purpose */
588 }
589 
590 /** Determines what compilation result is anticipated for each of the pipeline stages.
591  *
592  *  @param pipeline_stage Pipeline stage to return compilation result for.
593  *
594  *  @return Requested compilation result.
595  **/
getCompilationResult(_pipeline_stage pipeline_stage)596 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError1InputBlocks::getCompilationResult(
597 	_pipeline_stage pipeline_stage)
598 {
599 	/* Tessellation control shader is allowed to fail to compile,
600 	 * shaders for all other stages should compile successfully
601 	 *
602 	 * NOTE: Vertex shader compilation can fail if underlying implementation does not support
603 	 *       GL_EXT_shader_io_blocks.
604 	 **/
605 	switch (pipeline_stage)
606 	{
607 	case PIPELINE_STAGE_VERTEX:
608 		return COMPILATION_RESULT_CAN_FAIL;
609 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
610 		return COMPILATION_RESULT_CAN_FAIL;
611 	default:
612 		return COMPILATION_RESULT_MUST_SUCCEED;
613 	}
614 }
615 
616 /** Determines what linking result is anticipated for all program objects created by the test.
617  *
618  *  @return Expected linking result.
619  **/
getLinkingResult()620 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError1InputBlocks::getLinkingResult()
621 {
622 	return LINKING_RESULT_MUST_FAIL;
623 }
624 
625 /** Retrieves source code of tessellation control shader that should be attached to the test
626  *  program object.
627  *
628  *  @param n_program_object Index of the program object the source code should
629  *                          be returned for.
630  *
631  *  @return Tessellation control shader source code to be used for user-specified program object.
632  */
getTessellationControlShaderCode(unsigned int n_program_object)633 std::string TessellationShaderError1InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
634 {
635 	DE_UNREF(n_program_object);
636 
637 	return "${VERSION}\n"
638 		   "\n"
639 		   "${TESSELLATION_SHADER_REQUIRE}\n"
640 		   "\n"
641 		   "layout (vertices=4) out;\n"
642 		   "\n"
643 		   /* Invalid input block declaration */
644 		   "in IN_TC\n"
645 		   "{\n"
646 		   "    vec4 test_block_field;\n"
647 		   "} test_block;\n"
648 		   "\n"
649 		   "void main()\n"
650 		   "{\n"
651 		   "    gl_out[gl_InvocationID].gl_Position = test_block.test_block_field;\n"
652 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
653 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
654 		   "    gl_TessLevelOuter[2]                = 1.0;\n"
655 		   "    gl_TessLevelOuter[3]                = 1.0;\n"
656 		   "    gl_TessLevelInner[0]                = 1.0;\n"
657 		   "    gl_TessLevelInner[1]                = 1.0;\n"
658 		   "}\n";
659 }
660 
661 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
662  *  program object.
663  *
664  *  @param n_program_object Index of the program object the source code should
665  *                          be returned for.
666  *
667  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
668  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)669 std::string TessellationShaderError1InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
670 {
671 	DE_UNREF(n_program_object);
672 
673 	return "${VERSION}\n"
674 		   "\n"
675 		   "${TESSELLATION_SHADER_REQUIRE}\n"
676 		   "\n"
677 		   "layout (quads) in;\n"
678 		   "\n"
679 		   "void main()\n"
680 		   "{\n"
681 		   "    gl_Position = gl_in[0].gl_Position;\n"
682 		   "}\n";
683 }
684 
685 /** Retrieves source code of vertex shader that should be attached to the test
686  *  program object.
687  *
688  *  @param n_program_object Index of the program object the source code should
689  *                          be returned for.
690  *
691  *  @return Vertex shader source code to be used for user-specified program object.
692  */
getVertexShaderCode(unsigned int n_program_object)693 std::string TessellationShaderError1InputBlocks::getVertexShaderCode(unsigned int n_program_object)
694 {
695 	DE_UNREF(n_program_object);
696 
697 	return "${VERSION}\n"
698 		   "\n"
699 		   "${SHADER_IO_BLOCKS_REQUIRE}\n"
700 		   "\n"
701 		   "out IN_TC\n"
702 		   "{\n"
703 		   "    vec4 test_block_field;\n"
704 		   "} test_block;\n"
705 		   "\n"
706 		   "void main()\n"
707 		   "{\n"
708 		   "    test_block.test_block_field = vec4(1.0, 2.0, 3.0, gl_VertexID);\n"
709 		   "}\n";
710 }
711 
712 /** Tells whether given pipeline stage should be used for the purpose of the test
713  *  (for all program objects).
714  *
715  *  @param Stage to query.
716  *
717  *  @return True if a shader object implementing the stage should be attached to
718  *          test program object;
719  *          False otherwise.
720  **/
isPipelineStageUsed(_pipeline_stage stage)721 bool TessellationShaderError1InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
722 {
723 	DE_UNREF(stage);
724 
725 	/* All stages used */
726 	return true;
727 }
728 
729 /** Constructor
730  *
731  * @param context Test context
732  **/
TessellationShaderError1InputVariables(Context & context,const ExtParameters & extParams)733 TessellationShaderError1InputVariables::TessellationShaderError1InputVariables(Context&				context,
734 																			   const ExtParameters& extParams)
735 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_input_variables",
736 										   "Tries to use non-arrayed per-vertex input variables"
737 										   "in a tessellation control shader")
738 {
739 	/* Left blank on purpose */
740 }
741 
742 /** Determines what compilation result is anticipated for each of the pipeline stages.
743  *
744  *  @param pipeline_stage Pipeline stage to return compilation result for.
745  *
746  *  @return Requested compilation result.
747  **/
getCompilationResult(_pipeline_stage pipeline_stage)748 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError1InputVariables::getCompilationResult(
749 	_pipeline_stage pipeline_stage)
750 {
751 	/* Tessellation control shader is allowed to fail to compile,
752 	 * shaders for all other stages should compile successfully */
753 	switch (pipeline_stage)
754 	{
755 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
756 		return COMPILATION_RESULT_CAN_FAIL;
757 	default:
758 		return COMPILATION_RESULT_MUST_SUCCEED;
759 	}
760 }
761 
762 /** Determines what linking result is anticipated for all program objects created by the test.
763  *
764  *  @return Expected linking result.
765  **/
getLinkingResult()766 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError1InputVariables::getLinkingResult()
767 {
768 	return LINKING_RESULT_MUST_FAIL;
769 }
770 
771 /** Retrieves source code of tessellation control shader that should be attached to the test
772  *  program object.
773  *
774  *  @param n_program_object Index of the program object the source code should
775  *                          be returned for.
776  *
777  *  @return Tessellation control shader source code to be used for user-specified program object.
778  */
getTessellationControlShaderCode(unsigned int n_program_object)779 std::string TessellationShaderError1InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
780 {
781 	DE_UNREF(n_program_object);
782 
783 	return "${VERSION}\n"
784 		   "\n"
785 		   "${TESSELLATION_SHADER_REQUIRE}\n"
786 		   "\n"
787 		   "layout (vertices=4) out;\n"
788 		   "\n"
789 		   /* Invalid input declaration */
790 		   "in vec4 test_field;\n"
791 		   "\n"
792 		   "void main()\n"
793 		   "{\n"
794 		   "    gl_out[gl_InvocationID].gl_Position = test_field;\n"
795 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
796 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
797 		   "    gl_TessLevelOuter[2]                = 1.0;\n"
798 		   "    gl_TessLevelOuter[3]                = 1.0;\n"
799 		   "    gl_TessLevelInner[0]                = 1.0;\n"
800 		   "    gl_TessLevelInner[1]                = 1.0;\n"
801 		   "}\n";
802 }
803 
804 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
805  *  program object.
806  *
807  *  @param n_program_object Index of the program object the source code should
808  *                          be returned for.
809  *
810  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
811  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)812 std::string TessellationShaderError1InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
813 {
814 	DE_UNREF(n_program_object);
815 
816 	return "${VERSION}\n"
817 		   "\n"
818 		   "${TESSELLATION_SHADER_REQUIRE}\n"
819 		   "\n"
820 		   "layout (quads) in;\n"
821 		   "\n"
822 		   "void main()\n"
823 		   "{\n"
824 		   "    gl_Position = gl_in[0].gl_Position;\n"
825 		   "}\n";
826 }
827 
828 /** Retrieves source code of vertex shader that should be attached to the test
829  *  program object.
830  *
831  *  @param n_program_object Index of the program object the source code should
832  *                          be returned for.
833  *
834  *  @return Vertex shader source code to be used for user-specified program object.
835  */
getVertexShaderCode(unsigned int n_program_object)836 std::string TessellationShaderError1InputVariables::getVertexShaderCode(unsigned int n_program_object)
837 {
838 	DE_UNREF(n_program_object);
839 
840 	return "${VERSION}\n"
841 		   "\n"
842 		   "out vec4 test_field;\n"
843 		   "\n"
844 		   "void main()\n"
845 		   "{\n"
846 		   "    test_field = vec4(1.0, 2.0, 3.0, gl_VertexID);\n"
847 		   "}\n";
848 }
849 
850 /** Tells whether given pipeline stage should be used for the purpose of the test
851  *  (for all program objects).
852  *
853  *  @param Stage to query.
854  *
855  *  @return True if a shader object implementing the stage should be attached to
856  *          test program object;
857  *          False otherwise.
858  **/
isPipelineStageUsed(_pipeline_stage stage)859 bool TessellationShaderError1InputVariables::isPipelineStageUsed(_pipeline_stage stage)
860 {
861 	DE_UNREF(stage);
862 
863 	/* All stages used */
864 	return true;
865 }
866 
867 /** Constructor
868  *
869  * @param context Test context
870  **/
TessellationShaderError2OutputBlocks(Context & context,const ExtParameters & extParams)871 TessellationShaderError2OutputBlocks::TessellationShaderError2OutputBlocks(Context&				context,
872 																		   const ExtParameters& extParams)
873 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_output_blocks",
874 										   "Tries to use non-arrayed per-vertex output blocks"
875 										   "in a tessellation control shader")
876 {
877 	/* Left blank on purpose */
878 }
879 
880 /** Determines what compilation result is anticipated for each of the pipeline stages.
881  *
882  *  @param pipeline_stage Pipeline stage to return compilation result for.
883  *
884  *  @return Requested compilation result.
885  **/
getCompilationResult(_pipeline_stage pipeline_stage)886 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError2OutputBlocks::getCompilationResult(
887 	_pipeline_stage pipeline_stage)
888 {
889 	/* Tessellation control shader is allowed to fail to compile,
890 	 * shaders for all other stages should compile successfully */
891 	switch (pipeline_stage)
892 	{
893 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
894 		return COMPILATION_RESULT_CAN_FAIL;
895 	default:
896 		return COMPILATION_RESULT_MUST_SUCCEED;
897 	}
898 }
899 
900 /** Determines what linking result is anticipated for all program objects created by the test.
901  *
902  *  @return Expected linking result.
903  **/
getLinkingResult()904 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError2OutputBlocks::getLinkingResult()
905 {
906 	return LINKING_RESULT_MUST_FAIL;
907 }
908 
909 /** Retrieves source code of tessellation control shader that should be attached to the test
910  *  program object.
911  *
912  *  @param n_program_object Index of the program object the source code should
913  *                          be returned for.
914  *
915  *  @return Tessellation control shader source code to be used for user-specified program object.
916  */
getTessellationControlShaderCode(unsigned int n_program_object)917 std::string TessellationShaderError2OutputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
918 {
919 	DE_UNREF(n_program_object);
920 
921 	return "${VERSION}\n"
922 		   "\n"
923 		   "${TESSELLATION_SHADER_REQUIRE}\n"
924 		   "\n"
925 		   "layout (vertices=4) out;\n"
926 		   "\n"
927 		   /* Invalid output block declaration */
928 		   "out OUT_TC\n"
929 		   "{\n"
930 		   "    vec4 test_block_field;\n"
931 		   "} test_block;\n"
932 		   "\n"
933 		   "void main()\n"
934 		   "{\n"
935 		   "    gl_out[gl_InvocationID].gl_Position = test_block.test_block_field;\n"
936 		   "    test_block.test_block_field         = gl_in[gl_InvocationID].gl_Position;\n"
937 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
938 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
939 		   "    gl_TessLevelOuter[2]                = 1.0;\n"
940 		   "    gl_TessLevelOuter[3]                = 1.0;\n"
941 		   "    gl_TessLevelInner[0]                = 1.0;\n"
942 		   "    gl_TessLevelInner[1]                = 1.0;\n"
943 		   "}\n";
944 }
945 
946 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
947  *  program object.
948  *
949  *  @param n_program_object Index of the program object the source code should
950  *                          be returned for.
951  *
952  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
953  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)954 std::string TessellationShaderError2OutputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
955 {
956 	DE_UNREF(n_program_object);
957 
958 	return "${VERSION}\n"
959 		   "\n"
960 		   "${TESSELLATION_SHADER_REQUIRE}\n"
961 		   "\n"
962 		   "layout (quads) in;\n"
963 		   "\n"
964 		   "void main()\n"
965 		   "{\n"
966 		   "    gl_Position = gl_in[0].gl_Position;\n"
967 		   "}\n";
968 }
969 
970 /** Tells whether given pipeline stage should be used for the purpose of the test
971  *  (for all program objects).
972  *
973  *  @param Stage to query.
974  *
975  *  @return True if a shader object implementing the stage should be attached to
976  *          test program object;
977  *          False otherwise.
978  **/
isPipelineStageUsed(_pipeline_stage stage)979 bool TessellationShaderError2OutputBlocks::isPipelineStageUsed(_pipeline_stage stage)
980 {
981 	DE_UNREF(stage);
982 
983 	/* All stages used */
984 	return true;
985 }
986 
987 /** Constructor
988  *
989  * @param context Test context
990  **/
TessellationShaderError2OutputVariables(Context & context,const ExtParameters & extParams)991 TessellationShaderError2OutputVariables::TessellationShaderError2OutputVariables(Context&			  context,
992 																				 const ExtParameters& extParams)
993 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_output_variabless",
994 										   "Tries to use non-arrayed per-vertex output variables"
995 										   "in a tessellation control shader")
996 {
997 	/* Left blank on purpose */
998 }
999 
1000 /** Determines what compilation result is anticipated for each of the pipeline stages.
1001  *
1002  *  @param pipeline_stage Pipeline stage to return compilation result for.
1003  *
1004  *  @return Requested compilation result.
1005  **/
getCompilationResult(_pipeline_stage pipeline_stage)1006 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError2OutputVariables::getCompilationResult(
1007 	_pipeline_stage pipeline_stage)
1008 {
1009 	/* Tessellation control shader is allowed to fail to compile,
1010 	 * shaders for all other stages should compile successfully */
1011 	switch (pipeline_stage)
1012 	{
1013 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
1014 		return COMPILATION_RESULT_CAN_FAIL;
1015 	default:
1016 		return COMPILATION_RESULT_MUST_SUCCEED;
1017 	}
1018 }
1019 
1020 /** Determines what linking result is anticipated for all program objects created by the test.
1021  *
1022  *  @return Expected linking result.
1023  **/
getLinkingResult()1024 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError2OutputVariables::getLinkingResult()
1025 {
1026 	return LINKING_RESULT_MUST_FAIL;
1027 }
1028 
1029 /** Retrieves source code of tessellation control shader that should be attached to the test
1030  *  program object.
1031  *
1032  *  @param n_program_object Index of the program object the source code should
1033  *                          be returned for.
1034  *
1035  *  @return Tessellation control shader source code to be used for user-specified program object.
1036  */
getTessellationControlShaderCode(unsigned int n_program_object)1037 std::string TessellationShaderError2OutputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
1038 {
1039 	DE_UNREF(n_program_object);
1040 
1041 	return "${VERSION}\n"
1042 		   "\n"
1043 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1044 		   "\n"
1045 		   "layout (vertices=4) out;\n"
1046 		   "\n"
1047 		   /* Invalid output declaration */
1048 		   "out vec4 test_field;\n"
1049 		   "\n"
1050 		   "void main()\n"
1051 		   "{\n"
1052 		   "    gl_out[gl_InvocationID].gl_Position = vec4(2.0);\n"
1053 		   "    test_field                          = vec4(3.0);\n"
1054 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
1055 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
1056 		   "    gl_TessLevelOuter[2]                = 1.0;\n"
1057 		   "    gl_TessLevelOuter[3]                = 1.0;\n"
1058 		   "    gl_TessLevelInner[0]                = 1.0;\n"
1059 		   "    gl_TessLevelInner[1]                = 1.0;\n"
1060 		   "}\n";
1061 }
1062 
1063 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1064  *  program object.
1065  *
1066  *  @param n_program_object Index of the program object the source code should
1067  *                          be returned for.
1068  *
1069  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1070  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1071 std::string TessellationShaderError2OutputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1072 {
1073 	DE_UNREF(n_program_object);
1074 
1075 	return "${VERSION}\n"
1076 		   "\n"
1077 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1078 		   "\n"
1079 		   "layout (quads) in;\n"
1080 		   "\n"
1081 		   "void main()\n"
1082 		   "{\n"
1083 		   "    gl_Position = gl_in[0].gl_Position;\n"
1084 		   "}\n";
1085 }
1086 
1087 /** Tells whether given pipeline stage should be used for the purpose of the test
1088  *  (for all program objects).
1089  *
1090  *  @param Stage to query.
1091  *
1092  *  @return True if a shader object implementing the stage should be attached to
1093  *          test program object;
1094  *          False otherwise.
1095  **/
isPipelineStageUsed(_pipeline_stage stage)1096 bool TessellationShaderError2OutputVariables::isPipelineStageUsed(_pipeline_stage stage)
1097 {
1098 	DE_UNREF(stage);
1099 
1100 	/* All stages used */
1101 	return true;
1102 }
1103 
1104 /** Constructor
1105  *
1106  * @param context Test context
1107  **/
TessellationShaderError3InputBlocks(Context & context,const ExtParameters & extParams)1108 TessellationShaderError3InputBlocks::TessellationShaderError3InputBlocks(Context&			  context,
1109 																		 const ExtParameters& extParams)
1110 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_non_arrayed_per_vertex_input_blocks",
1111 										   "Tries to use non-arrayed per-vertex input blocks"
1112 										   "in a tessellation evaluation shader")
1113 {
1114 	/* Left blank on purpose */
1115 }
1116 
1117 /** Determines what compilation result is anticipated for each of the pipeline stages.
1118  *
1119  *  @param pipeline_stage Pipeline stage to return compilation result for.
1120  *
1121  *  @return Requested compilation result.
1122  **/
getCompilationResult(_pipeline_stage pipeline_stage)1123 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError3InputBlocks::getCompilationResult(
1124 	_pipeline_stage pipeline_stage)
1125 {
1126 	/* Tessellation evaluation shader is allowed to fail to compile,
1127 	 * shaders for all other stages should compile successfully */
1128 	switch (pipeline_stage)
1129 	{
1130 	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
1131 		return COMPILATION_RESULT_CAN_FAIL;
1132 	default:
1133 		return COMPILATION_RESULT_MUST_SUCCEED;
1134 	}
1135 }
1136 
1137 /** Determines what linking result is anticipated for all program objects created by the test.
1138  *
1139  *  @return Expected linking result.
1140  **/
getLinkingResult()1141 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError3InputBlocks::getLinkingResult()
1142 {
1143 	return LINKING_RESULT_MUST_FAIL;
1144 }
1145 
1146 /** Retrieves source code of tessellation control shader that should be attached to the test
1147  *  program object.
1148  *
1149  *  @param n_program_object Index of the program object the source code should
1150  *                          be returned for.
1151  *
1152  *  @return Tessellation control shader source code to be used for user-specified program object.
1153  */
getTessellationControlShaderCode(unsigned int n_program_object)1154 std::string TessellationShaderError3InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
1155 {
1156 	DE_UNREF(n_program_object);
1157 
1158 	return "${VERSION}\n"
1159 		   "\n"
1160 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1161 		   "\n"
1162 		   "layout (vertices=4) out;\n"
1163 		   "\n"
1164 		   "out IN_TE\n"
1165 		   "{\n"
1166 		   "    vec4 test_block_field;\n"
1167 		   "} test_block[];\n"
1168 		   "\n"
1169 		   "void main()\n"
1170 		   "{\n"
1171 		   "    gl_out           [gl_InvocationID].gl_Position      = gl_in[gl_InvocationID].gl_Position;\n"
1172 		   "    test_block       [gl_InvocationID].test_block_field = vec4(2.0);\n"
1173 		   "    gl_TessLevelOuter[0]                                = 1.0;\n"
1174 		   "    gl_TessLevelOuter[1]                                = 1.0;\n"
1175 		   "    gl_TessLevelOuter[2]                                = 1.0;\n"
1176 		   "    gl_TessLevelOuter[3]                                = 1.0;\n"
1177 		   "    gl_TessLevelInner[0]                                = 1.0;\n"
1178 		   "    gl_TessLevelInner[1]                                = 1.0;\n"
1179 		   "}\n";
1180 }
1181 
1182 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1183  *  program object.
1184  *
1185  *  @param n_program_object Index of the program object the source code should
1186  *                          be returned for.
1187  *
1188  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1189  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1190 std::string TessellationShaderError3InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1191 {
1192 	DE_UNREF(n_program_object);
1193 
1194 	return "${VERSION}\n"
1195 		   "\n"
1196 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1197 		   "\n"
1198 		   "layout (quads) in;\n"
1199 		   "\n"
1200 		   /* Invalid input block declaration */
1201 		   "in IN_TE\n"
1202 		   "{\n"
1203 		   "    vec4 test_block_field;\n"
1204 		   "} test_block;\n"
1205 		   "\n"
1206 		   "void main()\n"
1207 		   "{\n"
1208 		   "    gl_Position = gl_in[0].gl_Position * test_block.test_block_field;\n"
1209 		   "}\n";
1210 }
1211 
1212 /** Tells whether given pipeline stage should be used for the purpose of the test
1213  *  (for all program objects).
1214  *
1215  *  @param Stage to query.
1216  *
1217  *  @return True if a shader object implementing the stage should be attached to
1218  *          test program object;
1219  *          False otherwise.
1220  **/
isPipelineStageUsed(_pipeline_stage stage)1221 bool TessellationShaderError3InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
1222 {
1223 	DE_UNREF(stage);
1224 
1225 	/* All stages used */
1226 	return true;
1227 }
1228 
1229 /** Constructor
1230  *
1231  * @param context Test context
1232  **/
TessellationShaderError3InputVariables(Context & context,const ExtParameters & extParams)1233 TessellationShaderError3InputVariables::TessellationShaderError3InputVariables(Context&				context,
1234 																			   const ExtParameters& extParams)
1235 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_non_arrayed_per_vertex_input_variables",
1236 										   "Tries to use non-arrayed per-vertex input variables "
1237 										   "in a tessellation evaluation shader")
1238 {
1239 	/* Left blank on purpose */
1240 }
1241 
1242 /** Determines what compilation result is anticipated for each of the pipeline stages.
1243  *
1244  *  @param pipeline_stage Pipeline stage to return compilation result for.
1245  *
1246  *  @return Requested compilation result.
1247  **/
getCompilationResult(_pipeline_stage pipeline_stage)1248 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError3InputVariables::getCompilationResult(
1249 	_pipeline_stage pipeline_stage)
1250 {
1251 	/* Tessellation evaluation shader is allowed to fail to compile,
1252 	 * shaders for all other stages should compile successfully */
1253 	switch (pipeline_stage)
1254 	{
1255 	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
1256 		return COMPILATION_RESULT_CAN_FAIL;
1257 	default:
1258 		return COMPILATION_RESULT_MUST_SUCCEED;
1259 	}
1260 }
1261 
1262 /** Determines what linking result is anticipated for all program objects created by the test.
1263  *
1264  *  @return Expected linking result.
1265  **/
getLinkingResult()1266 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError3InputVariables::getLinkingResult()
1267 {
1268 	return LINKING_RESULT_MUST_FAIL;
1269 }
1270 
1271 /** Retrieves source code of tessellation control shader that should be attached to the test
1272  *  program object.
1273  *
1274  *  @param n_program_object Index of the program object the source code should
1275  *                          be returned for.
1276  *
1277  *  @return Tessellation control shader source code to be used for user-specified program object.
1278  */
getTessellationControlShaderCode(unsigned int n_program_object)1279 std::string TessellationShaderError3InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
1280 {
1281 	DE_UNREF(n_program_object);
1282 
1283 	return "${VERSION}\n"
1284 		   "\n"
1285 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1286 		   "\n"
1287 		   "layout (vertices=4) out;\n"
1288 		   "\n"
1289 		   "out vec4 test_field[];\n"
1290 		   "\n"
1291 		   "void main()\n"
1292 		   "{\n"
1293 		   "    gl_out           [gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
1294 		   "    test_field       [gl_InvocationID]             = vec4(4.0);\n"
1295 		   "    gl_TessLevelOuter[0]                           = 1.0;\n"
1296 		   "    gl_TessLevelOuter[1]                           = 1.0;\n"
1297 		   "    gl_TessLevelOuter[2]                           = 1.0;\n"
1298 		   "    gl_TessLevelOuter[3]                           = 1.0;\n"
1299 		   "    gl_TessLevelInner[0]                           = 1.0;\n"
1300 		   "    gl_TessLevelInner[1]                           = 1.0;\n"
1301 		   "}\n";
1302 }
1303 
1304 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1305  *  program object.
1306  *
1307  *  @param n_program_object Index of the program object the source code should
1308  *                          be returned for.
1309  *
1310  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1311  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1312 std::string TessellationShaderError3InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1313 {
1314 	DE_UNREF(n_program_object);
1315 
1316 	return "${VERSION}\n"
1317 		   "\n"
1318 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1319 		   "\n"
1320 		   "layout (quads) in;\n"
1321 		   "\n"
1322 		   /* Invalid input declaration */
1323 		   "in vec4 test_field;\n"
1324 		   "\n"
1325 		   "void main()\n"
1326 		   "{\n"
1327 		   "    gl_Position = gl_in[0].gl_Position * test_field;\n"
1328 		   "}\n";
1329 }
1330 
1331 /** Tells whether given pipeline stage should be used for the purpose of the test
1332  *  (for all program objects).
1333  *
1334  *  @param Stage to query.
1335  *
1336  *  @return True if a shader object implementing the stage should be attached to
1337  *          test program object;
1338  *          False otherwise.
1339  **/
isPipelineStageUsed(_pipeline_stage stage)1340 bool TessellationShaderError3InputVariables::isPipelineStageUsed(_pipeline_stage stage)
1341 {
1342 	DE_UNREF(stage);
1343 
1344 	/* All stages used */
1345 	return true;
1346 }
1347 
1348 /** Constructor
1349  *
1350  * @param context Test context
1351  **/
TessellationShaderError4InputBlocks(Context & context,const ExtParameters & extParams)1352 TessellationShaderError4InputBlocks::TessellationShaderError4InputBlocks(Context&			  context,
1353 																		 const ExtParameters& extParams)
1354 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_array_size_used_for_input_blocks",
1355 										   "Tries to use invalid array size when defining input blocks "
1356 										   "in a tessellation control shader")
1357 {
1358 	/* Left blank on purpose */
1359 }
1360 
1361 /** Determines what compilation result is anticipated for each of the pipeline stages.
1362  *
1363  *  @param pipeline_stage Pipeline stage to return compilation result for.
1364  *
1365  *  @return Requested compilation result.
1366  **/
getCompilationResult(_pipeline_stage pipeline_stage)1367 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError4InputBlocks::getCompilationResult(
1368 	_pipeline_stage pipeline_stage)
1369 {
1370 	/* Tessellation control shader is allowed to fail to compile,
1371 	 * shaders for all other stages should compile successfully */
1372 	switch (pipeline_stage)
1373 	{
1374 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
1375 		return COMPILATION_RESULT_CAN_FAIL;
1376 	default:
1377 		return COMPILATION_RESULT_MUST_SUCCEED;
1378 	}
1379 }
1380 
1381 /** Determines what linking result is anticipated for all program objects created by the test.
1382  *
1383  *  @return Expected linking result.
1384  **/
getLinkingResult()1385 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError4InputBlocks::getLinkingResult()
1386 {
1387 	return LINKING_RESULT_MUST_FAIL;
1388 }
1389 
1390 /** Retrieves source code of tessellation control shader that should be attached to the test
1391  *  program object.
1392  *
1393  *  @param n_program_object Index of the program object the source code should
1394  *                          be returned for.
1395  *
1396  *  @return Tessellation control shader source code to be used for user-specified program object.
1397  */
getTessellationControlShaderCode(unsigned int n_program_object)1398 std::string TessellationShaderError4InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
1399 {
1400 	DE_UNREF(n_program_object);
1401 
1402 	return "${VERSION}\n"
1403 		   "\n"
1404 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1405 		   "\n"
1406 		   "layout (vertices=4) out;\n"
1407 		   "\n"
1408 		   /* Invalid input block size */
1409 		   "in IN_TC\n"
1410 		   "{\n"
1411 		   "    vec4 input_block_input;\n"
1412 		   "} input_block[11];\n"
1413 		   "\n"
1414 		   "void main()\n"
1415 		   "{\n"
1416 		   "    gl_out[gl_InvocationID].gl_Position = input_block[gl_InvocationID].input_block_input;\n"
1417 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
1418 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
1419 		   "}\n";
1420 }
1421 
1422 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1423  *  program object.
1424  *
1425  *  @param n_program_object Index of the program object the source code should
1426  *                          be returned for.
1427  *
1428  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1429  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1430 std::string TessellationShaderError4InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1431 {
1432 	DE_UNREF(n_program_object);
1433 
1434 	return "${VERSION}\n"
1435 		   "\n"
1436 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1437 		   "\n"
1438 		   "layout(isolines) in;\n"
1439 		   "\n"
1440 		   "void main()\n"
1441 		   "{\n"
1442 		   "    gl_Position = gl_in[0].gl_Position;\n"
1443 		   "}\n";
1444 }
1445 
1446 /** Tells whether given pipeline stage should be used for the purpose of the test
1447  *  (for all program objects).
1448  *
1449  *  @param Stage to query.
1450  *
1451  *  @return True if a shader object implementing the stage should be attached to
1452  *          test program object;
1453  *          False otherwise.
1454  **/
isPipelineStageUsed(_pipeline_stage stage)1455 bool TessellationShaderError4InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
1456 {
1457 	DE_UNREF(stage);
1458 
1459 	/* All stages used */
1460 	return true;
1461 }
1462 
1463 /** Constructor
1464  *
1465  * @param context Test context
1466  **/
TessellationShaderError4InputVariables(Context & context,const ExtParameters & extParams)1467 TessellationShaderError4InputVariables::TessellationShaderError4InputVariables(Context&				context,
1468 																			   const ExtParameters& extParams)
1469 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_array_size_used_for_input_variables",
1470 										   "Tries to use invalid array size when defining input variables"
1471 										   " in a tessellation control shader")
1472 {
1473 	/* Left blank on purpose */
1474 }
1475 
1476 /** Determines what compilation result is anticipated for each of the pipeline stages.
1477  *
1478  *  @param pipeline_stage Pipeline stage to return compilation result for.
1479  *
1480  *  @return Requested compilation result.
1481  **/
getCompilationResult(_pipeline_stage pipeline_stage)1482 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError4InputVariables::getCompilationResult(
1483 	_pipeline_stage pipeline_stage)
1484 {
1485 	/* Tessellation control shader is allowed to fail to compile,
1486 	 * shaders for all other stages should compile successfully */
1487 	switch (pipeline_stage)
1488 	{
1489 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
1490 		return COMPILATION_RESULT_CAN_FAIL;
1491 	default:
1492 		return COMPILATION_RESULT_MUST_SUCCEED;
1493 	}
1494 }
1495 
1496 /** Determines what linking result is anticipated for all program objects created by the test.
1497  *
1498  *  @return Expected linking result.
1499  **/
getLinkingResult()1500 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError4InputVariables::getLinkingResult()
1501 {
1502 	return LINKING_RESULT_MUST_FAIL;
1503 }
1504 
1505 /** Retrieves source code of tessellation control shader that should be attached to the test
1506  *  program object.
1507  *
1508  *  @param n_program_object Index of the program object the source code should
1509  *                          be returned for.
1510  *
1511  *  @return Tessellation control shader source code to be used for user-specified program object.
1512  */
getTessellationControlShaderCode(unsigned int n_program_object)1513 std::string TessellationShaderError4InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
1514 {
1515 	DE_UNREF(n_program_object);
1516 
1517 	return "${VERSION}\n"
1518 		   "\n"
1519 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1520 		   "\n"
1521 		   "layout (vertices=4) out;\n"
1522 		   "\n"
1523 		   /* Invalid array size */
1524 		   "in vec4 test_input[11];\n"
1525 		   "\n"
1526 		   "void main()\n"
1527 		   "{\n"
1528 		   "    gl_out[gl_InvocationID].gl_Position = test_input[gl_InvocationID];\n"
1529 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
1530 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
1531 		   "}\n";
1532 }
1533 
1534 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1535  *  program object.
1536  *
1537  *  @param n_program_object Index of the program object the source code should
1538  *                          be returned for.
1539  *
1540  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1541  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1542 std::string TessellationShaderError4InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1543 {
1544 	DE_UNREF(n_program_object);
1545 
1546 	return "${VERSION}\n"
1547 		   "\n"
1548 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1549 		   "\n"
1550 		   "layout(isolines) in;\n"
1551 		   "\n"
1552 		   "void main()\n"
1553 		   "{\n"
1554 		   "    gl_Position = gl_in[0].gl_Position;\n"
1555 		   "}\n";
1556 }
1557 
1558 /** Tells whether given pipeline stage should be used for the purpose of the test
1559  *  (for all program objects).
1560  *
1561  *  @param Stage to query.
1562  *
1563  *  @return True if a shader object implementing the stage should be attached to
1564  *          test program object;
1565  *          False otherwise.
1566  **/
isPipelineStageUsed(_pipeline_stage stage)1567 bool TessellationShaderError4InputVariables::isPipelineStageUsed(_pipeline_stage stage)
1568 {
1569 	DE_UNREF(stage);
1570 
1571 	/* All stages used */
1572 	return true;
1573 }
1574 
1575 /** Constructor
1576  *
1577  * @param context Test context
1578  **/
TessellationShaderError5InputBlocks(Context & context,const ExtParameters & extParams)1579 TessellationShaderError5InputBlocks::TessellationShaderError5InputBlocks(Context&			  context,
1580 																		 const ExtParameters& extParams)
1581 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_invalid_array_size_used_for_input_blocks",
1582 										   "Tries to use invalid array size when defining input "
1583 										   "blocks in a tessellation evaluation shader")
1584 {
1585 	/* Left blank on purpose */
1586 }
1587 
1588 /** Determines what compilation result is anticipated for each of the pipeline stages.
1589  *
1590  *  @param pipeline_stage Pipeline stage to return compilation result for.
1591  *
1592  *  @return Requested compilation result.
1593  **/
getCompilationResult(_pipeline_stage pipeline_stage)1594 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError5InputBlocks::getCompilationResult(
1595 	_pipeline_stage pipeline_stage)
1596 {
1597 	/* Tessellation evaluation shader is allowed to fail to compile,
1598 	 * shaders for all other stages should compile successfully */
1599 	switch (pipeline_stage)
1600 	{
1601 	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
1602 		return COMPILATION_RESULT_CAN_FAIL;
1603 	default:
1604 		return COMPILATION_RESULT_MUST_SUCCEED;
1605 	}
1606 }
1607 
1608 /** Determines what linking result is anticipated for all program objects created by the test.
1609  *
1610  *  @return Expected linking result.
1611  **/
getLinkingResult()1612 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError5InputBlocks::getLinkingResult()
1613 {
1614 	return LINKING_RESULT_MUST_FAIL;
1615 }
1616 
1617 /** Retrieves source code of tessellation control shader that should be attached to the test
1618  *  program object.
1619  *
1620  *  @param n_program_object Index of the program object the source code should
1621  *                          be returned for.
1622  *
1623  *  @return Tessellation control shader source code to be used for user-specified program object.
1624  */
getTessellationControlShaderCode(unsigned int n_program_object)1625 std::string TessellationShaderError5InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
1626 {
1627 	DE_UNREF(n_program_object);
1628 
1629 	return "${VERSION}\n"
1630 		   "\n"
1631 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1632 		   "\n"
1633 		   "layout (vertices=4) out;\n"
1634 		   "\n"
1635 		   "void main()\n"
1636 		   "{\n"
1637 		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
1638 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
1639 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
1640 		   "}\n";
1641 }
1642 
1643 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1644  *  program object.
1645  *
1646  *  @param n_program_object Index of the program object the source code should
1647  *                          be returned for.
1648  *
1649  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1650  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1651 std::string TessellationShaderError5InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1652 {
1653 	DE_UNREF(n_program_object);
1654 
1655 	return "${VERSION}\n"
1656 		   "\n"
1657 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1658 		   "\n"
1659 		   "layout(isolines) in;\n"
1660 		   "\n"
1661 		   /* Invalid input block size */
1662 		   "in IN_TC\n"
1663 		   "{\n"
1664 		   "    vec4 input_block_input;\n"
1665 		   "} input_block[11];\n"
1666 		   "\n"
1667 		   "void main()\n"
1668 		   "{\n"
1669 		   "    gl_Position = gl_in[0].gl_Position * input_block[0].input_block_input;\n"
1670 		   "}\n";
1671 }
1672 
1673 /** Tells whether given pipeline stage should be used for the purpose of the test
1674  *  (for all program objects).
1675  *
1676  *  @param Stage to query.
1677  *
1678  *  @return True if a shader object implementing the stage should be attached to
1679  *          test program object;
1680  *          False otherwise.
1681  **/
isPipelineStageUsed(_pipeline_stage stage)1682 bool TessellationShaderError5InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
1683 {
1684 	DE_UNREF(stage);
1685 
1686 	/* All stages used */
1687 	return true;
1688 }
1689 
1690 /** Constructor
1691  *
1692  * @param context Test context
1693  **/
TessellationShaderError5InputVariables(Context & context,const ExtParameters & extParams)1694 TessellationShaderError5InputVariables::TessellationShaderError5InputVariables(Context&				context,
1695 																			   const ExtParameters& extParams)
1696 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_invalid_array_size_used_for_input_variables",
1697 										   "Tries to use invalid array size when defining input "
1698 										   "variables in a tessellation evaluation shader")
1699 {
1700 	/* Left blank on purpose */
1701 }
1702 
1703 /** Determines what compilation result is anticipated for each of the pipeline stages.
1704  *
1705  *  @param pipeline_stage Pipeline stage to return compilation result for.
1706  *
1707  *  @return Requested compilation result.
1708  **/
getCompilationResult(_pipeline_stage pipeline_stage)1709 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError5InputVariables::getCompilationResult(
1710 	_pipeline_stage pipeline_stage)
1711 {
1712 	/* Tessellation evaluation shader is allowed to fail to compile,
1713 	 * shaders for all other stages should compile successfully */
1714 	switch (pipeline_stage)
1715 	{
1716 	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
1717 		return COMPILATION_RESULT_CAN_FAIL;
1718 	default:
1719 		return COMPILATION_RESULT_MUST_SUCCEED;
1720 	}
1721 }
1722 
1723 /** Determines what linking result is anticipated for all program objects created by the test.
1724  *
1725  *  @return Expected linking result.
1726  **/
getLinkingResult()1727 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError5InputVariables::getLinkingResult()
1728 {
1729 	return LINKING_RESULT_MUST_FAIL;
1730 }
1731 
1732 /** Retrieves source code of tessellation control shader that should be attached to the test
1733  *  program object.
1734  *
1735  *  @param n_program_object Index of the program object the source code should
1736  *                          be returned for.
1737  *
1738  *  @return Tessellation control shader source code to be used for user-specified program object.
1739  */
getTessellationControlShaderCode(unsigned int n_program_object)1740 std::string TessellationShaderError5InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
1741 {
1742 	DE_UNREF(n_program_object);
1743 
1744 	return "${VERSION}\n"
1745 		   "\n"
1746 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1747 		   "\n"
1748 		   "layout (vertices=4) out;\n"
1749 		   "\n"
1750 		   "void main()\n"
1751 		   "{\n"
1752 		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
1753 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
1754 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
1755 		   "}\n";
1756 }
1757 
1758 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1759  *  program object.
1760  *
1761  *  @param n_program_object Index of the program object the source code should
1762  *                          be returned for.
1763  *
1764  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1765  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1766 std::string TessellationShaderError5InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1767 {
1768 	DE_UNREF(n_program_object);
1769 
1770 	return "${VERSION}\n"
1771 		   "\n"
1772 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1773 		   "\n"
1774 		   "layout(isolines) in;\n"
1775 		   "\n"
1776 		   /* Invalid array size */
1777 		   "in vec4 test_input[11];\n"
1778 		   "\n"
1779 		   "void main()\n"
1780 		   "{\n"
1781 		   "    gl_Position = gl_in[0].gl_Position * test_input[0];\n"
1782 		   "}\n";
1783 }
1784 
1785 /** Tells whether given pipeline stage should be used for the purpose of the test
1786  *  (for all program objects).
1787  *
1788  *  @param Stage to query.
1789  *
1790  *  @return True if a shader object implementing the stage should be attached to
1791  *          test program object;
1792  *          False otherwise.
1793  **/
isPipelineStageUsed(_pipeline_stage stage)1794 bool TessellationShaderError5InputVariables::isPipelineStageUsed(_pipeline_stage stage)
1795 {
1796 	DE_UNREF(stage);
1797 
1798 	/* All stages used */
1799 	return true;
1800 }
1801 
1802 /** Constructor
1803  *
1804  * @param context Test context
1805  **/
TessellationShaderError6(Context & context,const ExtParameters & extParams)1806 TessellationShaderError6::TessellationShaderError6(Context& context, const ExtParameters& extParams)
1807 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_output_patch_vertex_count",
1808 										   "Tries to use invalid output patch vertex count in"
1809 										   " a tessellation control shader")
1810 {
1811 	/* Left blank on purpose */
1812 }
1813 
1814 /** Retrieves amount of program objects the test that should be linked for
1815  *  the prupose of the test.
1816  *
1817  *  @return As per description.
1818  */
getAmountOfProgramObjects()1819 unsigned int TessellationShaderError6::getAmountOfProgramObjects()
1820 {
1821 	return 2;
1822 }
1823 
1824 /** Determines what compilation result is anticipated for each of the pipeline stages.
1825  *
1826  *  @param pipeline_stage Pipeline stage to return compilation result for.
1827  *
1828  *  @return Requested compilation result.
1829  **/
getCompilationResult(_pipeline_stage pipeline_stage)1830 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError6::getCompilationResult(
1831 	_pipeline_stage pipeline_stage)
1832 {
1833 	/* Tessellation control shader is allowed to fail to compile */
1834 	switch (pipeline_stage)
1835 	{
1836 	case PIPELINE_STAGE_TESSELLATION_CONTROL:
1837 		return COMPILATION_RESULT_CAN_FAIL;
1838 	default:
1839 		return COMPILATION_RESULT_MUST_SUCCEED;
1840 	}
1841 }
1842 
1843 /** Determines what linking result is anticipated for all program objects created by the test.
1844  *
1845  *  @return Expected linking result.
1846  **/
getLinkingResult()1847 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError6::getLinkingResult()
1848 {
1849 	return LINKING_RESULT_MUST_FAIL;
1850 }
1851 
1852 /** Retrieves source code of tessellation control shader that should be attached to the test
1853  *  program object.
1854  *
1855  *  @param n_program_object Index of the program object the source code should
1856  *                          be returned for.
1857  *
1858  *  @return Tessellation control shader source code to be used for user-specified program object.
1859  */
getTessellationControlShaderCode(unsigned int n_program_object)1860 std::string TessellationShaderError6::getTessellationControlShaderCode(unsigned int n_program_object)
1861 {
1862 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1863 	std::stringstream	 result;
1864 	const char*			  tc_code_preamble = "${VERSION}\n"
1865 								   "\n"
1866 								   "${TESSELLATION_SHADER_REQUIRE}\n"
1867 								   "\n";
1868 	const char* tc_code_body_excl_layout_qualifiers = "\n"
1869 													  "in vec4 test_input[];\n"
1870 													  "\n"
1871 													  "void main()\n"
1872 													  "{\n"
1873 													  "    gl_out[gl_InvocationID].gl_Position = test_input[0];\n"
1874 													  "    gl_TessLevelOuter[0]                = 1.0;\n"
1875 													  "    gl_TessLevelOuter[1]                = 1.0;\n"
1876 													  "}\n";
1877 
1878 	/* Prepare the line with layout qualifier */
1879 	std::stringstream tc_code_layout_qualifier_sstream;
1880 	std::string		  tc_code_layout_qualifier_string;
1881 
1882 	if (n_program_object == 0)
1883 	{
1884 		tc_code_layout_qualifier_string = "layout (vertices = 0) out;\n";
1885 	}
1886 	else
1887 	{
1888 		/* Retrieve GL_MAX_PATCH_VERTICES_EXT value first */
1889 		glw::GLint gl_max_patch_vertices_value = 0;
1890 
1891 		gl.getIntegerv(m_glExtTokens.MAX_PATCH_VERTICES, &gl_max_patch_vertices_value);
1892 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_PATCH_VERTICES_EXT pname");
1893 
1894 		/* Construct the string */
1895 		tc_code_layout_qualifier_sstream << "layout (vertices = " << (gl_max_patch_vertices_value + 1) << ") out;\n";
1896 
1897 		tc_code_layout_qualifier_string = tc_code_layout_qualifier_sstream.str();
1898 	}
1899 
1900 	result << tc_code_preamble << tc_code_layout_qualifier_string << tc_code_body_excl_layout_qualifiers;
1901 
1902 	return result.str();
1903 }
1904 
1905 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
1906  *  program object.
1907  *
1908  *  @param n_program_object Index of the program object the source code should
1909  *                          be returned for.
1910  *
1911  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
1912  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)1913 std::string TessellationShaderError6::getTessellationEvaluationShaderCode(unsigned int n_program_object)
1914 {
1915 	DE_UNREF(n_program_object);
1916 
1917 	return "${VERSION}\n"
1918 		   "\n"
1919 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1920 		   "\n"
1921 		   "layout(isolines) in;\n"
1922 		   "\n"
1923 		   "void main()\n"
1924 		   "{\n"
1925 		   "    gl_Position = gl_in[0].gl_Position;\n"
1926 		   "}\n";
1927 }
1928 
1929 /** Tells whether given pipeline stage should be used for the purpose of the test
1930  *  (for all program objects).
1931  *
1932  *  @param Stage to query.
1933  *
1934  *  @return True if a shader object implementing the stage should be attached to
1935  *          test program object;
1936  *          False otherwise.
1937  **/
isPipelineStageUsed(_pipeline_stage stage)1938 bool TessellationShaderError6::isPipelineStageUsed(_pipeline_stage stage)
1939 {
1940 	DE_UNREF(stage);
1941 
1942 	/* All stages used */
1943 	return true;
1944 }
1945 
1946 /** Constructor
1947  *
1948  * @param context Test context
1949  **/
TessellationShaderError7(Context & context,const ExtParameters & extParams)1950 TessellationShaderError7::TessellationShaderError7(Context& context, const ExtParameters& extParams)
1951 	: TessellationShaderErrorsTestCaseBase(context, extParams,
1952 										   "tc_invalid_write_operation_at_non_gl_invocation_id_index",
1953 										   "Tries to write to a per-vertex output variable at index"
1954 										   " which is not equal to gl_InvocationID")
1955 {
1956 	/* Left blank on purpose */
1957 }
1958 
1959 /** Determines what compilation result is anticipated for each of the pipeline stages.
1960  *
1961  *  @param pipeline_stage Pipeline stage to return compilation result for.
1962  *
1963  *  @return Requested compilation result.
1964  **/
getCompilationResult(_pipeline_stage pipeline_stage)1965 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError7::getCompilationResult(
1966 	_pipeline_stage pipeline_stage)
1967 {
1968 	/* TC stage should _may_ fail to compile (but linking *must* fail) */
1969 	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_CONTROL) ? COMPILATION_RESULT_CAN_FAIL :
1970 																	 COMPILATION_RESULT_MUST_SUCCEED;
1971 }
1972 
1973 /** Determines what linking result is anticipated for all program objects created by the test.
1974  *
1975  *  @return Expected linking result.
1976  **/
getLinkingResult()1977 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError7::getLinkingResult()
1978 {
1979 	return LINKING_RESULT_MUST_FAIL;
1980 }
1981 
1982 /** Retrieves source code of tessellation control shader that should be attached to the test
1983  *  program object.
1984  *
1985  *  @param n_program_object Index of the program object the source code should
1986  *                          be returned for.
1987  *
1988  *  @return Tessellation control shader source code to be used for user-specified program object.
1989  */
getTessellationControlShaderCode(unsigned int n_program_object)1990 std::string TessellationShaderError7::getTessellationControlShaderCode(unsigned int n_program_object)
1991 {
1992 	DE_UNREF(n_program_object);
1993 
1994 	return "${VERSION}\n"
1995 		   "\n"
1996 		   "${TESSELLATION_SHADER_REQUIRE}\n"
1997 		   "\n"
1998 		   "layout (vertices=4) out;\n"
1999 		   "\n"
2000 		   "out vec4 test[];\n"
2001 		   "\n"
2002 		   "void main()\n"
2003 		   "{\n"
2004 		   "    gl_out[2].gl_Position = gl_in[0].gl_Position;\n"
2005 		   "    test[2]               = gl_in[1].gl_Position;\n"
2006 		   "}\n";
2007 }
2008 
2009 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2010  *  program object.
2011  *
2012  *  @param n_program_object Index of the program object the source code should
2013  *                          be returned for.
2014  *
2015  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2016  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2017 std::string TessellationShaderError7::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2018 {
2019 	DE_UNREF(n_program_object);
2020 
2021 	return "${VERSION}\n"
2022 		   "\n"
2023 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2024 		   "\n"
2025 		   "layout (quads) in;\n"
2026 		   "\n"
2027 		   "void main()\n"
2028 		   "{\n"
2029 		   "    gl_Position = gl_in[0].gl_Position;\n"
2030 		   "}\n";
2031 }
2032 
2033 /** Tells whether given pipeline stage should be used for the purpose of the test
2034  *  (for all program objects).
2035  *
2036  *  @param Stage to query.
2037  *
2038  *  @return True if a shader object implementing the stage should be attached to
2039  *          test program object;
2040  *          False otherwise.
2041  **/
isPipelineStageUsed(_pipeline_stage stage)2042 bool TessellationShaderError7::isPipelineStageUsed(_pipeline_stage stage)
2043 {
2044 	DE_UNREF(stage);
2045 
2046 	/* All stages used */
2047 	return true;
2048 }
2049 
2050 /** Constructor
2051  *
2052  * @param context Test context
2053  **/
TessellationShaderError8(Context & context,const ExtParameters & extParams)2054 TessellationShaderError8::TessellationShaderError8(Context& context, const ExtParameters& extParams)
2055 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_input_per_patch_attribute_definition",
2056 										   "Tries to define input per-patch attributes in "
2057 										   "a tessellation control shader")
2058 {
2059 	/* Left blank on purpose */
2060 }
2061 
2062 /** Determines what compilation result is anticipated for each of the pipeline stages.
2063  *
2064  *  @param pipeline_stage Pipeline stage to return compilation result for.
2065  *
2066  *  @return Requested compilation result.
2067  **/
getCompilationResult(_pipeline_stage pipeline_stage)2068 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError8::getCompilationResult(
2069 	_pipeline_stage pipeline_stage)
2070 {
2071 	/* TC stage should never compile, all stages are out of scope */
2072 	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_CONTROL) ? COMPILATION_RESULT_MUST_FAIL :
2073 																	 COMPILATION_RESULT_UNKNOWN;
2074 }
2075 
2076 /** Determines what linking result is anticipated for all program objects created by the test.
2077  *
2078  *  @return Expected linking result.
2079  **/
getLinkingResult()2080 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError8::getLinkingResult()
2081 {
2082 	return LINKING_RESULT_MUST_FAIL;
2083 }
2084 
2085 /** Retrieves source code of tessellation control shader that should be attached to the test
2086  *  program object.
2087  *
2088  *  @param n_program_object Index of the program object the source code should
2089  *                          be returned for.
2090  *
2091  *  @return Tessellation control shader source code to be used for user-specified program object.
2092  */
getTessellationControlShaderCode(unsigned int n_program_object)2093 std::string TessellationShaderError8::getTessellationControlShaderCode(unsigned int n_program_object)
2094 {
2095 	DE_UNREF(n_program_object);
2096 
2097 	return "${VERSION}\n"
2098 		   "\n"
2099 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2100 		   "\n"
2101 		   "layout (vertices=4) out;\n"
2102 		   "\n"
2103 		   "patch in vec4 test;\n"
2104 		   "\n"
2105 		   "void main()\n"
2106 		   "{\n"
2107 		   "    gl_out[gl_InvocationID].gl_Position = test;\n"
2108 		   "}\n";
2109 }
2110 
2111 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2112  *  program object.
2113  *
2114  *  @param n_program_object Index of the program object the source code should
2115  *                          be returned for.
2116  *
2117  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2118  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2119 std::string TessellationShaderError8::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2120 {
2121 	DE_UNREF(n_program_object);
2122 
2123 	/* This function should never be called */
2124 	DE_ASSERT(false);
2125 
2126 	return "";
2127 }
2128 
2129 /** Tells whether given pipeline stage should be used for the purpose of the test
2130  *  (for all program objects).
2131  *
2132  *  @param Stage to query.
2133  *
2134  *  @return True if a shader object implementing the stage should be attached to
2135  *          test program object;
2136  *          False otherwise.
2137  **/
isPipelineStageUsed(_pipeline_stage stage)2138 bool TessellationShaderError8::isPipelineStageUsed(_pipeline_stage stage)
2139 {
2140 	/* Only TC stage is used */
2141 	return (stage == PIPELINE_STAGE_TESSELLATION_CONTROL);
2142 }
2143 
2144 /** Constructor
2145  *
2146  * @param context Test context
2147  **/
TessellationShaderError9(Context & context,const ExtParameters & extParams)2148 TessellationShaderError9::TessellationShaderError9(Context& context, const ExtParameters& extParams)
2149 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_invalid_output_per_patch_attribute_definition",
2150 										   "Tries to define output per-patch attributes in "
2151 										   "a tessellation evaluation shader")
2152 {
2153 	/* Left blank on purpose */
2154 }
2155 
2156 /** Determines what compilation result is anticipated for each of the pipeline stages.
2157  *
2158  *  @param pipeline_stage Pipeline stage to return compilation result for.
2159  *
2160  *  @return Requested compilation result.
2161  **/
getCompilationResult(_pipeline_stage pipeline_stage)2162 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError9::getCompilationResult(
2163 	_pipeline_stage pipeline_stage)
2164 {
2165 	/* TE stage should never compile, all stages are out of scope */
2166 	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_EVALUATION) ? COMPILATION_RESULT_MUST_FAIL :
2167 																		COMPILATION_RESULT_UNKNOWN;
2168 }
2169 
2170 /** Determines what linking result is anticipated for all program objects created by the test.
2171  *
2172  *  @return Expected linking result.
2173  **/
getLinkingResult()2174 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError9::getLinkingResult()
2175 {
2176 	return LINKING_RESULT_MUST_FAIL;
2177 }
2178 
2179 /** Retrieves source code of tessellation control shader that should be attached to the test
2180  *  program object.
2181  *
2182  *  @param n_program_object Index of the program object the source code should
2183  *                          be returned for.
2184  *
2185  *  @return Tessellation control shader source code to be used for user-specified program object.
2186  */
getTessellationControlShaderCode(unsigned int n_program_object)2187 std::string TessellationShaderError9::getTessellationControlShaderCode(unsigned int n_program_object)
2188 {
2189 	DE_UNREF(n_program_object);
2190 
2191 	/* This function should never be called */
2192 	DE_ASSERT(false);
2193 
2194 	return "";
2195 }
2196 
2197 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2198  *  program object.
2199  *
2200  *  @param n_program_object Index of the program object the source code should
2201  *                          be returned for.
2202  *
2203  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2204  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2205 std::string TessellationShaderError9::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2206 {
2207 	DE_UNREF(n_program_object);
2208 
2209 	return "${VERSION}\n"
2210 		   "\n"
2211 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2212 		   "\n"
2213 		   "layout (isolines) in;\n"
2214 		   "\n"
2215 		   "patch out vec4 test;\n"
2216 		   "\n"
2217 		   "void main()\n"
2218 		   "{\n"
2219 		   "    gl_Position = vec4(1.0, 0.0, 0.0, 0.0);\n"
2220 		   "    test        = vec4(0.0, 1.0, 0.0, 0.0);\n"
2221 		   "}\n";
2222 }
2223 
2224 /** Tells whether given pipeline stage should be used for the purpose of the test
2225  *  (for all program objects).
2226  *
2227  *  @param Stage to query.
2228  *
2229  *  @return True if a shader object implementing the stage should be attached to
2230  *          test program object;
2231  *          False otherwise.
2232  **/
isPipelineStageUsed(_pipeline_stage stage)2233 bool TessellationShaderError9::isPipelineStageUsed(_pipeline_stage stage)
2234 {
2235 	/* Only TE stage is used */
2236 	return (stage == PIPELINE_STAGE_TESSELLATION_EVALUATION);
2237 }
2238 
2239 /** Constructor
2240  *
2241  * @param context Test context
2242  **/
TessellationShaderError10(Context & context,const ExtParameters & extParams)2243 TessellationShaderError10::TessellationShaderError10(Context& context, const ExtParameters& extParams)
2244 	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_matching_variable_declarations",
2245 										   "Tries to define variables of different types/qualifications"
2246 										   " in tessellation control and tessellation evaluation shaders")
2247 {
2248 	/* Left blank on purpose */
2249 }
2250 
2251 /** Determines what compilation result is anticipated for each of the pipeline stages.
2252  *
2253  *  @param pipeline_stage Pipeline stage to return compilation result for.
2254  *
2255  *  @return Requested compilation result.
2256  **/
getCompilationResult(_pipeline_stage pipeline_stage)2257 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError10::getCompilationResult(
2258 	_pipeline_stage pipeline_stage)
2259 {
2260 	DE_UNREF(pipeline_stage);
2261 	/* All stages should compile */
2262 	return COMPILATION_RESULT_MUST_SUCCEED;
2263 }
2264 
2265 /** Determines what linking result is anticipated for all program objects created by the test.
2266  *
2267  *  @return Expected linking result.
2268  **/
getLinkingResult()2269 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError10::getLinkingResult()
2270 {
2271 	return LINKING_RESULT_MUST_FAIL;
2272 }
2273 
2274 /** Retrieves source code of tessellation control shader that should be attached to the test
2275  *  program object.
2276  *
2277  *  @param n_program_object Index of the program object the source code should
2278  *                          be returned for.
2279  *
2280  *  @return Tessellation control shader source code to be used for user-specified program object.
2281  */
getTessellationControlShaderCode(unsigned int n_program_object)2282 std::string TessellationShaderError10::getTessellationControlShaderCode(unsigned int n_program_object)
2283 {
2284 	DE_UNREF(n_program_object);
2285 
2286 	return "${VERSION}\n"
2287 		   "\n"
2288 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2289 		   "\n"
2290 		   "layout (vertices=4) out;\n"
2291 		   "\n"
2292 		   "patch out float test;\n"
2293 		   "patch out vec4  test2;\n"
2294 		   "\n"
2295 		   "void main()\n"
2296 		   "{\n"
2297 		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
2298 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
2299 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
2300 		   "    test                                = 1.0;\n"
2301 		   "    test2                               = vec4(0.1, 0.2, 0.3, 0.4);\n"
2302 		   "}\n";
2303 }
2304 
2305 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2306  *  program object.
2307  *
2308  *  @param n_program_object Index of the program object the source code should
2309  *                          be returned for.
2310  *
2311  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2312  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2313 std::string TessellationShaderError10::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2314 {
2315 	DE_UNREF(n_program_object);
2316 
2317 	return "${VERSION}\n"
2318 		   "\n"
2319 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2320 		   "\n"
2321 		   "layout(isolines) in;\n"
2322 		   "\n"
2323 		   "patch in uint  test;\n"
2324 		   "patch in float test2;\n"
2325 		   "\n"
2326 		   "void main()\n"
2327 		   "{\n"
2328 		   "    gl_Position = gl_in[0].gl_Position * float(int(test)) * vec4(test2);\n"
2329 		   "}\n";
2330 }
2331 
2332 /** Tells whether given pipeline stage should be used for the purpose of the test
2333  *  (for all program objects).
2334  *
2335  *  @param Stage to query.
2336  *
2337  *  @return True if a shader object implementing the stage should be attached to
2338  *          test program object;
2339  *          False otherwise.
2340  **/
isPipelineStageUsed(_pipeline_stage stage)2341 bool TessellationShaderError10::isPipelineStageUsed(_pipeline_stage stage)
2342 {
2343 	DE_UNREF(stage);
2344 
2345 	return true;
2346 }
2347 
2348 /** Constructor
2349  *
2350  * @param context Test context
2351  **/
TessellationShaderError11(Context & context,const ExtParameters & extParams)2352 TessellationShaderError11::TessellationShaderError11(Context& context, const ExtParameters& extParams)
2353 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_lacking_primitive_mode_declaration",
2354 										   "Tries to link a tessellation evaluation shader"
2355 										   " without a primitive mode declaration")
2356 {
2357 	/* Left blank on purpose */
2358 }
2359 
2360 /** Determines what compilation result is anticipated for each of the pipeline stages.
2361  *
2362  *  @param pipeline_stage Pipeline stage to return compilation result for.
2363  *
2364  *  @return Requested compilation result.
2365  **/
getCompilationResult(_pipeline_stage pipeline_stage)2366 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError11::getCompilationResult(
2367 	_pipeline_stage pipeline_stage)
2368 {
2369 	DE_UNREF(pipeline_stage);
2370 
2371 	/* All stages should compile */
2372 	return COMPILATION_RESULT_MUST_SUCCEED;
2373 }
2374 
2375 /** Determines what linking result is anticipated for all program objects created by the test.
2376  *
2377  *  @return Expected linking result.
2378  **/
getLinkingResult()2379 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError11::getLinkingResult()
2380 {
2381 	return LINKING_RESULT_MUST_FAIL;
2382 }
2383 
2384 /** Retrieves source code of tessellation control shader that should be attached to the test
2385  *  program object.
2386  *
2387  *  @param n_program_object Index of the program object the source code should
2388  *                          be returned for.
2389  *
2390  *  @return Tessellation control shader source code to be used for user-specified program object.
2391  */
getTessellationControlShaderCode(unsigned int n_program_object)2392 std::string TessellationShaderError11::getTessellationControlShaderCode(unsigned int n_program_object)
2393 {
2394 	DE_UNREF(n_program_object);
2395 
2396 	return "${VERSION}\n"
2397 		   "\n"
2398 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2399 		   "\n"
2400 		   "layout (vertices=4) out;\n"
2401 		   "\n"
2402 		   "void main()\n"
2403 		   "{\n"
2404 		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
2405 		   "    gl_TessLevelInner[0]                = 1.0;\n"
2406 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
2407 		   "}\n";
2408 }
2409 
2410 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2411  *  program object.
2412  *
2413  *  @param n_program_object Index of the program object the source code should
2414  *                          be returned for.
2415  *
2416  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2417  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2418 std::string TessellationShaderError11::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2419 {
2420 	DE_UNREF(n_program_object);
2421 
2422 	return "${VERSION}\n"
2423 		   "\n"
2424 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2425 		   "\n"
2426 		   "void main()\n"
2427 		   "{\n"
2428 		   "    gl_Position = gl_in[0].gl_Position;\n"
2429 		   "}\n";
2430 }
2431 
2432 /** Tells whether given pipeline stage should be used for the purpose of the test
2433  *  (for all program objects).
2434  *
2435  *  @param Stage to query.
2436  *
2437  *  @return True if a shader object implementing the stage should be attached to
2438  *          test program object;
2439  *          False otherwise.
2440  **/
isPipelineStageUsed(_pipeline_stage stage)2441 bool TessellationShaderError11::isPipelineStageUsed(_pipeline_stage stage)
2442 {
2443 	DE_UNREF(stage);
2444 
2445 	return true;
2446 }
2447 
2448 /** Constructor
2449  *
2450  * @param context Test context
2451  **/
TessellationShaderError12(Context & context,const ExtParameters & extParams)2452 TessellationShaderError12::TessellationShaderError12(Context& context, const ExtParameters& extParams)
2453 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_accessing_glTessCoord_as_array",
2454 										   "Tries to access gl_TessCoord as if it was an array")
2455 {
2456 	/* Left blank on purpose */
2457 }
2458 
2459 /** Determines what compilation result is anticipated for each of the pipeline stages.
2460  *
2461  *  @param pipeline_stage Pipeline stage to return compilation result for.
2462  *
2463  *  @return Requested compilation result.
2464  **/
getCompilationResult(_pipeline_stage pipeline_stage)2465 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError12::getCompilationResult(
2466 	_pipeline_stage pipeline_stage)
2467 {
2468 	/* It is OK for TE stage to fail to compile. Other stages must compile successfully */
2469 	/* All stages should compile */
2470 	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_EVALUATION) ? COMPILATION_RESULT_CAN_FAIL :
2471 																		COMPILATION_RESULT_MUST_SUCCEED;
2472 }
2473 
2474 /** Determines what linking result is anticipated for all program objects created by the test.
2475  *
2476  *  @return Expected linking result.
2477  **/
getLinkingResult()2478 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError12::getLinkingResult()
2479 {
2480 	return LINKING_RESULT_MUST_FAIL;
2481 }
2482 
2483 /** Retrieves source code of tessellation control shader that should be attached to the test
2484  *  program object.
2485  *
2486  *  @param n_program_object Index of the program object the source code should
2487  *                          be returned for.
2488  *
2489  *  @return Tessellation control shader source code to be used for user-specified program object.
2490  */
getTessellationControlShaderCode(unsigned int n_program_object)2491 std::string TessellationShaderError12::getTessellationControlShaderCode(unsigned int n_program_object)
2492 {
2493 	DE_UNREF(n_program_object);
2494 
2495 	return "${VERSION}\n"
2496 		   "\n"
2497 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2498 		   "\n"
2499 		   "layout (vertices=4) out;\n"
2500 		   "\n"
2501 		   "void main()\n"
2502 		   "{\n"
2503 		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
2504 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
2505 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
2506 		   "}\n";
2507 }
2508 
2509 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2510  *  program object.
2511  *
2512  *  @param n_program_object Index of the program object the source code should
2513  *                          be returned for.
2514  *
2515  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2516  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2517 std::string TessellationShaderError12::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2518 {
2519 	DE_UNREF(n_program_object);
2520 
2521 	return "${VERSION}\n"
2522 		   "\n"
2523 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2524 		   "\n"
2525 		   "layout(isolines) in;\n"
2526 		   "\n"
2527 		   "out vec3 test;\n"
2528 		   "\n"
2529 		   "void main()\n"
2530 		   "{\n"
2531 		   "    test = gl_TessCoord[0].xyz;\n"
2532 		   "}\n";
2533 }
2534 
2535 /** Tells whether given pipeline stage should be used for the purpose of the test
2536  *  (for all program objects).
2537  *
2538  *  @param Stage to query.
2539  *
2540  *  @return True if a shader object implementing the stage should be attached to
2541  *          test program object;
2542  *          False otherwise.
2543  **/
isPipelineStageUsed(_pipeline_stage stage)2544 bool TessellationShaderError12::isPipelineStageUsed(_pipeline_stage stage)
2545 {
2546 	DE_UNREF(stage);
2547 
2548 	return true;
2549 }
2550 
2551 /** Constructor
2552  *
2553  * @param context Test context
2554  **/
TessellationShaderError13(Context & context,const ExtParameters & extParams)2555 TessellationShaderError13::TessellationShaderError13(Context& context, const ExtParameters& extParams)
2556 	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_accessing_glTessCoord_as_gl_in_member",
2557 										   "Tries to access gl_TessCoord as if it was a gl_in[] member")
2558 {
2559 	/* Left blank on purpose */
2560 }
2561 
2562 /** Determines what compilation result is anticipated for each of the pipeline stages.
2563  *
2564  *  @param pipeline_stage Pipeline stage to return compilation result for.
2565  *
2566  *  @return Requested compilation result.
2567  **/
getCompilationResult(_pipeline_stage pipeline_stage)2568 TessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError13::getCompilationResult(
2569 	_pipeline_stage pipeline_stage)
2570 {
2571 	/* It is OK for TE stage to fail to compile. Other stages must compile successfully */
2572 	/* All stages should compile */
2573 	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_EVALUATION) ? COMPILATION_RESULT_CAN_FAIL :
2574 																		COMPILATION_RESULT_MUST_SUCCEED;
2575 }
2576 
2577 /** Determines what linking result is anticipated for all program objects created by the test.
2578  *
2579  *  @return Expected linking result.
2580  **/
getLinkingResult()2581 TessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError13::getLinkingResult()
2582 {
2583 	return LINKING_RESULT_MUST_FAIL;
2584 }
2585 
2586 /** Retrieves source code of tessellation control shader that should be attached to the test
2587  *  program object.
2588  *
2589  *  @param n_program_object Index of the program object the source code should
2590  *                          be returned for.
2591  *
2592  *  @return Tessellation control shader source code to be used for user-specified program object.
2593  */
getTessellationControlShaderCode(unsigned int n_program_object)2594 std::string TessellationShaderError13::getTessellationControlShaderCode(unsigned int n_program_object)
2595 {
2596 	DE_UNREF(n_program_object);
2597 
2598 	return "${VERSION}\n"
2599 		   "\n"
2600 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2601 		   "\n"
2602 		   "layout (vertices=4) out;\n"
2603 		   "\n"
2604 		   "void main()\n"
2605 		   "{\n"
2606 		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
2607 		   "    gl_TessLevelOuter[0]                = 1.0;\n"
2608 		   "    gl_TessLevelOuter[1]                = 1.0;\n"
2609 		   "}\n";
2610 }
2611 
2612 /** Retrieves source code of tessellation evaluation shader that should be attached to the test
2613  *  program object.
2614  *
2615  *  @param n_program_object Index of the program object the source code should
2616  *                          be returned for.
2617  *
2618  *  @return Tessellation evaluation shader source code to be used for user-specified program object.
2619  */
getTessellationEvaluationShaderCode(unsigned int n_program_object)2620 std::string TessellationShaderError13::getTessellationEvaluationShaderCode(unsigned int n_program_object)
2621 {
2622 	DE_UNREF(n_program_object);
2623 
2624 	return "${VERSION}\n"
2625 		   "\n"
2626 		   "${TESSELLATION_SHADER_REQUIRE}\n"
2627 		   "\n"
2628 		   "layout(isolines) in;\n"
2629 		   "\n"
2630 		   "out vec3 test;\n"
2631 		   "\n"
2632 		   "void main()\n"
2633 		   "{\n"
2634 		   "    test = gl_in[0].gl_TessCoord;\n"
2635 		   "}\n";
2636 }
2637 
2638 /** Tells whether given pipeline stage should be used for the purpose of the test
2639  *  (for all program objects).
2640  *
2641  *  @param Stage to query.
2642  *
2643  *  @return True if a shader object implementing the stage should be attached to
2644  *          test program object;
2645  *          False otherwise.
2646  **/
isPipelineStageUsed(_pipeline_stage stage)2647 bool TessellationShaderError13::isPipelineStageUsed(_pipeline_stage stage)
2648 {
2649 	DE_UNREF(stage);
2650 
2651 	return true;
2652 }
2653 
2654 } /* namespace glcts */
2655