]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/bufferable.h
InstanceArray doesn't need to refresh the vertex arrays
[libs/gl.git] / source / core / bufferable.h
index 8bd3f77f021d39e2722f0b8d7e13e5f60ae2a353..25d29fd8f393021c6d6af4f86e624d77ec79705b 100644 (file)
@@ -12,9 +12,7 @@ class Buffer;
 Base class for things that can store data in buffers.  Multiple Bufferables
 may be put in the same 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: public NonCopyable
 {
 */
 class Bufferable: public NonCopyable
 {
@@ -43,9 +41,9 @@ private:
        Bufferable *next_in_buffer = 0;
        Bufferable *prev_in_buffer = 0;
        mutable bool location_dirty = false;
        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:
        Bufferable() = default;
        Bufferable(Bufferable &&);
 public:
@@ -54,7 +52,7 @@ public:
        /** Sets the buffer to use.  If prev is not null, it must use the same
        buffer, and this object is inserted after it.
 
        /** 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. */
        void use_buffer(Buffer *, Bufferable *prev = 0);
 
        /** Sets the buffer for the entire chain of objects. */
@@ -62,14 +60,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. */
 
        /** 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. */
 
        /** Uploads new data into the buffer if necessary. */
-       void refresh() const { if(dirty) upload_data(0); }
+       void refresh(unsigned f) const { if(dirty&(1<<f)) 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. */
 
        /** 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();
 
 private:
        void unlink_from_buffer();
@@ -94,6 +92,10 @@ protected:
        changes. */
        void update_offset();
 
        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; }
 public:
        /** Returns the offset of the data from the beginning of the buffer. */
        std::size_t get_offset() const { return offset; }
@@ -101,7 +103,9 @@ public:
 private:
        /** Uploads data to the buffer.  Receives pointer to mapped buffer memory as
        parameter, or null to use the buffer upload interface. */
 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
 };
 
 } // namespace GL