The following patch alters the way triangle fans are split to cover dma buffer boundaries. Without the patch the first polygon after the split will be missing. I've only tested the sw tcl case (as my chipset doesn't support hw tcl) and the problem only manifests when emitting verts (since elts don't appear to split), but I'm certain this is correct behaviour when rendering triangle fans. This patch does in fact address a specific bug (XF86 bug #185).
Dylan
Index: xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp.h =================================================================== RCS file: /cvsroot/dri/xc/xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp.h,v retrieving revision 1.9 diff -u -r1.9 t_dd_dmatmp.h --- xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp.h 3 Apr 2003 21:30:42 -0000 1.9 +++ xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp.h 20 Jul 2003 01:55:13 -0000 @@ -363,7 +363,7 @@ currentsz = dmasz; } - for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { + for (j = start + 1 ; j + 1 < count; j += nr - 2 ) { nr = MIN2( currentsz, count - j + 1 ); EMIT_VERTS( ctx, start, 1 ); EMIT_VERTS( ctx, j, nr - 1 ); @@ -911,7 +911,7 @@ currentsz = dmasz; } - for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { + for (j = start + 1 ; j + 1 < count; j += nr - 2 ) { nr = MIN2( currentsz, count - j + 1 ); TAG(emit_elts)( ctx, elts+start, 1 ); TAG(emit_elts)( ctx, elts+j, nr - 1 ); Index: xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h =================================================================== RCS file: /cvsroot/dri/xc/xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h,v retrieving revision 1.4 diff -u -r1.4 t_dd_dmatmp2.h --- xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h 26 Aug 2002 22:16:02 -0000 1.4 +++ xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h 20 Jul 2003 01:55:16 -0000 @@ -906,7 +906,7 @@ currentsz = dmasz; } - for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { + for (j = start + 1 ; j + 1 < count; j += nr - 2 ) { nr = MIN2( currentsz, count - j + 1 ); TAG(emit_elts)( ctx, elts+start, 1 ); TAG(emit_elts)( ctx, elts+j, nr - 1 );