X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fbuffer_backend.cpp;h=dc081b1c76517852a5b832a8918b06b7896b8990;hb=b294ef47df0ae87c42fe8114987817fb28326f10;hp=e1bced73718272f91fd5cfb63642abd51f099c37;hpb=160e9eea29bd10034733d59507fa1bcca36be401;p=libs%2Fgl.git diff --git a/source/backends/opengl/buffer_backend.cpp b/source/backends/opengl/buffer_backend.cpp index e1bced73..dc081b1c 100644 --- a/source/backends/opengl/buffer_backend.cpp +++ b/source/backends/opengl/buffer_backend.cpp @@ -6,14 +6,13 @@ #include #include "buffer.h" #include "buffer_backend.h" +#include "device.h" using namespace std; namespace Msp { namespace GL { -OpenGLBuffer *OpenGLBuffer::scratch_binding = 0; - OpenGLBuffer::OpenGLBuffer() { static Require _req(ARB_vertex_buffer_object); @@ -24,16 +23,23 @@ OpenGLBuffer::OpenGLBuffer() glGenBuffers(1, &id); } +OpenGLBuffer::OpenGLBuffer(OpenGLBuffer &&other): + id(other.id) +{ + other.id = 0; +} + OpenGLBuffer::~OpenGLBuffer() { - if(this==scratch_binding) + if(this==Device::get_current().get_state().scratch_buffer) unbind_scratch(); - glDeleteBuffers(1, &id); + if(id) + glDeleteBuffers(1, &id); } void OpenGLBuffer::allocate() { - unsigned size = static_cast(this)->size; + size_t size = static_cast(this)->get_total_size(); if(ARB_buffer_storage) { @@ -55,7 +61,7 @@ void OpenGLBuffer::allocate() } } -void OpenGLBuffer::sub_data(unsigned off, unsigned sz, const void *d) +void OpenGLBuffer::sub_data(size_t off, size_t sz, const void *d) { if(ARB_direct_state_access) glNamedBufferSubData(id, off, sz, d); @@ -70,7 +76,7 @@ void *OpenGLBuffer::map() { static Require _req(ARB_map_buffer_range); - unsigned size = static_cast(this)->size; + size_t size = static_cast(this)->size; if(ARB_direct_state_access) return glMapNamedBufferRange(id, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT); @@ -84,7 +90,6 @@ void *OpenGLBuffer::map() bool OpenGLBuffer::unmap() { - // TODO check if it's mapped if(ARB_direct_state_access) return glUnmapNamedBuffer(id); else if(OES_mapbuffer) @@ -109,6 +114,7 @@ void OpenGLBuffer::set_debug_name(const string &name) void OpenGLBuffer::bind_scratch() { + const OpenGLBuffer *&scratch_binding = Device::get_current().get_state().scratch_buffer; if(scratch_binding!=this) { glBindBuffer(GL_ARRAY_BUFFER, id); @@ -118,6 +124,7 @@ void OpenGLBuffer::bind_scratch() void OpenGLBuffer::unbind_scratch() { + const OpenGLBuffer *&scratch_binding = Device::get_current().get_state().scratch_buffer; if(scratch_binding) { glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -125,5 +132,16 @@ void OpenGLBuffer::unbind_scratch() } } + +void Buffer::AsyncTransfer::allocate() +{ + dest_addr = buffer->map(); +} + +void Buffer::AsyncTransfer::finalize() +{ + buffer->unmap(); +} + } // namespace GL } // namespace Msp