It's more robust to always specify the binding point when using the
buffer.
ARRAY_BUFFER is used for buffer operations because it's always available
and is only used transiently by other code so there's no interference.
const Buffer *Buffer::bound[5] = { 0, 0, 0, 0, 0 };
BufferType buffer_types[] = { ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER, PIXEL_PACK_BUFFER, PIXEL_UNPACK_BUFFER, UNIFORM_BUFFER };
const Buffer *Buffer::bound[5] = { 0, 0, 0, 0, 0 };
BufferType buffer_types[] = { ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER, PIXEL_PACK_BUFFER, PIXEL_UNPACK_BUFFER, UNIFORM_BUFFER };
-Buffer::Buffer(BufferType t):
- type(t),
size(0),
allocated(false)
{
size(0),
allocated(false)
{
- require_buffer_type(type);
+ static Require _req(ARB_vertex_buffer_object);
if(ARB_direct_state_access)
glCreateBuffers(1, &id);
if(ARB_direct_state_access)
glCreateBuffers(1, &id);
glNamedBufferStorage(id, size, 0, flags);
else
{
glNamedBufferStorage(id, size, 0, flags);
else
{
- BindRestore _bind(this, type);
- glBufferStorage(type, size, 0, flags);
+ BindRestore _bind(this, ARRAY_BUFFER);
+ glBufferStorage(ARRAY_BUFFER, size, 0, flags);
glNamedBufferData(id, size, d, STATIC_DRAW);
else
{
glNamedBufferData(id, size, d, STATIC_DRAW);
else
{
- BindRestore _bind(this, type);
- glBufferData(type, size, d, STATIC_DRAW);
+ BindRestore _bind(this, ARRAY_BUFFER);
+ glBufferData(ARRAY_BUFFER, size, d, STATIC_DRAW);
glNamedBufferSubData(id, off, sz, d);
else
{
glNamedBufferSubData(id, off, sz, d);
else
{
- BindRestore _bind(this, type);
- glBufferSubData(type, off, sz, d);
+ BindRestore _bind(this, ARRAY_BUFFER);
+ glBufferSubData(ARRAY_BUFFER, off, sz, d);
return glMapNamedBufferRange(id, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
else
{
return glMapNamedBufferRange(id, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
else
{
- BindRestore _bind(this, type);
- return glMapBufferRange(type, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
+ BindRestore _bind(this, ARRAY_BUFFER);
+ return glMapBufferRange(ARRAY_BUFFER, 0, size, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
return glUnmapNamedBuffer(id);
else if(OES_mapbuffer)
{
return glUnmapNamedBuffer(id);
else if(OES_mapbuffer)
{
- BindRestore _bind(this, type);
- return glUnmapBuffer(type);
+ BindRestore _bind(this, ARRAY_BUFFER);
+ return glUnmapBuffer(ARRAY_BUFFER);
void Buffer::bind_to(BufferType t) const
{
void Buffer::bind_to(BufferType t) const
{
- if(t!=type)
- require_buffer_type(t);
+ require_buffer_type(t);
if(t==ELEMENT_ARRAY_BUFFER)
if(const VertexSetup *vs = VertexSetup::current())
{
if(t==ELEMENT_ARRAY_BUFFER)
if(const VertexSetup *vs = VertexSetup::current())
{
void BufferRange::bind_to(BufferType t, unsigned i)
{
void BufferRange::bind_to(BufferType t, unsigned i)
{
- if(t!=buffer.type)
- Buffer::require_buffer_type(t);
+ Buffer::require_buffer_type(t);
if(set_current(t, i, this))
{
// The buffer gets bound as a side effect
if(set_current(t, i, this))
{
// The buffer gets bound as a side effect
friend class BufferRange;
private:
friend class BufferRange;
private:
unsigned id;
unsigned size;
bool allocated;
unsigned id;
unsigned size;
bool allocated;
static const Buffer *bound[5];
public:
static const Buffer *bound[5];
public:
/** Returns the OpenGL ID of the buffer. For internal use only. */
unsigned get_id() const { return id; }
/** 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);
/** Defines the storage size of the buffer. Must be called before data can
be uploaded. Storage cannot be changed once set. */
void storage(unsigned);
DEPRECATED void *map(BufferAccess) { return map(); }
bool unmap();
DEPRECATED void *map(BufferAccess) { return map(); }
bool unmap();
- /** Binds the buffer in its default slot. */
- void bind() const { bind_to(type); }
-
- /** Binds the buffer in an alternate slot. */
+ /** Binds the buffer. */
void bind_to(BufferType) const;
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 *current(BufferType);
static void unbind_from(BufferType);
private:
if(!vbuf || (vbuf->get_size()>0 && vbuf->get_size()<req_size))
{
delete vbuf;
if(!vbuf || (vbuf->get_size()>0 && vbuf->get_size()<req_size))
{
delete vbuf;
- vbuf = new Buffer(ARRAY_BUFFER);
vertices.use_buffer(vbuf);
vtx_setup.set_vertex_array(vertices);
dirty |= VERTEX_BUFFER;
vertices.use_buffer(vbuf);
vtx_setup.set_vertex_array(vertices);
dirty |= VERTEX_BUFFER;
if(!ibuf || (ibuf->get_size()>0 && ibuf->get_size()<req_size))
{
delete ibuf;
if(!ibuf || (ibuf->get_size()>0 && ibuf->get_size()<req_size))
{
delete ibuf;
- ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
if(!batches.empty())
batches.front().change_buffer(ibuf);
vtx_setup.set_index_buffer(*ibuf);
if(!batches.empty())
batches.front().change_buffer(ibuf);
vtx_setup.set_index_buffer(*ibuf);
Texture2D::AsyncLoader::AsyncLoader(Texture2D &t, IO::Seekable &i):
texture(t),
io(i),
Texture2D::AsyncLoader::AsyncLoader(Texture2D &t, IO::Seekable &i):
texture(t),
io(i),
- pixel_buffer(PIXEL_UNPACK_BUFFER),
mapped_address(0),
img_loader(Graphics::ImageLoader::open_io(io)),
phase(0)
mapped_address(0),
img_loader(Graphics::ImageLoader::open_io(io)),
phase(0)
const VertexFormat &fmt = instance_data->get_format();
matrix_offset = fmt.offset(make_indexed_attribute(RAW_ATTRIB4, matrix_location));
const VertexFormat &fmt = instance_data->get_format();
matrix_offset = fmt.offset(make_indexed_attribute(RAW_ATTRIB4, matrix_location));
- instance_buffer = new Buffer(ARRAY_BUFFER);
+ instance_buffer = new Buffer;
instance_data->use_buffer(instance_buffer);
vtx_setup = new VertexSetup;
instance_data->use_buffer(instance_buffer);
vtx_setup = new VertexSetup;
if(instance_buffer->get_size()>0 && instance_buffer->get_size()<req_size)
{
delete instance_buffer;
if(instance_buffer->get_size()>0 && instance_buffer->get_size()<req_size)
{
delete instance_buffer;
- instance_buffer = new Buffer(ARRAY_BUFFER);
+ instance_buffer = new Buffer;
instance_data->use_buffer(instance_buffer);
}
}
instance_data->use_buffer(instance_buffer);
}
}
- buffer = new Buffer(UNIFORM_BUFFER);
#ifdef DEBUG
if(!debug_name.empty())
#ifdef DEBUG
if(!debug_name.empty())
prog_begin->masks.dirty = 0;
prog_begin->masks.dirty = 0;
- /* If any blocks stored in the buffer were updated, bind the buffer here
- to avoid state thrashing. */
- if(buffered_blocks_updated && !ARB_direct_state_access)
- buffer->bind();
-
if(last_buffer_block!=old_last_block)
{
unsigned required_size = last_buffer_block->get_required_buffer_size();
if(last_buffer_block!=old_last_block)
{
unsigned required_size = last_buffer_block->get_required_buffer_size();
if(buffer->get_size()>0)
{
delete buffer;
if(buffer->get_size()>0)
{
delete buffer;
- buffer = new Buffer(UNIFORM_BUFFER);
last_buffer_block->change_buffer(buffer);
#ifdef DEBUG
last_buffer_block->change_buffer(buffer);
#ifdef DEBUG