diff options
author | Michel Dänzer <[email protected]> | 2016-08-17 17:02:04 +0900 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2016-08-25 17:40:24 +0900 |
commit | 1e3218bc5ba2b739261f0c0bacf4eb662d377236 (patch) | |
tree | df2bafb0fa4687640c7ad3c10d3b74d61014d2b9 /src/loader/loader_dri3_helper.c | |
parent | 2301705dee6324634520559b27ac6728ebb02191 (diff) |
loader/dri3: Overhaul dri3_update_num_back
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).
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" <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97260
Reviewed-by: Frank Binns <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/loader/loader_dri3_helper.c')
-rw-r--r-- | src/loader/loader_dri3_helper.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index e9fb97bfaf7..86ae5aecd5f 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 |