-#include "arb_multitexture.h"
-#include "arb_vertex_shader.h"
+#include <msp/gl/extensions/arb_multitexture.h>
+#include <msp/gl/extensions/arb_vertex_shader.h>
#include "buffer.h"
#include "error.h"
#include "gl.h"
namespace GL {
VertexArray::VertexArray(const VertexFormat &f):
- defer_vbuf(true),
dirty(false)
{
reset(f);
}
}
-void VertexArray::use_vertex_buffer()
-{
- if(vbuf)
- return;
-
- vbuf = new Buffer(ARRAY_BUFFER);
- defer_vbuf = false;
- dirty = true;
-}
-
void VertexArray::use_vertex_buffer(Buffer *b)
{
vbuf = b;
- vbuf.keep();
- defer_vbuf = false;
dirty = true;
}
void VertexArray::set_dirty()
{
dirty = true;
- if(defer_vbuf)
- {
- vbuf = new Buffer(ARRAY_BUFFER);
- defer_vbuf = false;
- }
}
void VertexArray::apply() const
throw invalid_operation("VertexArray::apply");
const VertexArray *old = current();
- if(!set_current(this))
+ /* If the array has been modified, apply it even if it was the last one to
+ be applied. This is necessary to get the data updated to vertex buffer, and
+ to resync things after a format change. Radeon drivers also have some
+ problems with modifying vertex arrays without re-setting the pointers. */
+ if(!set_current(this) && !dirty)
return;
if(vbuf)