diff options
| author | Dan Goodliffe <dan.goodliffe@octal.co.uk> | 2026-03-10 09:40:37 +0000 |
|---|---|---|
| committer | Dan Goodliffe <dan.goodliffe@octal.co.uk> | 2026-03-10 10:23:51 +0000 |
| commit | b73a3c677171a13bdd7b0044071601647bfbfe67 (patch) | |
| tree | 31f3ff8371ee964dfb6e68226d8f7f835c46293a | |
| parent | Switch frame and render buffer to DSA helpers (diff) | |
| download | ilt-b73a3c677171a13bdd7b0044071601647bfbfe67.tar.bz2 ilt-b73a3c677171a13bdd7b0044071601647bfbfe67.tar.xz ilt-b73a3c677171a13bdd7b0044071601647bfbfe67.zip | |
| -rw-r--r-- | game/terrain.cpp | 5 | ||||
| -rw-r--r-- | lib/glMappedBufferSpan.h | 51 | ||||
| -rw-r--r-- | lib/glMappedBufferWriter.cpp | 4 | ||||
| -rw-r--r-- | lib/glMappedBufferWriter.h | 78 |
4 files changed, 54 insertions, 84 deletions
diff --git a/game/terrain.cpp b/game/terrain.cpp index 8bef36e..44ed484 100644 --- a/game/terrain.cpp +++ b/game/terrain.cpp @@ -6,7 +6,7 @@ #include <gfx/image.h> #include <gfx/models/mesh.h> #include <gfx/models/vertex.h> -#include <glMappedBufferWriter.h> +#include <glMappedBufferSpan.h> #include <glm/glm.hpp> #include <location.h> #include <maths.h> @@ -33,7 +33,8 @@ Terrain::SurfaceKey::operator<(const SurfaceKey & other) const inline void Terrain::copyVerticesToBuffer() const { - std::ranges::transform(all_vertices(), glMappedBufferWriter<Vertex> {GL_ARRAY_BUFFER, verticesBuffer, n_vertices()}, + std::ranges::transform(all_vertices(), + glMappedBufferSpan<Vertex> {verticesBuffer, n_vertices(), GL_WRITE_ONLY, true}.begin(), [this](const auto & vertex) { return Vertex {point(vertex), normal(vertex)}; }); 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; -}; |
