1 #ifndef MSP_GL_BUFFER_H_
2 #define MSP_GL_BUFFER_H_
6 #include <msp/gl/extensions/arb_vertex_buffer_object.h>
7 #include <msp/gl/extensions/arb_uniform_buffer_object.h>
14 ARRAY_BUFFER = GL_ARRAY_BUFFER,
15 ELEMENT_ARRAY_BUFFER = GL_ELEMENT_ARRAY_BUFFER,
16 PIXEL_PACK_BUFFER = GL_PIXEL_PACK_BUFFER,
17 PIXEL_UNPACK_BUFFER = GL_PIXEL_UNPACK_BUFFER,
18 UNIFORM_BUFFER = GL_UNIFORM_BUFFER
23 STREAM_DRAW = GL_STREAM_DRAW,
24 STREAM_READ = GL_STREAM_READ,
25 STREAM_COPY = GL_STREAM_COPY,
26 STATIC_DRAW = GL_STATIC_DRAW,
27 STATIC_READ = GL_STATIC_READ,
28 STATIC_COPY = GL_STATIC_COPY,
29 DYNAMIC_DRAW = GL_DYNAMIC_DRAW,
30 DYNAMIC_READ = GL_DYNAMIC_READ,
31 DYNAMIC_COPY = GL_DYNAMIC_COPY
37 A buffer for storing data in GL memory. Putting vertex and index data in
38 buffers can improve rendering performance. The VertexArray, Mesh and
39 UniformBlock classes contain built-in support for buffers.
43 friend class BufferRange;
51 static const Buffer *bound[5];
58 static void require_buffer_type(BufferType);
61 /** Returns the OpenGL ID of the buffer. For internal use only. */
62 unsigned get_id() const { return id; }
64 /** Returns the default binding type for the buffer. */
65 BufferType get_type() const { return type; }
67 /** Sets the usage hint of the buffer. It will take effect the next time
68 the buffer's contents are defined. */
69 void set_usage(BufferUsage);
71 /** Uploads data into the buffer, completely replacing any previous
73 void data(unsigned, const void *);
75 /** Overwrites part of the buffer data with new data. The buffer size can
76 not be changed with this call. */
77 void sub_data(unsigned, unsigned, const void *);
79 unsigned get_size() const { return size; }
81 BufferRange *create_range(unsigned, unsigned);
83 /** Binds the buffer in its default slot. */
84 void bind() const { bind_to(type); }
86 /** Binds the buffer in an alternate slot. */
87 void bind_to(BufferType) const;
89 /** Unbinds the buffer from its default slot. */
90 void unbind() const { unbind_from(type); }
92 static const Buffer *current(BufferType t) { return binding(t); }
93 static void unbind_from(BufferType);
95 static const Buffer *&binding(BufferType);
96 static bool set_current(BufferType, const Buffer *);
97 static void restore(const Buffer *, BufferType);
102 An adaptor for Buffer to make it compatible with Bind.
104 template<BufferType T>
108 const Buffer &buffer;
111 BufferAlias(const Buffer &b): buffer(b) { }
113 void bind() const { buffer.bind_to(T); }
114 static const Buffer *current() { return Buffer::current(T); }
115 static void unbind() { Buffer::unbind_from(T); }
120 A proxy for a subset of a buffer. Can be bound for use with uniform blocks.
129 static std::vector<const BufferRange *> bound_uniform;
132 BufferRange(Buffer &, unsigned, unsigned);
134 void data(const void *);
136 void bind_to(BufferType, unsigned);
138 static const BufferRange *current(BufferType t, unsigned i) { return binding(t, i); }
139 static void unbind_from(BufferType, unsigned);
141 static const BufferRange *&binding(BufferType, unsigned);
142 static bool set_current(BufferType, unsigned, const BufferRange *);
145 static unsigned get_n_uniform_buffer_bindings();
146 static unsigned get_uniform_buffer_alignment();