X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fbuffer.h;h=a12b3373e601664bddf75d60bb930d56bbe26833;hp=db0ff025f3b1f816283fe0bed7a696d95d7ccff9;hb=6080120777fdf7b6e1184288eff9d205ca7ebf5f;hpb=2e09b4f72f06537431151fe8b2574e1aa886ad48 diff --git a/source/core/buffer.h b/source/core/buffer.h index db0ff025..a12b3373 100644 --- a/source/core/buffer.h +++ b/source/core/buffer.h @@ -3,8 +3,7 @@ #include #include -#include -#include "gl.h" +#include "buffer_backend.h" namespace Msp { namespace GL { @@ -16,57 +15,57 @@ public: virtual ~buffer_too_small() throw() { } }; -class BufferRange; +enum BufferUsage +{ + STATIC, + STREAMING +}; /** -A buffer for storing data in GL memory. Putting vertex and index data in -buffers can improve rendering performance. The VertexArray, Mesh and -UniformBlock classes contain built-in support for buffers. +Stores data in GPU memory. + +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. */ -class Buffer +class Buffer: public BufferBackend { - friend class PipelineState; - friend class VertexSetup; + friend BufferBackend; private: - unsigned id; - unsigned size; - - static Buffer *scratch_binding; + std::size_t size = 0; + BufferUsage usage = STATIC; + bool mapped = false; public: - Buffer(); - ~Buffer(); + /** 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); - /** Returns the OpenGL ID of the buffer. For internal use only. */ - unsigned get_id() const { return id; } - - /** Defines the storage size of the buffer. Must be called before data can - be uploaded. Storage cannot be changed once set. */ - void storage(unsigned); - - /** Uploads data into the buffer, completely replacing any previous - contents. Storage must be defined beforehand. The data must have size - matching the defined storage. */ + /** Replaces contents of the entire buffer. Allocated storage must exist. + The data must have size matching the defined storage. */ void data(const void *); - /** Overwrites part of the buffer data with new data. Storage must be - defined beforehand. */ - void sub_data(unsigned, unsigned, const void *); - - unsigned get_size() const { return size; } + /** Replaces a range of bytes in the buffer. Allocated storage must exist. + The range must be fully inside the buffer. */ + void sub_data(std::size_t, std::size_t, const void *); - void require_size(unsigned) const; + std::size_t get_size() const { return size; } + BufferUsage get_usage() const { return usage; } - void *map(); - bool unmap(); + void require_size(std::size_t) const; - void set_debug_name(const std::string &); + using BufferBackend::map; + using BufferBackend::unmap; -private: - void bind_scratch(); -public: - static void unbind_scratch(); + using BufferBackend::set_debug_name; }; } // namespace GL