Index: src/mesa/drivers/dri/unichrome/via_context.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_context.c,v retrieving revision 1.57 diff -u -r1.57 via_context.c --- src/mesa/drivers/dri/unichrome/via_context.c 14 Sep 2005 00:36:28 -0000 1.57 +++ src/mesa/drivers/dri/unichrome/via_context.c 20 Oct 2005 07:38:03 -0000 @@ -701,7 +701,7 @@ } if (vmesa) { - viaWaitIdle(vmesa); + viaWaitIdle(vmesa, GL_FALSE); if (vmesa->doPageFlip) { LOCK_HARDWARE(vmesa); if (vmesa->pfCurrentOffset != 0) { Index: src/mesa/drivers/dri/unichrome/via_fb.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_fb.c,v retrieving revision 1.12 diff -u -r1.12 via_fb.c --- src/mesa/drivers/dri/unichrome/via_fb.c 3 Sep 2005 16:52:41 -0000 1.12 +++ src/mesa/drivers/dri/unichrome/via_fb.c 20 Oct 2005 07:38:05 -0000 @@ -206,7 +206,7 @@ struct via_tex_buffer *s, *tmp; foreach_s( s, tmp, &vmesa->freed_tex_buffers ) { - if (s->lastUsed < vmesa->lastBreadcrumbRead) { + if (!VIA_GEQ_WRAP(s->lastUsed, vmesa->lastBreadcrumbRead)) { if (VIA_DEBUG & DEBUG_TEXTURE) fprintf(stderr, "%s: release tex sz %d lastUsed %x\n", __FUNCTION__, s->size, s->lastUsed); Index: src/mesa/drivers/dri/unichrome/via_ioctl.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_ioctl.c,v retrieving revision 1.34 diff -u -r1.34 via_ioctl.c --- src/mesa/drivers/dri/unichrome/via_ioctl.c 3 Sep 2005 16:52:41 -0000 1.34 +++ src/mesa/drivers/dri/unichrome/via_ioctl.c 20 Oct 2005 07:38:06 -0000 @@ -90,7 +90,6 @@ } - void viaCheckDma(struct via_context *vmesa, GLuint bytes) { VIA_FINISH_PRIM( vmesa ); @@ -412,9 +411,9 @@ if (VIA_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s %d < %d: %d\n", __FUNCTION__, value, vmesa->lastBreadcrumbRead, - value < vmesa->lastBreadcrumbRead); + !VIA_GEQ_WRAP(value, vmesa->lastBreadcrumbRead)); - return value < vmesa->lastBreadcrumbRead; + return !VIA_GEQ_WRAP(value, vmesa->lastBreadcrumbRead); } static void viaWaitBreadcrumb( struct via_context *vmesa, GLuint value ) @@ -422,7 +421,7 @@ if (VIA_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s %d\n", __FUNCTION__, value); - assert(value < vmesa->lastBreadcrumbWrite); + assert(!VIA_GEQ_WRAP(value, vmesa->lastBreadcrumbWrite)); while (!viaCheckBreadcrumb( vmesa, value )) { viaSwapOutWork( vmesa ); @@ -431,7 +430,7 @@ } -void viaWaitIdle( struct via_context *vmesa ) +void viaWaitIdle( struct via_context *vmesa, GLboolean light ) { VIA_FLUSH_DMA(vmesa); @@ -449,17 +448,20 @@ /* Need to wait? */ - if (vmesa->lastDma >= vmesa->lastBreadcrumbRead) + if (VIA_GEQ_WRAP(vmesa->lastDma, vmesa->lastBreadcrumbRead)) viaWaitBreadcrumb( vmesa, vmesa->lastDma ); + if (light) return; + + LOCK_HARDWARE(vmesa); while(!viaCheckIdle(vmesa)) ; - + UNLOCK_HARDWARE(vmesa); via_release_pending_textures(vmesa); } -void viaWaitIdleLocked( struct via_context *vmesa ) +void viaWaitIdleLocked( struct via_context *vmesa, GLboolean light ) { if (vmesa->dmaLow) viaFlushDmaLocked(vmesa, 0); @@ -479,6 +481,8 @@ if (vmesa->lastDma >= vmesa->lastBreadcrumbRead) viaWaitBreadcrumb( vmesa, vmesa->lastDma ); + if (light) return; + while(!viaCheckIdle(vmesa)) ; @@ -596,7 +600,7 @@ vmesa->lastBreadcrumbWrite > 1) viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastBreadcrumbWrite-1); else - viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastSwap[1]); + viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastSwap[1]); LOCK_HARDWARE(vmesa); @@ -702,7 +706,7 @@ /* Fall through to PCI handling?!? */ - viaWaitIdleLocked(vmesa); + viaWaitIdleLocked(vmesa, GL_FALSE); } ret = drmCommandWrite(vmesa->driFd, DRM_VIA_PCICMD, &bufI, sizeof(bufI)); @@ -946,7 +950,7 @@ { struct via_context *vmesa = VIA_CONTEXT(ctx); VIA_FLUSH_DMA(vmesa); - viaWaitIdle(vmesa); + viaWaitIdle(vmesa, GL_FALSE); } static void viaClearStencil(GLcontext *ctx, int s) Index: src/mesa/drivers/dri/unichrome/via_ioctl.h =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_ioctl.h,v retrieving revision 1.10 diff -u -r1.10 via_ioctl.h --- src/mesa/drivers/dri/unichrome/via_ioctl.h 22 Mar 2005 14:25:55 -0000 1.10 +++ src/mesa/drivers/dri/unichrome/via_ioctl.h 20 Oct 2005 07:38:07 -0000 @@ -37,8 +37,8 @@ void viaPageFlip(const __DRIdrawablePrivate *dpriv); void viaCheckDma(struct via_context *vmesa, GLuint bytes); void viaResetPageFlippingLocked(struct via_context *vmesa); -void viaWaitIdle(struct via_context *vmesa); -void viaWaitIdleLocked(struct via_context *vmesa); +void viaWaitIdle(struct via_context *vmesa, GLboolean light); +void viaWaitIdleLocked(struct via_context *vmesa, GLboolean light); GLboolean viaCheckBreadcrumb( struct via_context *vmesa, GLuint value ); void viaEmitBreadcrumb( struct via_context *vmesa ); @@ -127,7 +127,9 @@ } \ } while (0) - +#define VIA_GEQ_WRAP(left, right) \ + (((left) - (right)) < ( 1 << 23)) + #endif Index: src/mesa/drivers/dri/unichrome/via_span.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_span.c,v retrieving revision 1.22 diff -u -r1.22 via_span.c --- src/mesa/drivers/dri/unichrome/via_span.c 4 Sep 2005 15:02:48 -0000 1.22 +++ src/mesa/drivers/dri/unichrome/via_span.c 20 Oct 2005 07:38:07 -0000 @@ -148,7 +148,7 @@ void viaSpanRenderStart( GLcontext *ctx ) { struct via_context *vmesa = VIA_CONTEXT(ctx); - viaWaitIdle(vmesa); + viaWaitIdle(vmesa, GL_FALSE); LOCK_HARDWARE(vmesa); } Index: src/mesa/drivers/dri/unichrome/via_tex.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_tex.c,v retrieving revision 1.12 diff -u -r1.12 via_tex.c --- src/mesa/drivers/dri/unichrome/via_tex.c 5 Oct 2005 01:48:08 -0000 1.12 +++ src/mesa/drivers/dri/unichrome/via_tex.c 20 Oct 2005 07:38:08 -0000 @@ -838,8 +838,8 @@ struct gl_texture_image *texImage) { struct via_context *vmesa = VIA_CONTEXT(ctx); - - VIA_FLUSH_DMA(vmesa); + viaWaitIdle(vmesa, GL_TRUE); + vmesa->clearTexCache = 1; _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, @@ -875,7 +875,7 @@ { struct via_context *vmesa = VIA_CONTEXT(ctx); - VIA_FLUSH_DMA(vmesa); + viaWaitIdle(vmesa, GL_TRUE); vmesa->clearTexCache = 1; _mesa_store_texsubimage1d(ctx, target, level, xoffset, width,