Commit 20909284 authored by Marek Olšák's avatar Marek Olšák

st/dri: decrease input lag by syncing sooner in SwapBuffers

It's done by:
- decrease the number of frames in flight by 1
- flush before throttling in SwapBuffers
  (instead of wait-then-flush, do flush-then-wait)

The improvement is apparent with Unigine Heaven.

    draw frame 2
    wait frame 0
    flush frame 2
    present frame 2

    The input lag is 2 frames.

    draw frame 2
    flush frame 2
    wait frame 1
    present frame 2

    The input lag is 1 frame. Flushing is done before waiting, because
    otherwise the device would be idle after waiting.

Nine is affected because it also uses the pipe cap.
parent d30ce03b
......@@ -356,7 +356,7 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
return 0;
return 2;
return 1;
......@@ -562,19 +562,19 @@ dri_flush(__DRIcontext *cPriv,
* flush method returns a fence even if there are no commands to flush.
struct pipe_screen *screen = drawable->screen->base.screen;
struct pipe_fence_handle *fence;
struct pipe_fence_handle *oldest_fence, *new_fence = NULL;
fence = swap_fences_pop_front(drawable);
if (fence) {
(void) screen->fence_finish(screen, NULL, fence, PIPE_TIMEOUT_INFINITE);
screen->fence_reference(screen, &fence, NULL);
st->flush(st, flush_flags, &new_fence);
st->flush(st, flush_flags, &fence);
oldest_fence = swap_fences_pop_front(drawable);
if (oldest_fence) {
screen->fence_finish(screen, NULL, oldest_fence, PIPE_TIMEOUT_INFINITE);
screen->fence_reference(screen, &oldest_fence, NULL);
if (fence) {
swap_fences_push_back(drawable, fence);
screen->fence_reference(screen, &fence, NULL);
if (new_fence) {
swap_fences_push_back(drawable, new_fence);
screen->fence_reference(screen, &new_fence, NULL);
else if (flags & (__DRI2_FLUSH_DRAWABLE | __DRI2_FLUSH_CONTEXT)) {
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment