X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fbuffer.h;fp=source%2Fcore%2Fbuffer.h;h=a12b3373e601664bddf75d60bb930d56bbe26833;hb=6080120777fdf7b6e1184288eff9d205ca7ebf5f;hp=b642738e0e96ef370a5e748701be071998e2de54;hpb=cb4158902a680c58c5834da8577cd95ff753fd7c;p=libs%2Fgl.git diff --git a/source/core/buffer.h b/source/core/buffer.h index b642738e..a12b3373 100644 --- a/source/core/buffer.h +++ b/source/core/buffer.h @@ -15,6 +15,12 @@ public: virtual ~buffer_too_small() throw() { } }; +enum BufferUsage +{ + STATIC, + STREAMING +}; + /** Stores data in GPU memory. @@ -22,6 +28,10 @@ Memory must be allocated for the buffer by calling storage(). Contents can then be modified either synchronously with the data() and sub_data() functions, or asynchronously by memory-mapping the buffer. +Buffers can have a static or streaming usage pattern. Streaming buffers can be +memory mapped for less update overhead, but memory space is more limited. If +the buffer is updated only rarely, static is recommended. + Applications normally don't need to deal with Buffers directly. They're managed by other classes such as Mesh and ProgramData. */ @@ -31,11 +41,13 @@ class Buffer: public BufferBackend private: std::size_t size = 0; + BufferUsage usage = STATIC; + bool mapped = false; public: - /** Sets the storage size and allocates memory for the buffer. Size cannot - be changed once set. */ - void storage(std::size_t); + /** Sets storage size and usage pattern and allocates memory for the buffer. + Size and usage cannot be changed once set. */ + void storage(std::size_t, BufferUsage); /** Replaces contents of the entire buffer. Allocated storage must exist. The data must have size matching the defined storage. */ @@ -46,6 +58,7 @@ public: void sub_data(std::size_t, std::size_t, const void *); std::size_t get_size() const { return size; } + BufferUsage get_usage() const { return usage; } void require_size(std::size_t) const;