From: Chris Wilson <ch...@chris-wilson.co.uk>

One side-effect of the introduction of ppgtt was that we needed to
rebind the object into the appropriate vm (and global gtt in some
peculiar cases). For simplicity this was done twice for every object on
every call to execbuffer. However, that adds a tremendous amount of CPU
overhead (rewriting all the PTE for all objects into WC memory) per
draw. The fix is to push all the decision about which vm to bind into
and when down into the low-level bind routines through hints rather than
inside the execbuffer routine.

v2: Split out prep work and unrelated changes.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72906
Tested-by: jianx.z...@intel.com
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> (v1)
Cc: Ben Widawsky <benjamin.widaw...@intel.com>
Cc: Daniel Vetter <daniel.vet...@ffwll.ch>
Acked-by: Ben Widawsky <b...@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_gem.c            | 16 ++++++++++------
 drivers/gpu/drm/i915/i915_gem_execbuffer.c |  2 --
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index a3534246fbca..05e79fa02db2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3333,6 +3333,9 @@ search_free:
        WARN_ON(flags & PIN_MAPPABLE && !obj->map_and_fenceable);
 
        trace_i915_vma_bind(vma, flags);
+       vma->bind_vma(vma, obj->cache_level,
+                     flags & (PIN_MAPPABLE | PIN_GLOBAL) ? GLOBAL_BIND : 0);
+
        i915_gem_verify_gtt(dev);
        return vma;
 
@@ -3535,7 +3538,9 @@ int i915_gem_object_set_cache_level(struct 
drm_i915_gem_object *obj,
                }
 
                list_for_each_entry(vma, &obj->vma_list, vma_link)
-                       vma->bind_vma(vma, cache_level, 0);
+                       if (drm_mm_node_allocated(&vma->node))
+                               vma->bind_vma(vma, cache_level,
+                                             obj->has_global_gtt_mapping ? 
GLOBAL_BIND : 0);
        }
 
        list_for_each_entry(vma, &obj->vma_list, vma_link)
@@ -3886,22 +3891,21 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
                        ret = i915_vma_unbind(vma);
                        if (ret)
                                return ret;
+
+                       vma = NULL;
                }
        }
 
-       if (!i915_gem_obj_bound(obj, vm)) {
-
+       if (vma == NULL || !drm_mm_node_allocated(&vma->node)) {
                vma = i915_gem_object_bind_to_vm(obj, vm, alignment, flags);
                if (IS_ERR(vma))
                        return PTR_ERR(vma);
        }
 
-       vma = i915_gem_obj_to_vma(obj, vm);
-
        if (flags & PIN_GLOBAL && !obj->has_global_gtt_mapping)
                vma->bind_vma(vma, obj->cache_level, GLOBAL_BIND);
 
-       i915_gem_obj_to_vma(obj, vm)->pin_count++;
+       vma->pin_count++;
        if (flags & PIN_MAPPABLE)
                obj->pin_mappable |= true;
 
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 9399a6fa4c2f..d7229ad2bd22 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -589,8 +589,6 @@ i915_gem_execbuffer_reserve_vma(struct i915_vma *vma,
                obj->base.pending_write_domain = I915_GEM_DOMAIN_RENDER;
        }
 
-       vma->bind_vma(vma, obj->cache_level, flags);
-
        return 0;
 }
 
-- 
1.8.5.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to