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]> --- hw/xfree86/dri2/dri2.c | 43 +++++++++++++++++++++++++++++-------------- 1 files changed, 29 insertions(+), 14 deletions(-) diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 7f40d28..453bc6b 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -597,33 +597,43 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, return Success; } - /* - * 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. + /* First swap needs to initialize last_swap_target. * If the last swap target hasn't been set yet, call into the driver * to get the current count. */ - if (target_msc == 0 && divisor == 0 && remainder == 0 && - pPriv->last_swap_target < 0) { - ret = (*ds->GetMSC)(pDraw, &ust, &target_msc); + if (pPriv->last_swap_target < 0) { + ret = (*ds->GetMSC)(pDraw, &ust, &pPriv->last_swap_target); if (!ret) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[DRI2] %s: driver failed to return current MSC\n", __func__); + pPriv->last_swap_target = -1; return BadDrawable; } } - /* First swap needs to initialize last_swap_target */ - if (pPriv->last_swap_target < 0) - pPriv->last_swap_target = 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); @@ -636,6 +646,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; } -- 1.6.6 _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
