On Wed, May 21, 2014 at 07:01:06PM +0300, Mika Kuoppala wrote:
> From: Mika Kuoppala <[email protected]>
> 
> 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ä <[email protected]>
> Cc: Chris Wilson <[email protected]>
> Cc: Damien Lespiau <[email protected]>
> Signed-off-by: Mika Kuoppala <[email protected]>
> Signed-off-by: Daniel Vetter <[email protected]>

Ok, merged instead of v3 with Chris' irc r-b.

Thanks, Daniel
> ---
>  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 --git a/drivers/gpu/drm/i915/i915_gem_context.c 
> b/drivers/gpu/drm/i915/i915_gem_context.c
> index f220c94..6a2d847a 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -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 */
>               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;
> -- 
> 1.7.9.5
> 
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to