Module: Mesa Branch: intel-2008-q4 Commit: 37f489edd217f7a92998b7ca9207d43e2860b357 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=37f489edd217f7a92998b7ca9207d43e2860b357
Author: Eric Anholt <[email protected]> Date: Tue Dec 23 16:08:40 2008 -0800 dri: Fix driWaitForMSC32 when divisor >= 2 and msc < 0. We'd come up with a negative remainder, while we were looking for the positive version of it in the loop conditional. And, since the "did we hit our target" break was disabled for the target_msc == 0 ("Just make the divisor/remainder work") path, we'd never exit. Simplify the code by just using int64_t all over instead of trying to do it in a u32 space. (cherry picked from commit 6c01500228014a6cfa133b5dbba8c6d024833e84) --- src/mesa/drivers/dri/common/vblank.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mesa/drivers/dri/common/vblank.c b/src/mesa/drivers/dri/common/vblank.c index d610253..12aeaa1 100644 --- a/src/mesa/drivers/dri/common/vblank.c +++ b/src/mesa/drivers/dri/common/vblank.c @@ -130,9 +130,8 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv, if ( divisor != 0 ) { - unsigned int target = (unsigned int)target_msc; - unsigned int next = target; - unsigned int r; + int64_t next = target_msc; + int64_t r; int dont_wait = (target_msc == 0); do { @@ -154,9 +153,9 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv, *msc = vblank_to_msc(priv, vbl.reply.sequence); - dont_wait = 0; - if (target_msc != 0 && *msc == target) + if (!dont_wait && *msc == next) break; + dont_wait = 0; /* Assuming the wait-done test fails, the next refresh to wait for * will be one that satisfies (MSC % divisor) == remainder. The @@ -165,11 +164,12 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv, * If this refresh has already happened, we add divisor to obtain * the next refresh after the current one that will satisfy it. */ - r = (*msc % (unsigned int)divisor); - next = (*msc - r + (unsigned int)remainder); - if (next <= *msc) next += (unsigned int)divisor; + r = ((uint64_t)*msc % divisor); + next = (*msc - r + remainder); + if (next <= *msc) + next += divisor; - } while ( r != (unsigned int)remainder ); + } while (r != remainder); } else { /* If the \c divisor is zero, just wait until the MSC is greater _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
