DRI2: Don't return junk reply instead of blocking in glXWaitForSbcOML()

DRI2WaitSBC() didn't block if requested targetSBC wasn't yet reached.

Instead it returned a xreply with uninitialized junk return values, then
blocked the connection until targetSBC was reached.

Therefore the client didn't block, but continued with bogus return
values from glXWaitForSbcOML.

This patch fixes the problem by implementing DRI2WaitSBC similar
to the clean and proven DRI2WaitMSC implementation.

Signed-off-by: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Mario Kleiner 2010-06-05 13:09:28 +02:00 committed by Keith Packard
parent 7287ef9e6c
commit b3548612c7
3 changed files with 8 additions and 21 deletions

View File

@ -912,8 +912,7 @@ DRI2WaitMSC(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
}
int
DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc,
CARD64 *ust, CARD64 *msc, CARD64 *sbc)
DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc)
{
DRI2DrawablePtr pPriv;
@ -927,14 +926,13 @@ DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc,
if (target_sbc == 0)
target_sbc = pPriv->swap_count + pPriv->swapsPending;
/* If current swap count already >= target_sbc,
/* If current swap count already >= target_sbc, reply and
* return immediately with (ust, msc, sbc) triplet of
* most recent completed swap.
*/
if (pPriv->swap_count >= target_sbc) {
*sbc = pPriv->swap_count;
*msc = pPriv->last_swap_msc;
*ust = pPriv->last_swap_ust;
ProcDRI2WaitMSCReply(client, pPriv->last_swap_ust,
pPriv->last_swap_msc, pPriv->swap_count);
return Success;
}

View File

@ -265,8 +265,7 @@ extern _X_EXPORT int DRI2WaitMSC(ClientPtr client, DrawablePtr pDrawable,
extern _X_EXPORT int ProcDRI2WaitMSCReply(ClientPtr client, CARD64 ust,
CARD64 msc, CARD64 sbc);
extern _X_EXPORT int DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw,
CARD64 target_sbc, CARD64 *ust, CARD64 *msc,
CARD64 *sbc);
CARD64 target_sbc);
extern _X_EXPORT Bool DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw);
extern _X_EXPORT Bool DRI2CanFlip(DrawablePtr pDraw);

View File

@ -520,9 +520,8 @@ static int
ProcDRI2WaitSBC(ClientPtr client)
{
REQUEST(xDRI2WaitSBCReq);
xDRI2MSCReply rep;
DrawablePtr pDrawable;
CARD64 target, ust, msc, sbc;
CARD64 target;
int status;
REQUEST_SIZE_MATCH(xDRI2WaitSBCReq);
@ -532,18 +531,9 @@ ProcDRI2WaitSBC(ClientPtr client)
return status;
target = vals_to_card64(stuff->target_sbc_lo, stuff->target_sbc_hi);
status = DRI2WaitSBC(client, pDrawable, target, &ust, &msc, &sbc);
if (status != Success)
return status;
status = DRI2WaitSBC(client, pDrawable, target);
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
load_msc_reply(&rep, ust, msc, sbc);
WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
return Success;
return status;
}
static int