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