]> git.tdb.fi Git - libs/gl.git/commitdiff
Refactor the internal interface of Bufferable a bit
authorMikko Rasa <tdb@tdb.fi>
Tue, 23 Sep 2014 17:11:16 +0000 (20:11 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 23 Sep 2014 17:11:16 +0000 (20:11 +0300)
source/batch.cpp
source/batch.h
source/bufferable.cpp
source/bufferable.h
source/uniformblock.h
source/vertexarray.cpp
source/vertexarray.h

index 7100653ea17800cf9ebd6364e6d5fba41443948b..1b0c47bf976dd212aa4270a962d7f98a40f34761 100644 (file)
@@ -196,11 +196,6 @@ void Batch::append_index(unsigned i)
                data.push_back(i);
 }
 
-void Batch::upload_data() const
-{
-       get_buffer()->sub_data(get_offset(), data.size(), &data[0]);
-}
-
 unsigned Batch::get_index_size() const
 {
        if(data_type==UNSIGNED_SHORT)
index 907a0b7f29c08c92540d53fef4afc27d8183836c..0ce4ecf14e41f9214023f0c631081edf230e13e5 100644 (file)
@@ -56,7 +56,7 @@ public:
 private:
        void append_index(unsigned);
        virtual unsigned get_data_size() const { return data.size(); }
-       virtual void upload_data() const;
+       virtual const void *get_data_pointer() const { return &data[0]; }
        unsigned get_index_size() const;
 public:
        unsigned size() const { return data.size()/get_index_size(); }
index eb3f1c006e925244f1c58ff671e4d28237378f4a..04793fb793905ebfae448899195873879d6ff542 100644 (file)
@@ -80,9 +80,8 @@ void Bufferable::update_offset()
        the buffer is actually used. */
 }
 
-void Bufferable::update_buffer() const
+bool Bufferable::resize_buffer() const
 {
-       BindRestore bind(buffer, buffer->get_type());
        if(offset+get_data_size()>=buffer->get_size())
        {
                const Bufferable *last = this;
@@ -93,17 +92,36 @@ void Bufferable::update_buffer() const
                if(total_size>buffer->get_size())
                {
                        buffer->data(total_size, 0);
-                       /* Resizing the buffer invalidates its contents.  Non-dirty data may
-                       be in use, so reupload it. */
-                       for(const Bufferable *b=last; b; b=b->prev_in_buffer)
-                               if(!b->dirty)
-                                       b->upload_data();
+                       return true;
                }
        }
 
+       return false;
+}
+
+void Bufferable::update_buffer() const
+{
+       BindRestore bind(buffer, buffer->get_type());
+       if(resize_buffer())
+       {
+               /* Resizing the buffer invalidates its contents.  Non-dirty data may
+               be in use, so reupload it. */
+               for(const Bufferable *b=prev_in_buffer; b; b=b->prev_in_buffer)
+                       if(!b->dirty)
+                               b->upload_data();
+               for(const Bufferable *b=next_in_buffer; b; b=b->next_in_buffer)
+                       if(!b->dirty)
+                               b->upload_data();
+       }
+
        upload_data();
        dirty = false;
 }
 
+void Bufferable::upload_data() const
+{
+       buffer->sub_data(offset, get_data_size(), get_data_pointer());
+}
+
 } // namespace GL
 } // namespace Msp
index c8c9393caabe47176627be22891c3f0ccb0d04c1..d7d7e45fe2183fa606395bda73f184a1f3ace282 100644 (file)
@@ -44,6 +44,9 @@ 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; }
@@ -59,11 +62,15 @@ protected:
        /** 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;
+       virtual void upload_data() const;
 };
 
 } // namespace GL
index 192e7c2e8441360e4f91b1d90a42d7b3187d8b18..877a255f5861bfbdf6c5e313253fb24588d16aa2 100644 (file)
@@ -36,6 +36,7 @@ public:
 
 private:
        virtual unsigned get_data_size() const { return size; }
+       virtual const void *get_data_pointer() const { return &data[0]; }
        virtual unsigned get_alignment() const;
        virtual void offset_changed();
        virtual void upload_data() const;
index 72fd8a48ecddc802ec6a1bd0aa2cb985e3c9328a..3848109973c9dca9c8c49c830ebfa10e0285c6e9 100644 (file)
@@ -103,11 +103,6 @@ unsigned VertexArray::get_data_size() const
        return data.size()*sizeof(float);
 }
 
-void VertexArray::upload_data() const
-{
-       get_buffer()->sub_data(get_offset(), get_data_size(), &data[0]);
-}
-
 void VertexArray::apply() const
 {
        if(format.empty())
index e38f0afff910b20500b750983fcf957db934d741..0223a1f4434df584cc16dd59a0a659f23d2f1409 100644 (file)
@@ -61,7 +61,7 @@ public:
        float *modify(unsigned);
 private:
        virtual unsigned get_data_size() const;
-       virtual void upload_data() const;
+       virtual const void *get_data_pointer() const { return &data[0]; }
 
 public:
        unsigned size() const { return data.size()/stride; }