Bufferable *next_in_buffer = 0;
Bufferable *prev_in_buffer = 0;
mutable bool location_dirty = false;
Bufferable *next_in_buffer = 0;
Bufferable *prev_in_buffer = 0;
mutable bool location_dirty = false;
/** Returns the total amount of storage required by this object and others
in the same chain, including any alignment between objects. */
/** Returns the total amount of storage required by this object and others
in the same chain, including any alignment between objects. */
/** Uploads new data into the buffer if necessary. */
void refresh() const { if(dirty) upload_data(0); }
/** Returns an object which can be used to upload data to the buffer using
mapped memory. */
/** Uploads new data into the buffer if necessary. */
void refresh() const { if(dirty) upload_data(0); }
/** Returns an object which can be used to upload data to the buffer using
mapped memory. */
const Buffer *get_buffer() const { return buffer; }
/** Returns the size of the data, in bytes. */
const Buffer *get_buffer() const { return buffer; }
/** Returns the size of the data, in bytes. */
/** Returns the alignment required for the data, in bytes. The offset is
guaranteed to be a multiple of this. */
/** Returns the alignment required for the data, in bytes. The offset is
guaranteed to be a multiple of this. */
/** Updates the offsets for the chain so that data from different objects
does not overlap. Should be called if either data size or alignment
/** Updates the offsets for the chain so that data from different objects
does not overlap. Should be called if either data size or alignment