diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2017-06-22 09:24:34 +0200 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2017-08-05 00:09:25 +0100 |
commit | f2a60ff20a8248aa5d8d5949e8f433c97b3a3506 (patch) | |
tree | d80de185d0e2827363166a960a27f58a1cf5754a /src | |
parent | 3c8673d42035e79da6879f7204d48abecb4b67ff (diff) |
dri3: Wait for all pending swapbuffers to be scheduled before touching the front
This implements a wait for glXWaitGL, glXCopySubBuffer, dri flush_front and
creation of fake front until all pending SwapBuffers have been committed to
hardware. Among other things this fixes piglit glx-copy-sub-buffers on dri3.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Cc: <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 185ef06fd2db782d9d3d6046580f7cece02c4797)
Diffstat (limited to 'src')
-rw-r--r-- | src/loader/loader_dri3_helper.c | 18 | ||||
-rw-r--r-- | src/loader/loader_dri3_helper.h | 3 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 1c93e7a96d3..c2ae8958120 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -504,6 +504,7 @@ loader_dri3_copy_sub_buffer(struct loader_dri3_drawable *draw, x, y, width, height, __BLIT_FLAG_FLUSH); } + loader_dri3_swapbuffer_barrier(draw); dri3_fence_reset(draw->conn, back); dri3_copy_area(draw->conn, dri3_back_buffer(draw)->pixmap, @@ -595,6 +596,7 @@ loader_dri3_wait_gl(struct loader_dri3_drawable *draw) front->height, 0, 0, front->width, front->height, __BLIT_FLAG_FLUSH); + loader_dri3_swapbuffer_barrier(draw); loader_dri3_copy_drawable(draw, draw->drawable, front->pixmap); } @@ -1258,6 +1260,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable, } break; case loader_dri3_buffer_front: + loader_dri3_swapbuffer_barrier(draw); dri3_fence_reset(draw->conn, new_buffer); dri3_copy_area(draw->conn, draw->drawable, @@ -1431,3 +1434,18 @@ loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw) free(geom_reply); } } + + +/** + * Make sure the server has flushed all pending swap buffers to hardware + * for this drawable. Ideally we'd want to send an X protocol request to + * have the server block our connection until the swaps are complete. That + * would avoid the potential round-trip here. + */ +void +loader_dri3_swapbuffer_barrier(struct loader_dri3_drawable *draw) +{ + int64_t ust, msc, sbc; + + (void) loader_dri3_wait_for_sbc(draw, 0, &ust, &msc, &sbc); +} diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h index a865e463559..659b63afa7a 100644 --- a/src/loader/loader_dri3_helper.h +++ b/src/loader/loader_dri3_helper.h @@ -241,4 +241,7 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable, void loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw); + +void +loader_dri3_swapbuffer_barrier(struct loader_dri3_drawable *draw); #endif |