--- src/mesa/drivers/dri/r128.bak/r128_context.h 2007-02-06 17:28:55.000000000 +0100 +++ src/mesa/drivers/dri/r128/r128_context.h 2007-02-06 17:50:54.000000000 +0100 @@ -218,6 +218,8 @@ /* Configuration cache */ driOptionCache optionCache; + + GLboolean span_dlocking; }; #define R128_CONTEXT(ctx) ((r128ContextPtr)(ctx->DriverCtx)) --- src/mesa/drivers/dri/r128.bak/r128_span.c 2007-02-06 17:28:55.000000000 +0100 +++ src/mesa/drivers/dri/r128/r128_span.c 2007-02-06 18:07:39.000000000 +0100 @@ -34,6 +34,8 @@ * */ +#include + #include "r128_context.h" #include "r128_ioctl.h" #include "r128_state.h" @@ -403,6 +405,29 @@ r128SpanRenderStart( GLcontext *ctx ) { r128ContextPtr rmesa = R128_CONTEXT(ctx); + { + static int first = 1; + + if (first) { + rmesa->span_dlocking = getenv("R128_SPAN_ENABLE_LOCKING") ? 0 : 1; + if (rmesa->span_dlocking == 0) { + fprintf(stderr, "You set R128_SPAN_ENABLE_LOCKING env var\nit may cause hanging in some apps."); + fflush(stderr); + sleep(1); + } + first = 0; + } + + if (rmesa->span_dlocking) { + FLUSH_BATCH(rmesa); + LOCK_HARDWARE( rmesa ); + r128WaitForIdleLocked( rmesa ); + UNLOCK_HARDWARE( rmesa ); + + return; + } + } + FLUSH_BATCH(rmesa); LOCK_HARDWARE(rmesa); r128WaitForIdleLocked( rmesa ); @@ -413,8 +438,8 @@ { r128ContextPtr rmesa = R128_CONTEXT(ctx); _swrast_flush( ctx ); - r128WaitForIdleLocked( rmesa ); - UNLOCK_HARDWARE( rmesa ); + if (rmesa->span_dlocking == 0) + UNLOCK_HARDWARE( rmesa ); } void r128DDInitSpanFuncs( GLcontext *ctx )