X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fbuffer.cpp;h=4a36937e7b745d1dd32f8c1e9ce19df0766037d7;hb=e98188ff6c9bba9761b71f2a69f3be7eb89ba3da;hp=557e576d2ac929e256646c0a3cdc59bd3887a962;hpb=be6ffe96ecb4707599fe1a6f620c348760213d46;p=libs%2Fgl.git diff --git a/source/core/buffer.cpp b/source/core/buffer.cpp index 557e576d..4a36937e 100644 --- a/source/core/buffer.cpp +++ b/source/core/buffer.cpp @@ -8,7 +8,7 @@ using namespace std; namespace Msp { namespace GL { -void Buffer::storage(size_t sz) +void Buffer::storage(size_t sz, BufferUsage u) { if(size>0) { @@ -20,6 +20,7 @@ void Buffer::storage(size_t sz) throw invalid_argument("Buffer::storage"); size = sz; + usage = u; allocate(); } @@ -33,6 +34,8 @@ void Buffer::sub_data(size_t off, size_t sz, const void *d) { if(size==0) throw invalid_operation("Buffer::sub_data"); + if(off>size || off+sz>size) + throw out_of_range("Buffer::sub_data"); BufferBackend::sub_data(off, sz, d); } @@ -43,5 +46,23 @@ void Buffer::require_size(size_t req_sz) const throw buffer_too_small(format("buffer has %d bytes; %d required", size, req_sz)); } +void *Buffer::map() +{ + if(!can_map() || mapped) + throw invalid_operation("Buffer::map"); + void *result = BufferBackend::map(); + mapped = true; + return result; +} + +bool Buffer::unmap() +{ + if(!can_map() || !mapped) + throw invalid_operation("Buffer::map"); + bool result = BufferBackend::unmap(); + mapped = false; + return result; +} + } // namespace GL } // namespace Msp