From 089ab7539c2e1ffa950834c1c29291bfa6c689f6 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Mon, 31 Aug 2020 11:17:10 -0700 Subject: [PATCH] Fix issues with vbos and binding. Also fix issue with multiple definition of explicit template specialization --- include/graphics/vbo.hpp | 43 +------------------------------ src/graphics/gl_buffers.cpp | 14 +++++++--- src/graphics/vbo.cpp | 51 ++++++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 49 deletions(-) diff --git a/include/graphics/vbo.hpp b/include/graphics/vbo.hpp index 64a0653..9f751ee 100644 --- a/include/graphics/vbo.hpp +++ b/include/graphics/vbo.hpp @@ -93,7 +93,7 @@ namespace graphics{ gl_buffer* get_bound_buffer()const; GLenum get_bound_id()const; private: - static void copy_buffer(const vbo& src, vbo& dest); + static void copy_buffer(vbo& dest, const vbo& src); }; //RAII wrapper for mapping vbo's @@ -234,47 +234,6 @@ namespace graphics{ return m_data[i]; } - scoped_vbo_map::scoped_vbo_map(const vbo& v, gl_buffer& targ, vbo::maptype m): - m_owner(&v) - { - m_owner->bind_lock(targ); - m_data = reinterpret_cast(glMapBuffer(m_owner->get_bound_id(), static_cast(m))); - } - scoped_vbo_map::scoped_vbo_map(scoped_vbo_map&& m): - m_data(std::exchange(m.m_data, nullptr)), - m_owner(m.m_owner){} - scoped_vbo_map::~scoped_vbo_map(){ - if(m_data){ - glUnmapBuffer(m_owner->get_bound_id()); - m_owner->bind_unlock(); - } - } - scoped_vbo_map& scoped_vbo_map::operator=(scoped_vbo_map&& m){ - std::swap(m_data, m.m_data); - std::swap(m_owner, m.m_owner); - return *this; - } - auto scoped_vbo_map::length()const -> size_type{ - GLint64 retval; - glGetBufferParameteri64v(m_owner->get_bound_id(), GL_BUFFER_MAP_LENGTH, &retval); - return retval; - } - auto scoped_vbo_map::release() -> pointer{ - return std::exchange(m_data, nullptr); - } - scoped_vbo_map::operator pointer(){ - return m_data; - } - scoped_vbo_map::operator const_pointer()const{ - return m_data; - } - auto scoped_vbo_map::raw() -> pointer{ - return m_data; - } - auto scoped_vbo_map::raw()const -> const_pointer{ - return m_data; - } - } #endif diff --git a/src/graphics/gl_buffers.cpp b/src/graphics/gl_buffers.cpp index 7bef498..5f6423a 100644 --- a/src/graphics/gl_buffers.cpp +++ b/src/graphics/gl_buffers.cpp @@ -20,6 +20,8 @@ #include "graphics/gl_include.hpp" +#include //exchange + namespace graphics{ buffer_iface::buffer_iface(const buffer_iface&): @@ -54,8 +56,10 @@ namespace graphics{ bool buffer_iface::bind(gl_buffer& b)const{ if(b.is_locked()) return false; - if(m_bound) - m_bound->bind(nullptr); + if(m_bound){ + gl_buffer* tmp = std::exchange(m_bound, nullptr); + tmp->bind(nullptr); + } m_bound = &b; m_bound->bind(this); return true; @@ -94,8 +98,10 @@ namespace graphics{ gl_buffer::gl_buffer(GLenum buf): m_buffer(buf){} void gl_buffer::bind(const buffer_iface* newbind){ - if(bound) - bound->unbind(); + if(bound){ + const buffer_iface* tmp = std::exchange(bound, nullptr); + tmp->unbind(); + } bound = newbind; } void gl_buffer::lock(bool b){ diff --git a/src/graphics/vbo.cpp b/src/graphics/vbo.cpp index 7eefcc7..dcb977a 100644 --- a/src/graphics/vbo.cpp +++ b/src/graphics/vbo.cpp @@ -24,11 +24,11 @@ namespace graphics{ vbo::vbo(size_t size, usage t): - m_buffer_size(size) + m_buffer_size(0) { glGenBuffers(1, &m_buffer); bind(buffer::copy_write); - glBufferData(m_bi.get_bound_id(), m_buffer_size, NULL, static_cast(t)); + glBufferData(m_bi.get_bound_id(), size, NULL, static_cast(t)); } vbo::vbo(const vbo& v): m_buffer_size(v.m_buffer_size), @@ -59,6 +59,8 @@ namespace graphics{ return *this; } bool vbo::bind(gl_buffer& buf)const{ + if(get_bound_id() == buf.get_buffer_id()) + return true; if(!m_bi.bind(buf)) return false; glBindBuffer(buf.get_buffer_id(), m_buffer); @@ -121,10 +123,53 @@ namespace graphics{ return static_cast(retval); } - void vbo::copy_buffer(const vbo& src, vbo& dest){ + void vbo::copy_buffer(vbo& dest, const vbo& src){ size_t bytes = util::min(dest.get_cap(), src.get_size()); dest.bind(buffer::copy_write); scoped_vbo_map data(src, buffer::copy_read, maptype::READ); dest.buffer(data, bytes); } + + + scoped_vbo_map::scoped_vbo_map(const vbo& v, gl_buffer& targ, vbo::maptype m): + m_owner(&v) + { + m_owner->bind_lock(targ); + m_data = reinterpret_cast(glMapBuffer(m_owner->get_bound_id(), static_cast(m))); + } + scoped_vbo_map::scoped_vbo_map(scoped_vbo_map&& m): + m_data(std::exchange(m.m_data, nullptr)), + m_owner(m.m_owner){} + scoped_vbo_map::~scoped_vbo_map(){ + if(m_data){ + glUnmapBuffer(m_owner->get_bound_id()); + m_owner->bind_unlock(); + } + } + scoped_vbo_map& scoped_vbo_map::operator=(scoped_vbo_map&& m){ + std::swap(m_data, m.m_data); + std::swap(m_owner, m.m_owner); + return *this; + } + auto scoped_vbo_map::length()const -> size_type{ + GLint64 retval; + glGetBufferParameteri64v(m_owner->get_bound_id(), GL_BUFFER_MAP_LENGTH, &retval); + return retval; + } + auto scoped_vbo_map::release() -> pointer{ + return std::exchange(m_data, nullptr); + } + scoped_vbo_map::operator pointer(){ + return m_data; + } + scoped_vbo_map::operator const_pointer()const{ + return m_data; + } + auto scoped_vbo_map::raw() -> pointer{ + return m_data; + } + auto scoped_vbo_map::raw()const -> const_pointer{ + return m_data; + } + }