1 #ifndef _ESEXTCGEOMETRYSHADERAPI_HPP 2 #define _ESEXTCGEOMETRYSHADERAPI_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 18", test 1 from CTS_EXT_geometry_shader. Description follows: 31 * 32 * 1. Make sure glCreateShaderProgramv() works correctly with geometry 33 * shaders. 34 * 35 * Category: API; 36 * 37 * Consider two geometry shader implementations (consisting of at least 38 * 2 body parts): a compilable (A) and a non-compilable one (B). For (A), 39 * vertex and fragment shader stage implementations as in test case 8.1 40 * should be considered. 41 * 42 * Call glCreateShaderProgramv() for both codebases: 43 * 44 * - In both cases, a new program object should be created; 45 * - For (A), GL_LINK_STATUS for the program object should be reported 46 * as GL_TRUE; Using a pipeline object to which all three separable 47 * program objects have been attached for each corresponding stage, the 48 * test should draw a single point and check the results (as described in 49 * test case 8.1) 50 * - For (B), GL_LINK_STATUS for the program object should be reported as 51 * GL_FALSE. 52 * - No error should be reported. 53 * 54 **/ 55 class GeometryShaderCreateShaderProgramvTest : public TestCaseBase 56 { 57 public: 58 /* Public methods */ 59 GeometryShaderCreateShaderProgramvTest(Context& context, const ExtParameters& extParams, const char* name, 60 const char* description); 61 ~GeometryShaderCreateShaderProgramvTest()62 virtual ~GeometryShaderCreateShaderProgramvTest() 63 { 64 } 65 66 virtual void deinit(); 67 virtual IterateResult iterate(); 68 69 private: 70 /* Private type definition */ 71 72 /* Private methods */ 73 void initFBO(); 74 void initPipelineObject(); 75 76 /* Private variables */ 77 static const char* fs_code; 78 static const char* gs_code; 79 static const char* vs_code; 80 81 glw::GLuint m_fbo_id; 82 glw::GLuint m_fs_po_id; 83 glw::GLuint m_gs_po_id; 84 glw::GLuint m_pipeline_object_id; 85 glw::GLuint m_to_id; 86 glw::GLuint m_vao_id; 87 glw::GLuint m_vs_po_id; 88 89 static const unsigned int m_to_height; 90 static const unsigned int m_to_width; 91 }; 92 93 /* Implementation of "Group 18", test 2 from CTS_EXT_geometry_shader. Description follows: 94 * 95 * 2. GL_GEOMETRY_SHADER_EXT is reported by glGetShaderiv() for geometry shaders. 96 * 97 * Category: API. 98 * 99 * Create a geometry shader object. Make sure glGetShaderiv() reports 100 * GL_GEOMETRY_SHADER_EXT when passed GL_SHADER_TYPE pname and the shader's 101 * id. 102 * 103 */ 104 class GeometryShaderGetShaderivTest : public TestCaseBase 105 { 106 public: 107 /* Public methods */ 108 GeometryShaderGetShaderivTest(Context& context, const ExtParameters& extParams, const char* name, 109 const char* description); 110 ~GeometryShaderGetShaderivTest()111 virtual ~GeometryShaderGetShaderivTest() 112 { 113 } 114 115 virtual void deinit(); 116 virtual IterateResult iterate(); 117 118 private: 119 /* Private type definition */ 120 121 /* Private methods */ 122 123 /* Private variables */ 124 glw::GLuint m_gs_id; 125 }; 126 127 /* Implementation of "Group 18", test 3 from CTS_EXT_geometry_shader. Description follows: 128 * 129 * 3. GL_INVALID_OPERATION error is generated if geometry stage-specific 130 * queries such as: 131 * 132 * * GL_GEOMETRY_LINKED_VERTICES_OUT_EXT; 133 * * GL_GEOMETRY_LINKED_INPUT_TYPE_EXT; 134 * * GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT; 135 * * GL_GEOMETRY_SHADER_INVOCATIONS_EXT; 136 * 137 * are passed to glGetProgramiv() for a program object that was not linked 138 * successfully. 139 * 140 * Category: API; 141 * Negative Test. 142 * 143 * Create a program object. 144 * 145 * Issue all of the above queries on the program object. The test fails if 146 * any of these queries does not result in a GL_INVALID_OPERATION error. 147 * 148 */ 149 class GeometryShaderGetProgramivTest : public TestCaseBase 150 { 151 public: 152 /* Public methods */ 153 GeometryShaderGetProgramivTest(Context& context, const ExtParameters& extParams, const char* name, 154 const char* description); 155 ~GeometryShaderGetProgramivTest()156 virtual ~GeometryShaderGetProgramivTest() 157 { 158 } 159 160 virtual void deinit(); 161 virtual IterateResult iterate(); 162 163 private: 164 /* Private type definition */ 165 166 /* Private methods */ 167 168 /* Private variables */ 169 glw::GLuint m_po_id; 170 }; 171 172 /* Implementation of "Group 18", test 4 from CTS_EXT_geometry_shader. Description follows: 173 * 174 * 4. GL_INVALID_OPERATION error is generated if geometry stage-specific 175 * queries such as: 176 * 177 * * GL_GEOMETRY_LINKED_VERTICES_OUT_EXT; 178 * * GL_GEOMETRY_LINKED_INPUT_TYPE_EXT; 179 * * GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT; 180 * * GL_GEOMETRY_SHADER_INVOCATIONS_EXT; 181 * 182 * are passed to glGetProgramiv() for a linked program object that does not 183 * have a geometry shader attached. 184 * 185 * Category: API; 186 * Negative Test. 187 * 188 * Create a program object and attach boilerplate fragment and vertex 189 * shaders to it. The program object should link successfully. 190 * 191 * Issue all of the above queries on the program object. The test fails if 192 * any of these queries does not result in a GL_INVALID_OPERATION error. 193 * 194 */ 195 class GeometryShaderGetProgramiv2Test : public TestCaseBase 196 { 197 public: 198 /* Public methods */ 199 GeometryShaderGetProgramiv2Test(Context& context, const ExtParameters& extParams, const char* name, 200 const char* description); 201 ~GeometryShaderGetProgramiv2Test()202 virtual ~GeometryShaderGetProgramiv2Test() 203 { 204 } 205 206 virtual void deinit(); 207 virtual IterateResult iterate(); 208 209 private: 210 /* Private type definition */ 211 212 /* Private methods */ 213 214 /* Private variables */ 215 glw::GLuint m_fs_id; 216 glw::GLuint m_po_id; 217 glw::GLuint m_vs_id; 218 }; 219 220 /* Implementation of "Group 19", test 1 from CTS_EXT_geometry_shader. Description follows: 221 * 222 * 1. Program objects that either have been attached compilable fragment & 223 * geometry & vertex shader objects attached and link successfully OR which 224 * have been assigned successfully linked separate fragment & geometry & 225 * shader object programs can be queried for geometry stage properties 226 * 227 * Category: API; 228 * 229 * The test should iterate through 3 different fragment + geometry + vertex 230 * shader object configurations. 231 * It should query the following geometry shader states and verify the 232 * reported values: 233 * 234 * 1) GL_GEOMETRY_LINKED_VERTICES_OUT_EXT, 235 * 2) GL_GEOMETRY_LINKED_INPUT_TYPE_EXT, 236 * 3) GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT, 237 * 4) GL_GEOMETRY_SHADER_INVOCATIONS_EXT 238 * 239 * For pipeline objects, an additional case should be checked: using 240 * a separable program object with fragment & vertex shader stages defined 241 * as a source for geometry shader stage should succeed but reported 242 * geometry shader program object id (retrieved by calling 243 * glGetProgramPipelineiv() with GL_GEOMETRY_SHADER_EXT pname) should return 0. 244 * 245 */ 246 class GeometryShaderGetProgramiv3Test : public TestCaseBase 247 { 248 public: 249 /* Public methods */ 250 GeometryShaderGetProgramiv3Test(Context& context, const ExtParameters& extParams, const char* name, 251 const char* description); 252 ~GeometryShaderGetProgramiv3Test()253 virtual ~GeometryShaderGetProgramiv3Test() 254 { 255 } 256 257 virtual void deinit(); 258 virtual IterateResult iterate(); 259 260 private: 261 /* Private type definition */ 262 typedef struct _run 263 { 264 glw::GLenum input_primitive_type; 265 int invocations; 266 int max_vertices; 267 glw::GLenum output_primitive_type; 268 _runglcts::GeometryShaderGetProgramiv3Test::_run269 explicit _run(glw::GLenum in_input_primitive_type, int in_invocations, int in_max_vertices, 270 glw::GLenum in_output_primitive_type) 271 { 272 input_primitive_type = in_input_primitive_type; 273 invocations = in_invocations; 274 max_vertices = in_max_vertices; 275 output_primitive_type = in_output_primitive_type; 276 } 277 } _run; 278 279 /* Private methods */ 280 bool buildShader(glw::GLuint so_id, const char* so_body); 281 282 bool buildShaderProgram(glw::GLuint* out_spo_id, glw::GLenum spo_bits, const char* spo_body); 283 284 void deinitPO(); 285 286 void deinitSOs(bool release_all_SOs); 287 288 void deinitSPOs(bool release_all_SPOs); 289 290 std::string getLayoutQualifierForPrimitiveType(glw::GLenum primitive_type); 291 292 std::string getGSCode(const _run& run); 293 294 void initTestRuns(); 295 296 /* Private variables */ 297 glw::GLuint m_fs_id; 298 glw::GLuint m_fs_po_id; 299 glw::GLuint m_gs_id; 300 glw::GLuint m_gs_po_id; 301 glw::GLuint m_pipeline_object_id; 302 glw::GLuint m_po_id; 303 glw::GLuint m_vs_id; 304 glw::GLuint m_vs_po_id; 305 306 std::vector<_run> _runs; 307 }; 308 309 /* Implementation of "Group 19", test 2 from CTS_EXT_geometry_shader. Description follows: 310 * 311 * 1. For an active pipeline object consisting of a geometry shader stage but 312 * lacking a vertex shader stage, GL_INVALID_OPERATION error should be 313 * generated if an application attempts to perform a draw call. 314 * 315 * Category: API; 316 * Negative Test; 317 * 318 * Create a pipeline object. 319 * 320 * Create boilerplate separate fragment and geometry shader program objects. 321 * Configure the pipeline object to use them correspondingly for fragment 322 * and geometry stages. 323 * 324 * Generate and bind a vertex array object. 325 * 326 * The test should now bind the pipeline object and do a glDrawArrays() 327 * call. 328 * 329 * Test succeeds if GL_INVALID_OPERATION error was generated. 330 * 331 */ 332 class GeometryShaderDrawCallWithFSAndGS : public TestCaseBase 333 { 334 public: 335 /* Public methods */ 336 GeometryShaderDrawCallWithFSAndGS(Context& context, const ExtParameters& extParams, const char* name, 337 const char* description); 338 ~GeometryShaderDrawCallWithFSAndGS()339 virtual ~GeometryShaderDrawCallWithFSAndGS() 340 { 341 } 342 343 virtual void deinit(); 344 virtual IterateResult iterate(); 345 346 private: 347 /* Private type definition */ 348 349 /* Private methods */ 350 351 /* Private variables */ 352 glw::GLuint m_fs_po_id; 353 glw::GLuint m_gs_po_id; 354 glw::GLuint m_pipeline_object_id; 355 glw::GLuint m_vao_id; 356 }; 357 358 /* Implementation of "Group 23", test 1 from CTS_EXT_geometry_shader. Description follows: 359 * 360 * 1. It should be possible to use as many image uniforms in a geometry shader 361 * as reported for GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT property. 362 * 363 * Category: API; 364 * Functional Test. 365 * 366 * 1. Create a program object consisting of a fragment, geometry and vertex 367 * shader: 368 * 1a. The shaders can have boilerplate implementation but should be 369 * compatible with each other. 370 * 1b. Geometry shader should take points on input and output a maximum of 371 * 1 point. 372 * 1c. Geometry shader should define exactly as many image uniforms as 373 * reported for the property. 374 * 1d. Geometry shader should load values from all bound images, sum them up, 375 * and store the result in X component of output vertex. 376 * 2. Configure transform feedback to capture gl_Position output from the 377 * program. 378 * 3. All shaders should compile successfully and the program object should 379 * link without problems. 380 * 4. Bind integer 2D texture objects of resolution 1x1 to all image units. 381 * First texture used should use a value of 1, second texture should use 382 * a value of 2, and so on. 383 * 5. Generate, bind a vertex array object, do a single point draw call. The 384 * test succeeds if the first component in the vector retrieved is equal 385 * to sum(i=1..n)(i) = n(n+1)/2 where n = 386 * GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT property value. 387 * 388 */ 389 class GeometryShaderMaxImageUniformsTest : public TestCaseBase 390 { 391 public: 392 /* Public methods */ 393 GeometryShaderMaxImageUniformsTest(Context& context, const ExtParameters& extParams, const char* name, 394 const char* description); 395 ~GeometryShaderMaxImageUniformsTest()396 virtual ~GeometryShaderMaxImageUniformsTest() 397 { 398 } 399 400 virtual void deinit(); 401 virtual IterateResult iterate(); 402 403 private: 404 /* Private type definition */ 405 406 /* Private methods */ 407 std::string getGSCode(); 408 409 /* Private variables */ 410 glw::GLuint m_fs_id; 411 glw::GLint m_gl_max_geometry_image_uniforms_ext_value; 412 glw::GLuint m_gs_id; 413 glw::GLuint m_po_id; 414 glw::GLuint* m_texture_ids; 415 glw::GLuint m_tfbo_id; 416 glw::GLuint m_vao_id; 417 glw::GLuint m_vs_id; 418 }; 419 420 /* Implementation of "Group 23", test 2 from CTS_EXT_geometry_shader. Description follows: 421 * 422 * 2. It should be possible to use as many shader storage blocks in a geometry 423 * shader as reported for GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT property. 424 * 425 * Category: API; 426 * Functional Test.0 427 * 428 * 1. Create a program object consisting of a fragment, geometry and vertex 429 * shader: 430 * 1a. The shaders can have boilerplate implementation but should be 431 * compatible with each other. 432 * 1b. Geometry shader should take points on input and output a maximum of 433 * 1 point. 434 * 1c. Geometry shader should define exactly as many shader storage blocks 435 * as reported for the property, each using subsequent shader storage 436 * buffer binding points. Each storage block should take a single int 437 * value. 438 * 1d. Geometry shader should read values from all bound SSBOs, write 439 * *incremented* values. It should also store a summed-up result (along 440 * the lines of test case 23.1) calculated from values *prior* to 441 * incrementation in X component of output vertex. 442 * 2. Configure transform feedback to capture gl_Position output from the 443 * program. 444 * 3. All shaders should compile successfully and the program object should 445 * link without problems. 446 * 4. Initialize a buffer object filled with subsequent int values (starting 447 * from 1). Bind corresponding ranges (of size sizeof(int) ) to subsequent 448 * SSBO binding points. 449 * 5. Generate, bind a vertex array object, do a single point draw call. The 450 * test succeeds if the value retrieved is equal to 451 * sum(i=1..n)(i) = n(n+1)/2 where n = 452 * GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT property value AND if the 453 * buffer object storing input data is now filled with increasing values, 454 * assuming a delta of 1 and a start value of 2. 455 * 456 */ 457 class GeometryShaderMaxShaderStorageBlocksTest : public TestCaseBase 458 { 459 public: 460 /* Public methods */ 461 GeometryShaderMaxShaderStorageBlocksTest(Context& context, const ExtParameters& extParams, const char* name, 462 const char* description); 463 ~GeometryShaderMaxShaderStorageBlocksTest()464 virtual ~GeometryShaderMaxShaderStorageBlocksTest() 465 { 466 } 467 468 virtual void deinit(); 469 virtual IterateResult iterate(); 470 471 private: 472 /* Private type definition */ 473 474 /* Private methods */ 475 std::string getGSCode(); 476 477 /* Private variables */ 478 glw::GLuint m_fs_id; 479 glw::GLint m_gl_max_geometry_shader_storage_blocks_ext_value; 480 glw::GLuint m_gs_id; 481 glw::GLuint m_po_id; 482 glw::GLuint m_ssbo_id; 483 glw::GLuint m_tfbo_id; 484 glw::GLuint m_vao_id; 485 glw::GLuint m_vs_id; 486 }; 487 488 /* Implementation of "Group 23", test 3 from CTS_EXT_geometry_shader. Description follows: 489 * 490 * 3. Make sure writing up to GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT atomic 491 * counters from within a geometry shader works correctly. 492 * 493 * Category: API. 494 * 495 * Create a program object. Define a boilerplate fragment shader object, 496 * a vertex and a geometry shader. 497 * 498 * The vertex shader should: 499 * 500 * - pass gl_VertexID information to the geometry shader using an output 501 * int variable called vertex_id. 502 * 503 * The geometry shader should: 504 * 505 * - define exactly GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT atomic counters. 506 * - take points on input and output a maximum of 1 point; 507 * - use only one invocation. 508 * - the shader should increment all atomic counters, for which 509 * (vertex_id % counter_id) == 0, where counter_id stands for "id" of 510 * a shader atomic counter, assuming first shader atomic counter has an 511 * "id" of 1. 512 * 513 * A single buffer object should be used to back up the storage. It should 514 * be filled with zeros on start-up. 515 * 516 * The test should draw 128*GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT points. It then 517 * should read the buffer object's contents and make sure the values read 518 * are valid. 519 * 520 */ 521 class GeometryShaderMaxAtomicCountersTest : public TestCaseBase 522 { 523 public: 524 /* Public methods */ 525 GeometryShaderMaxAtomicCountersTest(Context& context, const ExtParameters& extParams, const char* name, 526 const char* description); 527 ~GeometryShaderMaxAtomicCountersTest()528 virtual ~GeometryShaderMaxAtomicCountersTest() 529 { 530 } 531 532 virtual void deinit(); 533 virtual IterateResult iterate(); 534 535 private: 536 /* Private type definition */ 537 538 /* Private methods */ 539 std::string getGSCode(); 540 541 /* Private variables */ 542 glw::GLuint m_acbo_id; 543 glw::GLuint m_fs_id; 544 glw::GLint m_gl_max_geometry_atomic_counters_ext_value; 545 glw::GLuint m_gs_id; 546 glw::GLuint m_po_id; 547 glw::GLuint m_vao_id; 548 glw::GLuint m_vs_id; 549 }; 550 551 /* Implementation of "Group 23", test 5 from CTS_EXT_geometry_shader. Description follows: 552 * 553 * 5. Make sure writing up to GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT atomic 554 * counter buffers from within a geometry shader works correctly. 555 * 556 * Category: API. 557 * 558 * Create a program object. Define a boilerplate fragment shader object, 559 * a vertex and a geometry shader. 560 * 561 * The vertex shader should: 562 * 563 * - pass gl_VertexID information to the geometry shader using an output 564 * int variable called vertex_id. 565 * 566 * The geometry shader should: 567 * 568 * - define exactly GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT atomic 569 * counters. 570 * - take points on input and output a maximum of 1 point; 571 * - use only one invocation. 572 * - the shader should increment all atomic counter if 573 * (vertex_id % counter_id) == 0, where counter_id stands for "id" of 574 * a shader atomic counter, assuming first shader atomic counter has an 575 * "id" of 1. 576 * 577 * Each atomic counter should use a separate buffer object binding to back 578 * up the storage. They should be filled with zeros on start-up. 579 * 580 * The test should draw 128*GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 581 * points. It then should read the buffer objects' contents and make sure 582 * the values read are valid. 583 * 584 */ 585 class GeometryShaderMaxAtomicCounterBuffersTest : public TestCaseBase 586 { 587 public: 588 /* Public methods */ 589 GeometryShaderMaxAtomicCounterBuffersTest(Context& context, const ExtParameters& extParams, const char* name, 590 const char* description); 591 ~GeometryShaderMaxAtomicCounterBuffersTest()592 virtual ~GeometryShaderMaxAtomicCounterBuffersTest() 593 { 594 } 595 596 virtual void deinit(); 597 virtual IterateResult iterate(); 598 599 private: 600 /* Private type definition */ 601 602 /* Private methods */ 603 std::string getGSCode(); 604 605 /* Private variables */ 606 glw::GLuint* m_acbo_ids; 607 glw::GLuint m_fs_id; 608 glw::GLint m_gl_max_atomic_counter_buffer_bindings_value; 609 glw::GLint m_gl_max_geometry_atomic_counter_buffers_ext_value; 610 glw::GLuint m_gs_id; 611 glw::GLuint m_po_id; 612 glw::GLuint m_vao_id; 613 glw::GLuint m_vs_id; 614 }; 615 616 /* Implementation of "Group 24", test 2 from CTS_EXT_geometry_shader. Description follows: 617 * 618 * 2. Make sure that draw calls results in an error if the bound pipeline 619 * program object has a configured geometry stage but has no active program 620 * with an executable vertex shader. 621 * 622 * Category: API; 623 * 624 * Generate a pipeline object. 625 * 626 * Create stand-alone fragment and geometry programs. Both of the programs 627 * should be provided valid but boilerplate implementation. Use these 628 * programs to define fragment and geometry stages for the pipeline object. 629 * 630 * Generate and bind a vertex array object. Bind the pipeline object and 631 * try to draw a single point. Test succeeds if GL_INVALID_OPERATION error 632 * was generated. 633 * 634 */ 635 class GeometryShaderPiplineProgramObjectWithoutActiveVSProgramTest : public TestCaseBase 636 { 637 public: 638 /* Public methods */ 639 GeometryShaderPiplineProgramObjectWithoutActiveVSProgramTest(Context& context, const ExtParameters& extParams, 640 const char* name, const char* description); 641 ~GeometryShaderPiplineProgramObjectWithoutActiveVSProgramTest()642 virtual ~GeometryShaderPiplineProgramObjectWithoutActiveVSProgramTest() 643 { 644 } 645 646 virtual void deinit(); 647 virtual IterateResult iterate(); 648 649 private: 650 /* Private type definition */ 651 652 /* Private methods */ 653 654 /* Private variables */ 655 glw::GLuint m_fs_id; 656 glw::GLuint m_fs_po_id; 657 glw::GLuint m_gs_id; 658 glw::GLuint m_gs_po_id; 659 glw::GLuint m_ppo_id; 660 glw::GLuint m_vao_id; 661 }; 662 663 /* Implementation of "Group 24", test 3 from CTS_EXT_geometry_shader. Description follows: 664 * 665 * 3. Verify that doing a draw call using a mode that is incompatible with 666 * input type of geometry shader active in current pipeline results in 667 * GL_INVALID_OPERATION error. 668 * 669 * Category: API; 670 * Negative Test. 671 * 672 * Create 5 program objects and a fragment & vertex shader objects. These 673 * shaders are free to use boilerplate code. Create 5 geometry shaders, each 674 * using a different input primitive type allowed for geometry shaders. 675 * Each program object should be assigned a set of fragment, geometry and 676 * vertex shaders, assuming each program is set a different geometry shader. 677 * Compile all shaders and link the program objects. 678 * 679 * Generate a vertex array object and bind it. 680 * 681 * For each valid draw call mode, iterate through all program objects. For 682 * program objects that accept an input primitive geometry type deemed 683 * incompatible for the draw call mode considered, try executing the draw 684 * call. Test fails if any of these draw calls does not result in 685 * a GL_INVALID_OPERATION. 686 * 687 * Invalid primitive types for all available draw call modes: 688 * 689 * * GL_LINE_LOOP draw call mode: 690 * 1) lines_adjacency; 691 * 2) points; 692 * 3) triangles; 693 * 4) triangles with adjacency; 694 * 695 * * GL_LINE_STRIP draw call mode: 696 * 1) lines with adjacency; 697 * 2) points; 698 * 3) triangles; 699 * 4) triangles with adajcency; 700 * 701 * * GL_LINE_STRIP_ADJACENCY_EXT draw call mode: 702 * 1) lines; 703 * 2) points; 704 * 3) triangles; 705 * 4) triangles with adjacency; 706 * 707 * * GL_LINES draw call mode: 708 * 1) lines with adjacency; 709 * 2) points; 710 * 3) triangles; 711 * 4) triangles with adjacency; 712 * 713 * * GL_LINES_ADJACENCY_EXT draw call mode: 714 * 1) lines; 715 * 2) points; 716 * 3) triangles; 717 * 4) triangles with adjacency; 718 * 719 * * GL_POINTS draw call mode: 720 * 1) lines; 721 * 2) lines with adjacency; 722 * 3) triangles; 723 * 4) triangles with adjacency; 724 * 725 * * GL_TRIANGLE_FAN draw call mode: 726 * 1) lines; 727 * 2) lines with adjacency; 728 * 3) points; 729 * 4) triangles with adjacency; 730 * 731 * * GL_TRIANGLE_STRIP draw call mode: 732 * 1) lines; 733 * 2) lines with adjacency; 734 * 3) points; 735 * 4) triangles with adjacency; 736 * 737 * * GL_TRIANGLES draw call mode: 738 * 1) lines; 739 * 2) lines with adjacency; 740 * 3) points; 741 * 4) triangles with adjacency; 742 * 743 * * GL_TRIANGLES_ADJACENCY_EXT draw call mode: 744 * 1) lines; 745 * 2) lines with adjacency; 746 * 3) points; 747 * 4) triangles; 748 * 749 * * GL_TRIANGLE_STRIP_ADJACENCY_EXT draw call mdoe: 750 * 1) lines; 751 * 2) lines with adjacency; 752 * 3) points; 753 * 4) triangles; 754 * 755 */ 756 class GeometryShaderIncompatibleDrawCallModeTest : public TestCaseBase 757 { 758 public: 759 /* Public methods */ 760 GeometryShaderIncompatibleDrawCallModeTest(Context& context, const ExtParameters& extParams, const char* name, 761 const char* description); 762 ~GeometryShaderIncompatibleDrawCallModeTest()763 virtual ~GeometryShaderIncompatibleDrawCallModeTest() 764 { 765 } 766 767 virtual void deinit(); 768 virtual IterateResult iterate(); 769 770 private: 771 /* Private type definition */ 772 773 /* Private methods */ 774 775 /* Private variables */ 776 glw::GLuint m_fs_id; 777 glw::GLuint* m_gs_ids; 778 const glw::GLuint m_number_of_gs; 779 glw::GLuint* m_po_ids; 780 glw::GLuint m_vs_id; 781 glw::GLuint m_vao_id; 782 }; 783 784 /* Implementation of "Group 24", test 5 from CTS_EXT_geometry_shader. Description follows: 785 * 786 * 5. Make sure that nothing is drawn if the number of vertices emitted by 787 * a geometry shader is insufficient to produce a single primitive. 788 * 789 * Category: API; 790 * Functional/Negative Test. 791 * 792 * For each output primitive type from the following list: 793 * 794 * - Line strip; 795 * - Triangle strip; 796 * 797 * Create a geometry shader that accepts a single point and emits exactly 798 * (N-1) vertices, coordinates of which are located within <-1,1>x<-1,1> 799 * region, Z set to 0 and W to 1, where N corresponds to exact amount of 800 * vertices needed to output a single primitive for output primitive type 801 * considered. 802 * 803 * Create a vertex shader object with boilerplate but valid implementation. 804 * Create a fragment shader object setting the only output variable to 805 * (1, 0, 0, 0). 806 * 807 * Create 2 program objects, compile all the shaders. For each program 808 * object, attach vertex and fragment shader objects discussed, as well as 809 * one of the geometry shaders discussed. All program objects together 810 * should use all geometry shaders discussed in the second paragraph. 811 * Link all program objects. 812 * 813 * Create a FBO and a texture object using a GL_RGBA8 internalformat and 814 * of 16x16 resolution. Attach the texture object to color attachment 0 of 815 * the FBO, bind the FBO to both framebuffer targets. 816 * 817 * Create a vertex array object and bind it. 818 * 819 * Set clear color to (0, 1, 0, 0). 820 * 821 * Iterate through all program objects. For each iteration: 822 * - Before doing actual draw call, clear the color buffer.; 823 * - Activate program object specific for current iteration; 824 * - Draw a single point. 825 * - Read rendered contents (glReadPixels() call with GL_RGBA format and 826 * GL_UNSIGNED_BYTE type) and make sure all pixels are set to (0, 255, 0, 0). 827 * 828 */ 829 class GeometryShaderInsufficientEmittedVerticesTest : public TestCaseBase 830 { 831 public: 832 /* Public methods */ 833 GeometryShaderInsufficientEmittedVerticesTest(Context& context, const ExtParameters& extParams, const char* name, 834 const char* description); 835 ~GeometryShaderInsufficientEmittedVerticesTest()836 virtual ~GeometryShaderInsufficientEmittedVerticesTest() 837 { 838 } 839 840 virtual void deinit(); 841 virtual IterateResult iterate(); 842 843 private: 844 /* Private type definition */ 845 846 /* Private methods */ 847 848 /* Private variables */ 849 glw::GLubyte* m_pixels; 850 851 glw::GLuint m_fbo_id; 852 glw::GLuint m_fs_id; 853 glw::GLuint* m_gs_ids; 854 const glw::GLuint m_number_of_color_components; 855 const glw::GLuint m_number_of_gs; 856 glw::GLuint* m_po_ids; 857 const glw::GLuint m_texture_height; 858 glw::GLuint m_texture_id; 859 const glw::GLuint m_texture_width; 860 glw::GLuint m_vs_id; 861 glw::GLuint m_vao_id; 862 }; 863 864 /* Implementation of "Group 25", test 2 from CTS_EXT_geometry_shader. Description follows: 865 * 866 * 2. Transform feedback which captures data from two variables where, 867 * configured separately for two separable program objects where: 868 * 869 * - the first one defines vertex shader stage (as in test case 25.1); is set 870 * by a program activated for vertex shader stage; 871 * - the second one defines geometry shader stage (as in test case 25.1); 872 * should correctly capture output variables from either geometry shader 873 * stage (if both stages are active) or vertex shader stage (if geometry 874 * shader stage is inactive) in a result buffer object. 875 * 876 * Category: API; 877 * Functional Test. 878 * 879 * Modify test case 25.1 to use pipeline objects. 880 * 881 * First, a pipeline object consisting of both stages, should be used for 882 * the test. Next, the geometry shader stage should be detached from the 883 * geometry shader. 884 * Transform feedback should be paused before the pipeline object's geometry 885 * shader stage is deactivated. 886 * 887 * Test succeeds if: 888 * 889 * - out_gs_1 variable values are correctly captured if both shader stages 890 * are being used for the pipeline object; 891 * - out_vs_1 variable values are correctly captured if only vertex shader 892 * stage is being used for the pipeline object; 893 * 894 */ 895 class GeometryShaderPipelineObjectTransformFeedbackVertexAndGeometryShaderCaptureTest : public TestCaseBase 896 { 897 public: 898 /* Public methods */ 899 GeometryShaderPipelineObjectTransformFeedbackVertexAndGeometryShaderCaptureTest(Context& context, 900 const ExtParameters& extParams, 901 const char* name, 902 const char* description); 903 ~GeometryShaderPipelineObjectTransformFeedbackVertexAndGeometryShaderCaptureTest()904 virtual ~GeometryShaderPipelineObjectTransformFeedbackVertexAndGeometryShaderCaptureTest() 905 { 906 } 907 908 virtual void deinit(); 909 virtual IterateResult iterate(); 910 911 private: 912 /* Private type definition */ 913 914 /* Private methods */ 915 916 /* Private variables */ 917 glw::GLuint m_gs_id; 918 glw::GLuint m_gs_po_id; 919 glw::GLuint m_ppo_id; 920 glw::GLuint m_tfbo_id; 921 glw::GLuint m_vao_id; 922 glw::GLuint m_vs_id; 923 glw::GLuint m_vs_po_id; 924 }; 925 926 /* Implementation of "Group 25", test 3 from CTS_EXT_geometry_shader. Description follows: 927 * 928 * 3. Make sure that, while transform feedback is active, attempts to draw 929 * primitives that do not match output primitive type of the geometry shader 930 * are rejected with GL_INVALID_OPERATION error. 931 * 932 * Category: API; 933 * Negative Test. 934 * 935 * Consider a program object, for which fragment, geometry and vertex 936 * shaders have been defined and attached. The geometry shader meets the 937 * following requirements: 938 * 939 * - accepts lines input; 940 * - outputs triangles (a maximum of 3 vertices); 941 * - defines and assigns a value to an output variable that can be used for 942 * transform feedback process. 943 * 944 * Fragment & vertex shader stages are boilerplate. Program object should 945 * capture data stored in the geometry shader's output variable described. 946 * 947 * Using the program object and GL_LINES transform feedback primitive mode, 948 * doing a draw call in GL_TRIANGLES mode should result in 949 * GL_INVALID_OPERATION error. 950 * 951 */ 952 class GeometryShaderDrawPrimitivesDoNotMatchOutputPrimitives : public TestCaseBase 953 { 954 public: 955 /* Public methods */ 956 GeometryShaderDrawPrimitivesDoNotMatchOutputPrimitives(Context& context, const ExtParameters& extParams, 957 const char* name, const char* description); 958 ~GeometryShaderDrawPrimitivesDoNotMatchOutputPrimitives()959 virtual ~GeometryShaderDrawPrimitivesDoNotMatchOutputPrimitives() 960 { 961 } 962 963 virtual void deinit(); 964 virtual IterateResult iterate(); 965 966 private: 967 /* Private type definition */ 968 969 /* Private methods */ 970 971 /* Private variables */ 972 glw::GLuint m_fs_id; 973 glw::GLuint m_gs_id; 974 glw::GLuint m_po_id; 975 glw::GLuint m_tfbo_id; 976 glw::GLuint m_vs_id; 977 glw::GLuint m_vao_id; 978 }; 979 980 /* Implementation of "Group 25", test 4 from CTS_EXT_geometry_shader. Description follows: 981 * 982 * 4. Make sure that, while transform feedback is paused, all draw calls 983 * executed with an active program object, which includes a geometry shader, 984 * are valid. All input primitive type+output primitive type configurations 985 * should be considered. 986 * 987 * Category: API. 988 * 989 * The test should run through all three transform feedback primitive modes, 990 * but should pause transform feedback before doing a check draw call. All 991 * permutations of valid input and output primitive types should be 992 * considered, actual implementation can be boilerplate. 993 * 994 * Note: in order to keep the execution times and implementation complexity 995 * level in control, this test is not focused on verifying visual 996 * outcome of the draw calls. Its aim is to only verify that the 997 * driver correctly handles use cases where the transform feedback is 998 * paused and draw calls are issued, meaning no error is reported. 999 * 1000 */ 1001 class GeometryShaderDrawCallsWhileTFPaused : public TestCaseBase 1002 { 1003 public: 1004 /* Public methods */ 1005 GeometryShaderDrawCallsWhileTFPaused(Context& context, const ExtParameters& extParams, const char* name, 1006 const char* description); 1007 ~GeometryShaderDrawCallsWhileTFPaused()1008 virtual ~GeometryShaderDrawCallsWhileTFPaused() 1009 { 1010 } 1011 1012 virtual void deinit(); 1013 virtual IterateResult iterate(); 1014 1015 private: 1016 /* Private type definition */ 1017 1018 /* Private methods */ 1019 1020 /* Private variables */ 1021 glw::GLuint m_fs_id; 1022 glw::GLuint m_gs_id; 1023 glw::GLuint m_po_ids[15] /* All combinations of possible inputs and outputs in GS */; 1024 glw::GLuint m_tfbo_id; 1025 glw::GLuint m_vs_id; 1026 glw::GLuint m_vao_id; 1027 }; 1028 1029 } // namespace glcts 1030 1031 #endif // _ESEXTCGEOMETRYSHADERAPI_HPP 1032