OK. Comment added.
Thanks, Thomas ________________________________________ From: Keith Whitwell [[email protected]] Sent: Tuesday, January 20, 2009 11:16 To: Thomas Hellstrom Cc: [email protected] Subject: Re: [Mesa3d-dev] [PATCH] tnl: Add a utility function to emit indexed vertices to dma buffers. This looks ok, but it's clearly a quick & dirty approach to what's being done. I think I'd probably just add a comment saying that this functionality has been implemented more comprehensively in gallium/auxiliary/translate, such that the whole function is code-generated including the indexed lookup. If someone found this code being a hotspot for them, then the gallium translate module (which is an evolution of t_vertex.[ch]) is a good place to start looking for a solution. Keith On Mon, 2009-01-19 at 12:52 -0800, [email protected] wrote: > From: Thomas Hellstrom <thellstrom-at-vmware-dot-com> > > --- > src/mesa/tnl/t_vertex.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- > src/mesa/tnl/t_vertex.h | 6 ++++++ > 2 files changed, 50 insertions(+), 1 deletions(-) > > diff --git a/src/mesa/tnl/t_vertex.c b/src/mesa/tnl/t_vertex.c > index b661524..165b001 100644 > --- a/src/mesa/tnl/t_vertex.c > +++ b/src/mesa/tnl/t_vertex.c > @@ -376,6 +376,22 @@ void _tnl_notify_pipeline_output_change( GLcontext *ctx ) > invalidate_funcs(vtx); > } > > + > +static void adjust_input_ptrs( GLcontext *ctx, GLint diff) > +{ > + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; > + struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); > + struct tnl_clipspace_attr *a = vtx->attr; > + const GLuint count = vtx->attr_count; > + int j; > + > + diff -= 1; > + for (j=0; j<count; ++j) { > + register GLvector4f *vptr = VB->AttribPtr[a->attrib]; > + (a++)->inputptr += diff*vptr->stride; > + } > +} > + > static void update_input_ptrs( GLcontext *ctx, GLuint start ) > { > struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; > @@ -431,13 +447,40 @@ void *_tnl_emit_vertices_to_buffer( GLcontext *ctx, > struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); > > update_input_ptrs(ctx, start); > - > /* Note: dest should not be adjusted for non-zero 'start' values: > */ > vtx->emit( ctx, end - start, (GLubyte*) dest ); > return (void *)((GLubyte *)dest + vtx->vertex_size * (end - start)); > } > > +/* Emit indexed VB vertices start..end to dest. Note that VB vertex at > + * postion start will be emitted to dest at position zero. > + */ > + > +void *_tnl_emit_indexed_vertices_to_buffer( GLcontext *ctx, > + GLuint *elts, > + GLuint start, > + GLuint end, > + void *dest ) > +{ > + struct tnl_clipspace *vtx = GET_VERTEX_STATE(ctx); > + GLuint oldIndex; > + GLubyte *cdest = dest; > + > + update_input_ptrs(ctx, oldIndex = elts[start++]); > + vtx->emit( ctx, 1, cdest ); > + cdest += vtx->vertex_size; > + > + for (; start < end; ++start) { > + adjust_input_ptrs(ctx, elts[start] - oldIndex); > + oldIndex = elts[start]; > + vtx->emit( ctx, 1, cdest); > + cdest += vtx->vertex_size; > + } > + > + return (void *) cdest; > +} > + > > void _tnl_init_vertices( GLcontext *ctx, > GLuint vb_size, > diff --git a/src/mesa/tnl/t_vertex.h b/src/mesa/tnl/t_vertex.h > index 712311a..271efdf 100644 > --- a/src/mesa/tnl/t_vertex.h > +++ b/src/mesa/tnl/t_vertex.h > @@ -118,6 +118,12 @@ extern void *_tnl_emit_vertices_to_buffer( GLcontext > *ctx, > GLuint start, > GLuint end, > void *dest ); > +extern void *_tnl_emit_indexed_vertices_to_buffer( GLcontext *ctx, > + GLuint *elts, > + GLuint start, > + GLuint end, > + void *dest ); > + > > extern void _tnl_build_vertices( GLcontext *ctx, > GLuint start, ------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword _______________________________________________ Mesa3d-dev mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
