]> git.tdb.fi Git - libs/gl.git/blobdiff - source/mesh.cpp
Make buffer storage immutable and use ARB_buffer_storage
[libs/gl.git] / source / mesh.cpp
index 3569e1c38badaac3a1f705769bfd4e6e625ff3e0..72936e66fb535a2e0020a896040221df2c60b777 100644 (file)
@@ -54,35 +54,28 @@ void Mesh::check_buffers(unsigned mask)
 {
        if(mask&VERTEX_BUFFER)
        {
-               if(!vbuf)
+               unsigned req_size = vertices.get_required_buffer_size();
+               if(!vbuf || (vbuf->get_size()>0 && vbuf->get_size()<req_size))
                {
+                       delete vbuf;
                        vbuf = new Buffer(ARRAY_BUFFER);
                        vertices.use_buffer(vbuf);
                        vtx_setup.set_vertex_array(vertices);
-               }
-               unsigned req_size = vertices.get_required_buffer_size();
-               if(vbuf->get_size()<req_size)
-               {
                        dirty |= VERTEX_BUFFER;
-                       vertices.buffer_resized();
                }
        }
 
        if(mask&INDEX_BUFFER)
        {
-               if(!ibuf)
+               unsigned req_size = (batches.empty() ? 0 : batches.front().get_required_buffer_size());
+               if(!ibuf || (ibuf->get_size()>0 && ibuf->get_size()<req_size))
                {
+                       delete ibuf;
                        ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
                        if(!batches.empty())
-                               batches.front().use_buffer(ibuf);
+                               batches.front().change_buffer(ibuf);
                        vtx_setup.set_index_buffer(*ibuf);
-               }
-               unsigned req_size = (batches.empty() ? 0 : batches.front().get_required_buffer_size());
-               if(ibuf->get_size()<req_size)
-               {
                        dirty |= INDEX_BUFFER;
-                       if(!batches.empty())
-                               batches.front().buffer_resized();
                }
        }
 }
@@ -182,9 +175,9 @@ void Mesh::draw(Renderer &renderer, const VertexSetup *vs, unsigned count) const
 void Mesh::resize_buffers() const
 {
        if(dirty&VERTEX_BUFFER)
-               vbuf->data(vertices.get_required_buffer_size(), 0);
+               vbuf->storage(vertices.get_required_buffer_size());
        if(dirty&INDEX_BUFFER)
-               ibuf->data(batches.front().get_required_buffer_size(), 0);
+               ibuf->storage(batches.front().get_required_buffer_size());
        dirty = 0;
 }