added vbo_use_buffer_objects() to specify that immediate mode data should be put into bufferobjects

This commit is contained in:
Brian 2007-08-17 15:26:33 +01:00 committed by Keith Whitwell
parent b36bc54d3c
commit 6f765fbde4
3 changed files with 51 additions and 2 deletions

View file

@ -114,4 +114,7 @@ void vbo_rebase_prims( GLcontext *ctx,
vbo_draw_func draw );
void vbo_use_buffer_objects(GLcontext *ctx);
#endif

View file

@ -651,6 +651,41 @@ static void vbo_exec_vtxfmt_init( struct vbo_exec_context *exec )
}
/**
* Tell the VBO module to use a real OpenGL vertex buffer object to
* store accumulated immediate-mode vertex data.
* This replaces the malloced buffer which was created in
* vb_exec_vtx_init() below.
*/
void vbo_use_buffer_objects(GLcontext *ctx)
{
struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
/* Any buffer name but 0 can be used here since this bufferobj won't
* go into the bufferobj hashtable.
*/
GLuint bufName = 0xaabbccdd;
GLenum target = GL_ARRAY_BUFFER_ARB;
GLenum access = GL_READ_WRITE_ARB;
GLenum usage = GL_STREAM_DRAW_ARB;
GLsizei size = VBO_VERT_BUFFER_SIZE * sizeof(GLfloat);
/* Make sure this func is only used once */
assert(exec->vtx.bufferobj == ctx->Array.NullBufferObj);
if (exec->vtx.buffer_map) {
_mesa_align_free(exec->vtx.buffer_map);
}
/* Allocate a real buffer object now */
exec->vtx.bufferobj = ctx->Driver.NewBufferObject(ctx, bufName, target);
ctx->Driver.BufferData(ctx, target, size, NULL, usage, exec->vtx.bufferobj);
/* and map it */
exec->vtx.buffer_map
= ctx->Driver.MapBuffer(ctx, target, access, exec->vtx.bufferobj);
}
void vbo_exec_vtx_init( struct vbo_exec_context *exec )
{
GLcontext *ctx = exec->ctx;

View file

@ -182,13 +182,24 @@ static void vbo_exec_bind_arrays( GLcontext *ctx )
* arrays of floats.
*/
for (attr = 0; attr < VERT_ATTRIB_MAX ; attr++) {
GLuint src = map[attr];
const GLuint src = map[attr];
if (exec->vtx.attrsz[src]) {
/* override the default array set above */
exec->vtx.inputs[attr] = &arrays[attr];
arrays[attr].Ptr = (void *)data;
if (exec->vtx.bufferobj->Name) {
/* a real buffer obj: Ptr is an offset, not a pointer*/
int offset;
assert(exec->vtx.bufferobj->Pointer); /* buf should be mapped */
offset = (GLbyte *) data - (GLbyte *) exec->vtx.bufferobj->Pointer;
assert(offset >= 0);
arrays[attr].Ptr = (void *) offset;
}
else {
/* Ptr into ordinary app memory */
arrays[attr].Ptr = (void *) data;
}
arrays[attr].Size = exec->vtx.attrsz[src];
arrays[attr].StrideB = exec->vtx.vertex_size * sizeof(GLfloat);
arrays[attr].Stride = exec->vtx.vertex_size * sizeof(GLfloat);