]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
drm/i915: Track when we dirty the scanout with render commands
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 6 Jun 2013 19:53:41 +0000 (16:53 -0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 7 Jun 2013 15:56:45 +0000 (17:56 +0200)
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>
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_ringbuffer.h

index a8bb62ca8756a42f424bd20a446e38d28a79f25b..c98333d7411123f049826a6d1269347e6754f18e 100644 (file)
@@ -786,7 +786,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *objects,
                        obj->dirty = 1;
                        obj->last_write_seqno = intel_ring_get_seqno(ring);
                        if (obj->pin_count) /* check for potential scanout */
-                               intel_mark_fb_busy(obj);
+                               intel_mark_fb_busy(obj, ring);
                }
 
                trace_i915_gem_object_change_domain(obj, old_read, old_write);
index 3f025ee299dd0ffc2327978737221cf581cf84aa..7b9eb7ccc09af2e73a56c4a4778a8117476726c5 100644 (file)
@@ -7112,7 +7112,8 @@ void intel_mark_idle(struct drm_device *dev)
        }
 }
 
-void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
+void intel_mark_fb_busy(struct drm_i915_gem_object *obj,
+                       struct intel_ring_buffer *ring)
 {
        struct drm_device *dev = obj->base.dev;
        struct drm_crtc *crtc;
@@ -7124,8 +7125,12 @@ void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
                if (!crtc->fb)
                        continue;
 
-               if (to_intel_framebuffer(crtc->fb)->obj == obj)
-                       intel_increase_pllclock(crtc);
+               if (to_intel_framebuffer(crtc->fb)->obj != obj)
+                       continue;
+
+               intel_increase_pllclock(crtc);
+               if (ring && intel_fbc_enabled(dev))
+                       ring->fbc_dirty = true;
        }
 }
 
@@ -7575,7 +7580,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
                goto cleanup_pending;
 
        intel_disable_fbc(dev);
-       intel_mark_fb_busy(obj);
+       intel_mark_fb_busy(obj, NULL);
        mutex_unlock(&dev->struct_mutex);
 
        trace_i915_flip_request(intel_crtc->plane, obj);
index b76a956cfb9acf4e5e505aa1df0674ed2b199500..bb4822a6c41efee3da975a0fc76e54b2d012e254 100644 (file)
@@ -574,7 +574,8 @@ extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
 extern void intel_dvo_init(struct drm_device *dev);
 extern void intel_tv_init(struct drm_device *dev);
 extern void intel_mark_busy(struct drm_device *dev);
-extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj);
+extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj,
+                              struct intel_ring_buffer *ring);
 extern void intel_mark_idle(struct drm_device *dev);
 extern bool intel_lvds_init(struct drm_device *dev);
 extern bool intel_is_dual_link_lvds(struct drm_device *dev);
index 4c7e103e6fa4c779d2554c2f983cd8075b139865..efc403d1e3e04c90b5939a71fb184839e2d7fcc2 100644 (file)
@@ -140,6 +140,7 @@ struct  intel_ring_buffer {
         */
        u32 outstanding_lazy_request;
        bool gpu_caches_dirty;
+       bool fbc_dirty;
 
        wait_queue_head_t irq_queue;