From 54a2c47408b1d6115f6ba3a2e1b1d876e4325350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 9 May 2012 01:42:28 +0200 Subject: [PATCH] Create and delete shaders and programs only on construction/destruction. Also inlined some simple functions, updated documentation. --- src/AbstractShaderProgram.cpp | 14 +------------- src/AbstractShaderProgram.h | 14 ++++++++++---- src/Shader.cpp | 13 ++++++------- src/Shader.h | 18 ++++++++++-------- 4 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/AbstractShaderProgram.cpp b/src/AbstractShaderProgram.cpp index aaeb0d3ad..d45a17e98 100644 --- a/src/AbstractShaderProgram.cpp +++ b/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) { diff --git a/src/AbstractShaderProgram.h b/src/AbstractShaderProgram.h index 199dbddc2..2a3cdbdd1 100644 --- a/src/AbstractShaderProgram.h +++ b/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 diff --git a/src/Shader.cpp b/src/Shader.cpp index f87b81df0..b8f0f8e77 100644 --- a/src/Shader.cpp +++ b/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(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; + } } } diff --git a/src/Shader.h b/src/Shader.h index 2511d32d6..aea8c1635 100644 --- a/src/Shader.h +++ b/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 *