]> git.tdb.fi Git - libs/gl.git/blobdiff - source/bufferable.h
Rework ProgramData to do less unnecessary work
[libs/gl.git] / source / bufferable.h
index c8c9393caabe47176627be22891c3f0ccb0d04c1..f157c6281d2197d17b56bd78a7d61cd1754ee186 100644 (file)
@@ -14,6 +14,21 @@ uploading fresh data to the buffer.
 */
 class Bufferable
 {
+public:
+       class AsyncUpdater
+       {
+       private:
+               const Bufferable &bufferable;
+               char *mapped_address;
+               bool buffer_resized;
+
+       public:
+               AsyncUpdater(const Bufferable &);
+               ~AsyncUpdater();
+
+               void upload_data();
+       };
+
 private:
        Buffer *buffer;
        unsigned offset;
@@ -34,6 +49,8 @@ public:
        /** Uploads new data into the buffer if necessary. */
        void refresh() const { if(dirty) update_buffer(); }
 
+       AsyncUpdater *refresh_async() const;
+
 private:
        void unlink_from_buffer();
 
@@ -44,6 +61,9 @@ protected:
        /** Returns the amount of data to be stored in the buffer, in bytes. */
        virtual unsigned get_data_size() const = 0;
 
+       /** Returns a pointer to the start of data in client memory. */
+       virtual const void *get_data_pointer() const = 0;
+
        /** Returns the alignment required for the data, in bytes.  The offset is
        guaranteed to be a multiple of this. */
        virtual unsigned get_alignment() const { return 1; }
@@ -59,11 +79,16 @@ protected:
        /** Called when the offset for the data has changed. */
        virtual void offset_changed() { }
 
+private:
+       bool resize_buffer() const;
+
+protected:
        /** Resizes the buffer if necessary and calls upload_data(). */
        void update_buffer() const;
 
-       /** Uploads data to the buffer. */
-       virtual void upload_data() const = 0;
+       /** Uploads data to the buffer.  Receives pointer to mapped buffer memory as
+       parameter.  If null, buffer interface should be used instead. */
+       virtual void upload_data(char *) const;
 };
 
 } // namespace GL