]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/bufferable.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / core / bufferable.h
index 4a4114d0ce683483717eee9baf0770e3b7ab7c4b..29acafe0f346c3e914bfe76d7ca4134e0c7822f6 100644 (file)
@@ -1,20 +1,20 @@
 #ifndef MSP_GL_BUFFERABLE_H_
 #define MSP_GL_BUFFERABLE_H_
 
+#include <cstddef>
+#include <msp/core/noncopyable.h>
+#include "buffer.h"
+
 namespace Msp {
 namespace GL {
 
-class Buffer;
-
 /**
 Base class for things that can store data in buffers.  Multiple Bufferables
 may be put in the same buffer.
 
-A dirty flag is provided for derived classes.  It should be set when the data
-in the buffer is considered out of date, and is cleared by Bufferable after
-uploading fresh data to the buffer.
+Derived classes should call mark_dirty() when the stored data has changed.
 */
-class Bufferable
+class Bufferable: public NonCopyable
 {
 public:
        /**
@@ -26,11 +26,10 @@ public:
        {
        private:
                const Bufferable &bufferable;
-               char *mapped_address;
+               Buffer::AsyncTransfer transfer;
 
        public:
                AsyncUpdater(const Bufferable &);
-               ~AsyncUpdater();
 
                void upload_data();
        };
@@ -41,17 +40,18 @@ private:
        Bufferable *next_in_buffer = 0;
        Bufferable *prev_in_buffer = 0;
        mutable bool location_dirty = false;
-protected:
-       mutable bool dirty = false;
+       mutable uint8_t dirty = 0;
 
+protected:
        Bufferable() = default;
+       Bufferable(Bufferable &&);
 public:
        virtual ~Bufferable();
 
        /** Sets the buffer to use.  If prev is not null, it must use the same
        buffer, and this object is inserted after it.
 
-       Date is not uploaded immediately, but only when refresh() is called. */
+       Data is not uploaded immediately, but only when refresh() is called. */
        void use_buffer(Buffer *, Bufferable *prev = 0);
 
        /** Sets the buffer for the entire chain of objects. */
@@ -59,14 +59,14 @@ public:
 
        /** Returns the total amount of storage required by this object and others
        in the same chain, including any padding required by object alignment. */
-       std::size_t get_required_buffer_size() const;
+       std::size_t get_required_buffer_size(bool = false) const;
 
        /** Uploads new data into the buffer if necessary. */
-       void refresh() const { if(dirty) upload_data(0); }
+       void refresh(unsigned f) const { if(dirty) upload_data(f, 0); }
 
        /** Returns an object which can be used to upload data to the buffer using
        mapped memory.  If data is not dirty, returns null. */
-       AsyncUpdater *refresh_async() const { return dirty ? new AsyncUpdater(*this) : 0; }
+       AsyncUpdater *refresh_async() const { return dirty ? create_async_updater() : 0; }
 
 private:
        void unlink_from_buffer();
@@ -91,6 +91,10 @@ protected:
        changes. */
        void update_offset();
 
+       /* Indicates that the data of the bufferable has changed and should be
+       uploaded to the buffer again. */
+       void mark_dirty();
+
 public:
        /** Returns the offset of the data from the beginning of the buffer. */
        std::size_t get_offset() const { return offset; }
@@ -98,7 +102,9 @@ public:
 private:
        /** Uploads data to the buffer.  Receives pointer to mapped buffer memory as
        parameter, or null to use the buffer upload interface. */
-       void upload_data(char *) const;
+       void upload_data(unsigned, char *) const;
+
+       AsyncUpdater *create_async_updater() const;
 };
 
 } // namespace GL