On Sun, 21 Feb 2010 05:26:01 +0100 Mario Kleiner <[email protected]> wrote:
> Returns expected SBC after completion of swap to caller, as required > by OML_sync_control spec, instead of the last_swap_target value. > > Passes target_msc, divisor, remainder, correctly for > glXSwapBuffersMscOML() call, while retaining old > behaviour for simple glXSwapBuffers() call. > > Signed-off-by: Mario Kleiner <[email protected]> I think this is what it ought to look like on top of my last patch to fix last_swap_target initialization. Your other patches looked fine too. diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 55846b1..952e493 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -622,11 +622,26 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, } /* - * Swap target for this swap is last swap target + swap interval since - * we have to account for the current swap count, interval, and the - * number of pending swaps. + * In the simple glXSwapBuffers case, all params will be 0, and we just + * need to schedule a swap for the last swap target + the swap interval. */ - *swap_target = pPriv->last_swap_target + pPriv->swap_interval; + if (target_msc == 0 && divisor == 0 && remainder == 0) { + /* + * Swap target for this swap is last swap target + swap interval since + * we have to account for the current swap count, interval, and the + * number of pending swaps. + */ + *swap_target = pPriv->last_swap_target + pPriv->swap_interval; + } else { + /* glXSwapBuffersMscOML() call with target_msc, divisor, remainder set. + * Just make sure that target_msc is not earlier than last swap target + + * swap interval. + */ + if (target_msc < pPriv->last_swap_target + pPriv->swap_interval) + target_msc = pPriv->last_swap_target + pPriv->swap_interval; + + *swap_target = target_msc; + } ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer, swap_target, divisor, remainder, func, data); @@ -639,6 +654,11 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, pPriv->swapsPending++; pPriv->last_swap_target = *swap_target; + /* According to spec, return expected swapbuffers count SBC after this swap + * will complete. + */ + *swap_target = pPriv->swap_count + pPriv->swapsPending; + return Success; } _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
