X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbuffer.h;h=39e88cd1ce7647b74ea5f7f6b75cba575ea0d403;hp=e91524865e7fa449b318d16b64af586bba5ea5ba;hb=00cc52f21b5ae29fb1b25c162552c851a0559e66;hpb=76e338af116120d93d082ad247591ec9adad9233 diff --git a/source/buffer.h b/source/buffer.h index e9152486..39e88cd1 100644 --- a/source/buffer.h +++ b/source/buffer.h @@ -1,69 +1,77 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_GL_BUFFER_H_ #define MSP_GL_BUFFER_H_ -#include "types.h" +#include +#include "gl.h" +#include +#include +#include +#include namespace Msp { namespace GL { 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; + /** A buffer for storing data in GL memory. Putting vertex and index data in -buffers can improve rendering performance. The VertexArray and Mesh classes -contain built-in support for buffers. +buffers can improve rendering performance. The VertexArray, Mesh and +UniformBlock classes contain built-in support for buffers. */ class Buffer { + friend class BufferRange; + private: BufferType type; BufferUsage usage; unsigned id; + unsigned size; - static const Buffer *bound[4]; + static const Buffer *bound[5]; public: Buffer(BufferType); ~Buffer(); - /** Binds the buffer in its default slot. */ - void bind() const { bind(type); } - - /** Binds the buffer in an alternate slot. */ - void bind(BufferType) const; - private: - void maybe_bind() const; + static void require_buffer_type(BufferType); public: - /** Unbinds the buffer from its default slot. */ - void unbind() const { unbind(type); } + /** 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; } /** Sets the usage hint of the buffer. It will take effect the next time the buffer's contents are defined. */ @@ -77,9 +85,59 @@ public: not be changed with this call. */ void sub_data(unsigned, unsigned, const void *); - static void unbind(BufferType); + unsigned get_size() const { return size; } + + BufferRange *create_range(unsigned, unsigned); + + void *map(BufferAccess); + bool unmap(); + + /** Binds the buffer in its default slot. */ + void bind() const { bind_to(type); } + + /** Binds the buffer in an alternate slot. */ + void bind_to(BufferType) const; + + /** Unbinds the buffer from its default slot. */ + void unbind() const { unbind_from(type); } + + static const Buffer *current(BufferType); + static void unbind_from(BufferType); private: static const Buffer *&binding(BufferType); + static bool set_current(BufferType, const Buffer *); +}; + + +/** +A proxy for a subset of a buffer. Can be bound for use with uniform blocks. +*/ +class BufferRange +{ +private: + Buffer &buffer; + unsigned offset; + unsigned size; + + static std::vector bound_uniform; + +public: + BufferRange(Buffer &, unsigned, unsigned); + ~BufferRange(); + + void data(const void *); + + void bind_to(BufferType, unsigned); + + static const BufferRange *current(BufferType t, unsigned i) { return binding(t, i); } + static void unbind_from(BufferType, unsigned); +private: + static const BufferRange *&binding(BufferType, unsigned); + static bool set_current(BufferType, unsigned, const BufferRange *); + +public: + static unsigned get_n_uniform_buffer_bindings(); + static unsigned get_uniform_buffer_alignment(); }; } // namespace GL