|
|
Definition at line 107 of file vbo_rebase.c.
Referenced by _tnl_draw_prims().
{
struct gl_client_array tmp_arrays[VERT_ATTRIB_MAX];
const struct gl_client_array *tmp_array_pointers[VERT_ATTRIB_MAX];
struct _mesa_index_buffer tmp_ib;
struct _mesa_prim *tmp_prims = NULL;
void *tmp_indices = NULL;
GLuint i;
assert(min_index != 0);
if (0)
_mesa_printf("%s %d..%d\n", __FUNCTION__, min_index, max_index);
if (ib) {
GLboolean map_ib = ib->obj->Name && !ib->obj->Pointer;
void *ptr;
if (map_ib)
ctx->Driver.MapBuffer(ctx,
GL_ELEMENT_ARRAY_BUFFER,
GL_READ_ONLY_ARB,
ib->obj);
ptr = ADD_POINTERS(ib->obj->Pointer, ib->ptr);
switch (ib->type) {
case GL_UNSIGNED_INT:
tmp_indices = rebase_GLuint( ptr, ib->count, min_index );
break;
case GL_UNSIGNED_SHORT:
tmp_indices = rebase_GLushort( ptr, ib->count, min_index );
break;
case GL_UNSIGNED_BYTE:
tmp_indices = rebase_GLubyte( ptr, ib->count, min_index );
break;
}
if (map_ib)
ctx->Driver.UnmapBuffer(ctx,
GL_ELEMENT_ARRAY_BUFFER,
ib->obj);
tmp_ib.obj = ctx->Array.NullBufferObj;
tmp_ib.ptr = tmp_indices;
tmp_ib.count = ib->count;
tmp_ib.type = ib->type;
ib = &tmp_ib;
}
else {
tmp_prims = (struct _mesa_prim *)_mesa_malloc(sizeof(*prim) * nr_prims);
for (i = 0; i < nr_prims; i++) {
assert(prim[i].start >= min_index);
tmp_prims[i] = prim[i];
tmp_prims[i].start -= min_index;
}
prim = tmp_prims;
}
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
tmp_arrays[i] = *arrays[i];
tmp_arrays[i].Ptr += min_index * tmp_arrays[i].StrideB;
tmp_array_pointers[i] = &tmp_arrays[i];
}
draw( ctx,
tmp_array_pointers,
prim,
nr_prims,
ib,
0,
max_index - min_index );
if (tmp_indices)
_mesa_free(tmp_indices);
if (tmp_prims)
_mesa_free(tmp_prims);
}
|