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
}
}
