Uniformize GL objects' interface & add texture extern templates

This commit is contained in:
Nikita Lisitsa 2020-10-04 11:44:16 +03:00
parent db0f7915cf
commit b1afa3dbc1
8 changed files with 94 additions and 52 deletions

View file

@ -10,20 +10,21 @@ namespace psemek::gfx
struct buffer struct buffer
{ {
buffer(); buffer();
buffer(buffer const &) = delete;
buffer(buffer &&); buffer(buffer &&);
buffer & operator = (buffer const &) = delete;
buffer & operator = (buffer &&); buffer & operator = (buffer &&);
~buffer(); ~buffer();
buffer(buffer const &) = delete;
buffer & operator = (buffer const &) = delete;
static buffer null(); static buffer null();
GLuint id() const { return id_; } GLuint id() const { return id_; }
void bind() const; void bind() const;
void reset();
void load(void const * data, std::size_t size, GLenum usage = gl::STREAM_DRAW); void load(void const * data, std::size_t size, GLenum usage = gl::STREAM_DRAW);
template <typename T> template <typename T>
@ -41,7 +42,7 @@ namespace psemek::gfx
private: private:
GLuint id_; GLuint id_;
explicit buffer(GLuint id); explicit buffer(std::nullptr_t);
}; };
} }

View file

@ -10,20 +10,21 @@ namespace psemek::gfx
struct framebuffer struct framebuffer
{ {
framebuffer(); framebuffer();
framebuffer(framebuffer const &) = delete;
framebuffer(framebuffer &&); framebuffer(framebuffer &&);
framebuffer & operator = (framebuffer const &) = delete;
framebuffer & operator = (framebuffer &&); framebuffer & operator = (framebuffer &&);
~framebuffer(); ~framebuffer();
framebuffer(framebuffer const &) = delete;
framebuffer & operator = (framebuffer const &) = delete;
static framebuffer null(); static framebuffer null();
GLuint id() const { return id_; } GLuint id() const { return id_; }
void bind() const; void bind() const;
void reset();
void color(texture_1d const & tex, int attachment = 0); void color(texture_1d const & tex, int attachment = 0);
void color(texture_2d const & tex, int attachment = 0); void color(texture_2d const & tex, int attachment = 0);
void color(texture_3d const & tex, int layer, int attachment = 0); void color(texture_3d const & tex, int layer, int attachment = 0);
@ -38,7 +39,7 @@ namespace psemek::gfx
private: private:
GLuint id_; GLuint id_;
explicit framebuffer(GLuint id); explicit framebuffer(std::nullptr_t);
}; };
} }

View file

@ -2,32 +2,35 @@
#include <psemek/gfx/gl.hpp> #include <psemek/gfx/gl.hpp>
#include <cstddef>
namespace psemek::gfx namespace psemek::gfx
{ {
struct renderbuffer struct renderbuffer
{ {
renderbuffer(); renderbuffer();
renderbuffer(renderbuffer const &) = delete;
renderbuffer(renderbuffer &&); renderbuffer(renderbuffer &&);
renderbuffer & operator = (renderbuffer const &) = delete;
renderbuffer & operator = (renderbuffer &&); renderbuffer & operator = (renderbuffer &&);
~renderbuffer(); ~renderbuffer();
renderbuffer(renderbuffer const &) = delete;
renderbuffer & operator = (renderbuffer const &) = delete;
static renderbuffer null(); static renderbuffer null();
GLuint id() const { return id_; } GLuint id() const { return id_; }
void bind() const; void bind() const;
void reset();
void storage(GLenum internal_format, GLsizei width, GLsizei height); void storage(GLenum internal_format, GLsizei width, GLsizei height);
private: private:
GLuint id_; GLuint id_;
explicit renderbuffer(GLuint id); explicit renderbuffer(std::nullptr_t);
}; };
} }

View file

@ -152,6 +152,12 @@ namespace psemek::gfx
using texture_2d_array = basic_texture<3, gl::TEXTURE_2D_ARRAY>; using texture_2d_array = basic_texture<3, gl::TEXTURE_2D_ARRAY>;
using texture_3d = basic_texture<3, gl::TEXTURE_3D>; using texture_3d = basic_texture<3, gl::TEXTURE_3D>;
extern template struct basic_texture<1, gl::TEXTURE_1D>;
extern template struct basic_texture<2, gl::TEXTURE_1D_ARRAY>;
extern template struct basic_texture<2, gl::TEXTURE_2D>;
extern template struct basic_texture<3, gl::TEXTURE_2D_ARRAY>;
extern template struct basic_texture<3, gl::TEXTURE_3D>;
namespace detail namespace detail
{ {
std::optional<float> max_anisotropy(); std::optional<float> max_anisotropy();

View file

@ -9,7 +9,7 @@ namespace psemek::gfx
} }
buffer::buffer(buffer && other) buffer::buffer(buffer && other)
: id_(other.id_) : id_{other.id_}
{ {
other.id_ = 0; other.id_ = 0;
} }
@ -18,20 +18,19 @@ namespace psemek::gfx
{ {
if (this == &other) return *this; if (this == &other) return *this;
gl::DeleteBuffers(1, &id_); reset();
id_ = other.id_; std::swap(id_, other.id_);
other.id_ = 0;
return *this; return *this;
} }
buffer::~buffer() buffer::~buffer()
{ {
gl::DeleteBuffers(1, &id_); reset();
} }
buffer buffer::null() buffer buffer::null()
{ {
return buffer(0); return buffer(nullptr);
} }
void buffer::bind() const void buffer::bind() const
@ -39,14 +38,21 @@ namespace psemek::gfx
gl::BindBuffer(gl::ARRAY_BUFFER, id_); gl::BindBuffer(gl::ARRAY_BUFFER, id_);
} }
void buffer::reset()
{
if (id_ != 0)
gl::DeleteBuffers(1, &id_);
id_ = 0;
}
void buffer::load(void const * data, std::size_t size, GLenum usage) void buffer::load(void const * data, std::size_t size, GLenum usage)
{ {
bind(); bind();
gl::BufferData(gl::ARRAY_BUFFER, size, data, usage); gl::BufferData(gl::ARRAY_BUFFER, size, data, usage);
} }
buffer::buffer(GLuint id) buffer::buffer(std::nullptr_t)
: id_(id) : id_{0}
{} {}
} }

View file

@ -22,12 +22,8 @@ namespace psemek::gfx
gl::GenFramebuffers(1, &id_); gl::GenFramebuffers(1, &id_);
} }
framebuffer::framebuffer(GLuint id)
: id_(id)
{}
framebuffer::framebuffer(framebuffer && other) framebuffer::framebuffer(framebuffer && other)
: id_(other.id_) : id_{other.id_}
{ {
other.id_ = 0; other.id_ = 0;
} }
@ -36,20 +32,19 @@ namespace psemek::gfx
{ {
if (this == &other) return *this; if (this == &other) return *this;
gl::DeleteFramebuffers(1, &id_); reset();
id_ = other.id_; std::swap(id_, other.id_);
other.id_ = 0;
return *this; return *this;
} }
framebuffer::~framebuffer() framebuffer::~framebuffer()
{ {
gl::DeleteFramebuffers(1, &id_); reset();
} }
framebuffer framebuffer::null() framebuffer framebuffer::null()
{ {
return framebuffer{0}; return framebuffer(nullptr);
} }
void framebuffer::bind() const void framebuffer::bind() const
@ -57,6 +52,13 @@ namespace psemek::gfx
gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER, id_); gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER, id_);
} }
void framebuffer::reset()
{
if (id_ != 0)
gl::DeleteFramebuffers(1, &id_);
id_ = 0;
}
void framebuffer::color(texture_1d const & tex, int attachment) void framebuffer::color(texture_1d const & tex, int attachment)
{ {
bind(); bind();
@ -110,4 +112,8 @@ namespace psemek::gfx
throw std::runtime_error("Framebuffer incomplete: " + framebuffer_status_string(s)); throw std::runtime_error("Framebuffer incomplete: " + framebuffer_status_string(s));
} }
framebuffer::framebuffer(std::nullptr_t)
: id_{0}
{}
} }

View file

@ -1,5 +1,7 @@
#include <psemek/gfx/renderbuffer.hpp> #include <psemek/gfx/renderbuffer.hpp>
#include <utility>
namespace psemek::gfx namespace psemek::gfx
{ {
@ -9,8 +11,8 @@ namespace psemek::gfx
} }
renderbuffer::renderbuffer(renderbuffer && other) renderbuffer::renderbuffer(renderbuffer && other)
: id_{other.id_}
{ {
id_ = other.id_;
other.id_ = 0; other.id_ = 0;
} }
@ -18,20 +20,19 @@ namespace psemek::gfx
{ {
if (this == &other) return *this; if (this == &other) return *this;
gl::DeleteRenderbuffers(1, &id_); reset();
id_ = other.id_; std::swap(id_, other.id_);
other.id_ = 0;
return *this; return *this;
} }
renderbuffer::~renderbuffer() renderbuffer::~renderbuffer()
{ {
gl::DeleteRenderbuffers(1, &id_); reset();
} }
renderbuffer renderbuffer::null() renderbuffer renderbuffer::null()
{ {
return renderbuffer(0); return renderbuffer(nullptr);
} }
void renderbuffer::bind() const void renderbuffer::bind() const
@ -39,14 +40,21 @@ namespace psemek::gfx
gl::BindRenderbuffer(gl::RENDERBUFFER, id_); gl::BindRenderbuffer(gl::RENDERBUFFER, id_);
} }
void renderbuffer::reset()
{
if (id_ != 0)
gl::DeleteRenderbuffers(1, &id_);
id_ = 0;
}
void renderbuffer::storage(GLenum internal_format, GLsizei width, GLsizei height) void renderbuffer::storage(GLenum internal_format, GLsizei width, GLsizei height)
{ {
bind(); bind();
gl::RenderbufferStorage(gl::RENDERBUFFER, internal_format, width, height); gl::RenderbufferStorage(gl::RENDERBUFFER, internal_format, width, height);
} }
renderbuffer::renderbuffer(GLuint id) renderbuffer::renderbuffer(std::nullptr_t)
: id_(id) : id_{0}
{} {}
} }

View file

@ -1,7 +1,16 @@
#include <psemek/gfx/texture.hpp> #include <psemek/gfx/texture.hpp>
#include <optional> #include <optional>
namespace psemek::gfx::detail namespace psemek::gfx
{
template struct basic_texture<1, gl::TEXTURE_1D>;
template struct basic_texture<2, gl::TEXTURE_1D_ARRAY>;
template struct basic_texture<2, gl::TEXTURE_2D>;
template struct basic_texture<3, gl::TEXTURE_2D_ARRAY>;
template struct basic_texture<3, gl::TEXTURE_3D>;
namespace detail
{ {
static std::optional<float> get_max_anisotropy() static std::optional<float> get_max_anisotropy()
@ -21,3 +30,5 @@ namespace psemek::gfx::detail
} }
} }
}