Browse Source

Using own Corrade::Debug class instead of cerr in Shaders.

Also improved and unified the messages and added messages when
uniformLocation() fails or attribute is bound after linking.
vectorfields
Vladimír Vondruš 14 years ago
parent
commit
8cc445d164
  1. 47
      src/AbstractShaderProgram.cpp
  2. 19
      src/AbstractShaderProgram.h
  3. 35
      src/Shader.cpp
  4. 19
      src/Shader.h

47
src/AbstractShaderProgram.cpp

@ -15,17 +15,15 @@
#include "AbstractShaderProgram.h"
#include <iostream>
#include <fstream>
#define LINKER_MESSAGE_MAX_LENGTH 1024
using namespace std;
using namespace Corrade::Utility;
namespace Magnum {
AbstractShaderProgram::LogLevel AbstractShaderProgram::_logLevel = AbstractShaderProgram::Errors;
AbstractShaderProgram::AbstractShaderProgram(): state(Initialized) {
program = glCreateProgram();
}
@ -52,6 +50,11 @@ bool AbstractShaderProgram::attachShader(Shader* shader) {
}
bool AbstractShaderProgram::bindAttribute(GLuint location, const string& name) {
if(state != Initialized) {
Error() << "AbstractShaderProgram: attribute cannot be bound after linking.";
return false;
}
/* Check whether given id already exists */
if(attributes.find(location) != attributes.end()) return false;
@ -82,21 +85,18 @@ void AbstractShaderProgram::link() {
glGetProgramiv(program, GL_LINK_STATUS, &status);
/* Display errors or warnings */
if((status == GL_FALSE && _logLevel != None) || _logLevel == Warnings) {
/* Get message */
char message[LINKER_MESSAGE_MAX_LENGTH];
glGetProgramInfoLog(program, LINKER_MESSAGE_MAX_LENGTH, 0, message);
/* Show error log and delete shader */
if(status == GL_FALSE) {
cerr << "Shader program failed to link. Error message:" << endl
<< message << endl;
/* Or just warnings, if there are any */
} else if(message[0] != 0) {
cerr << "Shader program was linked with the following warnings:" << endl
<< message << endl;
}
char message[LINKER_MESSAGE_MAX_LENGTH];
glGetProgramInfoLog(program, LINKER_MESSAGE_MAX_LENGTH, 0, message);
/* Show error log and delete shader */
if(status == GL_FALSE) {
Error() << "AbstractShaderProgram: linking failed with the following message:\n"
<< message;
/* Or just warnings, if there are any */
} else if(message[0] != 0) {
Debug() << "AbstractShaderProgram: linking succeeded with the following message:\n"
<< message;
}
if(status == GL_FALSE) {
@ -107,8 +107,15 @@ void AbstractShaderProgram::link() {
}
GLint AbstractShaderProgram::uniformLocation(const std::string& name) {
if(state != Linked) return -1;
return glGetUniformLocation(program, name.c_str());
if(state != Linked) {
Error() << "AbstractShaderProgram: uniform location cannot be retrieved before linking.";
return -1;
}
GLint location = glGetUniformLocation(program, name.c_str());
if(location == -1)
Error() << "AbstractShaderProgram: location of uniform \'" + name + "\' cannot be retrieved!";
return location;
}
}

19
src/AbstractShaderProgram.h

@ -84,23 +84,6 @@ class MAGNUM_EXPORT AbstractShaderProgram {
AbstractShaderProgram& operator=(AbstractShaderProgram&& other) = delete;
public:
/** @brief Logging level */
enum LogLevel {
None, /**< @brief Don't display anything */
Errors, /**< @brief Display only errors */
Warnings /**< @brief Display only errors and warnings */
};
/**
* @brief Log level
*
* Log level for displaying compilation messages. Default is Errors.
*/
inline static LogLevel logLevel() { return _logLevel; }
/** @brief Set log level */
inline static void setLogLevel(LogLevel level) { _logLevel = level; }
/** @brief Default constructor */
AbstractShaderProgram();
@ -213,8 +196,6 @@ class MAGNUM_EXPORT AbstractShaderProgram {
Failed
};
static LogLevel _logLevel;
GLuint program;
State state;
std::map<GLuint, std::string> attributes;

35
src/Shader.cpp

@ -15,25 +15,22 @@
#include "Shader.h"
#include <iostream>
#include <fstream>
#define COMPILER_MESSAGE_MAX_LENGTH 1024
using namespace std;
using namespace Corrade::Utility;
namespace Magnum {
Shader::LogLevel Shader::_logLevel = Shader::Errors;
bool Shader::addFile(const std::string& filename) {
/* Open file */
ifstream file(filename.c_str());
if(!file.good()) {
file.close();
cerr << "Shader file " << filename << " cannot be opened." << endl;
Error() << "Shader file " << '\'' + filename + '\'' << " cannot be opened.";
return false;
}
@ -77,26 +74,28 @@ GLuint Shader::compile() {
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
/* Display errors or warnings */
if((status == GL_FALSE && _logLevel != None) || _logLevel == Warnings) {
/* Get message */
char message[COMPILER_MESSAGE_MAX_LENGTH];
glGetShaderInfoLog(shader, COMPILER_MESSAGE_MAX_LENGTH, 0, message);
if(status == GL_FALSE || message[0] != 0) switch(_type) {
case Vertex: cerr << "Vertex"; break;
case Geometry: cerr << "Geometry"; break;
case Fragment: cerr << "Fragment"; break;
char message[COMPILER_MESSAGE_MAX_LENGTH];
glGetShaderInfoLog(shader, COMPILER_MESSAGE_MAX_LENGTH, 0, message);
if(status == GL_FALSE || message[0] != 0) {
Error err;
err << "Shader:";
switch(_type) {
case Vertex: err << "vertex"; break;
case Geometry: err << "geometry"; break;
case Fragment: err << "fragment"; break;
}
/* Show error log and delete shader */
if(status == GL_FALSE) {
cerr << " shader failed to compile. Error message:" << endl
<< message << endl;
err << "shader failed to compile with the following message:\n"
<< message;
/* Or just warnings, if there are any */
} else if(message[0] != 0) {
cerr << " shader was compiled with the following warnings:" << endl
<< message << endl;
err << "shader was successfully compiled with the following message:\n"
<< message;
}
}

19
src/Shader.h

@ -40,13 +40,6 @@ class MAGNUM_EXPORT Shader {
Shader& operator=(Shader&& other) = delete;
public:
/** @brief Logging level */
enum LogLevel {
None, /**< @brief Don't display anything */
Errors, /**< @brief Display only errors */
Warnings /**< @brief Display only errors and warnings */
};
/** @brief Shader type */
enum Type {
Vertex = GL_VERTEX_SHADER, /**< @brief Vertex shader */
@ -61,16 +54,6 @@ class MAGNUM_EXPORT Shader {
Failed /**< @brief Compilation failed */
};
/**
* @brief Log level
*
* Log level for displaying compilation messages.
*/
inline static LogLevel logLevel() { return _logLevel; }
/** @brief Set log level */
inline static void setLogLevel(LogLevel level) { _logLevel = level; }
/**
* @brief Load shader from source
* @param type Shader type
@ -179,8 +162,6 @@ class MAGNUM_EXPORT Shader {
GLuint compile();
private:
static LogLevel _logLevel;
Type _type;
State _state;

Loading…
Cancel
Save