Properly destroy shaders & programs

This commit is contained in:
Nikita Lisitsa 2020-08-27 16:54:04 +03:00
parent 6225f89f88
commit 211b9d7342
3 changed files with 23 additions and 4 deletions

View file

@ -18,6 +18,8 @@ namespace psemek::gfx
program(std::string_view vertex_source, std::string_view fragment_source);
program(std::string_view vertex_source, std::string_view geometry_source, std::string_view fragment_source);
~program();
GLuint id() const;
void bind() const;

View file

@ -1,6 +1,7 @@
#include <psemek/gfx/program.hpp>
#include <psemek/util/to_string.hpp>
#include <psemek/util/at_scope_exit.hpp>
#include <memory>
@ -245,6 +246,12 @@ namespace psemek::gfx
static GLuint create_program(std::vector<std::pair<GLenum, std::string_view>> const & sources)
{
std::vector<GLuint> shaders;
[[maybe_unused]] util::at_scope_exit delete_shaders([&shaders]{
for (auto s : shaders)
gl::DeleteShader(s);
});
for (auto const & p : sources)
{
GLuint sh = gl::CreateShader(p.first);
@ -252,10 +259,16 @@ namespace psemek::gfx
}
GLuint program = gl::CreateProgram();
load_program(program, shaders);
for (auto s : shaders)
gl::DeleteShader(s);
try
{
load_program(program, shaders);
}
catch (...)
{
gl::DeleteProgram(program);
throw;
}
return program;
}
@ -270,6 +283,11 @@ namespace psemek::gfx
program_ = create_program({{gl::VERTEX_SHADER, vertex_source}, {gl::GEOMETRY_SHADER, geometry_source}, {gl::FRAGMENT_SHADER, fragment_source}});
}
program::~program()
{
gl::DeleteProgram(program_);
}
GLuint program::id() const
{
return program_;

View file

@ -1,4 +1,3 @@
* Make sure program & shaders are deleted properly if program creation fails
* Remove gfx::vertex, setup mesh using attributes directly
* Design affine transforms in geom & use them instead of matrices when appropriate
* Create an 'app' module that simplifies application creation