From 42de6197a6b29ef1d922c82e5bab263f1348ec03 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Mon, 24 May 2010 03:38:50 +0200 Subject: Rewrote shader classes to throw exceptions when errors occur. --- engine/shader.cpp | 76 ++++++++++++++++++++++++++++--------------------------- engine/shader.h | 18 ++++++------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/engine/shader.cpp b/engine/shader.cpp index 04aa031..a0509ff 100644 --- a/engine/shader.cpp +++ b/engine/shader.cpp @@ -1,11 +1,21 @@ #include +#include + +#include + #include "shader.h" -bool GLBaseShader::shader_source(const char *filename) { +static void gl_check_error(const char *msg) { + GLenum error = glGetError(); + if(error != GL_NO_ERROR) { + throw(std::runtime_error((boost::format("%s:\n%s") % msg % gluErrorString(error)).str())); + } +} + +void GLBaseShader::shader_source(const char *filename) { std::ifstream inf(filename, std::ios_base::in); if(!inf.is_open()) { - std::cerr << "Failed to load shader " << filename << std::endl; - return false; + throw(std::runtime_error((boost::format("Failed to load shader from file %s") % filename).str())); } inf.seekg(0, std::ios_base::end); int length = inf.tellg(); @@ -15,77 +25,69 @@ bool GLBaseShader::shader_source(const char *filename) { inf.close(); glShaderSource(shader, 1, (const GLchar**)&buffer, &length); - print_check_ogl_error(); + gl_check_error("Failed to set shader source"); delete[] buffer; glCompileShader(shader); - print_check_ogl_error(); int p; glGetShaderiv(shader, GL_COMPILE_STATUS, &p); if(p == 0) { - std::cerr << "Failed to compile shader:" << std::endl; char log[0xffff]; int size; glGetShaderInfoLog(shader, 0xffff, &size, (GLchar*)&log); - std::cerr << log << std::endl; + throw(std::runtime_error((boost::format("Failed to compile shader:\n%s") % log).str())); } - return shader; } -bool GLBaseShader::shader_source(std::string& filename) { - return shader_source(filename.c_str()); +void GLBaseShader::shader_source(std::string& filename) { + shader_source(filename.c_str()); } GLBaseShader::GLBaseShader(GLenum type) { shader = glCreateShader(type); } +GLBaseShader::~GLBaseShader() { + glDeleteShader(shader); +} + +/** + * GLShaderProgram + */ GLShaderProgram::GLShaderProgram() { program = glCreateProgram(); } -bool GLShaderProgram::attach(GLBaseShader& shader) { +GLShaderProgram::~GLShaderProgram() { + glDeleteProgram(program); +} + +void GLShaderProgram::attach(GLBaseShader& shader) { glAttachShader(program, shader.shader); - return !print_check_ogl_error(); + + gl_check_error("Failed to attach shader to program"); } -bool GLShaderProgram::detach(GLBaseShader& shader) { +void GLShaderProgram::detach(GLBaseShader& shader) { glDetachShader(program, shader.shader); - return !print_check_ogl_error(); + + gl_check_error("Failed to detach shader from program"); } -bool GLShaderProgram::link() { +void GLShaderProgram::link() { glLinkProgram(program); - bool error = print_check_ogl_error(); + int p; glGetProgramiv(program, GL_LINK_STATUS, &p); if(p == 0) { - std::cerr << "Failed to link program:" << std::endl; char log[0xffff]; int size; glGetProgramInfoLog(program, 0xffff, &size, (GLchar*)&log); - printf(log); + throw(std::runtime_error((boost::format("Failed to link program:\n%s") % log).str())); } - return !error && p; } -bool GLShaderProgram::use() { - if(!glIsProgram(program)) program = glCreateProgram(); +void GLShaderProgram::use() { glUseProgram(program); - return !print_check_ogl_error(); -} - -void GLShaderProgram::remove() { - glDeleteProgram(program); -} -void print_ogl_error(GLenum error) { - unsigned char *buf = (unsigned char*)gluErrorString(error); - std::cerr << "OpenGL: " << buf << std::endl; -} - -bool print_check_ogl_error() { - GLenum error = glGetError(); - if(error != GL_NO_ERROR) - print_ogl_error(error); - return error != GL_NO_ERROR; + gl_check_error("Failed to use program"); } diff --git a/engine/shader.h b/engine/shader.h index 012165a..d4ad263 100644 --- a/engine/shader.h +++ b/engine/shader.h @@ -16,11 +16,12 @@ class GLBaseShader { friend class GLShaderProgram; protected: - bool shader_source(const char *filename); - bool shader_source(std::string& filename); + void shader_source(const char *filename); + void shader_source(std::string& filename); unsigned int shader; public: GLBaseShader(GLenum); + ~GLBaseShader(); }; class GLVertexShader : public GLBaseShader { @@ -42,15 +43,12 @@ class GLShaderProgram { unsigned int program; public: GLShaderProgram(); + ~GLShaderProgram(); - bool attach(GLBaseShader&); - bool detach(GLBaseShader&); - bool link(); - bool use(); - void remove(); + void attach(GLBaseShader&); + void detach(GLBaseShader&); + void link(); + void use(); }; -void print_ogl_error(GLenum); -bool print_check_ogl_error(); - #endif -- cgit v1.2.3