Add framebuffers wrapper class.

This commit is contained in:
John Preston 2021-05-29 12:29:26 +04:00
parent 5389de6b96
commit 28b72295ab
2 changed files with 54 additions and 0 deletions

View file

@ -32,7 +32,21 @@ void DestroyTextures(QOpenGLFunctions &f, gsl::span<GLuint> values) {
ranges::fill(values, 0);
}
void GenerateFramebuffers(QOpenGLFunctions &f, gsl::span<GLuint> values) {
Expects(!values.empty());
f.glGenFramebuffers(values.size(), values.data());
}
void DestroyFramebuffers(QOpenGLFunctions &f, gsl::span<GLuint> values) {
Expects(!values.empty());
f.glDeleteTextures(values.size(), values.data());
ranges::fill(values, 0);
}
} // namespace details
void Image::setImage(QImage image) {
_image = std::move(image);
}

View file

@ -16,6 +16,9 @@ namespace details {
void GenerateTextures(QOpenGLFunctions &f, gsl::span<GLuint> values);
void DestroyTextures(QOpenGLFunctions &f, gsl::span<GLuint> values);
void GenerateFramebuffers(QOpenGLFunctions &f, gsl::span<GLuint> values);
void DestroyFramebuffers(QOpenGLFunctions &f, gsl::span<GLuint> values);
} // namespace details
template <size_t Count>
@ -40,6 +43,43 @@ public:
f.glBindTexture(GL_TEXTURE_2D, _values[index]);
}
[[nodiscard]] GLuint id(int index) const {
Expects(index >= 0 && index < Count);
return _values[index];
}
[[nodiscard]] bool created() const {
return (_values[0] != 0);
}
private:
std::array<GLuint, Count> _values = { { 0 } };
};
template <size_t Count>
class Framebuffers final {
public:
static_assert(Count > 0);
void ensureCreated(QOpenGLFunctions &f) {
if (!created()) {
details::GenerateFramebuffers(f, gsl::make_span(_values));
}
}
void destroy(QOpenGLFunctions &f) {
if (created()) {
details::DestroyFramebuffers(f, gsl::make_span(_values));
}
}
void bind(QOpenGLFunctions &f, int index) const {
Expects(index >= 0 && index < Count);
f.glBindFramebuffer(GL_FRAMEBUFFER, _values[index]);
}
[[nodiscard]] bool created() const {
return (_values[0] != 0);
}