13#ifndef CSCI441_SHADER_PROGRAM_HPP
14#define CSCI441_SHADER_PROGRAM_HPP
17#include "LogUtils.hpp"
21#include <glm/gtc/type_ptr.hpp>
56 const char *fragmentShaderFilename );
66 const char *fragmentShaderFilename,
78 const char *tessellationControlShaderFilename,
79 const char *tessellationEvaluationShaderFilename,
80 const char *geometryShaderFilename,
81 const char *fragmentShaderFilename );
94 const char *tessellationControlShaderFilename,
95 const char *tessellationEvaluationShaderFilename,
96 const char *geometryShaderFilename,
97 const char *fragmentShaderFilename,
109 const char *tessellationControlShaderFilename,
110 const char *tessellationEvaluationShaderFilename,
111 const char *fragmentShaderFilename );
123 const char *tessellationControlShaderFilename,
124 const char *tessellationEvaluationShaderFilename,
125 const char *fragmentShaderFilename,
135 const char *geometryShaderFilename,
136 const char *fragmentShaderFilename );
147 const char *geometryShaderFilename,
148 const char *fragmentShaderFilename,
163 bool vertexPresent,
bool tessellationPresent,
bool geometryPresent,
bool fragmentPresent,
233 [[maybe_unused]] virtual GLubyte*
getUniformBlockBuffer( const GLchar *uniformBlockName ) const final;
248 [[maybe_unused]] virtual GLint*
getUniformBlockOffsets( const GLchar *uniformBlockName, const GLchar *names[] ) const final;
263 [[nodiscard]] virtual GLint*
getUniformBlockOffsets(GLuint uniformBlockIndex, const GLchar *names[] ) const final;
288 [[maybe_unused]] virtual GLuint
getSubroutineIndex( GLenum shaderStage, const GLchar *subroutineName ) const final;
308 [[maybe_unused]] virtual
void setSubroutineIndices( GLenum shaderStage, GLsizei numIndices, const GLuint *indices ) final;
316 [[maybe_unused]] virtual GLint
getImageBinding(const GLchar* imageName) const final;
352 [[maybe_unused]] [[nodiscard]] virtual GLuint
getNumUniforms() const final;
362 [[maybe_unused]] [[nodiscard]] virtual GLuint
getNumAttributes() const final;
376 [[maybe_unused]] [[nodiscard]] virtual GLint
getFragmentDataIndex(const GLchar* name) const final;
388 [[nodiscard]] virtual GLboolean
validate() const final;
393 [[maybe_unused]] virtual
void useProgram() const final;
400 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0) const final;
406 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0) const final;
412 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0) const final;
418 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat2 mtx) const final;
424 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat3 mtx) const final;
430 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat4 mtx) const final;
436 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat2x3 mtx) const final;
442 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat3x2 mtx) const final;
448 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat2x4 mtx) const final;
454 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat4x2 mtx) const final;
460 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat3x4 mtx) const final;
466 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat4x3 mtx) const final;
474 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0, GLfloat v1) const final;
481 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0, GLint v1) const final;
488 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0, GLuint v1) const final;
497 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0, GLfloat v1, GLfloat v2) const final;
505 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0, GLint v1, GLint v2) const final;
513 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0, GLuint v1, GLuint v2) const final;
523 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const final;
532 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0, GLint v1, GLint v2, GLint v3) const final;
541 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const final;
548 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::vec2 value) const final;
554 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::ivec2 value) const final;
560 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::uvec2 value) const final;
567 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::vec3 value) const final;
573 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::ivec3 value) const final;
579 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::uvec3 value) const final;
586 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::vec4 value) const final;
592 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::ivec4 value) const final;
598 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::uvec4 value) const final;
607 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint dim, GLsizei count, const GLfloat *value) const final;
615 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint dim, GLsizei count, const GLint *value) const final;
623 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint dim, GLsizei count, const GLuint *value) const final;
630 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0) const final;
636 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0) const final;
642 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0) const final;
648 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat2 mtx) const final;
654 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat3 mtx) const final;
660 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat4 mtx) const final;
666 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat2x3 mtx) const final;
672 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat3x2 mtx) const final;
678 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat2x4 mtx) const final;
684 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat4x2 mtx) const final;
690 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat3x4 mtx) const final;
696 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat4x3 mtx) const final;
704 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0, GLfloat v1) const final;
711 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0, GLint v1) const final;
718 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0, GLuint v1) const final;
727 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0, GLfloat v1, GLfloat v2) const final;
735 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0, GLint v1, GLint v2) const final;
743 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0, GLuint v1, GLuint v2) const final;
753 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const final;
762 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0, GLint v1, GLint v2, GLint v3) const final;
771 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const final;
778 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::vec2 value) const final;
784 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::ivec2 value) const final;
790 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::uvec2 value) const final;
797 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::vec3 value) const final;
803 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::ivec3 value) const final;
809 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::uvec3 value) const final;
816 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::vec4 value) const final;
822 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::ivec4 value) const final;
828 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::uvec4 value) const final;
837 virtual
void setProgramUniform(GLint uniformLocation, GLuint dim, GLsizei count, const GLfloat *value) const final;
845 virtual
void setProgramUniform(GLint uniformLocation, GLuint dim, GLsizei count, const GLint *value) const final;
853 virtual
void setProgramUniform(GLint uniformLocation, GLuint dim, GLsizei count, const GLuint *value) const final;
919 const
char *tessellationControlShaderFilename,
920 const
char *tessellationEvaluationShaderFilename,
921 const
char *geometryShaderFilename,
922 const
char *fragmentShaderFilename,
923 bool isSeparable ) final;
939 CSCI441_INTERNAL::ShaderUtils::enableDebugMessages();
945 CSCI441_INTERNAL::ShaderUtils::disableDebugMessages();
949 const char *vertexShaderFilename,
950 const char *fragmentShaderFilename
958 const char *vertexShaderFilename,
959 const char *fragmentShaderFilename,
960 const bool isSeparable
968 const char *vertexShaderFilename,
969 const char *tessellationControlShaderFilename,
970 const char *tessellationEvaluationShaderFilename,
971 const char *geometryShaderFilename,
972 const char *fragmentShaderFilename
974 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
975 geometryShaderFilename, fragmentShaderFilename,
false);
980 const char *vertexShaderFilename,
981 const char *tessellationControlShaderFilename,
982 const char *tessellationEvaluationShaderFilename,
983 const char *geometryShaderFilename,
984 const char *fragmentShaderFilename,
985 const bool isSeparable
987 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
988 geometryShaderFilename, fragmentShaderFilename, isSeparable);
993 const char *vertexShaderFilename,
994 const char *tessellationControlShaderFilename,
995 const char *tessellationEvaluationShaderFilename,
996 const char *fragmentShaderFilename
998 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
999 "", fragmentShaderFilename,
false);
1004 const char *vertexShaderFilename,
1005 const char *tessellationControlShaderFilename,
1006 const char *tessellationEvaluationShaderFilename,
1007 const char *fragmentShaderFilename,
1008 const bool isSeparable
1010 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
1011 "", fragmentShaderFilename, isSeparable);
1015 const char *vertexShaderFilename,
1016 const char *geometryShaderFilename,
1017 const char *fragmentShaderFilename
1019 mRegisterShaderProgram(vertexShaderFilename,
"",
"", geometryShaderFilename, fragmentShaderFilename,
false);
1024 const char *vertexShaderFilename,
1025 const char *geometryShaderFilename,
1026 const char *fragmentShaderFilename,
1027 const bool isSeparable
1029 mRegisterShaderProgram(vertexShaderFilename,
"",
"", geometryShaderFilename, fragmentShaderFilename, isSeparable);
1034 const char **shaderFilenames,
1035 const bool vertexPresent,
const bool tessellationPresent,
const bool geometryPresent,
const bool fragmentPresent,
1036 const bool isSeparable
1038 if( vertexPresent && !tessellationPresent && !geometryPresent && !fragmentPresent ) {
1039 if( !isSeparable ) {
1044 }
else if( vertexPresent && tessellationPresent && !geometryPresent && !fragmentPresent ) {
1045 if( !isSeparable ) {
1050 }
else if( vertexPresent && tessellationPresent && geometryPresent && !fragmentPresent ) {
1051 if( !isSeparable ) {
1054 mRegisterShaderProgram(shaderFilenames[0], shaderFilenames[1], shaderFilenames[2], shaderFilenames[3],
"", isSeparable);
1056 }
else if( vertexPresent && tessellationPresent && geometryPresent && fragmentPresent ) {
1057 mRegisterShaderProgram(shaderFilenames[0], shaderFilenames[1], shaderFilenames[2], shaderFilenames[3], shaderFilenames[4], isSeparable);
1058 }
else if( vertexPresent && tessellationPresent && !geometryPresent && fragmentPresent ) {
1059 mRegisterShaderProgram(shaderFilenames[0], shaderFilenames[1], shaderFilenames[2],
"", shaderFilenames[3], isSeparable);
1060 }
else if( vertexPresent && !tessellationPresent && geometryPresent && !fragmentPresent ) {
1061 if( !isSeparable ) {
1066 }
else if( vertexPresent && !tessellationPresent && geometryPresent && fragmentPresent ) {
1068 }
else if( vertexPresent && !tessellationPresent && !geometryPresent && fragmentPresent ) {
1070 }
else if( !vertexPresent && tessellationPresent && !geometryPresent && !fragmentPresent ) {
1071 if( !isSeparable ) {
1076 }
else if( !vertexPresent && tessellationPresent && geometryPresent && !fragmentPresent ) {
1077 if( !isSeparable ) {
1082 }
else if( !vertexPresent && tessellationPresent && geometryPresent && fragmentPresent ) {
1083 if( !isSeparable ) {
1086 mRegisterShaderProgram(
"", shaderFilenames[0], shaderFilenames[1], shaderFilenames[2], shaderFilenames[3], isSeparable);
1088 }
else if( !vertexPresent && tessellationPresent && !geometryPresent && fragmentPresent ) {
1089 if( !isSeparable ) {
1094 }
else if( !vertexPresent && !tessellationPresent && geometryPresent && !fragmentPresent ) {
1095 if( !isSeparable ) {
1100 }
else if( !vertexPresent && !tessellationPresent && geometryPresent && fragmentPresent ) {
1101 if( !isSeparable ) {
1106 }
else if( !vertexPresent && !tessellationPresent && !geometryPresent && fragmentPresent ) {
1107 if( !isSeparable ) {
1112 }
else if( !vertexPresent && !tessellationPresent && !geometryPresent && !fragmentPresent ) {
1120 const char *vertexShaderFilename,
1121 const char *tessellationControlShaderFilename,
1122 const char *tessellationEvaluationShaderFilename,
1123 const char *geometryShaderFilename,
1124 const char *fragmentShaderFilename,
1125 const bool isSeparable
1128 glGetIntegerv(GL_MAJOR_VERSION, &major);
1129 glGetIntegerv(GL_MINOR_VERSION, &minor);
1131 if( sDEBUG )
CSCI441::LogUtils::log(
"\n[INFO]: /--------------------------------------------------------\\\n");
1134 if( strcmp( vertexShaderFilename,
"" ) != 0 ) {
1136 mVertexShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(vertexShaderFilename, GL_VERTEX_SHADER );
1138 mVertexShaderHandle = 0;
1141 if(strcmp(tessellationControlShaderFilename,
"" ) != 0 ) {
1142 if( sDEBUG )
CSCI441::LogUtils::log(
"[INFO]: | Tess Control Shader: %33s |\n", tessellationControlShaderFilename );
1145 mTessellationControlShaderHandle = 0;
1147 mTessellationControlShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(tessellationControlShaderFilename, GL_TESS_CONTROL_SHADER );
1150 mTessellationControlShaderHandle = 0;
1153 if(strcmp(tessellationEvaluationShaderFilename,
"" ) != 0 ) {
1154 if( sDEBUG )
CSCI441::LogUtils::log(
"[INFO]: | Tess Evaluation Shader: %30s |\n", tessellationEvaluationShaderFilename );
1157 mTessellationEvaluationShaderHandle = 0;
1159 mTessellationEvaluationShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(tessellationEvaluationShaderFilename, GL_TESS_EVALUATION_SHADER );
1162 mTessellationEvaluationShaderHandle = 0;
1165 if( strcmp( geometryShaderFilename,
"" ) != 0 ) {
1167 if( major < 3 || (major == 3 && minor < 2) ) {
1169 mGeometryShaderHandle = 0;
1171 mGeometryShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(geometryShaderFilename, GL_GEOMETRY_SHADER );
1174 mGeometryShaderHandle = 0;
1177 if( strcmp( fragmentShaderFilename,
"" ) != 0 ) {
1179 mFragmentShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(fragmentShaderFilename, GL_FRAGMENT_SHADER );
1181 mFragmentShaderHandle = 0;
1184 mShaderProgramHandle = glCreateProgram();
1188 glProgramParameteri(mShaderProgramHandle, GL_PROGRAM_SEPARABLE, GL_TRUE );
1192 if(mVertexShaderHandle != 0 ) {
1193 glAttachShader(mShaderProgramHandle, mVertexShaderHandle );
1195 if(mTessellationControlShaderHandle != 0 ) {
1196 glAttachShader(mShaderProgramHandle, mTessellationControlShaderHandle );
1198 if(mTessellationEvaluationShaderHandle != 0 ) {
1199 glAttachShader(mShaderProgramHandle, mTessellationEvaluationShaderHandle );
1201 if(mGeometryShaderHandle != 0 ) {
1202 glAttachShader(mShaderProgramHandle, mGeometryShaderHandle );
1204 if(mFragmentShaderHandle != 0 ) {
1205 glAttachShader(mShaderProgramHandle, mFragmentShaderHandle );
1209 glLinkProgram(mShaderProgramHandle );
1214 CSCI441_INTERNAL::ShaderUtils::printProgramLog(mShaderProgramHandle );
1217 if(mVertexShaderHandle != 0 ) {
1218 glDetachShader(mShaderProgramHandle, mVertexShaderHandle );
1219 glDeleteShader(mVertexShaderHandle );
1221 if(mTessellationControlShaderHandle != 0 ) {
1222 glDetachShader(mShaderProgramHandle, mTessellationControlShaderHandle );
1223 glDeleteShader(mTessellationControlShaderHandle );
1225 if(mTessellationEvaluationShaderHandle != 0 ) {
1226 glDetachShader(mShaderProgramHandle, mTessellationEvaluationShaderHandle );
1227 glDeleteShader(mTessellationEvaluationShaderHandle );
1229 if(mGeometryShaderHandle != 0 ) {
1230 glDetachShader(mShaderProgramHandle, mGeometryShaderHandle );
1231 glDeleteShader(mGeometryShaderHandle );
1233 if(mFragmentShaderHandle != 0 ) {
1234 glDetachShader(mShaderProgramHandle, mFragmentShaderHandle );
1235 glDeleteShader(mFragmentShaderHandle );
1240 mpUniformLocationsMap =
new std::map<std::string, GLint>();
1242 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORMS, &numUniforms);
1243 GLint max_uniform_name_size;
1244 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_uniform_name_size);
1245 if( numUniforms > 0 ) {
1246 for(GLint i = 0; i < numUniforms; i++) {
1247 auto name =
new GLchar[max_uniform_name_size];
1248 int actual_length = 0;
1251 glGetActiveUniform(mShaderProgramHandle, i, max_uniform_name_size, &actual_length, &size, &type, name );
1254 for(
int j = 0; j < size; j++) {
1255 const int max_array_size = actual_length + 4 + 2 + 1;
1256 auto array_name =
new GLchar[max_array_size];
1257 snprintf(array_name, max_array_size,
"%s[%i]", name, j);
1258 location = glGetUniformLocation(mShaderProgramHandle, array_name);
1259 mpUniformLocationsMap->emplace(array_name, location);
1260 delete[] array_name;
1263 location = glGetUniformLocation(mShaderProgramHandle, name);
1264 mpUniformLocationsMap->emplace(name, location);
1271 mpAttributeLocationsMap =
new std::map<std::string, GLint>();
1272 GLint numAttributes;
1273 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttributes );
1274 GLint max_attr_name_size;
1275 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_attr_name_size);
1276 if( numAttributes > 0 ) {
1277 for(GLint i = 0; i < numAttributes; i++) {
1278 auto name =
new GLchar[max_attr_name_size];
1279 int actual_length = 0;
1282 glGetActiveAttrib(mShaderProgramHandle, i, max_attr_name_size, &actual_length, &size, &type, name );
1285 for(
int j = 0; j < size; j++ ) {
1286 const int max_array_size = actual_length + 4 + 2 + 1;
1287 auto array_name =
new GLchar[max_array_size];
1288 snprintf( array_name, max_array_size,
"%s[%i]", name, j );
1289 location = glGetAttribLocation(mShaderProgramHandle, array_name );
1290 mpAttributeLocationsMap->emplace(array_name, location);
1291 delete[] array_name;
1294 location = glGetAttribLocation(mShaderProgramHandle, name );
1295 mpAttributeLocationsMap->emplace(name, location);
1301 GLint separable = GL_FALSE;
1302 glGetProgramiv(mShaderProgramHandle, GL_PROGRAM_SEPARABLE, &separable );
1304 if( sDEBUG )
CSCI441::LogUtils::log(
"[INFO]: | Program Separable: %35s |\n", (separable ?
"Yes" :
"No"));
1307 glGetProgramiv(mShaderProgramHandle, GL_LINK_STATUS, &linkStatus );
1310 if(linkStatus == GL_TRUE) {
1311 CSCI441_INTERNAL::ShaderUtils::printShaderProgramInfo(mShaderProgramHandle, mVertexShaderHandle != 0,
1312 mTessellationControlShaderHandle != 0,
1313 mTessellationEvaluationShaderHandle != 0,
1314 mGeometryShaderHandle != 0, mFragmentShaderHandle != 0,
1317 if(sDEBUG)
CSCI441::LogUtils::log(
"[INFO]: \\--------------------------------------------------------/\n\n");
1320 return mShaderProgramHandle != 0;
1324 const GLint uniformLoc = glGetUniformLocation(mShaderProgramHandle, uniformName );
1325 if( uniformLoc == GL_INVALID_VALUE )
1326 CSCI441::LogUtils::logError(
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle );
1331 const GLuint uniformBlockLoc = glGetUniformBlockIndex(mShaderProgramHandle, uniformBlockName );
1332 if( uniformBlockLoc == GL_INVALID_INDEX )
1333 CSCI441::LogUtils::logError(
"[ERROR]: Could not find uniform block \"%s\" for Shader Program %u\n", uniformBlockName, mShaderProgramHandle );
1334 return uniformBlockLoc;
1339 glGetActiveUniformBlockiv(mShaderProgramHandle, getUniformBlockIndex(uniformBlockName), GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize );
1345 const GLint blockSize = getUniformBlockSize( uniformBlockName );
1346 return (GLubyte*)malloc(blockSize);
1351 return getUniformBlockOffsets(getUniformBlockIndex(uniformBlockName));
1356 return getUniformBlockOffsets(getUniformBlockIndex(uniformBlockName), names);
1361 glGetActiveUniformBlockiv(mShaderProgramHandle, uniformBlockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &numUniforms );
1363 const auto indices = (GLuint*)malloc(numUniforms*
sizeof(GLuint));
1364 glGetActiveUniformBlockiv(mShaderProgramHandle, uniformBlockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, (GLint*)indices);
1366 const auto offsets = (GLint*)malloc(numUniforms*
sizeof(GLint));
1367 glGetActiveUniformsiv(mShaderProgramHandle, numUniforms, indices, GL_UNIFORM_OFFSET, offsets );
1373 glGetActiveUniformBlockiv(mShaderProgramHandle, uniformBlockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &numUniforms );
1375 const auto indices = (GLuint*)malloc(numUniforms*
sizeof(GLuint));
1376 glGetUniformIndices(mShaderProgramHandle, numUniforms, names, indices );
1378 const auto offsets = (GLint*)malloc(numUniforms*
sizeof(GLint));
1379 glGetActiveUniformsiv(mShaderProgramHandle, numUniforms, indices, GL_UNIFORM_OFFSET, offsets );
1384 glUniformBlockBinding(mShaderProgramHandle, getUniformBlockIndex(uniformBlockName), binding );
1389 const auto attribIter = mpAttributeLocationsMap->find(attributeName);
1390 if(attribIter == mpAttributeLocationsMap->end() ) {
1391 CSCI441::LogUtils::logError(
"[ERROR]: Could not find attribute \"%s\" for Shader Program %u\n", attributeName, mShaderProgramHandle );
1394 return attribIter->second;
1399 const GLuint subroutineIndex = glGetSubroutineIndex(mShaderProgramHandle, shaderStage, subroutineName );
1400 if( subroutineIndex == GL_INVALID_INDEX )
1401 CSCI441::LogUtils::logError(
"[ERROR]: Could not find subroutine \"%s\" in %s for Shader Program %u\n", subroutineName, CSCI441_INTERNAL::ShaderUtils::GL_shader_type_to_string(shaderStage), mShaderProgramHandle );
1402 return subroutineIndex;
1407 const GLint subroutineUniform = glGetSubroutineUniformLocation(mShaderProgramHandle, shaderStage, subroutineName );
1408 if ( subroutineUniform == GL_INVALID_VALUE )
1409 CSCI441::LogUtils::logError(
"[ERROR]: Could not find subroutine \"%s\" in %s for Shader Program %u\n", subroutineName, CSCI441_INTERNAL::ShaderUtils::GL_shader_type_to_string(shaderStage), mShaderProgramHandle );
1410 return subroutineUniform;
1415 glUniformSubroutinesuiv( shaderStage, numIndices, indices );
1421 const GLint imageLoc = getUniformLocation(imageName);
1423 if(imageLoc == -1) {
1429 glGetUniformiv(mShaderProgramHandle, imageLoc, &bindingPoint);
1431 return bindingPoint;
1436 const GLuint ssboIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_SHADER_STORAGE_BLOCK, ssboName);
1438 if(ssboIndex == GL_INVALID_INDEX) {
1439 CSCI441::LogUtils::logError(
"[ERROR]: Could not find shader storage block \"%s\" for Shader Program %u\n", ssboName, mShaderProgramHandle);
1443 constexpr GLenum props = GL_BUFFER_BINDING;
1445 glGetProgramResourceiv(mShaderProgramHandle, GL_SHADER_STORAGE_BLOCK, ssboIndex, 1, &props, 1,
nullptr, &binding);
1452 const GLuint uniformIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_UNIFORM, atomicName);
1454 if(uniformIndex == GL_INVALID_INDEX) {
1455 CSCI441::LogUtils::logError(
"[ERROR]: Could not find atomic counter \"%s\" for Shader Program %u\n", atomicName, mShaderProgramHandle);
1459 constexpr GLenum props = GL_ATOMIC_COUNTER_BUFFER_INDEX;
1460 GLint atomicIndex, binding;
1461 glGetProgramResourceiv(mShaderProgramHandle, GL_UNIFORM, uniformIndex, 1, &props, 1,
nullptr, &atomicIndex);
1462 glGetActiveAtomicCounterBufferiv(mShaderProgramHandle, atomicIndex, GL_ATOMIC_COUNTER_BUFFER_BINDING, &binding);
1469 const GLuint uniformIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_UNIFORM, atomicName);
1471 if(uniformIndex == GL_INVALID_INDEX) {
1472 CSCI441::LogUtils::logError(
"[ERROR]: Could not find atomic counter \"%s\" for Shader Program %u\n", atomicName, mShaderProgramHandle);
1477 glGetActiveUniformsiv(mShaderProgramHandle, 1, &uniformIndex, GL_UNIFORM_OFFSET, &offset);
1483 const GLuint uniformIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_UNIFORM, atomicName);
1485 if(uniformIndex == GL_INVALID_INDEX) {
1486 CSCI441::LogUtils::logError(
"[ERROR]: Could not find atomic counter \"%s\" for Shader Program %u\n", atomicName, mShaderProgramHandle);
1490 constexpr GLenum props = GL_ATOMIC_COUNTER_BUFFER_INDEX;
1491 GLint atomicIndex, bufferSize;
1492 glGetProgramResourceiv(mShaderProgramHandle, GL_UNIFORM, uniformIndex, 1, &props, 1,
nullptr, &atomicIndex);
1493 glGetActiveAtomicCounterBufferiv(mShaderProgramHandle, atomicIndex, GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE, &bufferSize);
1500 GLint numUniform = 0;
1501 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORMS, &numUniform );
1507 GLint numUniformBlocks = 0;
1508 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORM_BLOCKS, &numUniformBlocks );
1509 return numUniformBlocks;
1515 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttr );
1521 return glGetFragDataLocation(mShaderProgramHandle, name);
1526 return glGetFragDataIndex(mShaderProgramHandle, name);
1530 return mShaderProgramHandle;
1534 if (mShaderProgramHandle == 0) {
1538 glValidateProgram(mShaderProgramHandle);
1539 GLint validateStatus = GL_FALSE;
1540 glGetProgramiv(mShaderProgramHandle, GL_VALIDATE_STATUS, &validateStatus);
1542 if (validateStatus == GL_FALSE && sDEBUG) {
1543 CSCI441_INTERNAL::ShaderUtils::printProgramInfoLog(mShaderProgramHandle);
1546 return (validateStatus == GL_TRUE);
1551 glUseProgram(mShaderProgramHandle );
1556 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1557 if(uniformIter != mpUniformLocationsMap->end()) {
1558 glProgramUniform1f(mShaderProgramHandle, uniformIter->second, v0 );
1566 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1567 if(uniformIter != mpUniformLocationsMap->end()) {
1568 glProgramUniform2f(mShaderProgramHandle, uniformIter->second, v0, v1 );
1576 setProgramUniform( uniformName, 2, 1, glm::value_ptr(value) );
1581 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1582 if(uniformIter != mpUniformLocationsMap->end()) {
1583 glProgramUniform3f(mShaderProgramHandle, uniformIter->second, v0, v1, v2 );
1591 setProgramUniform( uniformName, 3, 1, glm::value_ptr(value) );
1596 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1597 if(uniformIter != mpUniformLocationsMap->end()) {
1598 glProgramUniform4f(mShaderProgramHandle, uniformIter->second, v0, v1, v2, v3 );
1606 setProgramUniform( uniformName, 4, 1, glm::value_ptr(value) );
1610 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1611 if(uniformIter != mpUniformLocationsMap->end()) {
1614 glProgramUniform1fv(mShaderProgramHandle, uniformIter->second, count, value );
1617 glProgramUniform2fv(mShaderProgramHandle, uniformIter->second, count, value );
1620 glProgramUniform3fv(mShaderProgramHandle, uniformIter->second, count, value );
1623 glProgramUniform4fv(mShaderProgramHandle, uniformIter->second, count, value );
1626 CSCI441::LogUtils::logError(
"[ERROR]: invalid dimension %u for uniform %s in Shader Program %u. Dimension must be [1,4]\n", dim, uniformName, mShaderProgramHandle);
1636 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1637 if(uniformIter != mpUniformLocationsMap->end()) {
1638 glProgramUniform1i(mShaderProgramHandle, uniformIter->second, v0 );
1646 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1647 if(uniformIter != mpUniformLocationsMap->end()) {
1648 glProgramUniform2i(mShaderProgramHandle, uniformIter->second, v0, v1 );
1656 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1657 if(uniformIter != mpUniformLocationsMap->end()) {
1658 glProgramUniform2iv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1666 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1667 if(uniformIter != mpUniformLocationsMap->end()) {
1668 glProgramUniform3i(mShaderProgramHandle, uniformIter->second, v0, v1, v2 );
1676 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1677 if(uniformIter != mpUniformLocationsMap->end()) {
1678 glProgramUniform3iv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1686 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1687 if(uniformIter != mpUniformLocationsMap->end()) {
1688 glProgramUniform4i(mShaderProgramHandle, uniformIter->second, v0, v1, v2, v3 );
1696 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1697 if(uniformIter != mpUniformLocationsMap->end()) {
1698 glProgramUniform4iv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1706 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1707 if(uniformIter != mpUniformLocationsMap->end()) {
1710 glProgramUniform1iv(mShaderProgramHandle, uniformIter->second, count, value );
1713 glProgramUniform2iv(mShaderProgramHandle, uniformIter->second, count, value );
1716 glProgramUniform3iv(mShaderProgramHandle, uniformIter->second, count, value );
1719 glProgramUniform4iv(mShaderProgramHandle, uniformIter->second, count, value );
1722 CSCI441::LogUtils::logError(
"[ERROR]: invalid dimension %u for uniform %s in Shader Program %u. Dimension must be [1,4]\n", dim, uniformName, mShaderProgramHandle);
1732 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1733 if(uniformIter != mpUniformLocationsMap->end()) {
1734 glProgramUniform1ui(mShaderProgramHandle, uniformIter->second, v0 );
1742 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1743 if(uniformIter != mpUniformLocationsMap->end()) {
1744 glProgramUniform2ui(mShaderProgramHandle, uniformIter->second, v0, v1 );
1752 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1753 if(uniformIter != mpUniformLocationsMap->end()) {
1754 glProgramUniform2uiv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1762 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1763 if(uniformIter != mpUniformLocationsMap->end()) {
1764 glProgramUniform3ui(mShaderProgramHandle, uniformIter->second, v0, v1, v2 );
1772 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1773 if(uniformIter != mpUniformLocationsMap->end()) {
1774 glProgramUniform3uiv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1782 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1783 if(uniformIter != mpUniformLocationsMap->end()) {
1784 glProgramUniform4ui(mShaderProgramHandle, uniformIter->second, v0, v1, v2, v3 );
1792 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1793 if(uniformIter != mpUniformLocationsMap->end()) {
1794 glProgramUniform4uiv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1802 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1803 if(uniformIter != mpUniformLocationsMap->end()) {
1806 glProgramUniform1uiv(mShaderProgramHandle, uniformIter->second, count, value );
1809 glProgramUniform2uiv(mShaderProgramHandle, uniformIter->second, count, value );
1812 glProgramUniform3uiv(mShaderProgramHandle, uniformIter->second, count, value );
1815 glProgramUniform4uiv(mShaderProgramHandle, uniformIter->second, count, value );
1818 CSCI441::LogUtils::logError(
"[ERROR]: invalid dimension %u for uniform %s in Shader Program %u. Dimension must be [1,4]\n", dim, uniformName, mShaderProgramHandle);
1828 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1829 if(uniformIter != mpUniformLocationsMap->end()) {
1830 glProgramUniformMatrix2fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1838 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1839 if(uniformIter != mpUniformLocationsMap->end()) {
1840 glProgramUniformMatrix3fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1848 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1849 if(uniformIter != mpUniformLocationsMap->end()) {
1850 glProgramUniformMatrix4fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1858 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1859 if(uniformIter != mpUniformLocationsMap->end()) {
1860 glProgramUniformMatrix2x3fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1868 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1869 if(uniformIter != mpUniformLocationsMap->end()) {
1870 glProgramUniformMatrix3x2fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1878 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1879 if(uniformIter != mpUniformLocationsMap->end()) {
1880 glProgramUniformMatrix2x4fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1888 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1889 if(uniformIter != mpUniformLocationsMap->end()) {
1890 glProgramUniformMatrix4x2fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1898 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1899 if(uniformIter != mpUniformLocationsMap->end()) {
1900 glProgramUniformMatrix3x4fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1908 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1909 if(uniformIter != mpUniformLocationsMap->end()) {
1910 glProgramUniformMatrix4x3fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1918 glProgramUniform1f(mShaderProgramHandle, uniformLocation, v0 );
1923 glProgramUniform2f(mShaderProgramHandle, uniformLocation, v0, v1 );
1928 setProgramUniform( uniformLocation, 2, 1, glm::value_ptr(value) );
1933 glProgramUniform3f(mShaderProgramHandle, uniformLocation, v0, v1, v2 );
1938 setProgramUniform( uniformLocation, 3, 1, glm::value_ptr(value) );
1943 glProgramUniform4f(mShaderProgramHandle, uniformLocation, v0, v1, v2, v3 );
1948 setProgramUniform( uniformLocation, 4, 1, glm::value_ptr(value) );
1954 glProgramUniform1fv(mShaderProgramHandle, uniformLocation, count, value );
1957 glProgramUniform2fv(mShaderProgramHandle, uniformLocation, count, value );
1960 glProgramUniform3fv(mShaderProgramHandle, uniformLocation, count, value );
1963 glProgramUniform4fv(mShaderProgramHandle, uniformLocation, count, value );
1966 CSCI441::LogUtils::logError(
"[ERROR]: invalid dimension %u for uniform %i in Shader Program %u. Dimension must be [1,4]\n", dim, uniformLocation, mShaderProgramHandle);
1973 glProgramUniform1i(mShaderProgramHandle, uniformLocation, v0 );
1978 glProgramUniform2i(mShaderProgramHandle, uniformLocation, v0, v1 );
1983 setProgramUniform(uniformLocation, 2, 1, glm::value_ptr(value));
1988 glProgramUniform3i(mShaderProgramHandle, uniformLocation, v0, v1, v2 );
1993 setProgramUniform(uniformLocation, 3, 1, glm::value_ptr(value));
1998 glProgramUniform4i(mShaderProgramHandle, uniformLocation, v0, v1, v2, v3 );
2003 setProgramUniform(uniformLocation, 4, 1, glm::value_ptr(value));
2009 glProgramUniform1iv(mShaderProgramHandle, uniformLocation, count, value );
2012 glProgramUniform2iv(mShaderProgramHandle, uniformLocation, count, value );
2015 glProgramUniform3iv(mShaderProgramHandle, uniformLocation, count, value );
2018 glProgramUniform4iv(mShaderProgramHandle, uniformLocation, count, value );
2021 CSCI441::LogUtils::logError(
"[ERROR]: invalid dimension %u for uniform %i in Shader Program %u. Dimension must be [1,4]\n", dim, uniformLocation, mShaderProgramHandle);
2028 glProgramUniform1ui(mShaderProgramHandle, uniformLocation, v0 );
2033 glProgramUniform2ui(mShaderProgramHandle, uniformLocation, v0, v1 );
2038 setProgramUniform(uniformLocation, 2, 1, glm::value_ptr(value));
2043 glProgramUniform3ui(mShaderProgramHandle, uniformLocation, v0, v1, v2 );
2048 setProgramUniform(uniformLocation, 3, 1, glm::value_ptr(value));
2053 glProgramUniform4ui(mShaderProgramHandle, uniformLocation, v0, v1, v2, v3 );
2058 setProgramUniform(uniformLocation, 4, 1, glm::value_ptr(value));
2064 glProgramUniform1uiv(mShaderProgramHandle, uniformLocation, count, value );
2067 glProgramUniform2uiv(mShaderProgramHandle, uniformLocation, count, value );
2070 glProgramUniform3uiv(mShaderProgramHandle, uniformLocation, count, value );
2073 glProgramUniform4uiv(mShaderProgramHandle, uniformLocation, count, value );
2076 CSCI441::LogUtils::logError(
"[ERROR]: invalid dimension %u for uniform %i in Shader Program %u. Dimension must be [1,4]\n", dim, uniformLocation, mShaderProgramHandle);
2083 glProgramUniformMatrix2fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2088 glProgramUniformMatrix3fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2093 glProgramUniformMatrix4fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2098 glProgramUniformMatrix2x3fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2103 glProgramUniformMatrix3x2fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2108 glProgramUniformMatrix2x4fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2113 glProgramUniformMatrix4x2fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2118 glProgramUniformMatrix3x4fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2123 glProgramUniformMatrix4x3fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2128 GLbitfield shaderBits = 0;
2129 if( mVertexShaderHandle != 0 ) shaderBits |= GL_VERTEX_SHADER_BIT;
2130 if( mTessellationControlShaderHandle != 0 ) shaderBits |= GL_TESS_CONTROL_SHADER_BIT;
2131 if( mTessellationEvaluationShaderHandle != 0 ) shaderBits |= GL_TESS_EVALUATION_SHADER_BIT;
2132 if( mGeometryShaderHandle != 0 ) shaderBits |= GL_GEOMETRY_SHADER_BIT;
2133 if( mFragmentShaderHandle != 0 ) shaderBits |= GL_FRAGMENT_SHADER_BIT;
2138 mVertexShaderHandle(0),
2139 mTessellationControlShaderHandle(0), mTessellationEvaluationShaderHandle(0),
2140 mGeometryShaderHandle(0),
2141 mFragmentShaderHandle(0),
2142 mShaderProgramHandle(0),
2143 mpUniformLocationsMap(nullptr), mpAttributeLocationsMap(nullptr)
2155 _moveFromSource(src);
2161 _moveFromSource(src);
2166inline void CSCI441::ShaderProgram::_cleanupSelf() {
2167 glDeleteProgram(mShaderProgramHandle);
2169 delete mpUniformLocationsMap;
2170 delete mpAttributeLocationsMap;
2172 mVertexShaderHandle = 0;
2173 mTessellationControlShaderHandle = 0;
2174 mTessellationEvaluationShaderHandle = 0;
2175 mGeometryShaderHandle = 0;
2176 mFragmentShaderHandle = 0;
2177 mShaderProgramHandle = 0;
2178 mpUniformLocationsMap =
nullptr;
2179 mpAttributeLocationsMap =
nullptr;
2182inline void CSCI441::ShaderProgram::_moveFromSource(ShaderProgram &src) {
2183 mVertexShaderHandle = src.mVertexShaderHandle;
2184 src.mVertexShaderHandle = 0;
2186 mTessellationControlShaderHandle = src.mTessellationControlShaderHandle;
2187 src.mTessellationControlShaderHandle = 0;
2189 mTessellationEvaluationShaderHandle = src.mTessellationEvaluationShaderHandle;
2190 src.mTessellationEvaluationShaderHandle = 0;
2192 mGeometryShaderHandle = src.mGeometryShaderHandle;
2193 src.mGeometryShaderHandle = 0;
2195 mFragmentShaderHandle = src.mFragmentShaderHandle;
2196 src.mFragmentShaderHandle = 0;
2198 mShaderProgramHandle = src.mShaderProgramHandle;
2199 src.mShaderProgramHandle = 0;
2201 mpUniformLocationsMap = src.mpUniformLocationsMap;
2202 src.mpUniformLocationsMap =
nullptr;
2204 mpAttributeLocationsMap = src.mpAttributeLocationsMap;
2205 src.mpAttributeLocationsMap =
nullptr;
2211 glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
2219 glGetProgramiv(mShaderProgramHandle, GL_PROGRAM_BINARY_LENGTH, &length);
2222 std::vector<GLubyte> buffer(length);
2224 glGetProgramBinary(mShaderProgramHandle, length,
nullptr, &format, buffer.data());
2228 std::ofstream out(BINARY_FILE_NAME, std::ios::binary);
2229 out.write(
reinterpret_cast<char *
>(buffer.data()), length );
2237 glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
2243 const GLuint program = glCreateProgram();
2246 std::ifstream inputStream(BINARY_FILE_NAME, std::ios::binary);
2247 const std::istreambuf_iterator<char> startIt(inputStream);
2248 constexpr std::istreambuf_iterator<char> endIt;
2249 const std::vector<char> buffer(startIt, endIt);
2250 inputStream.close();
2253 glProgramBinary(program, FORMAT, buffer.data(),
static_cast<GLsizei
>(buffer.size()) );
2257 glGetProgramiv(program, GL_LINK_STATUS, &status);
2258 if( GL_FALSE == status ) {
2259 CSCI441_INTERNAL::ShaderUtils::printProgramLog(program);
2264 shaderProgram->mShaderProgramHandle = program;
2265 return shaderProgram;
Helper functions to work with OpenGL Shaders.
Handles registration and compilation of Shaders.
Definition: ShaderProgram.hpp:37
virtual GLbitfield getProgramStages() const
returns a single value corresponding to which shader stages are present in this shader program
Definition: ShaderProgram.hpp:2127
GLuint mTessellationEvaluationShaderHandle
handle to the tessellation evaluation shader stage
Definition: ShaderProgram.hpp:884
virtual GLint * getUniformBlockOffsets(const GLchar *uniformBlockName) const final
Returns an array of offsets into the buffer for the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1350
GLuint mVertexShaderHandle
handle to the vertex shader stage
Definition: ShaderProgram.hpp:876
virtual GLubyte * getUniformBlockBuffer(const GLchar *uniformBlockName) const final
Returns an allocated buffer for the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1344
virtual void setProgramUniform(const GLchar *uniformName, GLfloat v0) const final
sets the program uniform consisting of one float
Definition: ShaderProgram.hpp:1555
static ShaderProgram * loadShaderProgramFromBinaryFile(const char *BINARY_FILE_NAME, GLenum format)
loads precompiled shader program binary from external file
Definition: ShaderProgram.hpp:2235
virtual GLint getAttributeLocation(const GLchar *attributeName) const final
Returns the location of the given attribute in this shader program.
Definition: ShaderProgram.hpp:1388
GLuint mShaderProgramHandle
handle to the shader program
Definition: ShaderProgram.hpp:897
GLuint mTessellationControlShaderHandle
handle to the tessellation control shader stage
Definition: ShaderProgram.hpp:880
virtual void useProgram() const final
Sets the Shader Program to be active.
Definition: ShaderProgram.hpp:1550
virtual GLuint getNumAttributes() const final
Returns the number of active attributes in this shader program.
Definition: ShaderProgram.hpp:1513
virtual void setUniformBlockBinding(const GLchar *uniformBlockName, GLuint binding) const final
Set the binding point for the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1383
std::map< std::string, GLint > * mpUniformLocationsMap
caches locations of uniform names within shader program
Definition: ShaderProgram.hpp:902
virtual GLint getAtomicCounterBufferOffset(const GLchar *atomicName) const final
Returns the offset into the buffer for the corresponding atomic counter buffer.
Definition: ShaderProgram.hpp:1468
ShaderProgram & operator=(const ShaderProgram &)=delete
do not allow shader programs to be copied
virtual GLuint getNumUniforms() const final
Returns the number of active uniforms in this shader program.
Definition: ShaderProgram.hpp:1499
virtual GLint getSubroutineUniformLocation(GLenum shaderStage, const GLchar *subroutineName) const final
Returns the uniform location within the subroutine array for a given subroutine.
Definition: ShaderProgram.hpp:1406
virtual GLuint getUniformBlockIndex(const GLchar *uniformBlockName) const final
Returns the index of the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1330
virtual GLint getImageBinding(const GLchar *imageName) const final
Returns the binding point for the corresponding image uniform.
Definition: ShaderProgram.hpp:1420
virtual ~ShaderProgram()
Clean up memory associated with the Shader Program.
Definition: ShaderProgram.hpp:2148
virtual GLuint getShaderProgramHandle() const final
Returns the handle for this shader program.
Definition: ShaderProgram.hpp:1529
GLuint mGeometryShaderHandle
handle to the geometry shader stage
Definition: ShaderProgram.hpp:888
virtual GLint getAtomicCounterBufferBinding(const GLchar *atomicName) const final
Returns the binding point for the corresponding atomic counter buffer.
Definition: ShaderProgram.hpp:1451
static bool sDEBUG
if DEBUG information should be printed or not
Definition: ShaderProgram.hpp:871
virtual GLuint getSubroutineIndex(GLenum shaderStage, const GLchar *subroutineName) const final
Returns the index of the given subroutine for a shader stage in this shader program.
Definition: ShaderProgram.hpp:1398
virtual void setSubroutineIndices(GLenum shaderStage, GLsizei numIndices, const GLuint *indices) final
Sets the subroutines to use for a given shader stage.
Definition: ShaderProgram.hpp:1414
virtual GLint getShaderStorageBlockBinding(const GLchar *ssboName) const final
Returns the binding point for the corresponding shader storage block.
Definition: ShaderProgram.hpp:1435
virtual bool writeShaderProgramBinaryToFile(const char *BINARY_FILE_NAME) const final
writes precompiled shader program binary to external file
Definition: ShaderProgram.hpp:2209
static void disableDebugMessages()
Disables debug messages from Shader Program functions.
Definition: ShaderProgram.hpp:943
virtual GLint getUniformBlockSize(const GLchar *uniformBlockName) const final
Returns the size of the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1337
static void enableDebugMessages()
Enables debug messages from Shader Program functions.
Definition: ShaderProgram.hpp:937
virtual GLboolean validate() const final
checks if program can execute in its current OpenGL state
Definition: ShaderProgram.hpp:1533
std::map< std::string, GLint > * mpAttributeLocationsMap
caches locations of attribute names within shader program
Definition: ShaderProgram.hpp:906
virtual GLuint getNumUniformBlocks() const final
Returns the number of active uniform blocks in this shader program.
Definition: ShaderProgram.hpp:1506
ShaderProgram(const ShaderProgram &)=delete
do not allow shader programs to be copied
virtual GLint getFragmentDataLocation(const GLchar *name) const final
query the bindings of color numbers to user-defined varying out variables
Definition: ShaderProgram.hpp:1520
GLuint mFragmentShaderHandle
handle to the fragment shader stage
Definition: ShaderProgram.hpp:892
ShaderProgram()
creates an empty shader program object
Definition: ShaderProgram.hpp:2137
virtual GLint getFragmentDataIndex(const GLchar *name) const final
query the bindings of color indices to user-defined varying out variables
Definition: ShaderProgram.hpp:1525
virtual GLint getUniformLocation(const GLchar *uniformName) const final
Returns the location of the given uniform in this shader program.
Definition: ShaderProgram.hpp:1323
virtual bool mRegisterShaderProgram(const char *vertexShaderFilename, const char *tessellationControlShaderFilename, const char *tessellationEvaluationShaderFilename, const char *geometryShaderFilename, const char *fragmentShaderFilename, bool isSeparable) final
registers a shader program with the GPU
Definition: ShaderProgram.hpp:1119
virtual GLint getAtomicCounterBufferSize(const GLchar *atomicName) const final
Returns the full buffer size for the corresponding atomic counter buffer.
Definition: ShaderProgram.hpp:1482
void log(const char *MSG,...)
log a message to both the standard output stream and file
Definition: LogUtils.hpp:116
void logError(const char *MSG,...)
log a message to both the standard error stream and file
Definition: LogUtils.hpp:128
CSCI441 Helper Functions for OpenGL.
Definition: ArcballCam.hpp:17