X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fbuffer.cpp;h=36ac440a54426c186c16ae238c51a337312445e8;hb=e1be82a4dfce8d90358c506f65be09da4dc9d5ec;hp=523b737d32bf696ff3628e48ddd4b6b64e55f428;hpb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;p=libs%2Fgl.git diff --git a/source/core/buffer.cpp b/source/core/buffer.cpp index 523b737d..36ac440a 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(unsigned sz) +void Buffer::storage(size_t sz, BufferUsage u) { if(size>0) { @@ -20,6 +20,7 @@ void Buffer::storage(unsigned sz) throw invalid_argument("Buffer::storage"); size = sz; + usage = u; allocate(); } @@ -29,19 +30,89 @@ void Buffer::data(const void *d) return sub_data(0, size, d); } -void Buffer::sub_data(unsigned off, unsigned sz, const void *d) +void Buffer::sub_data(size_t off, size_t sz, const void *d) { - if(size==0) - throw invalid_operation("Buffer::sub_data"); - + check_sub_data(off, sz, "Buffer::sub_data"); BufferBackend::sub_data(off, sz, d); } -void Buffer::require_size(unsigned req_sz) const +Buffer::AsyncTransfer Buffer::sub_data_async(size_t off, size_t sz) +{ + check_sub_data(off, sz, "Buffer::sub_data_async"); + return AsyncTransfer(*this, off, sz); +} + +void Buffer::check_sub_data(size_t off, size_t sz, const char *func) +{ + if(size==0) + throw invalid_operation(func); + if(off>get_total_size() || off%size+sz>size) + throw out_of_range(func); +} + +void Buffer::require_size(size_t req_sz) const { if(size