Here it is. It'll need cleaning up if it works, but it'll do as a test. -- Tim Smith ([EMAIL PROTECTED]) "A fray!!!!" -- Groo the Wanderer
Index: xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c,v retrieving revision 1.16 diff -u -3 -p -r1.16 radeon_ioctl.c --- xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c 18 Jun 2002 22:40:26 -0000 1.16 +++ xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c 1 Jul 2002 21:36:54 -0000 @@ -614,7 +614,22 @@ static int radeonWaitForFrameCompletion( int i; while ( 1 ) { - frame = INREG( RADEON_LAST_FRAME_REG ); + /* frame = INREG( RADEON_LAST_FRAME_REG ); */ + drmRadeonGetParam gp; + int ret; + + gp.param = RADEON_PARAM_LAST_FRAME; + gp.value = &frame; + ret = drmCommandWriteRead( rmesa->dri.fd, + DRM_RADEON_GETPARAM,&gp, sizeof(gp)); + if (ret) { + fprintf(stderr, "drmRadeonGetParam: %d\n", ret); + exit(1); + } + if ( RADEON_DEBUG & DEBUG_IOCTL ) { + fprintf( stderr, "%s( %d )\n", __FUNCTION__, clear ); + } + if ( sarea->last_frame - frame <= RADEON_MAX_OUTSTANDING ) { break; } @@ -803,12 +818,28 @@ static void radeonClear( GLcontext *ctx, /* Throttle the number of clear ioctls we do. */ while ( 1 ) { - clear = INREG( RADEON_LAST_CLEAR_REG ); + /* clear = INREG( RADEON_LAST_CLEAR_REG ); */ + drmRadeonGetParam gp; + int ret; + + gp.param = RADEON_PARAM_LAST_CLEAR; + gp.value = &clear; + ret = drmCommandWriteRead( rmesa->dri.fd, + DRM_RADEON_GETPARAM,&gp, sizeof(gp)); + if (ret) { + fprintf(stderr, "drmRadeonGetParam: %d\n", ret); + exit(1); + } + if ( RADEON_DEBUG & DEBUG_IOCTL ) { + fprintf( stderr, "%s( %d )\n", __FUNCTION__, clear ); + } + if ( sarea->last_clear - clear <= RADEON_MAX_CLEARS ) { break; } /* Spin in place a bit so we aren't hammering the bus */ for ( i = 0 ; i < 1024 ; i++ ) { + delay(); } } Index: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h,v retrieving revision 1.3 diff -u -3 -p -r1.3 radeon_common.h --- xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h 12 Jun 2002 15:50:27 -0000 1.3 +++ xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h 1 Jul 2002 21:36:55 -0000 @@ -336,5 +336,8 @@ typedef struct drm_radeon_getparam { } drmRadeonGetParam; #define RADEON_PARAM_AGP_BUFFER_OFFSET 0x1 +#define RADEON_PARAM_LAST_FRAME 0x2 +#define RADEON_PARAM_LAST_DISPATCH 0x3 +#define RADEON_PARAM_LAST_CLEAR 0x4 #endif Index: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c,v retrieving revision 1.23 diff -u -3 -p -r1.23 radeon_cp.c --- xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c 12 Jun 2002 15:50:28 -0000 1.23 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c 1 Jul 2002 21:36:57 -0000 @@ -905,17 +905,16 @@ static int radeon_do_init_cp( drm_device dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK; -#if 0 /* Initialize the scratch register pointer. This will cause * the scratch register values to be written out to memory * whenever they are updated. * FIXME: This doesn't quite work yet, so we're disabling it * for the release. + * TCS 2002-07-01 enabled again for testing */ RADEON_WRITE( RADEON_SCRATCH_ADDR, (dev_priv->ring_rptr->offset + RADEON_SCRATCH_REG_OFFSET) ); RADEON_WRITE( RADEON_SCRATCH_UMSK, 0x7 ); -#endif dev_priv->scratch = ((__volatile__ u32 *) dev_priv->ring_rptr->handle + @@ -1189,7 +1188,11 @@ drm_buf_t *radeon_freelist_get( drm_devi start = dev_priv->last_buf; for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) { + /* Testing scratch register writeback u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG ); + */ + u32 done_age = dev_priv->scratch[1]; + DRM_DEBUG("done_age = %d\n",done_age); for ( i = start ; i < dma->buf_count ; i++ ) { buf = dma->buflist[i]; buf_priv = buf->dev_private; Index: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h,v retrieving revision 1.11 diff -u -3 -p -r1.11 radeon_drm.h --- xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h 12 Jun 2002 15:50:28 -0000 1.11 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h 1 Jul 2002 21:36:57 -0000 @@ -458,6 +458,9 @@ typedef struct drm_radeon_indirect { * client any other way. */ #define RADEON_PARAM_AGP_BUFFER_OFFSET 0x1 +#define RADEON_PARAM_LAST_FRAME 0x2 +#define RADEON_PARAM_LAST_DISPATCH 0x3 +#define RADEON_PARAM_LAST_CLEAR 0x4 typedef struct drm_radeon_getparam { int param; Index: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c,v retrieving revision 1.17 diff -u -3 -p -r1.17 radeon_state.c --- xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c 27 Jun 2002 17:56:39 -0000 1.17 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c 1 Jul 2002 21:36:58 -0000 @@ -1878,6 +1878,15 @@ int radeon_cp_getparam( struct inode *in case RADEON_PARAM_AGP_BUFFER_OFFSET: value = dev_priv->agp_buffers_offset; break; + case RADEON_PARAM_LAST_FRAME: + value = dev_priv->scratch[0]; + break; + case RADEON_PARAM_LAST_DISPATCH: + value = dev_priv->scratch[1]; + break; + case RADEON_PARAM_LAST_CLEAR: + value = dev_priv->scratch[2]; + break; default: return -EINVAL; }