X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbufferable.h;h=86c5c77fc4d39226295c3e442903eb476e85de1b;hb=5f78db03b3285c977760a41da1e3927720e50352;hp=a88f7b07a719535d426e262157fc8ef10879bd80;hpb=9f25c3632cfd5c669a2ad24255e2e85dfa1cb460;p=libs%2Fgl.git diff --git a/source/bufferable.h b/source/bufferable.h index a88f7b07..86c5c77f 100644 --- a/source/bufferable.h +++ b/source/bufferable.h @@ -20,7 +20,6 @@ public: private: const Bufferable &bufferable; char *mapped_address; - bool buffer_resized; public: AsyncUpdater(const Bufferable &); @@ -34,6 +33,7 @@ private: unsigned offset; Bufferable *next_in_buffer; Bufferable *prev_in_buffer; + mutable bool location_dirty; protected: mutable bool dirty; @@ -45,18 +45,27 @@ public: buffer, and this object is inserted after it. */ void use_buffer(Buffer *buf, Bufferable *prev = 0); + /** Informs the objects in this chain that the buffer has been resized and + data should be reuploaded. */ + void buffer_resized(); + + /** Returns the total amount of storage required by this object and others + in the same chain, including any alignment between objects. */ + unsigned get_required_buffer_size() const; + /** Uploads new data into the buffer if necessary. */ - void refresh() const { if(dirty) update_buffer(); } + void refresh() const { if(buffer && dirty) upload_data(0); } AsyncUpdater *refresh_async() const; private: void unlink_from_buffer(); -protected: +public: /** Returns the buffer in which the data is stored. */ - Buffer *get_buffer() const { return buffer; } + const Buffer *get_buffer() const { return buffer; } +protected: /** Returns the amount of data to be stored in the buffer, in bytes. */ virtual unsigned get_data_size() const = 0; @@ -75,19 +84,13 @@ protected: /** Returns the offset where the data should be uploaded. */ unsigned get_offset() const { return offset; } - /** Called when the offset for the data has changed. */ - virtual void offset_changed() { } + /** Called when the target buffer or offset within it has changed. */ + virtual void location_changed(Buffer *, unsigned, unsigned) const { } private: - bool resize_buffer() const; - -protected: - /** Resizes the buffer if necessary and calls upload_data(). */ - void update_buffer() const; - /** 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; + void upload_data(char *) const; }; } // namespace GL