diff mbox

[04/15] drm/i915: only one interrupt per batchbuffer is not enough!

Message ID 1268323140-12006-5-git-send-email-daniel.vetter@ffwll.ch (mailing list archive)
State Deferred, archived
Headers show

Commit Message

Daniel Vetter March 11, 2010, 3:58 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8f69a9c..9c147ab 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -564,6 +564,11 @@  typedef struct drm_i915_private {
 		uint32_t next_gem_seqno;
 
 		/**
+		 * Do we have some not yet emitted requests outstanding?
+		 */
+		int outstanding_lazy_request;
+
+		/**
 		 * Waiting sequence number, if any
 		 */
 		uint32_t waiting_gem_seqno;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 4c84b87..f46f1df 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1490,6 +1490,8 @@  i915_gem_next_request_seqno(struct drm_device *dev)
 {
 	drm_i915_private_t *dev_priv = dev->dev_private;
 
+	dev_priv->mm.outstanding_lazy_request = 1;
+
 	return dev_priv->mm.next_gem_seqno;
 }
 
@@ -3549,7 +3551,7 @@  i915_dispatch_gem_execbuffer(struct drm_device *dev,
 			OUT_RING(MI_BATCH_BUFFER);
 			OUT_RING(exec_start | MI_BATCH_NON_SECURE);
 			OUT_RING(exec_start + exec_len - 4);
-			OUT_RING(0);
+			OUT_RING(MI_NOOP);
 			ADVANCE_LP_RING();
 		} else {
 			BEGIN_LP_RING(2);
@@ -3946,8 +3948,12 @@  i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 		i915_gem_flush(dev,
 			       dev->invalidate_domains,
 			       dev->flush_domains);
-		if (dev->flush_domains & I915_GEM_GPU_DOMAINS)
-			(void)i915_add_request(dev, file_priv, 0);
+	}
+
+	/* Dropping this regresses xrender preformance! */
+	if (dev_priv->mm.outstanding_lazy_request) {
+		i915_add_request(dev, file_priv);
+		dev_priv->mm.outstanding_lazy_request = 0;
 	}
 
 	for (i = 0; i < args->buffer_count; i++) {
@@ -4857,6 +4863,7 @@  i915_gem_load(struct drm_device *dev)
 	INIT_DELAYED_WORK(&dev_priv->mm.retire_work,
 			  i915_gem_retire_work_handler);
 	dev_priv->mm.next_gem_seqno = 1;
+	dev_priv->mm.outstanding_lazy_request = 0;
 
 	spin_lock(&shrink_list_lock);
 	list_add(&dev_priv->mm.shrink_list, &shrink_list);