• Daniel Vetter's avatar
    drm/i915: Only bind each object rather than for every execbuffer · 8ea99c92
    Daniel Vetter authored
    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
    performing the bind unconditionally in the execbuffer routine.
    
    Note that this is a regression introduced in the full ppgtt feature
    branch, before this we've only done re-bound objects when the relevant
    has_(aliasing_ppgtt|global_gtt)_mapping flag was clear. But since
    that's per-object and not per-vma that optimization broke.
    
    v2: Split out prep work and unrelated changes.
    
    v3: Bring back functional change around PIN_GLOBAL that I've
    accidentally split out.
    
    v4: Remove the temporary hack for the old binding logic to avoid
    bisection issues.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72906
    Tested-by: jianx.zhou@intel.com
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> (v1)
    Cc: Ben Widawsky <benjamin.widawsky@intel.com>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Acked-by: default avatarBen Widawsky <ben@bwidawsk.net>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    8ea99c92
i915_gem.c 127 KB