diff mbox

[3/5] drm/i915: use PIPE_CONTROL to retire commands

Message ID 1271875166-13084-4-git-send-email-jbarnes@virtuousgeek.org (mailing list archive)
State Deferred, archived
Headers show

Commit Message

Jesse Barnes April 21, 2010, 6:39 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index e7fc200..21bfaae 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1707,17 +1707,26 @@  static uint32_t
 i915_retire_commands(struct drm_device *dev)
 {
 	drm_i915_private_t *dev_priv = dev->dev_private;
-	uint32_t cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
 	uint32_t flush_domains = 0;
 	RING_LOCALS;
 
-	/* The sampler always gets flushed on i965 (sigh) */
-	if (IS_I965G(dev))
-		flush_domains |= I915_GEM_DOMAIN_SAMPLER;
-	BEGIN_LP_RING(2);
-	OUT_RING(cmd);
-	OUT_RING(0); /* noop */
-	ADVANCE_LP_RING();
+	if (HAS_PIPE_CONTROL(dev)) {
+		/* PIPE_CONTROL flushes sampler & vertex by default on 965*/
+		if (!(IS_G4X(dev) || IS_IRONLAKE(dev)))
+			flush_domains |= I915_GEM_DOMAIN_SAMPLER |
+				I915_GEM_DOMAIN_VERTEX	;
+		BEGIN_LP_RING(4);
+		OUT_RING(GFX_OP_PIPE_CONTROL);
+		OUT_RING(0); /* unused addr */
+		OUT_RING(0); /* unused data */
+		OUT_RING(0); /* unused data */
+		ADVANCE_LP_RING();
+	} else {
+		BEGIN_LP_RING(2);
+		OUT_RING(MI_FLUSH | MI_NO_WRITE_FLUSH);
+		OUT_RING(0); /* noop */
+		ADVANCE_LP_RING();
+	}
 	return flush_domains;
 }