From 25153001c0d7f02a7b126a965d0574e1ec7268ba Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 4 Jul 2021 23:17:33 +0300 Subject: [PATCH] Proper move, reset & null-construct for gfx::program --- libs/gfx/include/psemek/gfx/program.hpp | 15 +++++++++++++ libs/gfx/source/program.cpp | 29 ++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/libs/gfx/include/psemek/gfx/program.hpp b/libs/gfx/include/psemek/gfx/program.hpp index b1066b9a..1167c097 100644 --- a/libs/gfx/include/psemek/gfx/program.hpp +++ b/libs/gfx/include/psemek/gfx/program.hpp @@ -19,12 +19,23 @@ 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(program && other); + + program & operator = (program && other); + ~program(); + static program null() + { + return program(nullptr); + } + GLuint id() const; void bind() const; + void reset(); + GLint location(char const * name) const; struct uniform_proxy @@ -104,6 +115,10 @@ namespace psemek::gfx private: GLuint program_; mutable std::unordered_map uniforms_; + + program(std::nullptr_t) + : program_{0} + {} }; template diff --git a/libs/gfx/source/program.cpp b/libs/gfx/source/program.cpp index 8c88187f..b4358e48 100644 --- a/libs/gfx/source/program.cpp +++ b/libs/gfx/source/program.cpp @@ -322,9 +322,30 @@ namespace psemek::gfx program_ = create_program({{gl::VERTEX_SHADER, vertex_source}, {gl::GEOMETRY_SHADER, geometry_source}, {gl::FRAGMENT_SHADER, fragment_source}}); } + program::program(program && other) + : program_(other.program_) + , uniforms_(std::move(other.uniforms_)) + { + other.program_ = 0; + } + + program & program::operator = (program && other) + { + if (this == &other) + return *this; + + reset(); + + program_ = other.program_; + uniforms_ = std::move(other.uniforms_); + other.program_ = 0; + + return *this; + } + program::~program() { - gl::DeleteProgram(program_); + reset(); } GLuint program::id() const @@ -337,6 +358,12 @@ namespace psemek::gfx gl::UseProgram(program_); } + void program::reset() + { + gl::DeleteProgram(program_); + program_ = 0; + } + GLint program::location(char const * name) const { auto it = uniforms_.find(name);