diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-06-06 15:53:41 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-07 11:56:45 -0400 |
commit | c65355bbefaf02d8819a810aacfd566634e3b146 (patch) | |
tree | da8996a7a3f740d720cf0213f5b03ffcb1bbb3b8 | |
parent | 0e088b8f33dab39bd8beb0c7a030d44beb936dd0 (diff) |
drm/i915: Track when we dirty the scanout with render commands
This is required for tracking render damage for use with FBC and will be
used in subsequent patches.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 1 |
4 files changed, 13 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index a8bb62ca8756..c98333d74111 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -786,7 +786,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *objects, | |||
786 | obj->dirty = 1; | 786 | obj->dirty = 1; |
787 | obj->last_write_seqno = intel_ring_get_seqno(ring); | 787 | obj->last_write_seqno = intel_ring_get_seqno(ring); |
788 | if (obj->pin_count) /* check for potential scanout */ | 788 | if (obj->pin_count) /* check for potential scanout */ |
789 | intel_mark_fb_busy(obj); | 789 | intel_mark_fb_busy(obj, ring); |
790 | } | 790 | } |
791 | 791 | ||
792 | trace_i915_gem_object_change_domain(obj, old_read, old_write); | 792 | trace_i915_gem_object_change_domain(obj, old_read, old_write); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3f025ee299dd..7b9eb7ccc09a 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7112,7 +7112,8 @@ void intel_mark_idle(struct drm_device *dev) | |||
7112 | } | 7112 | } |
7113 | } | 7113 | } |
7114 | 7114 | ||
7115 | void intel_mark_fb_busy(struct drm_i915_gem_object *obj) | 7115 | void intel_mark_fb_busy(struct drm_i915_gem_object *obj, |
7116 | struct intel_ring_buffer *ring) | ||
7116 | { | 7117 | { |
7117 | struct drm_device *dev = obj->base.dev; | 7118 | struct drm_device *dev = obj->base.dev; |
7118 | struct drm_crtc *crtc; | 7119 | struct drm_crtc *crtc; |
@@ -7124,8 +7125,12 @@ void intel_mark_fb_busy(struct drm_i915_gem_object *obj) | |||
7124 | if (!crtc->fb) | 7125 | if (!crtc->fb) |
7125 | continue; | 7126 | continue; |
7126 | 7127 | ||
7127 | if (to_intel_framebuffer(crtc->fb)->obj == obj) | 7128 | if (to_intel_framebuffer(crtc->fb)->obj != obj) |
7128 | intel_increase_pllclock(crtc); | 7129 | continue; |
7130 | |||
7131 | intel_increase_pllclock(crtc); | ||
7132 | if (ring && intel_fbc_enabled(dev)) | ||
7133 | ring->fbc_dirty = true; | ||
7129 | } | 7134 | } |
7130 | } | 7135 | } |
7131 | 7136 | ||
@@ -7575,7 +7580,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
7575 | goto cleanup_pending; | 7580 | goto cleanup_pending; |
7576 | 7581 | ||
7577 | intel_disable_fbc(dev); | 7582 | intel_disable_fbc(dev); |
7578 | intel_mark_fb_busy(obj); | 7583 | intel_mark_fb_busy(obj, NULL); |
7579 | mutex_unlock(&dev->struct_mutex); | 7584 | mutex_unlock(&dev->struct_mutex); |
7580 | 7585 | ||
7581 | trace_i915_flip_request(intel_crtc->plane, obj); | 7586 | trace_i915_flip_request(intel_crtc->plane, obj); |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index b76a956cfb9a..bb4822a6c41e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -574,7 +574,8 @@ extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, | |||
574 | extern void intel_dvo_init(struct drm_device *dev); | 574 | extern void intel_dvo_init(struct drm_device *dev); |
575 | extern void intel_tv_init(struct drm_device *dev); | 575 | extern void intel_tv_init(struct drm_device *dev); |
576 | extern void intel_mark_busy(struct drm_device *dev); | 576 | extern void intel_mark_busy(struct drm_device *dev); |
577 | extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj); | 577 | extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj, |
578 | struct intel_ring_buffer *ring); | ||
578 | extern void intel_mark_idle(struct drm_device *dev); | 579 | extern void intel_mark_idle(struct drm_device *dev); |
579 | extern bool intel_lvds_init(struct drm_device *dev); | 580 | extern bool intel_lvds_init(struct drm_device *dev); |
580 | extern bool intel_is_dual_link_lvds(struct drm_device *dev); | 581 | extern bool intel_is_dual_link_lvds(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 4c7e103e6fa4..efc403d1e3e0 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -140,6 +140,7 @@ struct intel_ring_buffer { | |||
140 | */ | 140 | */ |
141 | u32 outstanding_lazy_request; | 141 | u32 outstanding_lazy_request; |
142 | bool gpu_caches_dirty; | 142 | bool gpu_caches_dirty; |
143 | bool fbc_dirty; | ||
143 | 144 | ||
144 | wait_queue_head_t irq_queue; | 145 | wait_queue_head_t irq_queue; |
145 | 146 | ||