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