aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-12-02 04:42:56 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2010-12-02 05:00:15 -0500
commit87ca9c8a7ea9c8c7ce1561edaad1aa8570f1a01e (patch)
tree727e90b080110273a51dc629c0db6ac482a69489
parent257e48f1474a1f5bfa6fcafb12f77a8479063293 (diff)
drm/i915: Prevent stalling for a GTT read back from a read-only GPU target
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h6
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c9
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c1
3 files changed, 13 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 590d8f2d0958..7b37c198cb19 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -729,6 +729,12 @@ struct drm_i915_gem_object {
729 unsigned int dirty : 1; 729 unsigned int dirty : 1;
730 730
731 /** 731 /**
732 * This is set if the object has been written to since the last
733 * GPU flush.
734 */
735 unsigned int pending_gpu_write : 1;
736
737 /**
732 * Fence register bits (if any) for this object. Will be set 738 * Fence register bits (if any) for this object. Will be set
733 * as needed when mapped into the GTT. 739 * as needed when mapped into the GTT.
734 * Protected by dev->struct_mutex. 740 * Protected by dev->struct_mutex.
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index eae52de75a4c..c3e6d7bda6e1 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1643,6 +1643,7 @@ i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
1643 obj->last_fenced_ring = NULL; 1643 obj->last_fenced_ring = NULL;
1644 1644
1645 obj->active = 0; 1645 obj->active = 0;
1646 obj->pending_gpu_write = false;
1646 drm_gem_object_unreference(&obj->base); 1647 drm_gem_object_unreference(&obj->base);
1647 1648
1648 WARN_ON(i915_verify_lists(dev)); 1649 WARN_ON(i915_verify_lists(dev));
@@ -2810,9 +2811,11 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
2810 return -EINVAL; 2811 return -EINVAL;
2811 2812
2812 i915_gem_object_flush_gpu_write_domain(obj); 2813 i915_gem_object_flush_gpu_write_domain(obj);
2813 ret = i915_gem_object_wait_rendering(obj, true); 2814 if (obj->pending_gpu_write || write) {
2814 if (ret) 2815 ret = i915_gem_object_wait_rendering(obj, true);
2815 return ret; 2816 if (ret)
2817 return ret;
2818 }
2816 2819
2817 i915_gem_object_flush_cpu_write_domain(obj); 2820 i915_gem_object_flush_cpu_write_domain(obj);
2818 2821
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index f57536a70a3a..af01a58a643b 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -775,6 +775,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *objects,
775 i915_gem_object_move_to_active(obj, ring); 775 i915_gem_object_move_to_active(obj, ring);
776 if (obj->base.write_domain) { 776 if (obj->base.write_domain) {
777 obj->dirty = 1; 777 obj->dirty = 1;
778 obj->pending_gpu_write = true;
778 list_move_tail(&obj->gpu_write_list, 779 list_move_tail(&obj->gpu_write_list,
779 &ring->gpu_write_list); 780 &ring->gpu_write_list);
780 intel_mark_busy(ring->dev, obj); 781 intel_mark_busy(ring->dev, obj);