diff options
author | Eric Anholt <eric@anholt.net> | 2008-05-05 14:38:04 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2008-05-05 14:38:26 -0700 |
commit | dafe48e6239a4e9b49dd87b8c70224e8eeeb6079 (patch) | |
tree | d72d9158d30e83aea6ae6429a22d1a71c01297bd /linux-core/i915_gem.c | |
parent | f0bc796a028dc7c6281d3d0cb2deef9df37e380a (diff) |
GEM: Replace drm_memrange_for_each with just evicting what we brought in.
I was wrong about how the data structure worked, and didn't care to fix it
to support debugging code.
Diffstat (limited to 'linux-core/i915_gem.c')
-rw-r--r-- | linux-core/i915_gem.c | 49 |
1 files changed, 15 insertions, 34 deletions
diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c index a1ce139b..919f32d7 100644 --- a/linux-core/i915_gem.c +++ b/linux-core/i915_gem.c @@ -288,45 +288,17 @@ i915_gem_reloc_and_validate_object(struct drm_gem_object *obj, } static int -evict_callback(struct drm_memrange_node *node, void *data) -{ - struct drm_gem_object *obj; - struct drm_i915_gem_object *obj_priv; - - DRM_INFO ("evict node %p\n", node); - - obj = node->private; - DRM_INFO ("evict obj %p\n", obj); - - obj_priv = obj->driver_private; - DRM_INFO ("evict priv %p\n", obj_priv); - - DRM_INFO ("pin_count %d\n", obj_priv->pin_count); - if (obj_priv->pin_count == 0) - i915_gem_object_unbind(obj); - - return 0; -} - -static int -i915_gem_sync_and_evict(struct drm_device *dev) +i915_gem_sync(struct drm_device *dev) { drm_i915_private_t *dev_priv = dev->dev_private; - int ret; RING_LOCALS; BEGIN_LP_RING(2); OUT_RING(CMD_MI_FLUSH | MI_READ_FLUSH | MI_EXE_FLUSH); OUT_RING(0); /* noop */ ADVANCE_LP_RING(); - ret = i915_quiescent(dev); - if (ret != 0) - return ret; - - /* Evict everything so we have space for sure. */ - drm_memrange_for_each(&dev_priv->mm.gtt_space, evict_callback, NULL); - return 0; + return i915_quiescent(dev); } static int @@ -410,9 +382,9 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, /* Big hammer: flush and idle the hardware so we can map things in/out. */ - ret = i915_gem_sync_and_evict(dev); + ret = i915_gem_sync(dev); if (ret != 0) { - DRM_ERROR ("i915_gem_sync_and_evict failed %d\n", ret); + DRM_ERROR ("i915_gem_sync failed %d\n", ret); return ret; } @@ -477,9 +449,18 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, args->buffer_count, ret); /* Clean up and return */ - ret = i915_gem_sync_and_evict(dev); + ret = i915_gem_sync(dev); if (ret) - DRM_ERROR ("failed to sync/evict buffers %d\n", ret); + DRM_ERROR ("failed to sync %d\n", ret); + + /* Evict all the buffers we moved in, leaving room for the next guy. */ + for (i = 0; i < args->buffer_count; i++) { + struct drm_gem_object *obj = object_list[i]; + struct drm_i915_gem_object *obj_priv = obj->driver_private; + + if (obj_priv->pin_count == 0) + i915_gem_object_unbind(obj); + } err: if (object_list != NULL) { for (i = 0; i < args->buffer_count; i++) |