summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/glMappedBufferSpan.h51
-rw-r--r--lib/glMappedBufferWriter.cpp4
-rw-r--r--lib/glMappedBufferWriter.h78
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;
-};