Brian Paul wrote:
Andreas Stenglein wrote:

Here is a backtrace from gdb, its almost the same for the
"app is dieing" and "xserver freezes".
when running xmms in gdb, the xserver doesnt freeze, only
the app. If you continue, one thread is dead, the other
keeps going!

But I had another thing: after "restoring" the xserver
with killall -KILL X and then init 3, init 5, a
switch to vt 1 for example locked up the whole machine
-> reboot


"app dieing":
[New Thread 4101 (LWP 4692)]
Delayed SIGSTOP caught for LWP 4692.
xmms: radeon_vtxfmt.c:325: copy_dma_verts: Zusicherung »0« nicht
erfüllt.

Program received signal SIGABRT, Aborted.
0x4032e861 in kill () from /lib/libc.so.6
(gdb) back
#0  0x4032e861 in kill () from /lib/libc.so.6
#1  0x40033acc in pthread_kill () from /lib/libpthread.so.0
#2  0x40033fd6 in raise () from /lib/libpthread.so.0
#3  0x4032fc81 in abort () from /lib/libc.so.6
#4  0x40328a52 in Letext () from /lib/libc.so.6
#5  0x41c1e6a9 in copy_dma_verts (rmesa=0x84505c0, tmp=0xbf3ff950) at
radeon_vtxfmt.c:325
#6  0x41c1eca1 in wrap_buffer () at radeon_vtxfmt.c:488
#7  0x40f4f675 in _ts_Vertex3f (x=-0.328125, y=0, z=0.34375) at
../../../extras/Mesa/src/glapitemp.h:733
#8  0x41432045 in draw_gl () from
/usr/X11R6/lib/xmms/Visualization/liblava.so
#9  0x41430e4b in draw_thread_loop () from
/usr/X11R6/lib/xmms/Visualization/liblava.so
#10 0x40030f37 in pthread_start_thread () from /lib/libpthread.so.0
#11 0x40030f8e in pthread_start_thread_event () from
/lib/libpthread.so.0
(gdb) quit


"xserver freeze":
[New Thread 4101 (LWP 4710)]
Delayed SIGSTOP caught for LWP 4710.
xmms: radeon_vtxfmt.c:325: copy_dma_verts: Zusicherung »0« nicht
erfüllt.

Program received signal SIGABRT, Aborted.
0x4032e861 in kill () from /lib/libc.so.6
(gdb) back
#0  0x4032e861 in kill () from /lib/libc.so.6
#1  0x40033acc in pthread_kill () from /lib/libpthread.so.0
#2  0x40033fd6 in raise () from /lib/libpthread.so.0
#3  0x4032fc81 in abort () from /lib/libc.so.6
#4  0x40328a52 in Letext () from /lib/libc.so.6
#5  0x41c1e6a9 in copy_dma_verts (rmesa=0x842d810, tmp=0xbf3ff950) at
radeon_vtxfmt.c:325
#6  0x41c1eca1 in wrap_buffer () at radeon_vtxfmt.c:488
#7  0x40f4f675 in _ts_Vertex3f (x=-0.296875, y=0, z=-0.015625) at
../../../extras/Mesa/src/glapitemp.h:733
#8  0x41432045 in draw_gl () from
/usr/X11R6/lib/xmms/Visualization/liblava.so
#9  0x41430e4b in draw_thread_loop () from
/usr/X11R6/lib/xmms/Visualization/liblava.so
#10 0x40030f37 in pthread_start_thread () from /lib/libpthread.so.0
#11 0x40030f8e in pthread_start_thread_event () from
/lib/libpthread.so.0
(gdb) quit
The program is running.  Exit anyway? (y or n) y

Could you try editing xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c
and remove or comment-out the assertion at line 325?
It looks like the problem is occuring when the buffer wraps on a vertex emitted outside a begin/end pair.

I've attached a patch that deals with a couple of problems when this happens. Can you give that a go?

Keith
Warning: Remote host denied X11 forwarding.
Index: radeon_vtxfmt.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c,v
retrieving revision 1.5
diff -u -r1.5 radeon_vtxfmt.c
--- radeon_vtxfmt.c     5 Nov 2002 21:19:52 -0000       1.5
+++ radeon_vtxfmt.c     26 Nov 2002 00:01:00 -0000
@@ -485,15 +485,21 @@
 
    /* Copy vertices out of dma:
     */
-   nrverts = copy_dma_verts( rmesa, tmp );
+   if (rmesa->vb.prim[0] == GL_POLYGON+1) 
+      nrverts = 0;
+   else {
+      nrverts = copy_dma_verts( rmesa, tmp );
 
-   if (RADEON_DEBUG & DEBUG_VFMT)
-      fprintf(stderr, "%d vertices to copy\n", nrverts);
+      if (RADEON_DEBUG & DEBUG_VFMT)
+        fprintf(stderr, "%d vertices to copy\n", nrverts);
    
+      /* Finish the prim at this point:
+       */
+      note_last_prim( rmesa, 0 );
+   }
 
-   /* Finish the prim at this point:
+   /* Fire any buffered primitives
     */
-   note_last_prim( rmesa, 0 );
    flush_prims( rmesa );
 
    /* Get new buffer
@@ -510,8 +516,11 @@
    vb.notify = wrap_buffer;
 
    rmesa->dma.flush = flush_prims;
-   start_prim( rmesa, rmesa->vb.prim[0] );
 
+   /* Restart wrapped primitive:
+    */
+   if (rmesa->vb.prim[0] != GL_POLYGON+1)
+      start_prim( rmesa, rmesa->vb.prim[0] );
 
    /* Reemit saved vertices
     */

Reply via email to