summaryrefslogtreecommitdiff
path: root/src/mbgl/gl/gl_object_store.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/gl/gl_object_store.hpp')
-rw-r--r--src/mbgl/gl/gl_object_store.hpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/mbgl/gl/gl_object_store.hpp b/src/mbgl/gl/gl_object_store.hpp
index ac8ddd2748..be25728660 100644
--- a/src/mbgl/gl/gl_object_store.hpp
+++ b/src/mbgl/gl/gl_object_store.hpp
@@ -4,15 +4,40 @@
#include <mbgl/gl/gl.hpp>
#include <mbgl/util/noncopyable.hpp>
+#include <memory>
#include <vector>
namespace mbgl {
namespace gl {
-class GLObjectStore : private util::noncopyable {
+class GLHolder : private util::noncopyable {
+public:
+ GLHolder() {}
+
+ GLHolder(GLHolder&& o) noexcept : id(o.id) { o.id = 0; }
+ GLHolder& operator=(GLHolder&& o) noexcept { id = o.id; o.id = 0; return *this; }
+
+ explicit operator bool() const { return id; }
+ GLuint getID() const { return id; }
+
+protected:
+ GLuint id = 0;
+};
+
+class ProgramHolder : public GLHolder {
public:
- GLObjectStore() = default;
+ ProgramHolder() = default;
+ ~ProgramHolder() { reset(); }
+
+ ProgramHolder(ProgramHolder&& o) noexcept : GLHolder(std::move(o)) {}
+ ProgramHolder& operator=(ProgramHolder&& o) noexcept { GLHolder::operator=(std::move(o)); return *this; }
+
+ void create();
+ void reset();
+};
+class GLObjectStore : private util::noncopyable {
+public:
// Mark OpenGL objects for deletion
void abandonVAO(GLuint vao);
void abandonBuffer(GLuint buffer);