[Mesa-stable] [PATCH 5/5] glx: Handle out-of-sequence swap completion events correctly.
Emil Velikov
emil.l.velikov at gmail.com
Sun Dec 14 07:15:25 PST 2014
Hi Mario,
I've picked up patches 1-4 in master and will land them in the stable
branches shortly.
Gents,
Can anyone spare some time and take a look at this patch.
If you're planning to look into it in a few days/a week from now, kindly
let me know so that I can keep the annoyance to a minimum :)
Thanks
Emil
On 05/12/14 07:42, Mario Kleiner wrote:
> The code for emitting INTEL_swap_events swap completion
> events needs to translate from 32-Bit sbc on the wire to
> 64-Bit sbc for the events and handle wraparound accordingly.
>
> It assumed that events would be sent by the server in the
> order their corresponding swap requests were emitted from
> the client, iow. sbc count should be always increasing. This
> was correct for DRI2.
>
> This is not always the case under the DRI3/Present backend,
> where the Present extension can execute swaps and send out
> completion events in a different order than the submission
> order of the present requests. This confused the wraparound
> handling. This patch fixes the problem by handling 32-Bit
> wraparound in both directions. As long as successive swap
> completion events real 64-Bit sbc's don't differ by more
> than 2^30, this should be able to do the right thing.
>
> Cc: "10.3 10.4" <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
> ---
> src/glx/glxext.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/src/glx/glxext.c b/src/glx/glxext.c
> index 68c359e..fdc24d4 100644
> --- a/src/glx/glxext.c
> +++ b/src/glx/glxext.c
> @@ -143,8 +143,13 @@ __glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire)
> aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
> aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
>
> - if (awire->sbc < glxDraw->lastEventSbc)
> - glxDraw->eventSbcWrap += 0x100000000;
> + /* Handle 32-Bit wire sbc wraparound in both directions to cope with out
> + * of sequence 64-Bit sbc's
> + */
> + if ((int64_t) awire->sbc < ((int64_t) glxDraw->lastEventSbc - 0x40000000))
> + glxDraw->eventSbcWrap += 0x100000000;
> + if ((int64_t) awire->sbc > ((int64_t) glxDraw->lastEventSbc + 0x40000000))
> + glxDraw->eventSbcWrap -= 0x100000000;
> glxDraw->lastEventSbc = awire->sbc;
> aevent->sbc = awire->sbc + glxDraw->eventSbcWrap;
> return True;
>
More information about the mesa-stable
mailing list