[EMAIL PROTECTED] wrote:
Hello,

No idea if this problem has been raised, but I had a problem running the demos
@ http://www.garagegames.com on a radeon ddr 32.

It seems to crash (lock hardware, the new IRQ code gives EBUSY, but the exit()
isn't clean) rendering triangle fan elts :-

xc/extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h
   for (j = start + 1 ; j + 1 < count; j += nr - 1 ) {
      nr = MIN2( currentsz, count - j + 1 );
      TAG(emit_elts)( ctx, elts+start, 1 );
      TAG(emit_elts)( ctx, elts+j, nr - 1 );
      NEW_PRIMITIVE();
      currentsz = dmasz;

iff the first vertex is emitted by itself at the end
of a CmdBuf.

Here's a patch that prevents Think Tanks (and possibly other heavy users of triangle fans) from crashing on Radeon hardware. There seem to be some other texture related problems, but I haven't had a chance to delve into that. This should also fix similar problems on R200 hardware, but I haven't tested that out yet either.


Basically, I just in-lined emit_elts and did some minor clean-up. One problem that I have with emit_elts is that it seems to assume that the number of elts to emit is *always* a multiple of 2. Clearly this may not always be the case.
Index: 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 -d -r1.4 t_dd_dmatmp2.h
--- extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h       26 Aug 2002 22:16:02 -0000      1.4
+++ extras/Mesa/src/tnl_dd/t_dd_dmatmp2.h       18 Jul 2003 19:45:43 -0000
@@ -907,11 +907,27 @@
    }
 
    for (j = start + 1 ; j + 1 < count; j += nr - 1 ) {
+#if 0
       nr = MIN2( currentsz, count - j + 1 );
       TAG(emit_elts)( ctx, elts+start, 1 );
       TAG(emit_elts)( ctx, elts+j, nr - 1 );
       NEW_PRIMITIVE();
       currentsz = dmasz;
+#else
+      GLint k;
+      ELTS_VARS;
+
+      nr = MIN2( currentsz, count - j + 1 );
+      ALLOC_ELTS( nr );
+
+      EMIT_ELT( 0, elts[ start ] );
+      for (k = 0 ; k < (nr - 1) ; k++ ) {
+        EMIT_ELT( k+1, elts[ j+k ] );
+      }
+
+      NEW_PRIMITIVE();
+      currentsz = dmasz;
+#endif
    }
 }
 

Reply via email to