1 #ifndef _ESEXTCGEOMETRYSHADERLINKING_HPP 2 #define _ESEXTCGEOMETRYSHADERLINKING_HPP 3 /*------------------------------------------------------------------------- 4 * OpenGL Conformance Test Suite 5 * ----------------------------- 6 * 7 * Copyright (c) 2015-2016 The Khronos Group Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 */ /*! 22 * \file 23 * \brief 24 */ /*-------------------------------------------------------------------*/ 25 26 #include "../esextcTestCaseBase.hpp" 27 28 namespace glcts 29 { 30 /** Implementation of "Group 17", tests 1 & 2 from CTS_EXT_geometry_shader. Description follows: 31 * 32 * 1. Make sure that linking a program object consisting of geometry shader 33 * object only will fail, assuming the program object is not separable. 34 * 35 * Category: API; 36 * Negative Test. 37 * 38 * Create a program object and a compilable geometry shader object. 39 * 40 * Attach the geometry shader object to the program object, compile it, link 41 * the program object. 42 * 43 * The test passes if GL_LINK_STATUS for the program object is reported as 44 * GL_FALSE. 45 * 46 * Should separate shader objects be supported, the linking should pass, 47 * assuming the program object is marked as separable prior to linking. 48 * 49 * 50 * 2. Make sure that linking a program object consisting of fragment and 51 * geometry shader objects will fail, assuming the program object is not 52 * separable. 53 * 54 * Category: API; 55 * Negative Test; 56 * 57 * Create a program object and a compilable fragment & geometry shader 58 * objects. 59 * 60 * Attach the shader objects to the program object, compile them, link the 61 * program object. 62 * 63 * The test passes if GL_LINK_STATUS for the program object is reported as 64 * GL_FALSE. 65 * 66 * Should separate shader objects be supported, the linking should pass, 67 * assuming the program object is marked as separable prior to linking. 68 * 69 **/ 70 class GeometryShaderIncompleteProgramObjectsTest : public TestCaseBase 71 { 72 public: 73 /* Public methods */ 74 GeometryShaderIncompleteProgramObjectsTest(Context& context, const ExtParameters& extParams, const char* name, 75 const char* description); 76 ~GeometryShaderIncompleteProgramObjectsTest()77 virtual ~GeometryShaderIncompleteProgramObjectsTest() 78 { 79 } 80 81 virtual void deinit(void); 82 virtual IterateResult iterate(void); 83 84 private: 85 /* Private type definition */ 86 typedef struct _run 87 { 88 bool use_fs; 89 bool use_gs; 90 bool use_separable_po; 91 _runglcts::GeometryShaderIncompleteProgramObjectsTest::_run92 explicit _run(bool in_use_fs, bool in_use_gs, bool in_use_separable_po) 93 { 94 use_fs = in_use_fs; 95 use_gs = in_use_gs; 96 use_separable_po = in_use_separable_po; 97 } 98 } _run; 99 100 /* Private methods */ 101 void initShaderObjects(); 102 void initTestRuns(); 103 104 /* Private variables */ 105 glw::GLuint m_fs_id; 106 glw::GLuint m_gs_id; 107 glw::GLuint m_po_id; 108 std::vector<_run> m_test_runs; 109 }; 110 111 /* Implementation of "Group 17", test 3 from CTS_EXT_geometry_shader. Description follows: 112 * 113 * 3. Make sure that program objects with a single geometry shader do not link 114 * if any of the required geometry stage-specific information is missing. 115 * 116 * Category: API; 117 * Negative Test. 118 * 119 * Create 5 program objects and a boilerplate fragment & vertex shader 120 * objects. Consider the following cases for a geometry shader: 121 * 122 * - input primitive type is only defined; 123 * - output primitive type is only defined; 124 * - maximum output vertex count is defined; 125 * - input & output primitive types are only defined 126 * - output primitive type & maximum output vertex count are only defined; 127 * 128 * For each of these cases, create a geometry shader with corresponding 129 * implementation. Each such shader can, but does not necessarily have to, 130 * compile. Whichever be the case, the test should carry on executing. 131 * 132 * Attach aforementioned fragment & vertex shaders to each of the program 133 * objects. Attach each of the discussed geometry shaders to subsequent 134 * program objects. 135 * 136 * Test succeeds if all program objects failed to link. 137 * 138 */ 139 class GeometryShaderIncompleteGSTest : public TestCaseBase 140 { 141 public: 142 /* Public methods */ 143 GeometryShaderIncompleteGSTest(Context& context, const ExtParameters& extParams, const char* name, 144 const char* description); 145 ~GeometryShaderIncompleteGSTest()146 virtual ~GeometryShaderIncompleteGSTest() 147 { 148 } 149 150 virtual void deinit(void); 151 virtual IterateResult iterate(void); 152 153 private: 154 /* Private type definition */ 155 typedef struct _run 156 { 157 bool is_input_primitive_type_defined; 158 bool is_max_vertices_defined; 159 bool is_output_primitive_type_defined; 160 _runglcts::GeometryShaderIncompleteGSTest::_run161 explicit _run(bool in_is_input_primitive_type_defined, bool in_is_max_vertices_defined, 162 bool in_is_output_primitive_type_defined) 163 { 164 is_input_primitive_type_defined = in_is_input_primitive_type_defined; 165 is_max_vertices_defined = in_is_max_vertices_defined; 166 is_output_primitive_type_defined = in_is_output_primitive_type_defined; 167 } 168 } _run; 169 170 /* Private methods */ 171 void deinitSOs(); 172 173 std::string getGeometryShaderCode(const _run& current_run); 174 175 void initShaderObjects(const _run& current_run, bool* out_has_fs_compiled_successfully, 176 bool* out_has_gs_compiled_successfully, bool* out_has_vs_compiled_successfully); 177 178 void initTestRuns(); 179 180 /* Private variables */ 181 glw::GLuint m_fs_id; 182 glw::GLuint m_gs_id; 183 glw::GLuint m_po_id; 184 glw::GLuint m_vs_id; 185 std::vector<_run> m_test_runs; 186 }; 187 188 /* Implementation of "Group 17", test 4 from CTS_EXT_geometry_shader. Description follows: 189 * 190 * 4. Make sure linking fails if input variables of a geometry shader are 191 * declared as arrays of incorrect size. 192 * 193 * Category: API; 194 * Negative Test. 195 * 196 * Consider 5 geometry shaders, each using a different input primitive type 197 * available for geometry shader's usage. Each geometry shader should define 198 * an arrayed input variable of size N called invalid, where N is equal to: 199 * 200 * (valid size provided the input primitive type) + 1 201 * 202 * The geometry shader should output a compatible output primitive type with 203 * max count set to 1. Rest of the code can be boilerplate, but it must be 204 * valid. 205 * 206 * The vertex shader should output non-arrayed variable invalid, but the 207 * rest of the code can be boilerplate, provided it is valid. 208 * 209 * Same applies for the fragment shader. 210 * 211 * 5 program objects, each consisting of a fragment and vertex shaders, as 212 * well as unique geometry shader, should fail to link. 213 * 214 */ 215 class GeometryShaderInvalidArrayedInputVariablesTest : public TestCaseBase 216 { 217 public: 218 /* Public methods */ 219 GeometryShaderInvalidArrayedInputVariablesTest(Context& context, const ExtParameters& extParams, const char* name, 220 const char* description); 221 ~GeometryShaderInvalidArrayedInputVariablesTest()222 virtual ~GeometryShaderInvalidArrayedInputVariablesTest() 223 { 224 } 225 226 virtual void deinit(void); 227 virtual IterateResult iterate(void); 228 229 private: 230 /* Private type definition */ 231 232 /* Private methods */ 233 void deinitSOs(); 234 std::string getGSCode(glw::GLenum gs_input_primitive_type) const; 235 std::string getInputPrimitiveTypeQualifier(glw::GLenum gs_input_primitive_type) const; 236 std::string getSpecializedVSCode() const; 237 glw::GLuint getValidInputVariableArraySize(glw::GLenum gs_input_primitive_type) const; 238 239 void initShaderObjects(glw::GLenum gs_input_primitive_type, bool* out_has_fs_compiled_successfully, 240 bool* out_has_gs_compiled_successfully, bool* out_has_vs_compiled_successfully); 241 242 /* Private variables */ 243 glw::GLuint m_fs_id; 244 glw::GLuint m_gs_id; 245 glw::GLuint m_po_id; 246 glw::GLuint m_vs_id; 247 }; 248 249 /* Implementation of "Group 20", test 1 from CTS_EXT_geometry_shader. Description follows: 250 * 251 * 1. It is a linking error to declare an output variable in a vertex shader 252 * and an input variable in a geometry shader, that is of different type 253 * but has the same qualification and name. 254 * 255 * Category: API; 256 * Negative Test. 257 * 258 * Use a boilerplate vertex shader that declares the output variable 259 * described in summary, a boilerplate geometry shader that declares the 260 * input variable. A geometry shader should use a different type than the 261 * vertex shader for the variable declaration, but should use the same 262 * qualifier. 263 * 264 * A boilerplate fragment shader should be used. 265 * 266 * Linking is expect to fail under this configuration. 267 * 268 */ 269 class GeometryShaderVSGSVariableTypeMismatchTest : public TestCaseBase 270 { 271 public: 272 /* Public methods */ 273 GeometryShaderVSGSVariableTypeMismatchTest(Context& context, const ExtParameters& extParams, const char* name, 274 const char* description); 275 ~GeometryShaderVSGSVariableTypeMismatchTest()276 virtual ~GeometryShaderVSGSVariableTypeMismatchTest() 277 { 278 } 279 280 virtual void deinit(void); 281 virtual IterateResult iterate(void); 282 283 private: 284 /* Private type definition */ 285 286 /* Private methods */ 287 288 /* Private variables */ 289 glw::GLuint m_fs_id; 290 glw::GLuint m_gs_id; 291 glw::GLuint m_po_id; 292 glw::GLuint m_vs_id; 293 }; 294 295 /* Implementation of "Group 20", test 2 from CTS_EXT_geometry_shader. Description follows: 296 * 297 * 2. It is a linking error to declare an output variable in a vertex shader 298 * and an input variable in a geometry shader, that is of different 299 * qualification but has the same type and name. 300 * 301 * Category: API; 302 * Negative Test. 303 * 304 * Use a boilerplate vertex shader that declares the output variable 305 * described in summary, a boilerplate geometry shader that declares the 306 * input variable. A geometry shader should use a different qualifier than 307 * the vertex shader for the variable declaration, but should use the same 308 * type. 309 * 310 * A boilerplate fragment shader should be used. 311 * 312 * Linking is expected to fail under this configuration. 313 * 314 */ 315 class GeometryShaderVSGSVariableQualifierMismatchTest : public TestCaseBase 316 { 317 public: 318 /* Public methods */ 319 GeometryShaderVSGSVariableQualifierMismatchTest(Context& context, const ExtParameters& extParams, const char* name, 320 const char* description); 321 ~GeometryShaderVSGSVariableQualifierMismatchTest()322 virtual ~GeometryShaderVSGSVariableQualifierMismatchTest() 323 { 324 } 325 326 virtual void deinit(void); 327 virtual IterateResult iterate(void); 328 329 private: 330 /* Private type definition */ 331 332 /* Private methods */ 333 334 /* Private variables */ 335 glw::GLuint m_fs_id; 336 glw::GLuint m_gs_id; 337 glw::GLuint m_po_id; 338 glw::GLuint m_vs_id; 339 }; 340 341 /* Implementation of "Group 20", test 3 from CTS_EXT_geometry_shader. Description follows: 342 * 343 * 3. It is a linking error to declare arrayed input variables in a geometry 344 * size if the array sizes do not match. 345 * 346 * Category: API; 347 * Negative Test. 348 * 349 * Create a program object, for which a boilerplate fragment and vertex 350 * shaders will be used. A geometry shader should also be attached to the 351 * program object. The shader should include the following incorrect input 352 * variable declarations: 353 * 354 * in vec4 Color1[]; 355 * in vec4 Color2[2]; 356 * in vec4 Color3[3]; 357 * 358 * Linking of the program object is expected to fail under this configuration. 359 * 360 */ 361 class GeometryShaderVSGSArrayedVariableSizeMismatchTest : public TestCaseBase 362 { 363 public: 364 /* Public methods */ 365 GeometryShaderVSGSArrayedVariableSizeMismatchTest(Context& context, const ExtParameters& extParams, 366 const char* name, const char* description); 367 ~GeometryShaderVSGSArrayedVariableSizeMismatchTest()368 virtual ~GeometryShaderVSGSArrayedVariableSizeMismatchTest() 369 { 370 } 371 372 virtual void deinit(void); 373 virtual IterateResult iterate(void); 374 375 private: 376 /* Private type definition */ 377 378 /* Private methods */ 379 380 /* Private variables */ 381 glw::GLuint m_fs_id; 382 glw::GLuint m_gs_id; 383 glw::GLuint m_po_id; 384 glw::GLuint m_vs_id; 385 }; 386 387 /* Implementation of "Group 20", test 4 from CTS_EXT_geometry_shader. Description follows: 388 * 389 * 4. It is a linking error to re-declare gl_FragCoord in a geometry shader. 390 * 391 * Category: API; 392 * Negative Test. 393 * 394 * Create a program object, for which a boilerplate fragment and vertex 395 * shaders will be used. A geometry shader should also be attached to the 396 * program object. The shader should include the following incorrect input 397 * variable declaration: 398 * 399 * in vec4 gl_FragCoord; 400 * 401 * Linking of the program object is expected to fail under this 402 * configuration. 403 * 404 */ 405 class GeometryShaderFragCoordRedeclarationTest : public TestCaseBase 406 { 407 public: 408 /* Public methods */ 409 GeometryShaderFragCoordRedeclarationTest(Context& context, const ExtParameters& extParams, const char* name, 410 const char* description); 411 ~GeometryShaderFragCoordRedeclarationTest()412 virtual ~GeometryShaderFragCoordRedeclarationTest() 413 { 414 } 415 416 virtual void deinit(void); 417 virtual IterateResult iterate(void); 418 419 private: 420 /* Private type definition */ 421 422 /* Private methods */ 423 424 /* Private variables */ 425 glw::GLuint m_fs_id; 426 glw::GLuint m_gs_id; 427 glw::GLuint m_po_id; 428 glw::GLuint m_vs_id; 429 }; 430 431 /* Implementation of "Group 20", test 5 from CTS_EXT_geometry_shader. Description follows: 432 * 433 * 5. It is a linking error to use the same location for two output variables 434 * in a geometry shader. 435 * 436 * Category: API; 437 * Negative Test. 438 * 439 * Create a program object, for which a boilerplate fragment and vertex 440 * shaders will be used. A geometry shader should also be attached to the 441 * program object. The shader should include the following incorrect input 442 * variable declaration: 443 * 444 * layout(location = 2) out vec4 test; 445 * layout(location = 2) out vec4 test2; 446 * 447 * Linking of the program object is expected to fail under this 448 * configuration. 449 * 450 */ 451 class GeometryShaderLocationAliasingTest : public TestCaseBase 452 { 453 public: 454 /* Public methods */ 455 GeometryShaderLocationAliasingTest(Context& context, const ExtParameters& extParams, const char* name, 456 const char* description); 457 ~GeometryShaderLocationAliasingTest()458 virtual ~GeometryShaderLocationAliasingTest() 459 { 460 } 461 462 virtual void deinit(void); 463 virtual IterateResult iterate(void); 464 465 private: 466 /* Private type definition */ 467 468 /* Private methods */ 469 470 /* Private variables */ 471 glw::GLuint m_fs_id; 472 glw::GLuint m_gs_id; 473 glw::GLuint m_po_id; 474 glw::GLuint m_vs_id; 475 }; 476 477 /* Implementation of "Group 23", test 4 from CTS_EXT_geometry_shader. Description follows: 478 * 479 * 4. Make sure using more than GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT atomic 480 * counters from within a geometry shader results in a linking error. 481 * 482 * Category: API. 483 * 484 * Create a program object. Define a boilerplate fragment and vertex shader 485 * objects, as well as a geometry shader. The geometry shader should: 486 * 487 * - define exactly (GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT+1) atomic counters. 488 * - take points on input and output a maximum of 1 point; 489 * - use only one invocation. 490 * - for each invocation, the shader should increment all atomic counter if 491 * (gl_PrimitiveIDIn % counter_id) == 0, where counter_id stands for "id" of 492 * a shader atomic counter, assuming first shader atomic counter has an 493 * "id" of 1. 494 * - The shader should set gl_Position to (0, 0, 0, 1) for the vertex that 495 * will be emitted. 496 * 497 * The test succeeds if linking of the program object fails. 498 * 499 */ 500 class GeometryShaderMoreACsInGSThanSupportedTest : public TestCaseBase 501 { 502 public: 503 /* Public methods */ 504 GeometryShaderMoreACsInGSThanSupportedTest(Context& context, const ExtParameters& extParams, const char* name, 505 const char* description); 506 ~GeometryShaderMoreACsInGSThanSupportedTest()507 virtual ~GeometryShaderMoreACsInGSThanSupportedTest() 508 { 509 } 510 511 virtual void deinit(void); 512 virtual IterateResult iterate(void); 513 514 private: 515 /* Private type definition */ 516 517 /* Private methods */ 518 std::string getGSCode(); 519 520 /* Private variables */ 521 glw::GLuint m_fs_id; 522 glw::GLuint m_gs_id; 523 glw::GLuint m_po_id; 524 glw::GLuint m_vs_id; 525 }; 526 527 /* Implementation of "Group 23", test 6 from CTS_EXT_geometry_shader. Description follows: 528 * 529 * 6. Make sure using more than GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 530 * buffer objects to back up atomic counter storage for geometry shader 531 * atomic counters results in a linking error. 532 * 533 * Category: API. 534 * 535 * Create a program object. Define a boilerplate fragment and vertex shader 536 * objects, as well as a geometry shader. The geometry shader should: 537 * 538 * - define exactly (GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT+1) atomic 539 * counters. 540 * - take points on input and output a maximum of 1 point; 541 * - use only one invocation. 542 * - for each invocation, the shader should increment all atomic counter if 543 * (gl_PrimitiveIDIn % counter_id) == 0, where counter_id stands for "id" of 544 * a shader atomic counter, assuming first shader atomic counter has an 545 * "id" of 1. 546 * - The shader should set gl_Position to (0, 0, 0, 1) for the vertex that 547 * will be emitted. 548 * - Each atomic counter should use a separate buffer object binding. 549 * 550 * The test succeeds if linking of the program object fails. 551 * 552 */ 553 class GeometryShaderMoreACBsInGSThanSupportedTest : public TestCaseBase 554 { 555 public: 556 /* Public methods */ 557 GeometryShaderMoreACBsInGSThanSupportedTest(Context& context, const ExtParameters& extParams, const char* name, 558 const char* description); 559 ~GeometryShaderMoreACBsInGSThanSupportedTest()560 virtual ~GeometryShaderMoreACBsInGSThanSupportedTest() 561 { 562 } 563 564 virtual void deinit(void); 565 virtual IterateResult iterate(void); 566 567 private: 568 /* Private type definition */ 569 570 /* Private methods */ 571 std::string getGSCode(); 572 573 /* Private variables */ 574 glw::GLuint m_fs_id; 575 glw::GLuint m_gs_id; 576 glw::GLuint m_po_id; 577 glw::GLuint m_vs_id; 578 }; 579 580 /* Implementation of "Group 24", test 1 from CTS_EXT_geometry_shader. Description follows: 581 * 582 * 1. Make sure that linking a program object consisting of a fragment, 583 * geometry and vertex shaders will fail, if geometry shader compilation 584 * status is GL_FALSE. 585 * 586 * Category: API; 587 * Negative Test. 588 * 589 * Create a program object and a fragment, geometry, vertex shader objects: 590 * 591 * - Fragment and vertex shader object should be compilable; 592 * - Geometry shader object should not compile. 593 * 594 * Compile all three shaders. Attach them to the program object, try to link 595 * the program object. 596 * 597 * The test passes if GL_LINK_STATUS for the program object is reported as 598 * GL_FALSE. 599 * 600 */ 601 class GeometryShaderCompilationFailTest : public TestCaseBase 602 { 603 public: 604 /* Public methods */ 605 GeometryShaderCompilationFailTest(Context& context, const ExtParameters& extParams, const char* name, 606 const char* description); 607 ~GeometryShaderCompilationFailTest()608 virtual ~GeometryShaderCompilationFailTest() 609 { 610 } 611 612 virtual void deinit(void); 613 virtual IterateResult iterate(void); 614 615 private: 616 /* Private type definition */ 617 618 /* Private methods */ 619 620 /* Private variables */ 621 glw::GLuint m_fs_id; 622 glw::GLuint m_gs_id; 623 glw::GLuint m_po_id; 624 glw::GLuint m_vs_id; 625 }; 626 627 /* Implementation of "Group 24", test 4 from CTS_EXT_geometry_shader. Description follows: 628 * 629 * 4. A geometry shader using more input vertices than are available should 630 * compile, but a program object with the shader attach should not link. 631 * 632 * Category: API; 633 * Negative Test. 634 * 635 * Following is a list of vertex count allowed for each geometry shader 636 * primitive type: 637 * 638 * * points - 1; 639 * * lines - 2; 640 * * triangles - 3; 641 * * lines_adjacency - 4; 642 * * triangles_adjacency - 6; 643 * 644 * For each geometry shader primitive type, create a geometry shader object. 645 * Each shader should output a maximum of a single point. Result vertex 646 * position should be set to gl_in[X].gl_Position, where X should be equal 647 * to a relevant value from the list above. This geometry shader must 648 * successfully compile. 649 * 650 * Create 5 program objects and a fragment and vertex shader objects. Each 651 * of these shaders should use a boilerplate but valid implementation. Each 652 * program object should be assigned both of these shaders, as well as one 653 * of the geometry shaders enlisted above, so that all program objects in 654 * total use up all geometry shaders considered. These program objects 655 * should fail to link. 656 * 657 */ 658 class GeometryShaderMoreInputVerticesThanAvailableTest : public TestCaseBase 659 { 660 public: 661 /* Public methods */ 662 GeometryShaderMoreInputVerticesThanAvailableTest(Context& context, const ExtParameters& extParams, const char* name, 663 const char* description); 664 ~GeometryShaderMoreInputVerticesThanAvailableTest()665 virtual ~GeometryShaderMoreInputVerticesThanAvailableTest() 666 { 667 } 668 669 virtual void deinit(); 670 virtual IterateResult iterate(); 671 672 private: 673 /* Private type definition */ 674 675 /* Private methods */ 676 677 /* Private variables */ 678 glw::GLuint m_fs_id; 679 glw::GLuint* m_gs_ids; 680 const glw::GLuint m_number_of_gs; 681 glw::GLuint* m_po_ids; 682 glw::GLuint m_vs_id; 683 glw::GLuint m_vao_id; 684 }; 685 686 /* Implementation of "Group 25", test 1 from CTS_EXT_geometry_shader. Description follows: 687 * 688 * 1. Transform feedback which captures data from two variables where: 689 * 690 * - the first one is set by vertex shader; 691 * - the second one is set by geometry shader; 692 * 693 * should cause linking operation to fail. 694 * 695 * Category: API; 696 * Negative Test. 697 * 698 * A vertex shader should declare an output variable out_vs_1 of ivec4 type. 699 * It should set it to: 700 * 701 * (gl_VertexID, gl_VertexID+1, gl_VertexID+2, gl_VertexID+3) 702 * 703 * Rest of the code can be boilerplate but must be valid. 704 * 705 * A geometry shader should declare an output variable out_gs_1 of vec4 706 * type. It should set it to: 707 * 708 * (gl_VertexID*2, gl_VertexID*2+1, gl_VertexID*2+2, gl_VertexID*2+3) 709 * (conversions omitted) 710 * 711 * The shader should accept points as input and is expected to emit 1 point 712 * at (0, 0, 0, 1). Rest of the code can be boilerplate but should be valid. 713 * 714 * The test should configure the program object to use transform feedback so 715 * that values the shaders set for both of the variables are captured. The 716 * test should then attempt to link the program object. 717 * 718 * The test passes if GL_LINK_STATUS state of the program object is reported 719 * to be GL_FALSE after glLinkProgram() call. 720 * 721 */ 722 class GeometryShaderTransformFeedbackVertexAndGeometryShaderCaptureTest : public TestCaseBase 723 { 724 public: 725 /* Public methods */ 726 GeometryShaderTransformFeedbackVertexAndGeometryShaderCaptureTest(Context& context, const ExtParameters& extParams, 727 const char* name, const char* description); 728 ~GeometryShaderTransformFeedbackVertexAndGeometryShaderCaptureTest()729 virtual ~GeometryShaderTransformFeedbackVertexAndGeometryShaderCaptureTest() 730 { 731 } 732 733 virtual void deinit(); 734 virtual IterateResult iterate(); 735 736 private: 737 /* Private type definition */ 738 739 /* Private methods */ 740 741 /* Private variables */ 742 glw::GLuint m_fs_id; 743 glw::GLuint m_gs_id; 744 glw::GLuint m_po_id; 745 glw::GLuint m_vs_id; 746 }; 747 748 } // namespace glcts 749 750 #endif // _ESEXTCGEOMETRYSHADERLINKING_HPP 751