提交 d8923dcf 编写于 作者: C Chris Wilson

drm/i915: Track display alignment on VMA

When using the aliasing ppgtt and pageflipping with the shrinker/eviction
active, we note that we often have to rebind the backbuffer before
flipping onto the scanout because it has an invalid alignment. If we
store the worst-case alignment required for a VMA, we can avoid having
to rebind at critical junctures.
Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160818161718.27187-28-chris@chris-wilson.co.uk
上级 2efb813d
...@@ -3050,7 +3050,6 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags) ...@@ -3050,7 +3050,6 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
struct drm_i915_private *dev_priv = to_i915(vma->vm->dev); struct drm_i915_private *dev_priv = to_i915(vma->vm->dev);
struct drm_i915_gem_object *obj = vma->obj; struct drm_i915_gem_object *obj = vma->obj;
u64 start, end; u64 start, end;
u64 min_alignment;
int ret; int ret;
GEM_BUG_ON(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND)); GEM_BUG_ON(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND));
...@@ -3061,17 +3060,10 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags) ...@@ -3061,17 +3060,10 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
size = i915_gem_get_ggtt_size(dev_priv, size, size = i915_gem_get_ggtt_size(dev_priv, size,
i915_gem_object_get_tiling(obj)); i915_gem_object_get_tiling(obj));
min_alignment = alignment = max(max(alignment, vma->display_alignment),
i915_gem_get_ggtt_alignment(dev_priv, size, i915_gem_get_ggtt_alignment(dev_priv, size,
i915_gem_object_get_tiling(obj), i915_gem_object_get_tiling(obj),
flags & PIN_MAPPABLE); flags & PIN_MAPPABLE));
if (alignment == 0)
alignment = min_alignment;
if (alignment & (min_alignment - 1)) {
DRM_DEBUG("Invalid object alignment requested %llu, minimum %llu\n",
alignment, min_alignment);
return -EINVAL;
}
start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0; start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0;
...@@ -3595,6 +3587,8 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, ...@@ -3595,6 +3587,8 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
if (IS_ERR(vma)) if (IS_ERR(vma))
goto err_unpin_display; goto err_unpin_display;
vma->display_alignment = max_t(u64, vma->display_alignment, alignment);
WARN_ON(obj->pin_display > i915_vma_pin_count(vma)); WARN_ON(obj->pin_display > i915_vma_pin_count(vma));
i915_gem_object_flush_cpu_write_domain(obj); i915_gem_object_flush_cpu_write_domain(obj);
...@@ -3625,7 +3619,8 @@ i915_gem_object_unpin_from_display_plane(struct i915_vma *vma) ...@@ -3625,7 +3619,8 @@ i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
if (WARN_ON(vma->obj->pin_display == 0)) if (WARN_ON(vma->obj->pin_display == 0))
return; return;
vma->obj->pin_display--; if (--vma->obj->pin_display == 0)
vma->display_alignment = 0;
i915_vma_unpin(vma); i915_vma_unpin(vma);
WARN_ON(vma->obj->pin_display > i915_vma_pin_count(vma)); WARN_ON(vma->obj->pin_display > i915_vma_pin_count(vma));
......
...@@ -184,6 +184,7 @@ struct i915_vma { ...@@ -184,6 +184,7 @@ struct i915_vma {
struct sg_table *pages; struct sg_table *pages;
void __iomem *iomap; void __iomem *iomap;
u64 size; u64 size;
u64 display_alignment;
unsigned int flags; unsigned int flags;
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册