#ifndef MSP_GL_BUFFERABLE_H_
#define MSP_GL_BUFFERABLE_H_
+#include <cstddef>
#include <msp/core/noncopyable.h>
+#include "buffer.h"
namespace Msp {
namespace GL {
-class Buffer;
-
/**
Base class for things that can store data in buffers. Multiple Bufferables
may be put in the same buffer.
-A dirty flag is provided for derived classes. It should be set when the data
-in the buffer is considered out of date, and is cleared by Bufferable after
-uploading fresh data to the buffer.
+Derived classes should call mark_dirty() when the stored data has changed.
*/
class Bufferable: public NonCopyable
{
{
private:
const Bufferable &bufferable;
- char *mapped_address;
+ Buffer::AsyncTransfer transfer;
public:
AsyncUpdater(const Bufferable &);
- ~AsyncUpdater();
void upload_data();
};
Bufferable *next_in_buffer = 0;
Bufferable *prev_in_buffer = 0;
mutable bool location_dirty = false;
-protected:
- mutable bool dirty = false;
+ mutable uint8_t dirty = 0;
+protected:
Bufferable() = default;
Bufferable(Bufferable &&);
public:
/** Returns the total amount of storage required by this object and others
in the same chain, including any padding required by object alignment. */
- std::size_t get_required_buffer_size() const;
+ std::size_t get_required_buffer_size(bool = false) const;
/** Uploads new data into the buffer if necessary. */
- void refresh() const { if(dirty) upload_data(0); }
+ void refresh(unsigned f) const { if(dirty) upload_data(f, 0); }
/** Returns an object which can be used to upload data to the buffer using
mapped memory. If data is not dirty, returns null. */
- AsyncUpdater *refresh_async() const { return dirty ? new AsyncUpdater(*this) : 0; }
+ AsyncUpdater *refresh_async() const { return dirty ? create_async_updater() : 0; }
private:
void unlink_from_buffer();
changes. */
void update_offset();
+ /* Indicates that the data of the bufferable has changed and should be
+ uploaded to the buffer again. */
+ void mark_dirty();
+
public:
/** Returns the offset of the data from the beginning of the buffer. */
std::size_t get_offset() const { return offset; }
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;
+ void upload_data(unsigned, char *) const;
+
+ AsyncUpdater *create_async_updater() const;
};
} // namespace GL