- // TODO check if it's mapped
- if(ARB_direct_state_access)
- return glUnmapNamedBuffer(id);
- else if(OES_mapbuffer)
- {
- BindRestore _bind(this, type);
- return glUnmapBuffer(type);
- }
- else
- return true;
-}
-
-void Buffer::bind_to(BufferType t) const
-{
- if(t!=type)
- require_buffer_type(t);
- if(t==ELEMENT_ARRAY_BUFFER)
- if(const VertexSetup *vs = VertexSetup::current())
- {
- // Don't change the binding in a vertex array object
- if(this==vs->get_index_buffer())
- return;
- throw invalid_operation("Buffer::bind_to(ELEMENT_ARRAY_BUFFER)");
- }
- if(set_current(t, this))
- glBindBuffer(t, id);
-}
-
-const Buffer *Buffer::current(BufferType t)
-{
- if(t==ELEMENT_ARRAY_BUFFER)
- if(const VertexSetup *vs = VertexSetup::current())
- return vs->get_index_buffer();
- return binding(t);
-}
-
-void Buffer::unbind_from(BufferType type)
-{
- if(type==ELEMENT_ARRAY_BUFFER && VertexSetup::current())
- throw invalid_operation("Buffer::unbind_from(ELEMENT_ARRAY_BUFFER)");
- if(set_current(type, 0))
- glBindBuffer(type, 0);
-}
-
-const Buffer *&Buffer::binding(BufferType type)
-{
- switch(type)
- {
- case ARRAY_BUFFER: return bound[0];
- case ELEMENT_ARRAY_BUFFER: return bound[1];
- case PIXEL_PACK_BUFFER: return bound[2];
- case PIXEL_UNPACK_BUFFER: return bound[3];
- case UNIFORM_BUFFER: return bound[4];
- default: throw invalid_argument("Buffer::binding");
- }
-}
-
-bool Buffer::set_current(BufferType type, const Buffer *buf)
-{
- const Buffer *&ptr = binding(type);
- if(ptr==buf)
- return false;
-
- ptr = buf;
- return true;
-}
-
-void Buffer::set_debug_name(const string &name)
-{
-#ifdef DEBUG
- if(KHR_debug)
- glObjectLabel(GL_BUFFER, id, name.size(), name.c_str());
-#else
- (void)name;
-#endif