i965: interleaved vbo

If the user passed in several arrays interleaved in the same vbo, only
emit a single vertex buffer and relocation.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2011-02-11 14:45:19 +00:00
parent 559435d915
commit 94d73d700e
1 changed files with 25 additions and 10 deletions

View File

@ -319,18 +319,33 @@ static void brw_prepare_vertices(struct brw_context *brw)
if (_mesa_is_bufferobj(input->glarray->BufferObj)) {
struct intel_buffer_object *intel_buffer =
intel_buffer_object(input->glarray->BufferObj);
struct brw_vertex_buffer *buffer = &brw->vb.buffers[j];
int k;
/* Named buffer object: Just reference its contents directly. */
buffer->bo = intel_bufferobj_source(intel, intel_buffer,
&buffer->offset);
drm_intel_bo_reference(buffer->bo);
buffer->offset += (unsigned long)input->glarray->Ptr;
buffer->stride = input->glarray->StrideB;
for (k = 0; k < i; k++) {
struct brw_vertex_element *other = brw->vb.enabled[k];
if (input->glarray->BufferObj == other->glarray->BufferObj &&
input->glarray->StrideB == other->glarray->StrideB &&
(uintptr_t)(input->glarray->Ptr - other->glarray->Ptr) <
input->glarray->StrideB)
{
input->buffer = other->buffer;
input->offset = input->glarray->Ptr - other->glarray->Ptr;
break;
}
}
if (k == i) {
struct brw_vertex_buffer *buffer = &brw->vb.buffers[j];
/* Named buffer object: Just reference its contents directly. */
buffer->bo = intel_bufferobj_source(intel, intel_buffer,
&buffer->offset);
drm_intel_bo_reference(buffer->bo);
buffer->offset += (uintptr_t)input->glarray->Ptr;
buffer->stride = input->glarray->StrideB;
input->buffer = j++;
input->offset = 0;
}
input->count = input->glarray->_MaxElement;
input->offset = 0;
input->buffer = j++;
/* This is a common place to reach if the user mistakenly supplies
* a pointer in place of a VBO offset. If we just let it go through,
@ -363,7 +378,7 @@ static void brw_prepare_vertices(struct brw_context *brw)
ptr = input->glarray->Ptr;
}
else if (interleave != input->glarray->StrideB ||
(GLuint)(input->glarray->Ptr - ptr) > interleave)
(uintptr_t)(input->glarray->Ptr - ptr) > interleave)
{
interleave = 0;
}