]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/vertexsetup.cpp
Move backend information into Device
[libs/gl.git] / source / core / vertexsetup.cpp
index f077ad2e00260ac675efcd191a214b8820eb3554..61bf032c0fcaecae0ffac46fef15c95f86e95952 100644 (file)
@@ -1,16 +1,5 @@
-#include <msp/core/raii.h>
-#include <msp/gl/extensions/arb_direct_state_access.h>
-#include <msp/gl/extensions/arb_instanced_arrays.h>
-#include <msp/gl/extensions/arb_vertex_array_object.h>
-#include <msp/gl/extensions/arb_vertex_attrib_binding.h>
-#include <msp/gl/extensions/arb_vertex_buffer_object.h>
-#include <msp/gl/extensions/arb_vertex_shader.h>
-#include <msp/gl/extensions/khr_debug.h>
-#include "buffer.h"
-#include "deviceinfo.h"
+#include "device.h"
 #include "error.h"
-#include "gl.h"
-#include "misc.h"
 #include "vertexarray.h"
 #include "vertexsetup.h"
 
@@ -19,24 +8,6 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-VertexSetup::VertexSetup():
-       dirty(0),
-       vertex_array(0),
-       inst_array(0),
-       index_buffer(0)
-{
-       static Require req(ARB_vertex_array_object);
-       if(ARB_direct_state_access)
-               glCreateVertexArrays(1, &id);
-       else
-               glGenVertexArrays(1, &id);
-}
-
-VertexSetup::~VertexSetup()
-{
-       glDeleteVertexArrays(1, &id);
-}
-
 void VertexSetup::set_format(const VertexFormat &vfmt)
 {
        if(!verify_format(vfmt))
@@ -44,15 +15,20 @@ void VertexSetup::set_format(const VertexFormat &vfmt)
        if(!vertex_format.empty())
                throw invalid_operation("VertexSetup::set_format");
 
+       require_format(vfmt, false);
+
        vertex_format = vfmt;
 }
 
 void VertexSetup::set_format_instanced(const VertexFormat &vfmt, const VertexFormat &ifmt)
 {
        if(!verify_format(vfmt) || !verify_format(ifmt))
-               throw invalid_argument("VertexSetup::set_format");
+               throw invalid_argument("VertexSetup::set_format_instanced");
        if(!vertex_format.empty())
-               throw invalid_operation("VertexSetup::set_format");
+               throw invalid_operation("VertexSetup::set_format_instanced");
+
+       require_format(vfmt, false);
+       require_format(ifmt, true);
 
        vertex_format = vfmt;
        inst_format = ifmt;
@@ -80,15 +56,14 @@ void VertexSetup::set_instance_array(const VertexArray &a)
        if(!a.get_buffer())
                throw invalid_argument("VertexSetup::set_instance_array");
 
-       static Require req(ARB_instanced_arrays);
-
        inst_array = &a;
        dirty |= INSTANCE_ARRAY;
 }
 
-void VertexSetup::set_index_buffer(const Buffer &ibuf)
+void VertexSetup::set_index_buffer(const Buffer &ibuf, DataType itype)
 {
        index_buffer = &ibuf;
+       index_type = itype;
        dirty |= INDEX_BUFFER;
 }
 
@@ -97,108 +72,19 @@ bool VertexSetup::verify_format(const VertexFormat &fmt)
        if(fmt.empty())
                return false;
 
-       unsigned max_attribs = Limits::get_global().max_vertex_attributes;
-
-       for(const unsigned char *a=fmt.begin(); a!=fmt.end(); ++a)
-               if(get_attribute_semantic(*a)>=max_attribs)
-                       return false;
-
-       return true;
+       static unsigned max_attribs = Device::get_current().get_info().limits.max_vertex_attributes;
+       return all_of(fmt.begin(), fmt.end(), [](VertexAttribute a){ return get_attribute_semantic(a)<max_attribs; });
 }
 
 void VertexSetup::update() const
 {
-       static bool direct = ARB_direct_state_access && ARB_vertex_attrib_binding;
-
-       if(dirty&VERTEX_ARRAY)
-               update_vertex_array(*vertex_array, 0, 0, direct);
-
-       if(dirty&INSTANCE_ARRAY)
-               update_vertex_array(*inst_array, 1, 1, direct);
-
-       if(dirty&INDEX_BUFFER)
-       {
-               if(direct)
-                       glVertexArrayElementBuffer(id, index_buffer->get_id());
-               else
-                       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer->get_id());
-       }
-
+       VertexSetupBackend::update(dirty);
        dirty = 0;
 }
 
-void VertexSetup::update_vertex_array(const VertexArray &array, unsigned binding, unsigned divisor, bool direct) const
-{
-       if(!direct)
-               glBindBuffer(GL_ARRAY_BUFFER, array.get_buffer()->get_id());
-
-       const VertexFormat &fmt = array.get_format();
-       unsigned stride = fmt.stride()*sizeof(float);
-       if(direct)
-       {
-               glVertexArrayVertexBuffer(id, binding, array.get_buffer()->get_id(), 0, stride);
-               glVertexArrayBindingDivisor(id, binding, divisor);
-       }
-
-       unsigned offset = 0;
-       for(const unsigned char *a=fmt.begin(); a!=fmt.end(); ++a)
-       {
-               unsigned sem = get_attribute_semantic(*a);
-               unsigned sz = get_attribute_size(*a);
-               if(direct)
-               {
-                       if(*a==COLOR4_UBYTE)
-                               glVertexArrayAttribFormat(id, sem, 4, GL_UNSIGNED_BYTE, true, offset);
-                       else
-                               glVertexArrayAttribFormat(id, sem, sz, GL_FLOAT, false, offset);
-                       glVertexArrayAttribBinding(id, sem, binding);
-                       glEnableVertexArrayAttrib(id, sem);
-               }
-               else
-               {
-                       if(*a==COLOR4_UBYTE)
-                               glVertexAttribPointer(sem, 4, GL_UNSIGNED_BYTE, true, stride, reinterpret_cast<unsigned char *>(offset));
-                       else
-                               glVertexAttribPointer(sem, sz, GL_FLOAT, false, stride, reinterpret_cast<float *>(offset));
-                       if(ARB_instanced_arrays)
-                               glVertexAttribDivisor(sem, divisor);
-                       glEnableVertexAttribArray(sem);
-               }
-               offset += sz*sizeof(float);
-       }
-
-       if(!direct)
-               glBindBuffer(GL_ARRAY_BUFFER, 0);
-}
-
 void VertexSetup::unload()
 {
-       if(ARB_direct_state_access)
-       {
-               glVertexArrayVertexBuffer(id, 0, 0, 0, 0);
-               glVertexArrayVertexBuffer(id, 1, 0, 0, 0);
-               glVertexArrayElementBuffer(id, 0);
-       }
-       else
-       {
-               glBindVertexArray(id);
-               glBindBuffer(GL_ARRAY_BUFFER, 0);
-
-               for(const unsigned char *a=vertex_format.begin(); a!=vertex_format.end(); ++a)
-               {
-                       unsigned sem = get_attribute_semantic(*a);
-                       glDisableVertexAttribArray(sem);
-                       glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0);
-               }
-               for(const unsigned char *a=inst_format.begin(); a!=inst_format.end(); ++a)
-               {
-                       unsigned sem = get_attribute_semantic(*a);
-                       glDisableVertexAttribArray(sem);
-                       glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0);
-               }
-
-               glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-       }
+       VertexSetupBackend::unload();
 
        vertex_array = 0;
        vertex_format = VertexFormat();
@@ -207,15 +93,5 @@ void VertexSetup::unload()
        index_buffer = 0;
 }
 
-void VertexSetup::set_debug_name(const string &name)
-{
-#ifdef DEBUG
-       if(KHR_debug)
-               glObjectLabel(GL_VERTEX_ARRAY, id, name.size(), name.c_str());
-#else
-       (void)name;
-#endif
-}
-
 } // namespace GL
 } // namespace Msp