]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/vertexsetup.cpp
Rewrite state management
[libs/gl.git] / source / core / vertexsetup.cpp
index 1094bb21c9ef229359a09f70b35435c32f6e8444..f077ad2e00260ac675efcd191a214b8820eb3554 100644 (file)
@@ -34,8 +34,6 @@ VertexSetup::VertexSetup():
 
 VertexSetup::~VertexSetup()
 {
-       if(current()==this)
-               unbind();
        glDeleteVertexArrays(1, &id);
 }
 
@@ -70,7 +68,7 @@ void VertexSetup::set_vertex_array(const VertexArray &a)
                throw invalid_argument("VertexSetup::set_vertex_array");
 
        vertex_array = &a;
-       update(VERTEX_ARRAY);
+       dirty |= VERTEX_ARRAY;
 }
 
 void VertexSetup::set_instance_array(const VertexArray &a)
@@ -85,13 +83,13 @@ void VertexSetup::set_instance_array(const VertexArray &a)
        static Require req(ARB_instanced_arrays);
 
        inst_array = &a;
-       update(INSTANCE_ARRAY);
+       dirty |= INSTANCE_ARRAY;
 }
 
 void VertexSetup::set_index_buffer(const Buffer &ibuf)
 {
        index_buffer = &ibuf;
-       update(INDEX_BUFFER);
+       dirty |= INDEX_BUFFER;
 }
 
 bool VertexSetup::verify_format(const VertexFormat &fmt)
@@ -108,33 +106,31 @@ bool VertexSetup::verify_format(const VertexFormat &fmt)
        return true;
 }
 
-void VertexSetup::update(unsigned mask) const
+void VertexSetup::update() const
 {
        static bool direct = ARB_direct_state_access && ARB_vertex_attrib_binding;
-       if(!direct && current()!=this)
-       {
-               dirty |= mask;
-               return;
-       }
 
-       if(mask&VERTEX_ARRAY)
+       if(dirty&VERTEX_ARRAY)
                update_vertex_array(*vertex_array, 0, 0, direct);
 
-       if((mask&INSTANCE_ARRAY) && inst_array)
+       if(dirty&INSTANCE_ARRAY)
                update_vertex_array(*inst_array, 1, 1, direct);
 
-       if(mask&INDEX_BUFFER)
+       if(dirty&INDEX_BUFFER)
        {
                if(direct)
                        glVertexArrayElementBuffer(id, index_buffer->get_id());
                else
-                       glBindBuffer(ELEMENT_ARRAY_BUFFER, index_buffer->get_id());
+                       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer->get_id());
        }
+
+       dirty = 0;
 }
 
 void VertexSetup::update_vertex_array(const VertexArray &array, unsigned binding, unsigned divisor, bool direct) const
 {
-       Conditional<Bind> bind_vbuf(!direct, array.get_buffer(), ARRAY_BUFFER);
+       if(!direct)
+               glBindBuffer(GL_ARRAY_BUFFER, array.get_buffer()->get_id());
 
        const VertexFormat &fmt = array.get_format();
        unsigned stride = fmt.stride()*sizeof(float);
@@ -170,31 +166,9 @@ void VertexSetup::update_vertex_array(const VertexArray &array, unsigned binding
                }
                offset += sz*sizeof(float);
        }
-}
 
-void VertexSetup::bind() const
-{
-       if(!vertex_array || !index_buffer)
-               throw invalid_operation("VertexSetup::bind");
-
-       if(set_current(this))
-       {
-               vertex_array->refresh();
-               if(inst_array)
-                       inst_array->refresh();
-               glBindVertexArray(id);
-               if(dirty)
-               {
-                       update(dirty);
-                       dirty = 0;
-               }
-       }
-}
-
-void VertexSetup::unbind()
-{
-       if(set_current(0))
-               glBindVertexArray(0);
+       if(!direct)
+               glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
 
 void VertexSetup::unload()
@@ -207,8 +181,8 @@ void VertexSetup::unload()
        }
        else
        {
-               BindRestore _bind(*this);
-               Buffer::unbind_from(ARRAY_BUFFER);
+               glBindVertexArray(id);
+               glBindBuffer(GL_ARRAY_BUFFER, 0);
 
                for(const unsigned char *a=vertex_format.begin(); a!=vertex_format.end(); ++a)
                {
@@ -223,7 +197,7 @@ void VertexSetup::unload()
                        glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0);
                }
 
-               glBindBuffer(ELEMENT_ARRAY_BUFFER, 0);
+               glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        }
 
        vertex_array = 0;