X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbuffer.h;h=cc5e58741c141f1fd5910e1abda23ec68a650a39;hp=6f0a9708e18069485460587d3295b63aaf6055b1;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=8eb9a8d90e5597154dab666481037b306b7bbca2 diff --git a/source/buffer.h b/source/buffer.h index 6f0a9708..cc5e5874 100644 --- a/source/buffer.h +++ b/source/buffer.h @@ -1,32 +1,53 @@ #ifndef MSP_GL_BUFFER_H_ #define MSP_GL_BUFFER_H_ +#include +#include #include +#include #include "gl.h" +#include +#include +#include +#include namespace Msp { namespace GL { +class buffer_too_small: public std::logic_error +{ +public: + buffer_too_small(const std::string &w): std::logic_error(w) { } + virtual ~buffer_too_small() throw() { } +}; + enum BufferType { - ARRAY_BUFFER = GL_ARRAY_BUFFER_ARB, - ELEMENT_ARRAY_BUFFER = GL_ELEMENT_ARRAY_BUFFER_ARB, - PIXEL_PACK_BUFFER = GL_PIXEL_PACK_BUFFER_ARB, - PIXEL_UNPACK_BUFFER = GL_PIXEL_UNPACK_BUFFER_ARB, + ARRAY_BUFFER = GL_ARRAY_BUFFER, + ELEMENT_ARRAY_BUFFER = GL_ELEMENT_ARRAY_BUFFER, + PIXEL_PACK_BUFFER = GL_PIXEL_PACK_BUFFER, + PIXEL_UNPACK_BUFFER = GL_PIXEL_UNPACK_BUFFER, UNIFORM_BUFFER = GL_UNIFORM_BUFFER }; enum BufferUsage { - STREAM_DRAW = GL_STREAM_DRAW_ARB, - STREAM_READ = GL_STREAM_READ_ARB, - STREAM_COPY = GL_STREAM_COPY_ARB, - STATIC_DRAW = GL_STATIC_DRAW_ARB, - STATIC_READ = GL_STATIC_READ_ARB, - STATIC_COPY = GL_STATIC_COPY_ARB, - DYNAMIC_DRAW = GL_DYNAMIC_DRAW_ARB, - DYNAMIC_READ = GL_DYNAMIC_READ_ARB, - DYNAMIC_COPY = GL_DYNAMIC_COPY_ARB + STREAM_DRAW = GL_STREAM_DRAW, + STREAM_READ = GL_STREAM_READ, + STREAM_COPY = GL_STREAM_COPY, + STATIC_DRAW = GL_STATIC_DRAW, + STATIC_READ = GL_STATIC_READ, + STATIC_COPY = GL_STATIC_COPY, + DYNAMIC_DRAW = GL_DYNAMIC_DRAW, + DYNAMIC_READ = GL_DYNAMIC_READ, + DYNAMIC_COPY = GL_DYNAMIC_COPY +}; + +enum BufferAccess +{ + READ_ONLY = GL_READ_ONLY, + WRITE_ONLY = GL_WRITE_ONLY, + READ_WRITE = GL_READ_WRITE }; class BufferRange; @@ -42,7 +63,6 @@ class Buffer private: BufferType type; - BufferUsage usage; unsigned id; unsigned size; @@ -56,22 +76,41 @@ private: static void require_buffer_type(BufferType); public: + /** Returns the OpenGL ID of the buffer. For internal use only. */ + unsigned get_id() const { return id; } + + /** Returns the default binding type for the buffer. */ + BufferType get_type() const { return type; } + + /** Defines the storage size of the buffer. Must be called before data can + be uploaded. Storage cannot be changed once set. */ + void storage(unsigned); + /** Sets the usage hint of the buffer. It will take effect the next time the buffer's contents are defined. */ - void set_usage(BufferUsage); + DEPRECATED void set_usage(BufferUsage); /** Uploads data into the buffer, completely replacing any previous - contents. */ - void data(unsigned, const void *); + contents. Storage must be defined beforehand. The data must have size + matching the defined storage. */ + void data(const void *); + + DEPRECATED void data(unsigned, const void *); - /** Overwrites part of the buffer data with new data. The buffer size can - not be changed with this call. */ + /** 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; } + void require_size(unsigned) const; + BufferRange *create_range(unsigned, unsigned); + void *map(); + DEPRECATED void *map(BufferAccess) { return map(); } + bool unmap(); + /** Binds the buffer in its default slot. */ void bind() const { bind_to(type); } @@ -81,30 +120,11 @@ public: /** Unbinds the buffer from its default slot. */ void unbind() const { unbind_from(type); } - static const Buffer *current(BufferType t) { return binding(t); } + static const Buffer *current(BufferType); static void unbind_from(BufferType); private: static const Buffer *&binding(BufferType); static bool set_current(BufferType, const Buffer *); - static void restore(const Buffer *, BufferType); -}; - - -/** -An adaptor for Buffer to make it compatible with Bind. -*/ -template -class BufferAlias -{ -private: - const Buffer &buffer; - -public: - BufferAlias(const Buffer &b): buffer(b) { } - - void bind() const { buffer.bind_to(T); } - static const Buffer *current() { return Buffer::current(T); } - static void unbind() { Buffer::unbind_from(T); } }; @@ -122,6 +142,7 @@ private: public: BufferRange(Buffer &, unsigned, unsigned); + ~BufferRange(); void data(const void *); @@ -135,6 +156,7 @@ private: public: static unsigned get_n_uniform_buffer_bindings(); + static unsigned get_uniform_buffer_alignment(); }; } // namespace GL