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 fragment_source);
|
||||||
program(std::string_view vertex_source, std::string_view geometry_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;
|
GLuint id() const;
|
||||||
|
|
||||||
void bind() const;
|
void bind() const;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#include <psemek/gfx/program.hpp>
|
#include <psemek/gfx/program.hpp>
|
||||||
|
|
||||||
#include <psemek/util/to_string.hpp>
|
#include <psemek/util/to_string.hpp>
|
||||||
|
#include <psemek/util/at_scope_exit.hpp>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
@ -245,6 +246,12 @@ namespace psemek::gfx
|
||||||
static GLuint create_program(std::vector<std::pair<GLenum, std::string_view>> const & sources)
|
static GLuint create_program(std::vector<std::pair<GLenum, std::string_view>> const & sources)
|
||||||
{
|
{
|
||||||
std::vector<GLuint> shaders;
|
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)
|
for (auto const & p : sources)
|
||||||
{
|
{
|
||||||
GLuint sh = gl::CreateShader(p.first);
|
GLuint sh = gl::CreateShader(p.first);
|
||||||
|
|
@ -252,10 +259,16 @@ namespace psemek::gfx
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint program = gl::CreateProgram();
|
GLuint program = gl::CreateProgram();
|
||||||
load_program(program, shaders);
|
|
||||||
|
|
||||||
for (auto s : shaders)
|
try
|
||||||
gl::DeleteShader(s);
|
{
|
||||||
|
load_program(program, shaders);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
gl::DeleteProgram(program);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
return program;
|
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_ = 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
|
GLuint program::id() const
|
||||||
{
|
{
|
||||||
return program_;
|
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
|
* Remove gfx::vertex, setup mesh using attributes directly
|
||||||
* Design affine transforms in geom & use them instead of matrices when appropriate
|
* Design affine transforms in geom & use them instead of matrices when appropriate
|
||||||
* Create an 'app' module that simplifies application creation
|
* Create an 'app' module that simplifies application creation
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue