[Mesa-dev] [PATCH] dri3: Stricter SBC wraparound handling

Juan A. Suarez Romero jasuarez at igalia.com
Thu May 24 07:24:30 UTC 2018


On Wed, 2018-05-16 at 11:10 +0200, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
> 
> Prevents spuriously bumping the upper 32 bits of the SBC, which results
> in hangs with the modesetting driver from xserver 1.20.
> 

I've picked this patch for 18.0, as it was nominated when pushed to master.

Nevertheless, the patch didn't apply cleanly in branch, so I've resolved
conflicts.


You can find the commited solved patch at

https://github.com/Igalia/release-mesa/commit/b582b8fc93697d193365bf11cd9f336d78
6d7f8d


If you think the patch was solved wrongly, please, send me a fixed version.
Thanks in advance!


	J.A.


> Bugzilla: https://bugs.freedesktop.org/106351
> Tested-by: Mike Lothian <mike at fireburn.co.uk>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>  src/loader/loader_dri3_helper.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
> index 6db8303d26d..f0ff2f07bde 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
> @@ -370,9 +370,17 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
>         * checking for wrap.
>         */
>        if (ce->kind == XCB_PRESENT_COMPLETE_KIND_PIXMAP) {
> -         draw->recv_sbc = (draw->send_sbc & 0xffffffff00000000LL) | ce->serial;
> -         if (draw->recv_sbc > draw->send_sbc)
> -            draw->recv_sbc -= 0x100000000;
> +         uint64_t recv_sbc = (draw->send_sbc & 0xffffffff00000000LL) | ce->serial;
> +
> +         /* Only assume wraparound if that results in exactly the previous
> +          * SBC + 1, otherwise ignore received SBC > sent SBC (those are
> +          * probably from a previous loader_dri3_drawable instance) to avoid
> +          * calculating bogus target MSC values in loader_dri3_swap_buffers_msc
> +          */
> +         if (recv_sbc <= draw->send_sbc)
> +            draw->recv_sbc = recv_sbc;
> +         else if (recv_sbc == (draw->recv_sbc + 0x100000001ULL))
> +            draw->recv_sbc = recv_sbc - 0x100000000ULL;
>  
>           /* When moving from flip to copy, we assume that we can allocate in
>            * a more optimal way if we don't need to cater for the display


More information about the mesa-dev mailing list