*/
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;
protected:
mutable bool dirty;
-protected:
Bufferable();
public:
virtual ~Bufferable();
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();
+public:
+ /** Returns the buffer in which the data is stored. */
+ const Buffer *get_buffer() const { return buffer; }
+
protected:
/** Returns the buffer in which the data is stored. */
- Buffer *get_buffer() const { return buffer; }
+ Buffer *get_mutable_buffer() const { return buffer; }
/** 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; }
/** 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