Revert "intel: use throttle ioctl for throttling"
authorEric Anholt <eric@anholt.net>
Mon, 25 Apr 2011 17:36:29 +0000 (10:36 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 27 Apr 2011 16:48:26 +0000 (09:48 -0700)
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
src/mesa/drivers/dri/intel/intel_context.c
src/mesa/drivers/dri/intel/intel_context.h

index 53d6e7c6acc10da141f04129e4ee1ce60f22b2e4..377989bcc149efb94463c68c0d4b5883539fc0cf 100644 (file)
@@ -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);
index 447fbe5bae1bed9fc96f74761d5dc1eb391342e6..acdf35fc71b911bdf9accbcb702da2b76a928b01 100644 (file)
@@ -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);
 
index c59119373dad80edd705ba7928d787c581fbfa95..d3a8a659caadf333d1f0ffeaa150150267b5bde0 100644 (file)
@@ -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;