]> git.tdb.fi Git - libs/gl.git/commitdiff
InstanceArray doesn't need to refresh the vertex arrays
authorMikko Rasa <tdb@tdb.fi>
Sun, 19 Dec 2021 11:26:00 +0000 (13:26 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sun, 19 Dec 2021 11:40:09 +0000 (13:40 +0200)
That's done in Renderer since 9b3bce7.

source/core/bufferable.h
source/render/instancearray.cpp

index f11d51fa0671b716f7897fdd1f2ed947892f8da9..25d29fd8f393021c6d6af4f86e624d77ec79705b 100644 (file)
@@ -41,7 +41,7 @@ private:
        Bufferable *next_in_buffer = 0;
        Bufferable *prev_in_buffer = 0;
        mutable bool location_dirty = false;
-       mutable bool dirty = false;
+       mutable uint8_t dirty = 0;
 
 protected:
        Bufferable() = default;
@@ -63,11 +63,11 @@ public:
        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&(1<<f)) 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();
@@ -103,7 +103,9 @@ public:
 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
index eec72f98dc18144c777f8ae61bb5eb3d18677db0..93985578ef08e04a0aaff4b9a66b2d567a5c8634 100644 (file)
@@ -103,10 +103,8 @@ void InstanceArray::render(Renderer &renderer, Tag tag) const
                return;
 
        const Mesh *mesh = object.get_mesh();
-       mesh->get_vertices().refresh();
        if(instance_buffer->get_size()==0)
                instance_buffer->storage(instance_data.get_required_buffer_size(), STREAMING);
-       instance_data.refresh();
 
        Renderer::Push push(renderer);
        method->apply(renderer);