[Intel-gfx] [PATCH] drm/i915: report all active objects as busy
Daniel Vetter
daniel at ffwll.ch
Wed Aug 4 20:57:26 CEST 2010
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.vetter at ffwll.ch>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc : Daniel Vetter <daniel.vetter at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48
More information about the Intel-gfx
mailing list