X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fbuffer.h;h=9b1293615832a615318cf0212400c08b3af10961;hb=b294ef47df0ae87c42fe8114987817fb28326f10;hp=17678fd4b4008f68a7dd2f3745916fd237526a10;hpb=6c5c2bcbd4025cba36f48f6f326466351f4f2971;p=libs%2Fgl.git diff --git a/source/core/buffer.h b/source/core/buffer.h index 17678fd4..9b129361 100644 --- a/source/core/buffer.h +++ b/source/core/buffer.h @@ -39,6 +39,38 @@ class Buffer: public BufferBackend { friend BufferBackend; +public: + /** + An RAII handle for asynchronously writing data into a buffer. + */ + class AsyncTransfer: public NonCopyable + { + friend BufferBackend; + friend class Buffer; + + private: + Buffer *buffer = 0; + std::size_t offset = 0; + std::size_t size = 0; + void *dest_addr = 0; + + AsyncTransfer(Buffer &, std::size_t, std::size_t); + public: + AsyncTransfer() = default; + AsyncTransfer(AsyncTransfer &&); + AsyncTransfer &operator=(AsyncTransfer &&); + ~AsyncTransfer(); + + private: + void allocate(); + void finalize(); + + public: + /** Returns an address for writing the data. It should not be used + beyond the lifetime of the object. */ + void *get_address() { return dest_addr; } + }; + private: std::size_t size = 0; BufferUsage usage = STATIC; @@ -57,7 +89,18 @@ public: The range must be fully inside the buffer. */ void sub_data(std::size_t, std::size_t, const void *); + /** Creates an asynchronous transfer for writing data to a range of bytes in + the buffer. While the transfer is pending, the state of the buffer region + is indeterminate. */ + AsyncTransfer sub_data_async(std::size_t, std::size_t); + +private: + void check_sub_data(std::size_t, std::size_t, const char *); + +public: std::size_t get_size() const { return size; } + using BufferBackend::get_multiplicity; + std::size_t get_total_size() const { return size*get_multiplicity(); } BufferUsage get_usage() const { return usage; } void require_size(std::size_t) const;