X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbufferable.h;h=a88f7b07a719535d426e262157fc8ef10879bd80;hp=0a30e80e817e8343b374094651008a7d03935714;hb=a4549c55a6d47129bd9e42c6a49a671b759ce6d9;hpb=900cf40469972b1f32a6dbac95c42f46c3726fa8 diff --git a/source/bufferable.h b/source/bufferable.h index 0a30e80e..a88f7b07 100644 --- a/source/bufferable.h +++ b/source/bufferable.h @@ -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; @@ -22,7 +37,6 @@ private: protected: mutable bool dirty; -protected: Bufferable(); public: virtual ~Bufferable(); @@ -31,6 +45,11 @@ public: buffer, and this object is inserted after it. */ void use_buffer(Buffer *buf, Bufferable *prev = 0); + /** Uploads new data into the buffer if necessary. */ + void refresh() const { if(dirty) update_buffer(); } + + AsyncUpdater *refresh_async() const; + private: void unlink_from_buffer(); @@ -41,6 +60,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; } @@ -56,11 +78,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