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

35
src/Shader.cpp

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

19
src/Shader.h

@ -40,13 +40,6 @@ class MAGNUM_EXPORT Shader {
Shader& operator=(Shader&& other) = delete; Shader& operator=(Shader&& other) = delete;
public: 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 */ /** @brief Shader type */
enum Type { enum Type {
Vertex = GL_VERTEX_SHADER, /**< @brief Vertex shader */ Vertex = GL_VERTEX_SHADER, /**< @brief Vertex shader */
@ -61,16 +54,6 @@ class MAGNUM_EXPORT Shader {
Failed /**< @brief Compilation failed */ 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 * @brief Load shader from source
* @param type Shader type * @param type Shader type
@ -179,8 +162,6 @@ class MAGNUM_EXPORT Shader {
GLuint compile(); GLuint compile();
private: private:
static LogLevel _logLevel;
Type _type; Type _type;
State _state; State _state;

Loading…
Cancel
Save