Properly destroy shaders & programs
This commit is contained in:
parent
6225f89f88
commit
211b9d7342
3 changed files with 23 additions and 4 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
|
|||
1
todo.md
1
todo.md
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue