Uniformize GL objects' interface & add texture extern templates
This commit is contained in:
parent
db0f7915cf
commit
b1afa3dbc1
8 changed files with 94 additions and 52 deletions
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
{}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,18 @@
|
||||||
#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()
|
||||||
{
|
{
|
||||||
if (!gl::exts::var_EXT_texture_filter_anisotropic) return std::nullopt;
|
if (!gl::exts::var_EXT_texture_filter_anisotropic) return std::nullopt;
|
||||||
|
|
@ -20,4 +29,6 @@ namespace psemek::gfx::detail
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue