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.
pull/279/head
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