In order to facilitate the concurrency offered by triple buffering and to offset the latency induced by swapping via an external process, which may incur extra rendering itself, only throttle to the previous frame and not the last. This doubles the maximum possible latency at the benefit of improving throughput and reducing jitter.
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> Cc: Daniel Vetter <daniel.vet...@ffwll.ch> Cc: Kenneth Graunke <kenn...@whitecape.org> Cc: Ben Widawsky <b...@bwidawsk.net> Cc: Kristian Høgsberg <k...@bitplanet.net> Cc: Chad Versace <chad.vers...@linux.intel.com --- src/mesa/drivers/dri/i965/brw_context.c | 19 ++++++++++++------- src/mesa/drivers/dri/i965/brw_context.h | 2 +- src/mesa/drivers/dri/i965/intel_batchbuffer.c | 7 ++++--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 2ed5f16..6897c2c 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -928,8 +928,10 @@ intelDestroyContext(__DRIcontext * driContextPriv) intel_batchbuffer_free(brw); - drm_intel_bo_unreference(brw->first_post_swapbuffers_batch); - brw->first_post_swapbuffers_batch = NULL; + drm_intel_bo_unreference(brw->first_post_swapbuffers_batch[1]); + drm_intel_bo_unreference(brw->first_post_swapbuffers_batch[0]); + brw->first_post_swapbuffers_batch[1] = NULL; + brw->first_post_swapbuffers_batch[0] = NULL; driDestroyOptionCache(&brw->optionCache); @@ -1238,11 +1240,14 @@ intel_prepare_render(struct brw_context *brw) * the swap, and getting our hands on that doesn't seem worth it, * so we just us the first batch we emitted after the last swap. */ - if (brw->need_swap_throttle && brw->first_post_swapbuffers_batch) { - if (!brw->disable_throttling) - drm_intel_bo_wait_rendering(brw->first_post_swapbuffers_batch); - drm_intel_bo_unreference(brw->first_post_swapbuffers_batch); - brw->first_post_swapbuffers_batch = NULL; + if (brw->need_swap_throttle && brw->first_post_swapbuffers_batch[0]) { + if (brw->first_post_swapbuffers_batch[1]) { + if (!brw->disable_throttling) + drm_intel_bo_wait_rendering(brw->first_post_swapbuffers_batch[1]); + drm_intel_bo_unreference(brw->first_post_swapbuffers_batch[1]); + } + brw->first_post_swapbuffers_batch[1] = brw->first_post_swapbuffers_batch[0]; + brw->first_post_swapbuffers_batch[0] = NULL; brw->need_swap_throttle = false; brw->need_front_throttle = false; } diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index b90e050..e347f26 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1030,7 +1030,7 @@ struct brw_context bool front_buffer_dirty; /** Framerate throttling: @{ */ - drm_intel_bo *first_post_swapbuffers_batch; + drm_intel_bo *first_post_swapbuffers_batch[2]; bool need_swap_throttle; bool need_front_throttle; /** @} */ diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c index 5ac4d18..460b4b9 100644 --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c @@ -168,6 +168,7 @@ static void brw_new_batch(struct brw_context *brw) { /* Create a new batchbuffer and reset the associated state: */ + drm_intel_gem_bo_clear_relocs(brw->batch.bo, 0); intel_batchbuffer_reset(brw); /* If the kernel supports hardware contexts, then most hardware state is @@ -289,9 +290,9 @@ _intel_batchbuffer_flush(struct brw_context *brw, if (brw->batch.used == 0) return 0; - if (brw->first_post_swapbuffers_batch == NULL) { - brw->first_post_swapbuffers_batch = brw->batch.bo; - drm_intel_bo_reference(brw->first_post_swapbuffers_batch); + if (brw->first_post_swapbuffers_batch[0] == NULL) { + brw->first_post_swapbuffers_batch[0] = brw->batch.bo; + drm_intel_bo_reference(brw->first_post_swapbuffers_batch[0]); } if (unlikely(INTEL_DEBUG & DEBUG_BATCH)) { -- 2.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev