]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/bufferable.h
Remove support for array size specialization from the engine as well
[libs/gl.git] / source / core / bufferable.h
index b1d991fca5218cfd4a0cd1e7ee554d2920a02463..4a4114d0ce683483717eee9baf0770e3b7ab7c4b 100644 (file)
@@ -7,7 +7,9 @@ namespace GL {
 class Buffer;
 
 /**
-Base class for things that can store data in buffers.  Supports buffer sharing.
+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.
@@ -15,6 +17,11 @@ uploading fresh data to the buffer.
 class Bufferable
 {
 public:
+       /**
+       Uploads data to the buffer asynchronously, through a memory mapping.  API
+       calls are done in the constructor and desctructor, so upload_data may be
+       called from a different thread.
+       */
        class AsyncUpdater
        {
        private:
@@ -30,7 +37,7 @@ public:
 
 private:
        Buffer *buffer = 0;
-       unsigned offset = 0;
+       std::size_t offset = 0;
        Bufferable *next_in_buffer = 0;
        Bufferable *prev_in_buffer = 0;
        mutable bool location_dirty = false;
@@ -42,22 +49,24 @@ public:
        virtual ~Bufferable();
 
        /** Sets the buffer to use.  If prev is not null, it must use the same
-       buffer, and this object is inserted after it. */
-       void use_buffer(Buffer *buf, Bufferable *prev = 0);
+       buffer, and this object is inserted after it.
+
+       Date is not uploaded immediately, but only when refresh() is called. */
+       void use_buffer(Buffer *, 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;
+       in the same chain, including any padding required by object alignment. */
+       std::size_t get_required_buffer_size() const;
 
        /** 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. */
-       AsyncUpdater *refresh_async() const;
+       mapped memory.  If data is not dirty, returns null. */
+       AsyncUpdater *refresh_async() const { return dirty ? new AsyncUpdater(*this) : 0; }
 
 private:
        void unlink_from_buffer();
@@ -67,15 +76,15 @@ public:
        const Buffer *get_buffer() const { return buffer; }
 
        /** Returns the size of the data, in bytes. */
-       virtual unsigned get_data_size() const = 0;
+       virtual std::size_t get_data_size() const = 0;
 
 protected:
-       /** Returns a pointer to the start of data in client memory. */
+       /** Returns a pointer to the start of the 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; }
+       /** Returns the alignment required for the data, in bytes.  The offset
+       within the buffer is guaranteed to be a multiple of the alignment. */
+       virtual std::size_t get_alignment() const { return 1; }
 
        /** Updates the offsets for the chain so that data from different objects
        does not overlap.  Should be called if either data size or alignment
@@ -84,12 +93,9 @@ protected:
 
 public:
        /** Returns the offset of the data from the beginning of the buffer. */
-       unsigned get_offset() const { return offset; }
+       std::size_t get_offset() const { return offset; }
 
 private:
-       /** Called when the target buffer or offset within it has changed. */
-       virtual void location_changed(Buffer *, unsigned, unsigned) const { }
-
        /** 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;