Browse Source

Create and delete shaders and programs only on construction/destruction.

Also inlined some simple functions, updated documentation.
pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
54a2c47408
  1. 14
      src/AbstractShaderProgram.cpp
  2. 14
      src/AbstractShaderProgram.h
  3. 13
      src/Shader.cpp
  4. 18
      src/Shader.h

14
src/AbstractShaderProgram.cpp

@ -24,14 +24,6 @@ using namespace Corrade::Utility;
namespace Magnum { namespace Magnum {
AbstractShaderProgram::AbstractShaderProgram(): state(Initialized) {
program = glCreateProgram();
}
AbstractShaderProgram::~AbstractShaderProgram() {
if(program) glDeleteProgram(program);
}
bool AbstractShaderProgram::use() { bool AbstractShaderProgram::use() {
if(state != Linked) return false; if(state != Linked) return false;
@ -85,11 +77,7 @@ void AbstractShaderProgram::link() {
<< message; << message;
} }
if(status == GL_FALSE) { state = status == GL_FALSE ? Failed : Linked;
glDeleteProgram(program);
program = 0;
state = Failed;
} else state = Linked;
} }
GLint AbstractShaderProgram::uniformLocation(const std::string& name) { GLint AbstractShaderProgram::uniformLocation(const std::string& name) {

14
src/AbstractShaderProgram.h

@ -104,15 +104,21 @@ class MAGNUM_EXPORT AbstractShaderProgram {
typedef T Type; /**< %Attribute type */ typedef T Type; /**< %Attribute type */
}; };
/** @brief Default constructor */ /**
AbstractShaderProgram(); * @brief Constructor
*
* Creates one OpenGL shader program.
*/
inline AbstractShaderProgram(): state(Initialized) {
program = glCreateProgram();
}
/** /**
* @brief Destructor * @brief Destructor
* *
* Deletes the shader program. * Deletes associated OpenGL shader program.
*/ */
~AbstractShaderProgram(); inline ~AbstractShaderProgram() { glDeleteProgram(program); }
/** /**
* @brief Use shader * @brief Use shader

13
src/Shader.cpp

@ -29,7 +29,7 @@ Shader::Shader(Shader&& other): _type(other._type), _state(other._state), source
} }
Shader& Shader::operator=(Shader&& other) { Shader& Shader::operator=(Shader&& other) {
if(shader) glDeleteShader(shader); glDeleteShader(shader);
_type = other._type; _type = other._type;
_state = other._state; _state = other._state;
@ -79,7 +79,6 @@ GLuint Shader::compile() {
_sources[i] = static_cast<const GLchar*>(sources[i].c_str()); _sources[i] = static_cast<const GLchar*>(sources[i].c_str());
/* Create shader and set its source */ /* Create shader and set its source */
shader = glCreateShader(_type);
glShaderSource(shader, sources.size(), _sources, nullptr); glShaderSource(shader, sources.size(), _sources, nullptr);
/* Compile shader */ /* Compile shader */
@ -119,12 +118,12 @@ GLuint Shader::compile() {
} }
if(status == GL_FALSE) { if(status == GL_FALSE) {
glDeleteShader(shader);
shader = 0;
_state = Failed; _state = Failed;
} else _state = Compiled; return 0;
} else {
return shader; _state = Compiled;
return shader;
}
} }
} }

18
src/Shader.h

@ -116,17 +116,13 @@ class MAGNUM_EXPORT Shader {
/** /**
* @brief Constructor * @brief Constructor
* *
* Creates empty OpenGL shader. Sources can be added with addData() * Creates empty OpenGL shader. Sources can be added with addSource()
* or addFile(). * or addFile().
* @see fromData(), fromFile() * @see fromData(), fromFile()
*/ */
inline Shader(Type type): _type(type), _state(Initialized), shader(0) {} inline Shader(Type type): _type(type), _state(Initialized), shader(0) {
shader = glCreateShader(_type);
/** @brief Move constructor */ }
Shader(Shader&& other);
/** @brief Move assignment operator */
Shader& operator=(Shader&& other);
/** /**
* @brief Destructor * @brief Destructor
@ -135,6 +131,12 @@ class MAGNUM_EXPORT Shader {
*/ */
inline ~Shader() { if(shader) glDeleteShader(shader); } inline ~Shader() { if(shader) glDeleteShader(shader); }
/** @brief Move constructor */
Shader(Shader&& other);
/** @brief Move assignment operator */
Shader& operator=(Shader&& other);
/** /**
* @brief %Shader type * @brief %Shader type
* *

Loading…
Cancel
Save