X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbufferable.h;h=cbbde4e1b93f1e07266c097c150774f2b5621d3c;hp=c8c9393caabe47176627be22891c3f0ccb0d04c1;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=4d3d1511616a0ad4a91f8a068b49faf2b450c298 diff --git a/source/bufferable.h b/source/bufferable.h index c8c9393c..cbbde4e1 100644 --- a/source/bufferable.h +++ b/source/bufferable.h @@ -14,15 +14,29 @@ uploading fresh data to the buffer. */ class Bufferable { +public: + class AsyncUpdater + { + private: + const Bufferable &bufferable; + char *mapped_address; + + public: + AsyncUpdater(const Bufferable &); + ~AsyncUpdater(); + + void upload_data(); + }; + private: Buffer *buffer; unsigned offset; Bufferable *next_in_buffer; Bufferable *prev_in_buffer; + mutable bool location_dirty; protected: mutable bool dirty; -protected: Bufferable(); public: virtual ~Bufferable(); @@ -31,19 +45,34 @@ public: buffer, and this object is inserted after it. */ void use_buffer(Buffer *buf, Bufferable *prev = 0); + /** Sets the buffer for the entire chain of objects. */ + void change_buffer(Buffer *); + + /** 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); } + + /** Returns an object which can be used to upload data to the buffer using + mapped memory. */ + 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; + /** 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,14 +85,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() { } - - /** Resizes the buffer if necessary and calls upload_data(). */ - void update_buffer() const; + /** Called when the target buffer or offset within it has changed. */ + virtual void location_changed(Buffer *, unsigned, unsigned) const { } - /** Uploads data to the buffer. */ - virtual void upload_data() const = 0; +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; }; } // namespace GL