namespace Msp {
namespace GL {
+Buffer *Buffer::scratch_binding = 0;
+
Buffer::Buffer():
size(0),
allocated(false)
Buffer::~Buffer()
{
+ if(this==scratch_binding)
+ unbind_scratch();
glDeleteBuffers(1, &id);
}
glNamedBufferStorage(id, size, 0, flags);
else
{
- glBindBuffer(GL_ARRAY_BUFFER, id);
+ bind_scratch();
glBufferStorage(GL_ARRAY_BUFFER, size, 0, flags);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
}
allocated = true;
glNamedBufferData(id, size, d, STATIC_DRAW);
else
{
- glBindBuffer(GL_ARRAY_BUFFER, id);
+ bind_scratch();
glBufferData(GL_ARRAY_BUFFER, size, d, STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
}
allocated = true;
glNamedBufferSubData(id, off, sz, d);
else
{
- glBindBuffer(GL_ARRAY_BUFFER, id);
+ bind_scratch();
glBufferSubData(GL_ARRAY_BUFFER, off, sz, d);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
}
}
return glMapNamedBufferRange(id, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
else
{
- glBindBuffer(GL_ARRAY_BUFFER, id);
+ bind_scratch();
void *result = glMapBufferRange(GL_ARRAY_BUFFER, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
return result;
}
}
return glUnmapNamedBuffer(id);
else if(OES_mapbuffer)
{
- glBindBuffer(GL_ARRAY_BUFFER, id);
+ bind_scratch();
bool result = glUnmapBuffer(GL_ARRAY_BUFFER);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
return result;
}
else
#endif
}
+void Buffer::bind_scratch()
+{
+ if(scratch_binding!=this)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER, id);
+ scratch_binding = this;
+ }
+}
+
+void Buffer::unbind_scratch()
+{
+ if(scratch_binding)
+ {
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ scratch_binding = 0;
+ }
+}
+
} // namespace GL
} // namespace Msp