From ad3fa0b214e73be4655e8ebedfff63208a80aab6 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 25 Feb 2025 00:08:13 +0000 Subject: Add glMappedBufferWriter helper Usable as an out iterator to transform directly to GPU mapped memory --- lib/glMappedBufferWriter.h | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 lib/glMappedBufferWriter.h (limited to 'lib/glMappedBufferWriter.h') diff --git a/lib/glMappedBufferWriter.h b/lib/glMappedBufferWriter.h new file mode 100644 index 0000000..f97d7e1 --- /dev/null +++ b/lib/glMappedBufferWriter.h @@ -0,0 +1,78 @@ +#pragma once + +#include "special_members.h" +#include +#include +#include + +template class glMappedBufferWriter { +public: + using difference_type = std::ptrdiff_t; + + glMappedBufferWriter(GLenum target, GLuint buffer, size_t count, GLenum usage = GL_STATIC_DRAW) : + target {target}, data {[&]() { + glBindBuffer(target, buffer); + glBufferData(target, static_cast(sizeof(T) * count), nullptr, usage); + return static_cast(glMapBuffer(target, GL_WRITE_ONLY)); + }()} + { + } + + ~glMappedBufferWriter() + { + if (target) { + glUnmapBuffer(target); + } + } + + glMappedBufferWriter(glMappedBufferWriter && other) noexcept : + target {std::exchange(other.target, 0)}, data {std::exchange(other.data, nullptr)} + { + } + + glMappedBufferWriter & + operator=(glMappedBufferWriter && other) noexcept + { + if (target) { + glUnmapBuffer(target); + } + target = std::exchange(other.target, 0); + data = std::exchange(other.data, nullptr); + return *this; + } + + NO_COPY(glMappedBufferWriter); + + glMappedBufferWriter & + operator++() + { + data++; + return *this; + } + + glMappedBufferWriter & + operator++(int) + { + glMappedBufferWriter rtn {data}; + data++; + return rtn; + } + + T & + operator*() + { + return *data; + } + + T * + operator->() const + { + return data; + } + +private: + explicit glMappedBufferWriter(T * data) : target {0}, data {data} { } + + GLenum target; + T * data; +}; -- cgit v1.2.3