Hi,

as I reported earlier there seems to be a race condition in the Radeon
driver when state is emitted while the card is processing vertices. Now
I narrowed it down to tex[0], tex[1] and tcl states that appear to
require 3D to be idle. Can someone with Radeon specs confirm this? Other
state changes may not lock up the card but cause incorrect rendering. I
havn't seen such behaviour, though. Again, what do the specs say?

A refined patch for the user space driver is attached. A proper fix in
the kernel would have to check the packet id in radeon_emit_packets
(shared/drm/kernel/radeon_state.c) once we know exactly which packets
are affected.

Regards,
   Felix

               __\|/__    ___     ___     ___
__Tschüß_______\_6 6_/___/__ \___/__ \___/___\___You can do anything,___
_____Felix_______\Ä/\ \_____\ \_____\ \______U___just not everything____
  [EMAIL PROTECTED]    >o<__/   \___/   \___/        at the same time!
Index: radeon_ioctl.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c,v
retrieving revision 1.37
diff -u -r1.37 radeon_ioctl.c
--- radeon_ioctl.c      30 Nov 2002 14:24:06 -0000      1.37
+++ radeon_ioctl.c      8 Dec 2002 13:21:06 -0000
@@ -87,6 +87,14 @@
 
    foreach_s( state, tmp, list ) {
       if (state->check( rmesa->glCtx )) {
+        if (state == &rmesa->hw.tex[0] || state == &rmesa->hw.tex[1] ||
+            state == &rmesa->hw.tcl) {
+            drmRadeonCmdHeader *cmd;
+            cmd = (drmRadeonCmdHeader *)radeonAllocCmdBuf( rmesa, sizeof(*cmd),
+                                                           __FUNCTION__ );
+            cmd->wait.cmd_type = RADEON_CMD_WAIT;
+            cmd->wait.flags = RADEON_WAIT_3D;
+        }
         dest = radeonAllocCmdBuf( rmesa, state->cmd_size * 4, __FUNCTION__);
         memcpy( dest, state->cmd, state->cmd_size * 4);
         move_to_head( &(rmesa->hw.clean), state );

Reply via email to