diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-12-02 04:42:56 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-12-02 05:00:15 -0500 |
commit | 87ca9c8a7ea9c8c7ce1561edaad1aa8570f1a01e (patch) | |
tree | 727e90b080110273a51dc629c0db6ac482a69489 | |
parent | 257e48f1474a1f5bfa6fcafb12f77a8479063293 (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.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 1 |
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); |