| 617 | } |
| 618 | |
| 619 | void GLSLReflection::ReflectDataBlocks(GLenum programInterface, std::vector<DataBlock>& blocks) |
| 620 | { |
| 621 | GLint numResources = 0; |
| 622 | glGetProgramInterfaceiv(mHandle, programInterface, GL_ACTIVE_RESOURCES, &numResources); |
| 623 | |
| 624 | if (numResources > 0) |
| 625 | { |
| 626 | blocks.resize(numResources); |
| 627 | |
| 628 | enum |
| 629 | { |
| 630 | IDX_NAME_LENGTH, |
| 631 | IDX_BUFFER_BINDING, |
| 632 | IDX_BUFFER_DATA_SIZE, |
| 633 | IDX_REFERENCED_BY_VERTEX_SHADER, |
| 634 | IDX_REFERENCED_BY_GEOMETRY_SHADER, |
| 635 | IDX_REFERENCED_BY_FRAGMENT_SHADER, |
| 636 | IDX_REFERENCED_BY_COMPUTE_SHADER, |
| 637 | IDX_REFERENCED_BY_TESS_CONTROL_SHADER, |
| 638 | IDX_REFERENCED_BY_TESS_EVALUATION_SHADER, |
| 639 | IDX_NUM_ACTIVE_VARIABLES |
| 640 | }; |
| 641 | |
| 642 | std::vector<GLenum> const properties = |
| 643 | { |
| 644 | GL_NAME_LENGTH, |
| 645 | GL_BUFFER_BINDING, |
| 646 | GL_BUFFER_DATA_SIZE, |
| 647 | GL_REFERENCED_BY_VERTEX_SHADER, |
| 648 | GL_REFERENCED_BY_GEOMETRY_SHADER, |
| 649 | GL_REFERENCED_BY_FRAGMENT_SHADER, |
| 650 | GL_REFERENCED_BY_COMPUTE_SHADER, |
| 651 | GL_REFERENCED_BY_TESS_CONTROL_SHADER, |
| 652 | GL_REFERENCED_BY_TESS_EVALUATION_SHADER, |
| 653 | GL_NUM_ACTIVE_VARIABLES |
| 654 | }; |
| 655 | |
| 656 | GLsizei const numProperties = static_cast<GLsizei>(properties.size()); |
| 657 | |
| 658 | std::vector<GLint> results(properties.size(), 0); |
| 659 | for (int32_t i = 0; i < numResources; ++i) |
| 660 | { |
| 661 | glGetProgramResourceiv(mHandle, programInterface, i, numProperties, |
| 662 | properties.data(), numProperties, nullptr, results.data()); |
| 663 | |
| 664 | GLsizei const numBytes = static_cast<GLsizei>(results[IDX_NAME_LENGTH] + 1); |
| 665 | std::vector<GLchar> name(numBytes); |
| 666 | glGetProgramResourceName(mHandle, programInterface, i, numBytes, |
| 667 | nullptr, name.data()); |
| 668 | |
| 669 | DataBlock& info = blocks[i]; |
| 670 | info.name = std::string(name.data()); |
| 671 | |
| 672 | if (mVendorIsIntel && programInterface == GL_SHADER_STORAGE_BLOCK) |
| 673 | { |
| 674 | IntelWorkaround(info.name, results.data()); |
| 675 | } |
| 676 |
nothing calls this directly
no test coverage detected