On Wed, Aug 04, 2010 at 03:36:30PM +0100, Chris Wilson wrote:
> Incorporates a similar patch by Daniel Vetter, the alteration being to
> report the current busy state after retiring.
Woot, nice idea to exactly preserve the semantics of the old
implementation.

/me bangs the head against the wall for not coming up with this myself

Reviewed-by: Daniel Vetter <daniel.vet...@ffwll.ch>

> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> Cc : Daniel Vetter <daniel.vet...@ffwll.ch>
> ---
>  drivers/gpu/drm/i915/i915_gem.c |   40 +++++++++++++++++++++++++-------------
>  1 files changed, 26 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index f599d77..909e727 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -4163,22 +4163,34 @@ i915_gem_busy_ioctl(struct drm_device *dev, void 
> *data,
>       }
>  
>       mutex_lock(&dev->struct_mutex);
> -     /* Update the active list for the hardware's current position.
> -      * Otherwise this only updates on a delayed timer or when irqs are
> -      * actually unmasked, and our working set ends up being larger than
> -      * required.
> -      */
> -     i915_gem_retire_requests(dev);
>  
> -     obj_priv = to_intel_bo(obj);
> -     /* Don't count being on the flushing list against the object being
> -      * done.  Otherwise, a buffer left on the flushing list but not getting
> -      * flushed (because nobody's flushing that domain) won't ever return
> -      * unbusy and get reused by libdrm's bo cache.  The other expected
> -      * consumer of this interface, OpenGL's occlusion queries, also specs
> -      * that the objects get unbusy "eventually" without any interference.
> +     /* Count all active objects as busy, even if they are currently not used
> +      * by the gpu. Users of this interface expect objects to eventually
> +      * become non-busy without any further actions, therefore emit any
> +      * necessary flushes here.
>        */
> -     args->busy = obj_priv->active && obj_priv->last_rendering_seqno != 0;
> +     obj_priv = to_intel_bo(obj);
> +     args->busy = obj_priv->active;
> +     if (args->busy) {
> +             /* Unconditionally flush objects, even when the gpu still uses 
> this
> +              * object. Userspace calling this function indicates that it 
> wants to
> +              * use this buffer rather sooner than later, so issuing the 
> required
> +              * flush earlier is beneficial.
> +              */
> +             if (obj->write_domain) {
> +                     i915_gem_flush(dev, 0, obj->write_domain);
> +                     (void)i915_add_request(dev, file_priv, 
> obj->write_domain, obj_priv->ring);
> +             }
> +
> +             /* Update the active list for the hardware's current position.
> +              * Otherwise this only updates on a delayed timer or when irqs
> +              * are actually unmasked, and our working set ends up being
> +              * larger than required.
> +              */
> +             i915_gem_retire_requests_ring(dev, obj_priv->ring);
> +
> +             args->busy = obj_priv->active;
> +     }
>  
>       drm_gem_object_unreference(obj);
>       mutex_unlock(&dev->struct_mutex);
> -- 
> 1.7.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Mail: dan...@ffwll.ch
Mobile: +41 (0)79 365 57 48
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to