drm/i915: Add null state batch to active list

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>
This commit is contained in:
Mika Kuoppala 2014-05-21 19:01:06 +03:00 committed by Daniel Vetter
parent d3eaf8843d
commit 46470fc932
2 changed files with 14 additions and 10 deletions

View File

@ -700,21 +700,21 @@ static int do_switch(struct intel_ring_buffer *ring,
/* obj is kept alive until the next request by its active ref */ /* obj is kept alive until the next request by its active ref */
i915_gem_object_ggtt_unpin(from->obj); i915_gem_object_ggtt_unpin(from->obj);
i915_gem_context_unreference(from); 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: done:
i915_gem_context_reference(to); i915_gem_context_reference(to);
ring->last_context = to; ring->last_context = to;
to->last_ring = ring; 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; return 0;
unpin_out: unpin_out:

View File

@ -164,9 +164,11 @@ int i915_gem_render_state_init(struct intel_ring_buffer *ring)
const int gen = INTEL_INFO(ring->dev)->gen; const int gen = INTEL_INFO(ring->dev)->gen;
struct i915_render_state *so; struct i915_render_state *so;
const struct intel_renderstate_rodata *rodata; const struct intel_renderstate_rodata *rodata;
u32 seqno;
int ret; int ret;
if (WARN_ON(ring->id != RCS))
return -ENOENT;
rodata = render_state_get_rodata(ring->dev, gen); rodata = render_state_get_rodata(ring->dev, gen);
if (rodata == NULL) if (rodata == NULL)
return 0; return 0;
@ -186,8 +188,10 @@ int i915_gem_render_state_init(struct intel_ring_buffer *ring)
if (ret) if (ret)
goto out; 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: out:
render_state_free(so); render_state_free(so);
return ret; return ret;