13#ifndef CSCI441_SHADER_PROGRAM_HPP
14#define CSCI441_SHADER_PROGRAM_HPP
20#include <glm/gtc/type_ptr.hpp>
55 const char *fragmentShaderFilename );
65 const char *fragmentShaderFilename,
77 const char *tessellationControlShaderFilename,
78 const char *tessellationEvaluationShaderFilename,
79 const char *geometryShaderFilename,
80 const char *fragmentShaderFilename );
93 const char *tessellationControlShaderFilename,
94 const char *tessellationEvaluationShaderFilename,
95 const char *geometryShaderFilename,
96 const char *fragmentShaderFilename,
108 const char *tessellationControlShaderFilename,
109 const char *tessellationEvaluationShaderFilename,
110 const char *fragmentShaderFilename );
122 const char *tessellationControlShaderFilename,
123 const char *tessellationEvaluationShaderFilename,
124 const char *fragmentShaderFilename,
134 const char *geometryShaderFilename,
135 const char *fragmentShaderFilename );
146 const char *geometryShaderFilename,
147 const char *fragmentShaderFilename,
162 bool vertexPresent,
bool tessellationPresent,
bool geometryPresent,
bool fragmentPresent,
232 [[maybe_unused]] virtual GLubyte*
getUniformBlockBuffer( const GLchar *uniformBlockName ) const final;
247 [[maybe_unused]] virtual GLint*
getUniformBlockOffsets( const GLchar *uniformBlockName, const GLchar *names[] ) const final;
262 [[nodiscard]] virtual GLint*
getUniformBlockOffsets(GLint uniformBlockIndex, const GLchar *names[] ) const final;
287 [[maybe_unused]] virtual GLuint
getSubroutineIndex( GLenum shaderStage, const GLchar *subroutineName ) const final;
307 [[maybe_unused]] virtual
void setSubroutineIndices( GLenum shaderStage, GLsizei numIndices, const GLuint *indices ) final;
315 [[maybe_unused]] virtual GLint
getImageBinding(const GLchar* imageName) const final;
351 [[maybe_unused]] [[nodiscard]] virtual GLuint
getNumUniforms() const final;
361 [[maybe_unused]] [[nodiscard]] virtual GLuint
getNumAttributes() const final;
375 [[maybe_unused]] [[nodiscard]] virtual GLint
getFragmentDataIndex(const GLchar* name) const final;
387 [[nodiscard]] virtual GLboolean
validate() const final;
392 [[maybe_unused]] virtual
void useProgram() const final;
399 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0) const final;
405 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0) const final;
411 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0) const final;
417 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat2 mtx) const final;
423 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat3 mtx) const final;
429 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat4 mtx) const final;
435 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat2x3 mtx) const final;
441 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat3x2 mtx) const final;
447 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat2x4 mtx) const final;
453 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat4x2 mtx) const final;
459 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat3x4 mtx) const final;
465 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::mat4x3 mtx) const final;
473 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0, GLfloat v1) const final;
480 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0, GLint v1) const final;
487 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0, GLuint v1) const final;
496 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0, GLfloat v1, GLfloat v2) const final;
504 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0, GLint v1, GLint v2) const final;
512 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0, GLuint v1, GLuint v2) const final;
522 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const final;
531 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLint v0, GLint v1, GLint v2, GLint v3) const final;
540 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const final;
547 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::vec2 value) const final;
553 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::ivec2 value) const final;
559 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::uvec2 value) const final;
566 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::vec3 value) const final;
572 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::ivec3 value) const final;
578 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::uvec3 value) const final;
585 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::vec4 value) const final;
591 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::ivec4 value) const final;
597 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, glm::uvec4 value) const final;
606 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint dim, GLsizei count, const GLfloat *value) const final;
614 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint dim, GLsizei count, const GLint *value) const final;
622 [[maybe_unused]] virtual
void setProgramUniform(const GLchar* uniformName, GLuint dim, GLsizei count, const GLuint *value) const final;
629 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0) const final;
635 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0) const final;
641 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0) const final;
647 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat2 mtx) const final;
653 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat3 mtx) const final;
659 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat4 mtx) const final;
665 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat2x3 mtx) const final;
671 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat3x2 mtx) const final;
677 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat2x4 mtx) const final;
683 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat4x2 mtx) const final;
689 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat3x4 mtx) const final;
695 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::mat4x3 mtx) const final;
703 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0, GLfloat v1) const final;
710 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0, GLint v1) const final;
717 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0, GLuint v1) const final;
726 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0, GLfloat v1, GLfloat v2) const final;
734 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0, GLint v1, GLint v2) const final;
742 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0, GLuint v1, GLuint v2) const final;
752 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const final;
761 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLint v0, GLint v1, GLint v2, GLint v3) const final;
770 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const final;
777 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::vec2 value) const final;
783 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::ivec2 value) const final;
789 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::uvec2 value) const final;
796 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::vec3 value) const final;
802 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::ivec3 value) const final;
808 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::uvec3 value) const final;
815 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::vec4 value) const final;
821 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::ivec4 value) const final;
827 [[maybe_unused]] virtual
void setProgramUniform(GLint uniformLocation, glm::uvec4 value) const final;
836 virtual
void setProgramUniform(GLint uniformLocation, GLuint dim, GLsizei count, const GLfloat *value) const final;
844 virtual
void setProgramUniform(GLint uniformLocation, GLuint dim, GLsizei count, const GLint *value) const final;
852 virtual
void setProgramUniform(GLint uniformLocation, GLuint dim, GLsizei count, const GLuint *value) const final;
858 [[maybe_unused]] [[nodiscard]] virtual GLbitfield
getProgramStages() const final;
918 const
char *tessellationControlShaderFilename,
919 const
char *tessellationEvaluationShaderFilename,
920 const
char *geometryShaderFilename,
921 const
char *fragmentShaderFilename,
922 bool isSeparable ) final;
938 CSCI441_INTERNAL::ShaderUtils::enableDebugMessages();
944 CSCI441_INTERNAL::ShaderUtils::disableDebugMessages();
948 const char *vertexShaderFilename,
949 const char *fragmentShaderFilename
957 const char *vertexShaderFilename,
958 const char *fragmentShaderFilename,
959 const bool isSeparable
967 const char *vertexShaderFilename,
968 const char *tessellationControlShaderFilename,
969 const char *tessellationEvaluationShaderFilename,
970 const char *geometryShaderFilename,
971 const char *fragmentShaderFilename
973 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
974 geometryShaderFilename, fragmentShaderFilename,
false);
979 const char *vertexShaderFilename,
980 const char *tessellationControlShaderFilename,
981 const char *tessellationEvaluationShaderFilename,
982 const char *geometryShaderFilename,
983 const char *fragmentShaderFilename,
984 const bool isSeparable
986 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
987 geometryShaderFilename, fragmentShaderFilename, isSeparable);
992 const char *vertexShaderFilename,
993 const char *tessellationControlShaderFilename,
994 const char *tessellationEvaluationShaderFilename,
995 const char *fragmentShaderFilename
997 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
998 "", fragmentShaderFilename,
false);
1003 const char *vertexShaderFilename,
1004 const char *tessellationControlShaderFilename,
1005 const char *tessellationEvaluationShaderFilename,
1006 const char *fragmentShaderFilename,
1007 const bool isSeparable
1009 mRegisterShaderProgram(vertexShaderFilename, tessellationControlShaderFilename, tessellationEvaluationShaderFilename,
1010 "", fragmentShaderFilename, isSeparable);
1014 const char *vertexShaderFilename,
1015 const char *geometryShaderFilename,
1016 const char *fragmentShaderFilename
1018 mRegisterShaderProgram(vertexShaderFilename,
"",
"", geometryShaderFilename, fragmentShaderFilename,
false);
1023 const char *vertexShaderFilename,
1024 const char *geometryShaderFilename,
1025 const char *fragmentShaderFilename,
1026 const bool isSeparable
1028 mRegisterShaderProgram(vertexShaderFilename,
"",
"", geometryShaderFilename, fragmentShaderFilename, isSeparable);
1033 const char **shaderFilenames,
1034 const bool vertexPresent,
const bool tessellationPresent,
const bool geometryPresent,
const bool fragmentPresent,
1035 const bool isSeparable
1037 if( vertexPresent && !tessellationPresent && !geometryPresent && !fragmentPresent ) {
1038 if( !isSeparable ) {
1039 fprintf(stderr,
"[ERROR]: Fragment Shader not present. Program must be separable.\n");
1043 }
else if( vertexPresent && tessellationPresent && !geometryPresent && !fragmentPresent ) {
1044 if( !isSeparable ) {
1045 fprintf(stderr,
"[ERROR]: Fragment Shader not present. Program must be separable.\n");
1049 }
else if( vertexPresent && tessellationPresent && geometryPresent && !fragmentPresent ) {
1050 if( !isSeparable ) {
1051 fprintf(stderr,
"[ERROR]: Fragment Shader not present. Program must be separable.\n");
1053 mRegisterShaderProgram(shaderFilenames[0], shaderFilenames[1], shaderFilenames[2], shaderFilenames[3],
"", isSeparable);
1055 }
else if( vertexPresent && tessellationPresent && geometryPresent && fragmentPresent ) {
1056 mRegisterShaderProgram(shaderFilenames[0], shaderFilenames[1], shaderFilenames[2], shaderFilenames[3], shaderFilenames[4], isSeparable);
1057 }
else if( vertexPresent && tessellationPresent && !geometryPresent && fragmentPresent ) {
1058 mRegisterShaderProgram(shaderFilenames[0], shaderFilenames[1], shaderFilenames[2],
"", shaderFilenames[3], isSeparable);
1059 }
else if( vertexPresent && !tessellationPresent && geometryPresent && !fragmentPresent ) {
1060 if( !isSeparable ) {
1061 fprintf(stderr,
"[ERROR]: Fragment Shader not present. Program must be separable.\n");
1065 }
else if( vertexPresent && !tessellationPresent && geometryPresent && fragmentPresent ) {
1067 }
else if( vertexPresent && !tessellationPresent && !geometryPresent && fragmentPresent ) {
1069 }
else if( !vertexPresent && tessellationPresent && !geometryPresent && !fragmentPresent ) {
1070 if( !isSeparable ) {
1071 fprintf(stderr,
"[ERROR]: Vertex & Fragment Shaders not present. Program must be separable.\n");
1075 }
else if( !vertexPresent && tessellationPresent && geometryPresent && !fragmentPresent ) {
1076 if( !isSeparable ) {
1077 fprintf(stderr,
"[ERROR]: Vertex & Fragment Shaders not present. Program must be separable.\n");
1081 }
else if( !vertexPresent && tessellationPresent && geometryPresent && fragmentPresent ) {
1082 if( !isSeparable ) {
1083 fprintf(stderr,
"[ERROR]: Vertex Shader not present. Program must be separable.\n");
1085 mRegisterShaderProgram(
"", shaderFilenames[0], shaderFilenames[1], shaderFilenames[2], shaderFilenames[3], isSeparable);
1087 }
else if( !vertexPresent && tessellationPresent && !geometryPresent && fragmentPresent ) {
1088 if( !isSeparable ) {
1089 fprintf(stderr,
"[ERROR]: Vertex Shader not present. Program must be separable.\n");
1093 }
else if( !vertexPresent && !tessellationPresent && geometryPresent && !fragmentPresent ) {
1094 if( !isSeparable ) {
1095 fprintf(stderr,
"[ERROR]: Vertex & Fragment Shaders not present. Program must be separable.\n");
1099 }
else if( !vertexPresent && !tessellationPresent && geometryPresent && fragmentPresent ) {
1100 if( !isSeparable ) {
1101 fprintf(stderr,
"[ERROR]: Vertex Shader not present. Program must be separable.\n");
1105 }
else if( !vertexPresent && !tessellationPresent && !geometryPresent && fragmentPresent ) {
1106 if( !isSeparable ) {
1107 fprintf(stderr,
"[ERROR]: Vertex Shader not present. Program must be separable.\n");
1111 }
else if( !vertexPresent && !tessellationPresent && !geometryPresent && !fragmentPresent ) {
1112 fprintf(stderr,
"[ERROR]: At least one shader must be present.\n");
1114 fprintf(stderr,
"[ERROR]: Unknown state.\n");
1119 const char *vertexShaderFilename,
1120 const char *tessellationControlShaderFilename,
1121 const char *tessellationEvaluationShaderFilename,
1122 const char *geometryShaderFilename,
1123 const char *fragmentShaderFilename,
1124 const bool isSeparable
1127 glGetIntegerv(GL_MAJOR_VERSION, &major);
1128 glGetIntegerv(GL_MINOR_VERSION, &minor);
1130 if( sDEBUG ) printf(
"\n[INFO]: /--------------------------------------------------------\\\n");
1133 if( strcmp( vertexShaderFilename,
"" ) != 0 ) {
1134 if( sDEBUG ) printf(
"[INFO]: | Vertex Shader: %39s |\n", vertexShaderFilename );
1135 mVertexShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(vertexShaderFilename, GL_VERTEX_SHADER );
1137 mVertexShaderHandle = 0;
1140 if(strcmp(tessellationControlShaderFilename,
"" ) != 0 ) {
1141 if( sDEBUG ) printf(
"[INFO]: | Tess Control Shader: %33s |\n", tessellationControlShaderFilename );
1143 printf(
"[ERROR]:| TESSELLATION SHADER NOT SUPPORTED!! UPGRADE TO v4.0+ |\n" );
1144 mTessellationControlShaderHandle = 0;
1146 mTessellationControlShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(tessellationControlShaderFilename, GL_TESS_CONTROL_SHADER );
1149 mTessellationControlShaderHandle = 0;
1152 if(strcmp(tessellationEvaluationShaderFilename,
"" ) != 0 ) {
1153 if( sDEBUG ) printf(
"[INFO]: | Tess Evaluation Shader: %30s |\n", tessellationEvaluationShaderFilename );
1155 printf(
"[ERROR]:| TESSELLATION SHADER NOT SUPPORTED!! UPGRADE TO v4.0+ |\n" );
1156 mTessellationEvaluationShaderHandle = 0;
1158 mTessellationEvaluationShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(tessellationEvaluationShaderFilename, GL_TESS_EVALUATION_SHADER );
1161 mTessellationEvaluationShaderHandle = 0;
1164 if( strcmp( geometryShaderFilename,
"" ) != 0 ) {
1165 if( sDEBUG ) printf(
"[INFO]: | Geometry Shader: %37s |\n", geometryShaderFilename );
1166 if( major < 3 || (major == 3 && minor < 2) ) {
1167 printf(
"[ERROR]:| GEOMETRY SHADER NOT SUPPORTED!!! UPGRADE TO v3.2+ |\n" );
1168 mGeometryShaderHandle = 0;
1170 mGeometryShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(geometryShaderFilename, GL_GEOMETRY_SHADER );
1173 mGeometryShaderHandle = 0;
1176 if( strcmp( fragmentShaderFilename,
"" ) != 0 ) {
1177 if( sDEBUG ) printf(
"[INFO]: | Fragment Shader: %37s |\n", fragmentShaderFilename );
1178 mFragmentShaderHandle = CSCI441_INTERNAL::ShaderUtils::compileShader(fragmentShaderFilename, GL_FRAGMENT_SHADER );
1180 mFragmentShaderHandle = 0;
1183 mShaderProgramHandle = glCreateProgram();
1187 glProgramParameteri(mShaderProgramHandle, GL_PROGRAM_SEPARABLE, GL_TRUE );
1191 if(mVertexShaderHandle != 0 ) {
1192 glAttachShader(mShaderProgramHandle, mVertexShaderHandle );
1194 if(mTessellationControlShaderHandle != 0 ) {
1195 glAttachShader(mShaderProgramHandle, mTessellationControlShaderHandle );
1197 if(mTessellationEvaluationShaderHandle != 0 ) {
1198 glAttachShader(mShaderProgramHandle, mTessellationEvaluationShaderHandle );
1200 if(mGeometryShaderHandle != 0 ) {
1201 glAttachShader(mShaderProgramHandle, mGeometryShaderHandle );
1203 if(mFragmentShaderHandle != 0 ) {
1204 glAttachShader(mShaderProgramHandle, mFragmentShaderHandle );
1208 glLinkProgram(mShaderProgramHandle );
1210 if( sDEBUG ) printf(
"[INFO]: | Shader Program: %41s",
"|\n" );
1213 CSCI441_INTERNAL::ShaderUtils::printProgramLog(mShaderProgramHandle );
1216 if(mVertexShaderHandle != 0 ) {
1217 glDetachShader(mShaderProgramHandle, mVertexShaderHandle );
1218 glDeleteShader(mVertexShaderHandle );
1220 if(mTessellationControlShaderHandle != 0 ) {
1221 glDetachShader(mShaderProgramHandle, mTessellationControlShaderHandle );
1222 glDeleteShader(mTessellationControlShaderHandle );
1224 if(mTessellationEvaluationShaderHandle != 0 ) {
1225 glDetachShader(mShaderProgramHandle, mTessellationEvaluationShaderHandle );
1226 glDeleteShader(mTessellationEvaluationShaderHandle );
1228 if(mGeometryShaderHandle != 0 ) {
1229 glDetachShader(mShaderProgramHandle, mGeometryShaderHandle );
1230 glDeleteShader(mGeometryShaderHandle );
1232 if(mFragmentShaderHandle != 0 ) {
1233 glDetachShader(mShaderProgramHandle, mFragmentShaderHandle );
1234 glDeleteShader(mFragmentShaderHandle );
1239 mpUniformLocationsMap =
new std::map<std::string, GLint>();
1241 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORMS, &numUniforms);
1242 GLint max_uniform_name_size;
1243 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_uniform_name_size);
1244 if( numUniforms > 0 ) {
1245 for(GLint i = 0; i < numUniforms; i++) {
1246 auto name =
new GLchar[max_uniform_name_size];
1247 int actual_length = 0;
1250 glGetActiveUniform(mShaderProgramHandle, i, max_uniform_name_size, &actual_length, &size, &type, name );
1253 for(
int j = 0; j < size; j++) {
1254 const int max_array_size = actual_length + 4 + 2 + 1;
1255 auto array_name =
new GLchar[max_array_size];
1256 snprintf(array_name, max_array_size,
"%s[%i]", name, j);
1257 location = glGetUniformLocation(mShaderProgramHandle, array_name);
1258 mpUniformLocationsMap->emplace(array_name, location);
1259 delete[] array_name;
1262 location = glGetUniformLocation(mShaderProgramHandle, name);
1263 mpUniformLocationsMap->emplace(name, location);
1270 mpAttributeLocationsMap =
new std::map<std::string, GLint>();
1271 GLint numAttributes;
1272 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttributes );
1273 GLint max_attr_name_size;
1274 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_attr_name_size);
1275 if( numAttributes > 0 ) {
1276 for(GLint i = 0; i < numAttributes; i++) {
1277 auto name =
new GLchar[max_attr_name_size];
1278 int actual_length = 0;
1281 glGetActiveAttrib(mShaderProgramHandle, i, max_attr_name_size, &actual_length, &size, &type, name );
1284 for(
int j = 0; j < size; j++ ) {
1285 const int max_array_size = actual_length + 4 + 2 + 1;
1286 auto array_name =
new GLchar[max_array_size];
1287 snprintf( array_name, max_array_size,
"%s[%i]", name, j );
1288 location = glGetAttribLocation(mShaderProgramHandle, array_name );
1289 mpAttributeLocationsMap->emplace(array_name, location);
1290 delete[] array_name;
1293 location = glGetAttribLocation(mShaderProgramHandle, name );
1294 mpAttributeLocationsMap->emplace(name, location);
1300 GLint separable = GL_FALSE;
1301 glGetProgramiv(mShaderProgramHandle, GL_PROGRAM_SEPARABLE, &separable );
1303 if( sDEBUG ) printf(
"[INFO]: | Program Separable: %35s |\n", (separable ?
"Yes" :
"No"));
1306 glGetProgramiv(mShaderProgramHandle, GL_LINK_STATUS, &linkStatus );
1309 if(linkStatus == GL_TRUE) {
1310 CSCI441_INTERNAL::ShaderUtils::printShaderProgramInfo(mShaderProgramHandle, mVertexShaderHandle != 0,
1311 mTessellationControlShaderHandle != 0,
1312 mTessellationEvaluationShaderHandle != 0,
1313 mGeometryShaderHandle != 0, mFragmentShaderHandle != 0,
1317 return mShaderProgramHandle != 0;
1321 const GLint uniformLoc = glGetUniformLocation(mShaderProgramHandle, uniformName );
1322 if( uniformLoc == GL_INVALID_VALUE )
1323 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle );
1328 const GLint uniformBlockLoc = glGetUniformBlockIndex(mShaderProgramHandle, uniformBlockName );
1329 if( uniformBlockLoc == GL_INVALID_INDEX )
1330 fprintf(stderr,
"[ERROR]: Could not find uniform block \"%s\" for Shader Program %u\n", uniformBlockName, mShaderProgramHandle );
1331 return uniformBlockLoc;
1336 glGetActiveUniformBlockiv(mShaderProgramHandle, getUniformBlockIndex(uniformBlockName), GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize );
1342 const GLint blockSize = getUniformBlockSize( uniformBlockName );
1343 return (GLubyte*)malloc(blockSize);
1348 return getUniformBlockOffsets(getUniformBlockIndex(uniformBlockName));
1353 return getUniformBlockOffsets(getUniformBlockIndex(uniformBlockName), names);
1358 glGetActiveUniformBlockiv(mShaderProgramHandle, uniformBlockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &numUniforms );
1360 const auto indices = (GLuint*)malloc(numUniforms*
sizeof(GLuint));
1361 glGetActiveUniformBlockiv(mShaderProgramHandle, uniformBlockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, (GLint*)indices);
1363 const auto offsets = (GLint*)malloc(numUniforms*
sizeof(GLint));
1364 glGetActiveUniformsiv(mShaderProgramHandle, numUniforms, indices, GL_UNIFORM_OFFSET, offsets );
1370 glGetActiveUniformBlockiv(mShaderProgramHandle, uniformBlockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &numUniforms );
1372 const auto indices = (GLuint*)malloc(numUniforms*
sizeof(GLuint));
1373 glGetUniformIndices(mShaderProgramHandle, numUniforms, names, indices );
1375 const auto offsets = (GLint*)malloc(numUniforms*
sizeof(GLint));
1376 glGetActiveUniformsiv(mShaderProgramHandle, numUniforms, indices, GL_UNIFORM_OFFSET, offsets );
1381 glUniformBlockBinding(mShaderProgramHandle, getUniformBlockIndex(uniformBlockName), binding );
1386 const auto attribIter = mpAttributeLocationsMap->find(attributeName);
1387 if(attribIter == mpAttributeLocationsMap->end() ) {
1388 fprintf(stderr,
"[ERROR]: Could not find attribute \"%s\" for Shader Program %u\n", attributeName, mShaderProgramHandle );
1391 return attribIter->second;
1396 const GLuint subroutineIndex = glGetSubroutineIndex(mShaderProgramHandle, shaderStage, subroutineName );
1397 if( subroutineIndex == GL_INVALID_INDEX )
1398 fprintf(stderr,
"[ERROR]: Could not find subroutine \"%s\" in %s for Shader Program %u\n", subroutineName, CSCI441_INTERNAL::ShaderUtils::GL_shader_type_to_string(shaderStage), mShaderProgramHandle );
1399 return subroutineIndex;
1404 const GLint subroutineUniform = glGetSubroutineUniformLocation(mShaderProgramHandle, shaderStage, subroutineName );
1405 if ( subroutineUniform == GL_INVALID_VALUE )
1406 fprintf(stderr,
"[ERROR]: Could not find subroutine \"%s\" in %s for Shader Program %u\n", subroutineName, CSCI441_INTERNAL::ShaderUtils::GL_shader_type_to_string(shaderStage), mShaderProgramHandle );
1407 return subroutineUniform;
1412 glUniformSubroutinesuiv( shaderStage, numIndices, indices );
1418 const GLint imageLoc = getUniformLocation(imageName);
1420 if(imageLoc == GL_INVALID_INDEX) {
1421 fprintf(stderr,
"[ERROR]: Could not find image \"%s\" for Shader Program %u\n", imageName, mShaderProgramHandle);
1426 glGetUniformiv(mShaderProgramHandle, imageLoc, &bindingPoint);
1428 return bindingPoint;
1433 const GLuint ssboIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_SHADER_STORAGE_BLOCK, ssboName);
1435 if(ssboIndex == GL_INVALID_INDEX) {
1436 fprintf(stderr,
"[ERROR]: Could not find shader storage block \"%s\" for Shader Program %u\n", ssboName, mShaderProgramHandle);
1440 constexpr GLenum props = GL_BUFFER_BINDING;
1442 glGetProgramResourceiv(mShaderProgramHandle, GL_SHADER_STORAGE_BLOCK, ssboIndex, 1, &props, 1,
nullptr, &binding);
1449 const GLuint uniformIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_UNIFORM, atomicName);
1451 if(uniformIndex == GL_INVALID_INDEX) {
1452 fprintf(stderr,
"[ERROR]: Could not find atomic counter \"%s\" for Shader Program %u\n", atomicName, mShaderProgramHandle);
1456 constexpr GLenum props = GL_ATOMIC_COUNTER_BUFFER_INDEX;
1457 GLint atomicIndex, binding;
1458 glGetProgramResourceiv(mShaderProgramHandle, GL_UNIFORM, uniformIndex, 1, &props, 1,
nullptr, &atomicIndex);
1459 glGetActiveAtomicCounterBufferiv(mShaderProgramHandle, atomicIndex, GL_ATOMIC_COUNTER_BUFFER_BINDING, &binding);
1466 const GLuint uniformIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_UNIFORM, atomicName);
1468 if(uniformIndex == GL_INVALID_INDEX) {
1469 fprintf(stderr,
"[ERROR]: Could not find atomic counter \"%s\" for Shader Program %u\n", atomicName, mShaderProgramHandle);
1474 glGetActiveUniformsiv(mShaderProgramHandle, 1, &uniformIndex, GL_UNIFORM_OFFSET, &offset);
1480 const GLuint uniformIndex = glGetProgramResourceIndex(mShaderProgramHandle, GL_UNIFORM, atomicName);
1482 if(uniformIndex == GL_INVALID_INDEX) {
1483 fprintf(stderr,
"[ERROR]: Could not find atomic counter \"%s\" for Shader Program %u\n", atomicName, mShaderProgramHandle);
1487 constexpr GLenum props = GL_ATOMIC_COUNTER_BUFFER_INDEX;
1488 GLint atomicIndex, bufferSize;
1489 glGetProgramResourceiv(mShaderProgramHandle, GL_UNIFORM, uniformIndex, 1, &props, 1,
nullptr, &atomicIndex);
1490 glGetActiveAtomicCounterBufferiv(mShaderProgramHandle, atomicIndex, GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE, &bufferSize);
1497 GLint numUniform = 0;
1498 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORMS, &numUniform );
1504 GLint numUniformBlocks = 0;
1505 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_UNIFORM_BLOCKS, &numUniformBlocks );
1506 return numUniformBlocks;
1512 glGetProgramiv(mShaderProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttr );
1518 return glGetFragDataLocation(mShaderProgramHandle, name);
1523 return glGetFragDataIndex(mShaderProgramHandle, name);
1527 return mShaderProgramHandle;
1531 if (mShaderProgramHandle == 0) {
1535 glValidateProgram(mShaderProgramHandle);
1536 GLint validateStatus = GL_FALSE;
1537 glGetProgramiv(mShaderProgramHandle, GL_VALIDATE_STATUS, &validateStatus);
1539 if (validateStatus == GL_FALSE && sDEBUG) {
1540 CSCI441_INTERNAL::ShaderUtils::printProgramInfoLog(mShaderProgramHandle);
1543 return (validateStatus == GL_TRUE);
1548 glUseProgram(mShaderProgramHandle );
1553 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1554 if(uniformIter != mpUniformLocationsMap->end()) {
1555 glProgramUniform1f(mShaderProgramHandle, uniformIter->second, v0 );
1557 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1563 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1564 if(uniformIter != mpUniformLocationsMap->end()) {
1565 glProgramUniform2f(mShaderProgramHandle, uniformIter->second, v0, v1 );
1567 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1573 setProgramUniform( uniformName, 2, 1, glm::value_ptr(value) );
1578 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1579 if(uniformIter != mpUniformLocationsMap->end()) {
1580 glProgramUniform3f(mShaderProgramHandle, uniformIter->second, v0, v1, v2 );
1582 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1588 setProgramUniform( uniformName, 3, 1, glm::value_ptr(value) );
1593 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1594 if(uniformIter != mpUniformLocationsMap->end()) {
1595 glProgramUniform4f(mShaderProgramHandle, uniformIter->second, v0, v1, v2, v3 );
1597 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1603 setProgramUniform( uniformName, 4, 1, glm::value_ptr(value) );
1607 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1608 if(uniformIter != mpUniformLocationsMap->end()) {
1611 glProgramUniform1fv(mShaderProgramHandle, uniformIter->second, count, value );
1614 glProgramUniform2fv(mShaderProgramHandle, uniformIter->second, count, value );
1617 glProgramUniform3fv(mShaderProgramHandle, uniformIter->second, count, value );
1620 glProgramUniform4fv(mShaderProgramHandle, uniformIter->second, count, value );
1623 fprintf(stderr,
"[ERROR]: invalid dimension %u for uniform %s in Shader Program %u. Dimension must be [1,4]\n", dim, uniformName, mShaderProgramHandle);
1627 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1633 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1634 if(uniformIter != mpUniformLocationsMap->end()) {
1635 glProgramUniform1i(mShaderProgramHandle, uniformIter->second, v0 );
1637 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1643 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1644 if(uniformIter != mpUniformLocationsMap->end()) {
1645 glProgramUniform2i(mShaderProgramHandle, uniformIter->second, v0, v1 );
1647 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1653 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1654 if(uniformIter != mpUniformLocationsMap->end()) {
1655 glProgramUniform2iv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1657 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1663 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1664 if(uniformIter != mpUniformLocationsMap->end()) {
1665 glProgramUniform3i(mShaderProgramHandle, uniformIter->second, v0, v1, v2 );
1667 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1673 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1674 if(uniformIter != mpUniformLocationsMap->end()) {
1675 glProgramUniform3iv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1677 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1683 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1684 if(uniformIter != mpUniformLocationsMap->end()) {
1685 glProgramUniform4i(mShaderProgramHandle, uniformIter->second, v0, v1, v2, v3 );
1687 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1693 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1694 if(uniformIter != mpUniformLocationsMap->end()) {
1695 glProgramUniform4iv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1697 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1703 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1704 if(uniformIter != mpUniformLocationsMap->end()) {
1707 glProgramUniform1iv(mShaderProgramHandle, uniformIter->second, count, value );
1710 glProgramUniform2iv(mShaderProgramHandle, uniformIter->second, count, value );
1713 glProgramUniform3iv(mShaderProgramHandle, uniformIter->second, count, value );
1716 glProgramUniform4iv(mShaderProgramHandle, uniformIter->second, count, value );
1719 fprintf(stderr,
"[ERROR]: invalid dimension %u for uniform %s in Shader Program %u. Dimension must be [1,4]\n", dim, uniformName, mShaderProgramHandle);
1723 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1729 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1730 if(uniformIter != mpUniformLocationsMap->end()) {
1731 glProgramUniform1ui(mShaderProgramHandle, uniformIter->second, v0 );
1733 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1739 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1740 if(uniformIter != mpUniformLocationsMap->end()) {
1741 glProgramUniform2ui(mShaderProgramHandle, uniformIter->second, v0, v1 );
1743 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1749 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1750 if(uniformIter != mpUniformLocationsMap->end()) {
1751 glProgramUniform2uiv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1753 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1759 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1760 if(uniformIter != mpUniformLocationsMap->end()) {
1761 glProgramUniform3ui(mShaderProgramHandle, uniformIter->second, v0, v1, v2 );
1763 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1769 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1770 if(uniformIter != mpUniformLocationsMap->end()) {
1771 glProgramUniform3uiv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1773 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1779 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1780 if(uniformIter != mpUniformLocationsMap->end()) {
1781 glProgramUniform4ui(mShaderProgramHandle, uniformIter->second, v0, v1, v2, v3 );
1783 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1789 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1790 if(uniformIter != mpUniformLocationsMap->end()) {
1791 glProgramUniform4uiv(mShaderProgramHandle, uniformIter->second, 1, glm::value_ptr(value) );
1793 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1799 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1800 if(uniformIter != mpUniformLocationsMap->end()) {
1803 glProgramUniform1uiv(mShaderProgramHandle, uniformIter->second, count, value );
1806 glProgramUniform2uiv(mShaderProgramHandle, uniformIter->second, count, value );
1809 glProgramUniform3uiv(mShaderProgramHandle, uniformIter->second, count, value );
1812 glProgramUniform4uiv(mShaderProgramHandle, uniformIter->second, count, value );
1815 fprintf(stderr,
"[ERROR]: invalid dimension %u for uniform %s in Shader Program %u. Dimension must be [1,4]\n", dim, uniformName, mShaderProgramHandle);
1819 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1825 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1826 if(uniformIter != mpUniformLocationsMap->end()) {
1827 glProgramUniformMatrix2fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1829 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1835 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1836 if(uniformIter != mpUniformLocationsMap->end()) {
1837 glProgramUniformMatrix3fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1839 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1845 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1846 if(uniformIter != mpUniformLocationsMap->end()) {
1847 glProgramUniformMatrix4fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1849 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1855 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1856 if(uniformIter != mpUniformLocationsMap->end()) {
1857 glProgramUniformMatrix2x3fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1859 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1865 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1866 if(uniformIter != mpUniformLocationsMap->end()) {
1867 glProgramUniformMatrix3x2fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1869 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1875 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1876 if(uniformIter != mpUniformLocationsMap->end()) {
1877 glProgramUniformMatrix2x4fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1879 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1885 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1886 if(uniformIter != mpUniformLocationsMap->end()) {
1887 glProgramUniformMatrix4x2fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1889 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1895 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1896 if(uniformIter != mpUniformLocationsMap->end()) {
1897 glProgramUniformMatrix3x4fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1899 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1905 auto uniformIter = mpUniformLocationsMap->find(uniformName);
1906 if(uniformIter != mpUniformLocationsMap->end()) {
1907 glProgramUniformMatrix4x3fv(mShaderProgramHandle, uniformIter->second, 1, GL_FALSE, glm::value_ptr(mtx) );
1909 fprintf(stderr,
"[ERROR]: Could not find uniform \"%s\" for Shader Program %u\n", uniformName, mShaderProgramHandle);
1915 glProgramUniform1f(mShaderProgramHandle, uniformLocation, v0 );
1920 glProgramUniform2f(mShaderProgramHandle, uniformLocation, v0, v1 );
1925 setProgramUniform( uniformLocation, 2, 1, glm::value_ptr(value) );
1930 glProgramUniform3f(mShaderProgramHandle, uniformLocation, v0, v1, v2 );
1935 setProgramUniform( uniformLocation, 3, 1, glm::value_ptr(value) );
1940 glProgramUniform4f(mShaderProgramHandle, uniformLocation, v0, v1, v2, v3 );
1945 setProgramUniform( uniformLocation, 4, 1, glm::value_ptr(value) );
1951 glProgramUniform1fv(mShaderProgramHandle, uniformLocation, count, value );
1954 glProgramUniform2fv(mShaderProgramHandle, uniformLocation, count, value );
1957 glProgramUniform3fv(mShaderProgramHandle, uniformLocation, count, value );
1960 glProgramUniform4fv(mShaderProgramHandle, uniformLocation, count, value );
1963 fprintf(stderr,
"[ERROR]: invalid dimension %u for uniform %i in Shader Program %u. Dimension must be [1,4]\n", dim, uniformLocation, mShaderProgramHandle);
1970 glProgramUniform1i(mShaderProgramHandle, uniformLocation, v0 );
1975 glProgramUniform2i(mShaderProgramHandle, uniformLocation, v0, v1 );
1980 setProgramUniform(uniformLocation, 2, 1, glm::value_ptr(value));
1985 glProgramUniform3i(mShaderProgramHandle, uniformLocation, v0, v1, v2 );
1990 setProgramUniform(uniformLocation, 3, 1, glm::value_ptr(value));
1995 glProgramUniform4i(mShaderProgramHandle, uniformLocation, v0, v1, v2, v3 );
2000 setProgramUniform(uniformLocation, 4, 1, glm::value_ptr(value));
2006 glProgramUniform1iv(mShaderProgramHandle, uniformLocation, count, value );
2009 glProgramUniform2iv(mShaderProgramHandle, uniformLocation, count, value );
2012 glProgramUniform3iv(mShaderProgramHandle, uniformLocation, count, value );
2015 glProgramUniform4iv(mShaderProgramHandle, uniformLocation, count, value );
2018 fprintf(stderr,
"[ERROR]: invalid dimension %u for uniform %i in Shader Program %u. Dimension must be [1,4]\n", dim, uniformLocation, mShaderProgramHandle);
2025 glProgramUniform1ui(mShaderProgramHandle, uniformLocation, v0 );
2030 glProgramUniform2ui(mShaderProgramHandle, uniformLocation, v0, v1 );
2035 setProgramUniform(uniformLocation, 2, 1, glm::value_ptr(value));
2040 glProgramUniform3ui(mShaderProgramHandle, uniformLocation, v0, v1, v2 );
2045 setProgramUniform(uniformLocation, 3, 1, glm::value_ptr(value));
2050 glProgramUniform4ui(mShaderProgramHandle, uniformLocation, v0, v1, v2, v3 );
2055 setProgramUniform(uniformLocation, 4, 1, glm::value_ptr(value));
2061 glProgramUniform1uiv(mShaderProgramHandle, uniformLocation, count, value );
2064 glProgramUniform2uiv(mShaderProgramHandle, uniformLocation, count, value );
2067 glProgramUniform3uiv(mShaderProgramHandle, uniformLocation, count, value );
2070 glProgramUniform4uiv(mShaderProgramHandle, uniformLocation, count, value );
2073 fprintf(stderr,
"[ERROR]: invalid dimension %u for uniform %i in Shader Program %u. Dimension must be [1,4]\n", dim, uniformLocation, mShaderProgramHandle);
2080 glProgramUniformMatrix2fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2085 glProgramUniformMatrix3fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2090 glProgramUniformMatrix4fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2095 glProgramUniformMatrix2x3fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2100 glProgramUniformMatrix3x2fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2105 glProgramUniformMatrix2x4fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2110 glProgramUniformMatrix4x2fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2115 glProgramUniformMatrix3x4fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2120 glProgramUniformMatrix4x3fv(mShaderProgramHandle, uniformLocation, 1, GL_FALSE, glm::value_ptr(mtx) );
2125 GLbitfield shaderBits = 0;
2126 if( mVertexShaderHandle != 0 ) shaderBits |= GL_VERTEX_SHADER_BIT;
2127 if( mTessellationControlShaderHandle != 0 ) shaderBits |= GL_TESS_CONTROL_SHADER_BIT;
2128 if( mTessellationEvaluationShaderHandle != 0 ) shaderBits |= GL_TESS_EVALUATION_SHADER_BIT;
2129 if( mGeometryShaderHandle != 0 ) shaderBits |= GL_GEOMETRY_SHADER_BIT;
2130 if( mFragmentShaderHandle != 0 ) shaderBits |= GL_FRAGMENT_SHADER_BIT;
2135 mVertexShaderHandle(0),
2136 mTessellationControlShaderHandle(0), mTessellationEvaluationShaderHandle(0),
2137 mGeometryShaderHandle(0),
2138 mFragmentShaderHandle(0),
2139 mShaderProgramHandle(0),
2140 mpUniformLocationsMap(nullptr), mpAttributeLocationsMap(nullptr)
2152 _moveFromSource(src);
2158 _moveFromSource(src);
2163inline void CSCI441::ShaderProgram::_cleanupSelf() {
2165 GLint infoLogLength = 0;
2166 constexpr int maxLength = 1000;
2168 glDeleteProgram(mShaderProgramHandle );
2171 const auto infoLog =
new GLchar[maxLength];
2173 glGetProgramiv(mShaderProgramHandle, GL_DELETE_STATUS, &status );
2176 glGetProgramInfoLog(mShaderProgramHandle, maxLength, &infoLogLength, infoLog );
2178 if(infoLogLength > 0 ) {
2180 if( sDEBUG ) printf(
"[INFO]: Program Handle %d Delete Status %s: %s\n", mShaderProgramHandle, (status == GL_TRUE ?
"Success" :
" Error"), infoLog );
2183 delete mpUniformLocationsMap;
2184 delete mpAttributeLocationsMap;
2187 mVertexShaderHandle = 0;
2188 mTessellationControlShaderHandle = 0;
2189 mTessellationEvaluationShaderHandle = 0;
2190 mGeometryShaderHandle = 0;
2191 mFragmentShaderHandle = 0;
2192 mShaderProgramHandle = 0;
2193 mpUniformLocationsMap =
nullptr;
2194 mpAttributeLocationsMap =
nullptr;
2197inline void CSCI441::ShaderProgram::_moveFromSource(ShaderProgram &src) {
2198 mVertexShaderHandle = src.mVertexShaderHandle;
2199 src.mVertexShaderHandle = 0;
2201 mTessellationControlShaderHandle = src.mTessellationControlShaderHandle;
2202 src.mTessellationControlShaderHandle = 0;
2204 mTessellationEvaluationShaderHandle = src.mTessellationEvaluationShaderHandle;
2205 src.mTessellationEvaluationShaderHandle = 0;
2207 mGeometryShaderHandle = src.mGeometryShaderHandle;
2208 src.mGeometryShaderHandle = 0;
2210 mFragmentShaderHandle = src.mFragmentShaderHandle;
2211 src.mFragmentShaderHandle = 0;
2213 mShaderProgramHandle = src.mShaderProgramHandle;
2214 src.mShaderProgramHandle = 0;
2216 mpUniformLocationsMap = src.mpUniformLocationsMap;
2217 src.mpUniformLocationsMap =
nullptr;
2219 mpAttributeLocationsMap = src.mpAttributeLocationsMap;
2220 src.mpAttributeLocationsMap =
nullptr;
2226 glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
2228 fprintf(stderr,
"[ERROR]: Driver does not support any binary formats.\n");
2234 glGetProgramiv(mShaderProgramHandle, GL_PROGRAM_BINARY_LENGTH, &length);
2237 std::vector<GLubyte> buffer(length);
2239 glGetProgramBinary(mShaderProgramHandle, length,
nullptr, &format, buffer.data());
2242 fprintf(stdout,
"[INFO]: Writing to %s, binary format %d\n",BINARY_FILE_NAME, format);
2243 std::ofstream out(BINARY_FILE_NAME, std::ios::binary);
2244 out.write(
reinterpret_cast<char *
>(buffer.data()), length );
2252 glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
2254 fprintf(stderr,
"[ERROR]: Driver does not support any binary formats.\n");
2258 const GLuint program = glCreateProgram();
2261 std::ifstream inputStream(BINARY_FILE_NAME, std::ios::binary);
2262 const std::istreambuf_iterator<char> startIt(inputStream);
2263 constexpr std::istreambuf_iterator<char> endIt;
2264 const std::vector<char> buffer(startIt, endIt);
2265 inputStream.close();
2268 glProgramBinary(program, FORMAT, buffer.data(), buffer.size() );
2272 glGetProgramiv(program, GL_LINK_STATUS, &status);
2273 if( GL_FALSE == status ) {
2274 CSCI441_INTERNAL::ShaderUtils::printProgramLog(program);
2279 shaderProgram->mShaderProgramHandle = program;
2280 return shaderProgram;
Helper functions to work with OpenGL Shaders.
Handles registration and compilation of Shaders.
Definition: ShaderProgram.hpp:36
GLuint mTessellationEvaluationShaderHandle
handle to the tessellation evaluation shader stage
Definition: ShaderProgram.hpp:883
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:1347
GLuint mVertexShaderHandle
handle to the vertex shader stage
Definition: ShaderProgram.hpp:875
virtual GLubyte * getUniformBlockBuffer(const GLchar *uniformBlockName) const final
Returns an allocated buffer for the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1341
virtual void setProgramUniform(const GLchar *uniformName, GLfloat v0) const final
sets the program uniform consisting of one float
Definition: ShaderProgram.hpp:1552
static ShaderProgram * loadShaderProgramFromBinaryFile(const char *BINARY_FILE_NAME, GLenum format)
loads precompiled shader program binary from external file
Definition: ShaderProgram.hpp:2250
virtual GLint getAttributeLocation(const GLchar *attributeName) const final
Returns the location of the given attribute in this shader program.
Definition: ShaderProgram.hpp:1385
GLuint mShaderProgramHandle
handle to the shader program
Definition: ShaderProgram.hpp:896
GLuint mTessellationControlShaderHandle
handle to the tessellation control shader stage
Definition: ShaderProgram.hpp:879
virtual void useProgram() const final
Sets the Shader Program to be active.
Definition: ShaderProgram.hpp:1547
virtual GLuint getNumAttributes() const final
Returns the number of active attributes in this shader program.
Definition: ShaderProgram.hpp:1510
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:1380
std::map< std::string, GLint > * mpUniformLocationsMap
caches locations of uniform names within shader program
Definition: ShaderProgram.hpp:901
virtual GLint getUniformBlockIndex(const GLchar *uniformBlockName) const final
Returns the index of the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1327
virtual GLint getAtomicCounterBufferOffset(const GLchar *atomicName) const final
Returns the offset into the buffer for the corresponding atomic counter buffer.
Definition: ShaderProgram.hpp:1465
ShaderProgram & operator=(const ShaderProgram &)=delete
do not allow shader programs to be copied
virtual GLbitfield getProgramStages() const final
returns a single value corresponding to which shader stages are present in this shader program
Definition: ShaderProgram.hpp:2124
virtual GLuint getNumUniforms() const final
Returns the number of active uniforms in this shader program.
Definition: ShaderProgram.hpp:1496
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:1403
virtual GLint getImageBinding(const GLchar *imageName) const final
Returns the binding point for the corresponding image uniform.
Definition: ShaderProgram.hpp:1417
virtual ~ShaderProgram()
Clean up memory associated with the Shader Program.
Definition: ShaderProgram.hpp:2145
virtual GLuint getShaderProgramHandle() const final
Returns the handle for this shader program.
Definition: ShaderProgram.hpp:1526
GLuint mGeometryShaderHandle
handle to the geometry shader stage
Definition: ShaderProgram.hpp:887
virtual GLint getAtomicCounterBufferBinding(const GLchar *atomicName) const final
Returns the binding point for the corresponding atomic counter buffer.
Definition: ShaderProgram.hpp:1448
static bool sDEBUG
if DEBUG information should be printed or not
Definition: ShaderProgram.hpp:870
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:1395
virtual void setSubroutineIndices(GLenum shaderStage, GLsizei numIndices, const GLuint *indices) final
Sets the subroutines to use for a given shader stage.
Definition: ShaderProgram.hpp:1411
virtual GLint getShaderStorageBlockBinding(const GLchar *ssboName) const final
Returns the binding point for the corresponding shader storage block.
Definition: ShaderProgram.hpp:1432
virtual bool writeShaderProgramBinaryToFile(const char *BINARY_FILE_NAME) const final
writes precompiled shader program binary to external file
Definition: ShaderProgram.hpp:2224
static void disableDebugMessages()
Disables debug messages from Shader Program functions.
Definition: ShaderProgram.hpp:942
virtual GLint getUniformBlockSize(const GLchar *uniformBlockName) const final
Returns the size of the given uniform block in this shader program.
Definition: ShaderProgram.hpp:1334
static void enableDebugMessages()
Enables debug messages from Shader Program functions.
Definition: ShaderProgram.hpp:936
virtual GLboolean validate() const final
checks if program can execute in its current OpenGL state
Definition: ShaderProgram.hpp:1530
std::map< std::string, GLint > * mpAttributeLocationsMap
caches locations of attribute names within shader program
Definition: ShaderProgram.hpp:905
virtual GLuint getNumUniformBlocks() const final
Returns the number of active uniform blocks in this shader program.
Definition: ShaderProgram.hpp:1503
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:1517
GLuint mFragmentShaderHandle
handle to the fragment shader stage
Definition: ShaderProgram.hpp:891
ShaderProgram()
creates an empty shader program object
Definition: ShaderProgram.hpp:2134
virtual GLint getFragmentDataIndex(const GLchar *name) const final
query the bindings of color indices to user-defined varying out variables
Definition: ShaderProgram.hpp:1522
virtual GLint getUniformLocation(const GLchar *uniformName) const final
Returns the location of the given uniform in this shader program.
Definition: ShaderProgram.hpp:1320
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:1118
virtual GLint getAtomicCounterBufferSize(const GLchar *atomicName) const final
Returns the full buffer size for the corresponding atomic counter buffer.
Definition: ShaderProgram.hpp:1479
CSCI441 Helper Functions for OpenGL.
Definition: ArcballCam.hpp:17