[Mesa-dev] [PATCH] loader/dri3: Overhaul dri3_update_num_back

Jason Ekstrand jason at jlekstrand.net
Wed Aug 31 14:21:39 UTC 2016


On Aug 19, 2016 12:07 AM, "Michel Dänzer" <michel at daenzer.net> wrote:
>
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Always use 3 buffers when flipping. With only 2 buffers, we have to wait
> for a flip to complete (which takes non-0 time even with asynchronous
> flips) before we can start working on the next frame. We were previously
> only using 2 buffers for flipping if the X server supports asynchronous
> flips, even when we're not using asynchronous flips. This could result
> in bad performance (the referenced bug report is an extreme case, where
> the inter-frame stalls were preventing the GPU from reaching its maximum
> clocks).

Sorry for the post-push review but I don't usually pay much attention to
the window system code.  In any case, I believe you're doing your counting
wrong.  When flipping with swapinterval=0, you need 4 buffers:

1. The buffer currently being scanned out  (will be released at next vblank)
2. The buffer X has queued for scanout but is waiting on vblank
3. The buffer the application has just submitted which X will queue next of
it doesn't get another before the window closes.
4. The buffer the application is using for rendering.

With only 3, you get a stall during that window in which X has queued
another flip but we're waiting on vblank before the flip begins. An I
missing something?

--Jason

> I couldn't measure any performance boost using 4 buffers with flipping.
> Performance actually seemed to go down slightly, but that might have
> been just noise.
>
> Without flipping, a single back buffer is enough for swap interval 0,
> but we need to use 2 back buffers when the swap interval is non-0,
> otherwise we have to wait for the swap interval to pass before we can
> start working on the next frame. This condition was previously reversed.
>
> Cc: "12.0 11.2" <mesa-stable at lists.freedesktop.org>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97260
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>  src/loader/loader_dri3_helper.c | 15 ++++++---------
>  1 file changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/src/loader/loader_dri3_helper.c
b/src/loader/loader_dri3_helper.c
> index e9fb97b..86ae5ae 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
> @@ -68,15 +68,12 @@ dri3_fence_await(xcb_connection_t *c, struct
loader_dri3_buffer *buffer)
>  static void
>  dri3_update_num_back(struct loader_dri3_drawable *draw)
>  {
> -   draw->num_back = 1;
> -   if (draw->flipping) {
> -      if (!draw->is_pixmap &&
> -          !(draw->present_capabilities & XCB_PRESENT_CAPABILITY_ASYNC))
> -         draw->num_back++;
> -      draw->num_back++;
> -   }
> -   if (draw->vtable->get_swap_interval(draw) == 0)
> -      draw->num_back++;
> +   if (draw->flipping)
> +      draw->num_back = 3;
> +   else if (draw->vtable->get_swap_interval(draw) != 0)
> +      draw->num_back = 2;
> +   else
> +      draw->num_back = 1;
>  }
>
>  void
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160831/afe0eefd/attachment.html>


More information about the mesa-dev mailing list