Browse Source

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

Also inlined some simple functions, updated documentation.
vectorfields
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 {
AbstractShaderProgram::AbstractShaderProgram(): state(Initialized) {
program = glCreateProgram();
}
AbstractShaderProgram::~AbstractShaderProgram() {
if(program) glDeleteProgram(program);
}
bool AbstractShaderProgram::use() {
if(state != Linked) return false;
@ -85,11 +77,7 @@ void AbstractShaderProgram::link() {
<< message;
}
if(status == GL_FALSE) {
glDeleteProgram(program);
program = 0;
state = Failed;
} else state = Linked;
state = status == GL_FALSE ? Failed : Linked;
}
GLint AbstractShaderProgram::uniformLocation(const std::string& name) {

14
src/AbstractShaderProgram.h

@ -104,15 +104,21 @@ class MAGNUM_EXPORT AbstractShaderProgram {
typedef T Type; /**< %Attribute type */
};
/** @brief Default constructor */
AbstractShaderProgram();
/**
* @brief Constructor
*
* Creates one OpenGL shader program.
*/
inline AbstractShaderProgram(): state(Initialized) {
program = glCreateProgram();
}
/**
* @brief Destructor
*
* Deletes the shader program.
* Deletes associated OpenGL shader program.
*/
~AbstractShaderProgram();
inline ~AbstractShaderProgram() { glDeleteProgram(program); }
/**
* @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) {
if(shader) glDeleteShader(shader);
glDeleteShader(shader);
_type = other._type;
_state = other._state;
@ -79,7 +79,6 @@ GLuint Shader::compile() {
_sources[i] = static_cast<const GLchar*>(sources[i].c_str());
/* Create shader and set its source */
shader = glCreateShader(_type);
glShaderSource(shader, sources.size(), _sources, nullptr);
/* Compile shader */
@ -119,12 +118,12 @@ GLuint Shader::compile() {
}
if(status == GL_FALSE) {
glDeleteShader(shader);
shader = 0;
_state = Failed;
} else _state = Compiled;
return shader;
return 0;
} else {
_state = Compiled;
return shader;
}
}
}

18
src/Shader.h

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

Loading…
Cancel
Save