]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/bufferable.h
Refactor ProgramData buffer (re)creation into a function
[libs/gl.git] / source / core / bufferable.h
index 53d493a0713d75a7205ede2ecfd04135902c7e15..b2b25765af2ef67b88c3c9e91bb7e785ee97b1b5 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:
@@ -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) 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