#include <stdexcept>
+#include <msp/core/raii.h>
+#include <msp/gl/extensions/arb_direct_state_access.h>
#include "bindable.h"
#include "buffer.h"
#include "bufferable.h"
}
}
+ dirty = true;
update_offset();
}
void Bufferable::update_buffer() const
{
- BindRestore bind(buffer, buffer->get_type());
+ Conditional<BindRestore> _bind(!ARB_direct_state_access, buffer, buffer->get_type());
+
if(resize_buffer())
{
/* Resizing the buffer invalidates its contents. Non-dirty data may
}
upload_data(0);
- dirty = false;
}
void Bufferable::upload_data(char *target) const
}
else
buffer->sub_data(offset, get_data_size(), get_data_pointer());
+ dirty = false;
}
// Update all bufferables in the same buffer at once
for(const Bufferable *b=bufferable.prev_in_buffer; b; b=b->prev_in_buffer)
if(b->dirty || buffer_resized)
- {
b->upload_data(mapped_address+b->offset);
- b->dirty = false;
- }
for(const Bufferable *b=bufferable.next_in_buffer; b; b=b->next_in_buffer)
if(b->dirty || buffer_resized)
- {
b->upload_data(mapped_address+b->offset);
- b->dirty = false;
- }
}
} // namespace GL