瀏覽代碼

drm/i915: Fix current tiling check for relaxed fencing

As we may bind an object with the correct alignment, but with an invalid
size, it may pass the current checks on whether the object may be reused
with a fence.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Chris Wilson 14 年之前
父節點
當前提交
df15315899
共有 1 個文件被更改,包括 14 次插入8 次删除
  1. 14 8
      drivers/gpu/drm/i915/i915_gem_tiling.c

+ 14 - 8
drivers/gpu/drm/i915/i915_gem_tiling.c

@@ -245,6 +245,17 @@ i915_gem_object_fence_ok(struct drm_gem_object *obj, int tiling_mode)
 	if (INTEL_INFO(obj->dev)->gen >= 4)
 		return true;
 
+	if (!obj_priv->gtt_space)
+		return true;
+
+	if (INTEL_INFO(obj->dev)->gen == 3) {
+		if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK)
+			return false;
+	} else {
+		if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK)
+			return false;
+	}
+
 	/*
 	 * Previous chips need to be aligned to the size of the smallest
 	 * fence register that can contain the object.
@@ -257,16 +268,11 @@ i915_gem_object_fence_ok(struct drm_gem_object *obj, int tiling_mode)
 	while (size < obj_priv->base.size)
 		size <<= 1;
 
-	if (obj_priv->gtt_offset & (size - 1))
+	if (obj_priv->gtt_space->size != size)
 		return false;
 
-	if (INTEL_INFO(obj->dev)->gen == 3) {
-		if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK)
-			return false;
-	} else {
-		if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK)
-			return false;
-	}
+	if (obj_priv->gtt_offset & (size - 1))
+		return false;
 
 	return true;
 }