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 );

Reply via email to