On Aug 19, 2016 12:07 AM, "Michel Dänzer" <mic...@daenzer.net> wrote: > > From: Michel Dänzer <michel.daen...@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-sta...@lists.freedesktop.org> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97260 > Signed-off-by: Michel Dänzer <michel.daen...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev