[PATCH 1/2] dri2: Let client call swap before previous swap target has been passed
walter harms
wharms at bfs.de
Mon Aug 29 05:19:28 PDT 2011
Am 29.08.2011 13:45, schrieb Pauli Nieminen:
> From: Pauli Nieminen <pauli.nieminen at linux.intel.com>
>
> Client has to be allowed to call swap buffers before last_swap_target
> has been passed if driver implements triple buffering with
> swap_interval.
>
> Time that swap may come before reaching last_swap_target is swap_limit *
> swap_interval if application renders very fast until throttled.
>
> Signed-off-by: Pauli Nieminen <pauli.nieminen at linux.intel.com>
> ---
> hw/xfree86/dri2/dri2.c | 21 +++++++++++++++++++--
> 1 files changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
> index af3bcae..44a8348 100644
> --- a/hw/xfree86/dri2/dri2.c
> +++ b/hw/xfree86/dri2/dri2.c
> @@ -791,6 +791,14 @@ DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
> return FALSE;
> }
>
> +#ifndef WORD64
> +# ifdef LONG64
> +typedef long INT64;
> +# else
> +typedef long long INT64;
> +#endif
> +#endif
> +
hi,
maybe it is better to use int64_t to have 64bit granted instead of making it ?
re,
wh
> int
> DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
> CARD64 divisor, CARD64 remainder, CARD64 *swap_target,
> @@ -854,12 +862,21 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
> * got enabled.
> */
> if (ds->GetMSC) {
> + INT64 msc_diff;
> + INT64 future_frames_allowed = pPriv->swap_limit * pPriv->swap_interval;
> if (!(*ds->GetMSC)(pDraw, &ust, ¤t_msc))
> pPriv->last_swap_target = 0;
>
> - if (current_msc < pPriv->last_swap_target)
> - pPriv->last_swap_target = current_msc;
> + msc_diff = (INT64)pPriv->last_swap_target - (INT64)current_msc;
>
> + /*
> + * If current_msc is more than swap_limit * swap_interval in future
> + * assume there was CRTC switch. That requires fixing swap_target for
> + * driver.
> + */
> + if (msc_diff < future_frames_allowed)
> + pPriv->last_swap_target = current_msc
> + + pPriv->swapsPending * pPriv->swap_interval;
> }
>
> /*
More information about the xorg-devel
mailing list