[Mesa-dev] [PATCH 2/2] i965: Throttle to the previous frame

Chris Wilson chris at chris-wilson.co.uk
Fri Mar 6 06:56:34 PST 2015


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 <chris at chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
Cc: Kenneth Graunke <kenneth at whitecape.org>
Cc: Ben Widawsky <ben at bwidawsk.net>
Cc: Kristian Høgsberg <krh at bitplanet.net>
Cc: Chad Versace <chad.versace at 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



More information about the mesa-dev mailing list