diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/glMappedBufferSpan.h | 51 | ||||
| -rw-r--r-- | lib/glMappedBufferWriter.cpp | 4 | ||||
| -rw-r--r-- | lib/glMappedBufferWriter.h | 78 |
3 files changed, 51 insertions, 82 deletions
diff --git a/lib/glMappedBufferSpan.h b/lib/glMappedBufferSpan.h new file mode 100644 index 0000000..d30c911 --- /dev/null +++ b/lib/glMappedBufferSpan.h @@ -0,0 +1,51 @@ +#pragma once + +#include "special_members.h" +#include <cstddef> +#include <glad/gl.h> +#include <span> +#include <utility> + +template<typename T> class glMappedBufferSpan : public std::span<T> { +public: + glMappedBufferSpan(GLuint buffer, size_t count, GLenum access, bool reinit) : + std::span<T> {[&]() { + if (reinit) { + glNamedBufferData( + buffer, static_cast<GLsizeiptr>(sizeof(T) * count), nullptr, GL_DYNAMIC_DRAW); + } + return static_cast<T *>(glMapNamedBuffer(buffer, access)); + }(), + count}, + buffer {buffer} + { + } + + ~glMappedBufferSpan() + { + if (buffer) { + glUnmapNamedBuffer(buffer); + } + } + + glMappedBufferSpan(glMappedBufferSpan && other) noexcept : + std::span<T> {other}, buffer {std::exchange(other.buffer, 0)} + { + } + + glMappedBufferSpan & + operator=(glMappedBufferSpan && other) noexcept + { + std::span<T>::span = other; + if (buffer) { + glUnmapBuffer(buffer); + } + buffer = std::exchange(other.buffer, 0); + return *this; + } + + NO_COPY(glMappedBufferSpan); + +private: + GLuint buffer; +}; diff --git a/lib/glMappedBufferWriter.cpp b/lib/glMappedBufferWriter.cpp deleted file mode 100644 index cc3c413..0000000 --- a/lib/glMappedBufferWriter.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "glMappedBufferWriter.h" -#include <iterator> - -static_assert(std::weakly_incrementable<glMappedBufferWriter<int>>); diff --git a/lib/glMappedBufferWriter.h b/lib/glMappedBufferWriter.h deleted file mode 100644 index 05540e4..0000000 --- a/lib/glMappedBufferWriter.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include "special_members.h" -#include <cstddef> -#include <glad/gl.h> -#include <utility> - -template<typename T> class glMappedBufferWriter { -public: - using difference_type = std::ptrdiff_t; - - glMappedBufferWriter(GLenum target, GLuint buffer, size_t count) : - target {target}, data {[&]() { - glBindBuffer(target, buffer); - glBufferData(target, static_cast<GLsizeiptr>(sizeof(T) * count), nullptr, GL_DYNAMIC_DRAW); - return static_cast<T *>(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; -}; |
