]> git.tdb.fi Git - libs/gl.git/blobdiff - source/buffer.cpp
Add vertex array object support to Mesh
[libs/gl.git] / source / buffer.cpp
index f3b40da6ab469623f8d7e2a27a65a6964da657c1..d8bb28028ee686380e48b77613c039906df40a35 100644 (file)
@@ -1,8 +1,10 @@
 #include <stdexcept>
-#include "arb_uniform_buffer_object.h"
-#include "arb_vertex_buffer_object.h"
+#include <msp/gl/extensions/arb_pixel_buffer_object.h>
+#include <msp/gl/extensions/arb_uniform_buffer_object.h>
+#include <msp/gl/extensions/arb_vertex_buffer_object.h>
 #include "buffer.h"
-#include "extension.h"
+#include "error.h"
+#include "mesh.h"
 #include "misc.h"
 
 using namespace std;
@@ -19,21 +21,21 @@ Buffer::Buffer(BufferType t):
 {
        require_buffer_type(type);
 
-       glGenBuffersARB(1, &id);
+       glGenBuffers(1, &id);
 }
 
 Buffer::~Buffer()
 {
-       glDeleteBuffersARB(1, &id);
+       glDeleteBuffers(1, &id);
 }
 
 void Buffer::require_buffer_type(BufferType type)
 {
-       static RequireExtension _req_vbo("GL_ARB_vertex_buffer_object");
+       static Require _req_vbo(ARB_vertex_buffer_object);
        if(type==PIXEL_PACK_BUFFER || type==PIXEL_UNPACK_BUFFER)
-               static RequireExtension _req_pbo("GL_ARB_pixel_buffer_object");
+               static Require _req_pbo(ARB_pixel_buffer_object);
        else if(type==UNIFORM_BUFFER)
-               static RequireExtension _req_ubo("GL_ARB_uniform_buffer_object");
+               static Require _req_ubo(ARB_uniform_buffer_object);
 }
 
 void Buffer::set_usage(BufferUsage u)
@@ -45,7 +47,7 @@ void Buffer::data(unsigned sz, const void *d)
 {
        const Buffer *old = current(type);
        bind();
-       glBufferDataARB(type, sz, d, usage);
+       glBufferData(type, sz, d, usage);
        size = sz;
        restore(old, type);
 }
@@ -54,7 +56,7 @@ void Buffer::sub_data(unsigned off, unsigned sz, const void *d)
 {
        const Buffer *old = current(type);
        bind();
-       glBufferSubDataARB(type, off, sz, d);
+       glBufferSubData(type, off, sz, d);
        restore(old, type);
 }
 
@@ -67,14 +69,19 @@ void Buffer::bind_to(BufferType t) const
 {
        if(t!=type)
                require_buffer_type(t);
+       // Don't change the binding in a mesh's vertex array object
+       if(t==ELEMENT_ARRAY_BUFFER && Mesh::current())
+               throw invalid_operation("Buffer::bind_to(ELEMENT_ARRAY_BUFFER)");
        if(set_current(t, this))
-               glBindBufferARB(t, id);
+               glBindBuffer(t, id);
 }
 
 void Buffer::unbind_from(BufferType type)
 {
+       if(type==ELEMENT_ARRAY_BUFFER && Mesh::current())
+               throw invalid_operation("Buffer::unbind_from(ELEMENT_ARRAY_BUFFER)");
        if(set_current(type, 0))
-               glBindBufferARB(type, 0);
+               glBindBuffer(type, 0);
 }
 
 const Buffer *&Buffer::binding(BufferType type)
@@ -151,13 +158,13 @@ const BufferRange *&BufferRange::binding(BufferType type, unsigned index)
        if(type==UNIFORM_BUFFER)
        {
                if(index>=get_n_uniform_buffer_bindings())
-                       throw out_of_range("Buffer::binding");
+                       throw out_of_range("BufferRange::binding");
                if(bound_uniform.size()<=index)
                        bound_uniform.resize(index+1);
                return bound_uniform[index];
        }
        else
-               throw invalid_argument("Buffer::binding");
+               throw invalid_argument("BufferRange::binding");
 }
 
 bool BufferRange::set_current(BufferType type, unsigned index, const BufferRange *buf)