Mesa (master): Revert "intel: use throttle ioctl for throttling"

Eric Anholt anholt at kemper.freedesktop.org
Wed Apr 27 09:58:45 PDT 2011


Module: Mesa
Branch: master
Commit: aa3e1c25d3e4fc7e79236c717deaa838182e68c9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=aa3e1c25d3e4fc7e79236c717deaa838182e68c9

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Apr 25 10:36:29 2011 -0700

Revert "intel: use throttle ioctl for throttling"

This reverts commit 50ade6ea697953bb17e3ca7210515fbd0411cd1e.

Fixes jerky rendering again on apps that don't block on the GPU per
frame and are GPU bound (e.g. 3DMMES on Ironlake).  The whole point of
this complicated throttle scheme is to wait on frame n-1 to have
started rendering before starting frame n's rendering.  Otherwise, the
GPU-bound app will race ahead and call the GL to draw many
nearly-identical frames, then >0ms later get stuck waiting for them
(all dispatched at about the same time) to retire, then render a new
batch of nearly-identical frames.

---

 src/mesa/drivers/dri/intel/intel_batchbuffer.c |    5 +++++
 src/mesa/drivers/dri/intel/intel_context.c     |   10 +++++++---
 src/mesa/drivers/dri/intel/intel_context.h     |    1 +
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c
index 53d6e7c..377989b 100644
--- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c
@@ -128,6 +128,11 @@ _intel_batchbuffer_flush(struct intel_context *intel,
    if (intel->batch.used == 0)
       return;
 
+   if (intel->first_post_swapbuffers_batch == NULL) {
+      intel->first_post_swapbuffers_batch = intel->batch.bo;
+      drm_intel_bo_reference(intel->first_post_swapbuffers_batch);
+   }
+
    if (unlikely(INTEL_DEBUG & DEBUG_BATCH))
       fprintf(stderr, "%s:%d: Batchbuffer flush with %db used\n", file, line,
 	      4*intel->batch.used);
diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
index 447fbe5..acdf35f 100644
--- a/src/mesa/drivers/dri/intel/intel_context.c
+++ b/src/mesa/drivers/dri/intel/intel_context.c
@@ -466,9 +466,11 @@ intel_prepare_render(struct intel_context *intel)
     * 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 (intel->need_throttle) {
-       drmCommandNone(intel->driFd, DRM_I915_GEM_THROTTLE);
-       intel->need_throttle = GL_FALSE;
+   if (intel->need_throttle && intel->first_post_swapbuffers_batch) {
+      drm_intel_bo_wait_rendering(intel->first_post_swapbuffers_batch);
+      drm_intel_bo_unreference(intel->first_post_swapbuffers_batch);
+      intel->first_post_swapbuffers_batch = NULL;
+      intel->need_throttle = GL_FALSE;
    }
 }
 
@@ -938,6 +940,8 @@ intelDestroyContext(__DRIcontext * driContextPriv)
       intel->prim.vb = NULL;
       drm_intel_bo_unreference(intel->prim.vb_bo);
       intel->prim.vb_bo = NULL;
+      drm_intel_bo_unreference(intel->first_post_swapbuffers_batch);
+      intel->first_post_swapbuffers_batch = NULL;
 
       driDestroyOptionCache(&intel->optionCache);
 
diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h
index c591193..d3a8a65 100644
--- a/src/mesa/drivers/dri/intel/intel_context.h
+++ b/src/mesa/drivers/dri/intel/intel_context.h
@@ -182,6 +182,7 @@ struct intel_context
       bool is_blit;
    } batch;
 
+   drm_intel_bo *first_post_swapbuffers_batch;
    GLboolean need_throttle;
    GLboolean no_batch_wrap;
 



More information about the mesa-commit mailing list