mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
added vbo_use_buffer_objects() to specify that immediate mode data should be put into bufferobjects
This commit is contained in:
parent
b36bc54d3c
commit
6f765fbde4
3 changed files with 51 additions and 2 deletions
|
|
@ -114,4 +114,7 @@ void vbo_rebase_prims( GLcontext *ctx,
|
|||
vbo_draw_func draw );
|
||||
|
||||
|
||||
void vbo_use_buffer_objects(GLcontext *ctx);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue