diff mbox

[0980/1094] drm/i915: Add null state batch to active list

Message ID 1413889294-31328-981-git-send-email-dheerajx.s.jamwal@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dheeraj Jamwal Oct. 21, 2014, 10:59 a.m. UTC
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>

for proper refcounting to take place as we use
i915_add_request() for it.

i915_add_request() also takes the context for the request
from ring->last_context so move the null state batch
submission after the ring context has been set.

v2: we need to check for correct ring now (Ville Syrjälä)
v3: no need to expose i915_gem_move_object_to_active (Chris Wilson)
v4: cargoculted vma/active/inactive error handling removed (Chris Wilson)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
(cherry picked from commit 46470fc932ac8a0e8317a220b3f4ea4ed903338e)

Signed-off-by: Dheeraj Jamwal <dheerajx.s.jamwal@intel.com>
---
 drivers/gpu/drm/i915/i915_gem_context.c      |   16 ++++++++--------
 drivers/gpu/drm/i915/i915_gem_render_state.c |    8 ++++++--
 2 files changed, 14 insertions(+), 10 deletions(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 446863b..f01a1e0 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -699,21 +699,21 @@  static int do_switch(struct intel_ring_buffer *ring,
 		/* obj is kept alive until the next request by its active ref */
 		i915_gem_object_ggtt_unpin(from->obj);
 		i915_gem_context_unreference(from);
-	} else {
-		if (to->is_initialized == false) {
-			ret = i915_gem_render_state_init(ring);
-			if (ret)
-				DRM_ERROR("init render state: %d\n", ret);
-		}
 	}
 
-	to->is_initialized = true;
-
 done:
 	i915_gem_context_reference(to);
 	ring->last_context = to;
 	to->last_ring = ring;
 
+	if (ring->id == RCS && !to->is_initialized && from == NULL) {
+		ret = i915_gem_render_state_init(ring);
+		if (ret)
+			DRM_ERROR("init render state: %d\n", ret);
+	}
+
+	to->is_initialized = true;
+
 	return 0;
 
 unpin_out:
diff --git a/drivers/gpu/drm/i915/i915_gem_render_state.c b/drivers/gpu/drm/i915/i915_gem_render_state.c
index 392aa7b..cfbf6fc 100644
--- a/drivers/gpu/drm/i915/i915_gem_render_state.c
+++ b/drivers/gpu/drm/i915/i915_gem_render_state.c
@@ -164,9 +164,11 @@  int i915_gem_render_state_init(struct intel_ring_buffer *ring)
 	const int gen = INTEL_INFO(ring->dev)->gen;
 	struct i915_render_state *so;
 	const struct intel_renderstate_rodata *rodata;
-	u32 seqno;
 	int ret;
 
+	if (WARN_ON(ring->id != RCS))
+		return -ENOENT;
+
 	rodata = render_state_get_rodata(ring->dev, gen);
 	if (rodata == NULL)
 		return 0;
@@ -186,8 +188,10 @@  int i915_gem_render_state_init(struct intel_ring_buffer *ring)
 	if (ret)
 		goto out;
 
-	ret = i915_add_request(ring, &seqno);
+	i915_vma_move_to_active(i915_gem_obj_to_ggtt(so->obj), ring);
 
+	ret = __i915_add_request(ring, NULL, so->obj, NULL);
+	/* __i915_add_request moves object to inactive if it fails */
 out:
 	render_state_free(so);
 	return ret;