浏览代码

drm/i915/execbuffer: Clear domains before beginning reloc processing

After reordering the sequence of relocating objects, commit 6fe4f1404,
we can no longer rely on seeing all reloc targets prior to performing
the relocation. As a result we were ignoring the need to flush objects
from the render cache and invalidate the sampler caches, resulting in
rendering glitches. So we need to clear the relocation domains earlier.

Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Tested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Chris Wilson 14 年之前
父节点
当前提交
595dad76a0
共有 1 个文件被更改,包括 3 次插入4 次删除
  1. 3 4
      drivers/gpu/drm/i915/i915_gem_execbuffer.c

+ 3 - 4
drivers/gpu/drm/i915/i915_gem_execbuffer.c

@@ -464,8 +464,6 @@ i915_gem_execbuffer_relocate(struct drm_device *dev,
 	int ret;
 	int ret;
 
 
 	list_for_each_entry(obj, objects, exec_list) {
 	list_for_each_entry(obj, objects, exec_list) {
-		obj->base.pending_read_domains = 0;
-		obj->base.pending_write_domain = 0;
 		ret = i915_gem_execbuffer_relocate_object(obj, eb);
 		ret = i915_gem_execbuffer_relocate_object(obj, eb);
 		if (ret)
 		if (ret)
 			return ret;
 			return ret;
@@ -505,6 +503,9 @@ i915_gem_execbuffer_reserve(struct intel_ring_buffer *ring,
 			list_move(&obj->exec_list, &ordered_objects);
 			list_move(&obj->exec_list, &ordered_objects);
 		else
 		else
 			list_move_tail(&obj->exec_list, &ordered_objects);
 			list_move_tail(&obj->exec_list, &ordered_objects);
+
+		obj->base.pending_read_domains = 0;
+		obj->base.pending_write_domain = 0;
 	}
 	}
 	list_splice(&ordered_objects, objects);
 	list_splice(&ordered_objects, objects);
 
 
@@ -712,8 +713,6 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
 
 
 	list_for_each_entry(obj, objects, exec_list) {
 	list_for_each_entry(obj, objects, exec_list) {
 		int offset = obj->exec_entry - exec;
 		int offset = obj->exec_entry - exec;
-		obj->base.pending_read_domains = 0;
-		obj->base.pending_write_domain = 0;
 		ret = i915_gem_execbuffer_relocate_object_slow(obj, eb,
 		ret = i915_gem_execbuffer_relocate_object_slow(obj, eb,
 							       reloc + reloc_offset[offset]);
 							       reloc + reloc_offset[offset]);
 		if (ret)
 		if (ret)