Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8923dcf authored by Chris Wilson's avatar Chris Wilson
Browse files

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160818161718.27187-28-chris@chris-wilson.co.uk
parent 2efb813d
Loading
Loading
Loading
Loading
+8 −13
Original line number Diff line number Diff line
@@ -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_gem_object *obj = vma->obj;
	u64 start, end;
	u64 min_alignment;
	int ret;

	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)
		size = i915_gem_get_ggtt_size(dev_priv, size,
					      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_object_get_tiling(obj),
					    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;
	}
						    flags & PIN_MAPPABLE));

	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,
	if (IS_ERR(vma))
		goto err_unpin_display;

	vma->display_alignment = max_t(u64, vma->display_alignment, alignment);

	WARN_ON(obj->pin_display > i915_vma_pin_count(vma));

	i915_gem_object_flush_cpu_write_domain(obj);
@@ -3625,7 +3619,8 @@ i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
	if (WARN_ON(vma->obj->pin_display == 0))
		return;

	vma->obj->pin_display--;
	if (--vma->obj->pin_display == 0)
		vma->display_alignment = 0;

	i915_vma_unpin(vma);
	WARN_ON(vma->obj->pin_display > i915_vma_pin_count(vma));
+1 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ struct i915_vma {
	struct sg_table *pages;
	void __iomem *iomap;
	u64 size;
	u64 display_alignment;

	unsigned int flags;
	/**