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