| 421 | } |
| 422 | |
| 423 | void GLSLReflection::ReflectProgramOutputs() |
| 424 | { |
| 425 | GLint numResources = 0; |
| 426 | glGetProgramInterfaceiv(mHandle, GL_PROGRAM_OUTPUT, GL_ACTIVE_RESOURCES, &numResources); |
| 427 | if (numResources > 0) |
| 428 | { |
| 429 | mOutputs.resize(numResources); |
| 430 | |
| 431 | enum |
| 432 | { |
| 433 | IDX_NAME_LENGTH, |
| 434 | IDX_TYPE, |
| 435 | IDX_LOCATION, |
| 436 | IDX_ARRAY_SIZE, |
| 437 | IDX_REFERENCED_BY_VERTEX_SHADER, |
| 438 | IDX_REFERENCED_BY_GEOMETRY_SHADER, |
| 439 | IDX_REFERENCED_BY_FRAGMENT_SHADER, |
| 440 | IDX_REFERENCED_BY_COMPUTE_SHADER, |
| 441 | IDX_REFERENCED_BY_TESS_CONTROL_SHADER, |
| 442 | IDX_REFERENCED_BY_TESS_EVALUATION_SHADER, |
| 443 | IDX_IS_PER_PATCH, |
| 444 | IDX_LOCATION_COMPONENT, |
| 445 | IDX_LOCATION_INDEX |
| 446 | }; |
| 447 | |
| 448 | std::vector<GLenum> const properties = |
| 449 | { |
| 450 | GL_NAME_LENGTH, |
| 451 | GL_TYPE, |
| 452 | GL_LOCATION, |
| 453 | GL_ARRAY_SIZE, |
| 454 | GL_REFERENCED_BY_VERTEX_SHADER, |
| 455 | GL_REFERENCED_BY_GEOMETRY_SHADER, |
| 456 | GL_REFERENCED_BY_FRAGMENT_SHADER, |
| 457 | GL_REFERENCED_BY_COMPUTE_SHADER, |
| 458 | GL_REFERENCED_BY_TESS_CONTROL_SHADER, |
| 459 | GL_REFERENCED_BY_TESS_EVALUATION_SHADER, |
| 460 | GL_IS_PER_PATCH, |
| 461 | GL_LOCATION_COMPONENT, |
| 462 | GL_LOCATION_INDEX |
| 463 | }; |
| 464 | |
| 465 | GLsizei const numProperties = static_cast<GLsizei>(properties.size()); |
| 466 | |
| 467 | std::vector<GLint> results(properties.size(), 0); |
| 468 | for (int32_t i = 0; i < numResources; ++i) |
| 469 | { |
| 470 | glGetProgramResourceiv(mHandle, GL_PROGRAM_OUTPUT, i, numProperties, |
| 471 | properties.data(), numProperties, nullptr, results.data()); |
| 472 | |
| 473 | GLsizei const numBytes = static_cast<GLsizei>(results[IDX_NAME_LENGTH] + 1); |
| 474 | std::vector<GLchar> name(numBytes); |
| 475 | glGetProgramResourceName(mHandle, GL_PROGRAM_OUTPUT, i, numBytes, |
| 476 | nullptr, name.data()); |
| 477 | |
| 478 | Output& info = mOutputs[i]; |
| 479 | info.name = std::string(name.data()); |
| 480 | info.type = results[IDX_TYPE]; |
nothing calls this directly
no test coverage detected