Support multisample renderbuffers

This commit is contained in:
Nikita Lisitsa 2022-11-30 17:32:38 +03:00
parent 52bb516d5c
commit f8846e8c06
2 changed files with 20 additions and 0 deletions

View file

@ -5,6 +5,7 @@
#include <psemek/geom/vector.hpp> #include <psemek/geom/vector.hpp>
#include <cstddef> #include <cstddef>
#include <optional>
namespace psemek::gfx namespace psemek::gfx
{ {
@ -36,7 +37,10 @@ namespace psemek::gfx
std::size_t width() const { return size_[0]; } std::size_t width() const { return size_[0]; }
std::size_t height() const { return size_[1]; } std::size_t height() const { return size_[1]; }
std::optional<int> samples() const { return samples_; }
void storage(GLenum internal_format, geom::vector<std::size_t, 2> const & size); void storage(GLenum internal_format, geom::vector<std::size_t, 2> const & size);
void storage(GLenum internal_format, geom::vector<std::size_t, 2> const & size, int samples);
template <typename Pixel> template <typename Pixel>
void storage(geom::vector<std::size_t, 2> const & size) void storage(geom::vector<std::size_t, 2> const & size)
@ -44,9 +48,16 @@ namespace psemek::gfx
storage(pixel_traits<Pixel>::internal_format, size); storage(pixel_traits<Pixel>::internal_format, size);
} }
template <typename Pixel>
void storage(geom::vector<std::size_t, 2> const & size, int samples)
{
storage(pixel_traits<Pixel>::internal_format, size, samples);
}
private: private:
GLuint id_ = 0; GLuint id_ = 0;
geom::vector<std::size_t, 2> size_ = {0, 0}; geom::vector<std::size_t, 2> size_ = {0, 0};
std::optional<int> samples_ = std::nullopt;
explicit renderbuffer(std::nullptr_t); explicit renderbuffer(std::nullptr_t);
}; };

View file

@ -52,6 +52,15 @@ namespace psemek::gfx
bind(); bind();
gl::RenderbufferStorage(target, internal_format, size[0], size[1]); gl::RenderbufferStorage(target, internal_format, size[0], size[1]);
size_ = size; size_ = size;
samples_ = std::nullopt;
}
void renderbuffer::storage(GLenum internal_format, geom::vector<std::size_t, 2> const & size, int samples)
{
bind();
gl::RenderbufferStorageMultisample(target, samples, internal_format, size[0], size[1]);
size_ = size;
samples_ = samples;
} }
renderbuffer::renderbuffer(std::nullptr_t) renderbuffer::renderbuffer(std::nullptr_t)