[Intel-gfx] [PATCH] drm/i915: Call drm_handle_vblank() after processing pending pageflips
Rodrigo Vivi
rodrigo.vivi at gmail.com
Sat Sep 29 02:57:22 CEST 2012
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>
On Fri, Sep 28, 2012 at 8:25 AM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> When we process a pageflip completion, we append an event to the vblank
> queue. That queue is processed by drm_handle_vblank() and so by calling
> drm_handle_vblank() prior to processing the pageflips, we incur an extra
> frame of latency in reporting the flip event.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_irq.c | 22 ++++++++++------------
> 1 file changed, 10 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 6361276..e18e56b 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -564,13 +564,12 @@ static irqreturn_t valleyview_irq_handler(DRM_IRQ_ARGS)
> spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
>
> for_each_pipe(pipe) {
> - if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS)
> - drm_handle_vblank(dev, pipe);
> -
> if (pipe_stats[pipe] & PLANE_FLIPDONE_INT_STATUS_VLV) {
> intel_prepare_page_flip(dev, pipe);
> intel_finish_page_flip(dev, pipe);
> }
> + if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS)
> + drm_handle_vblank(dev, pipe);
> }
>
> /* Consume port. Then clear IIR or we'll miss events */
> @@ -2220,22 +2219,22 @@ static irqreturn_t i8xx_irq_handler(DRM_IRQ_ARGS)
> if (iir & I915_USER_INTERRUPT)
> notify_ring(dev, &dev_priv->ring[RCS]);
>
> - if (pipe_stats[0] & PIPE_VBLANK_INTERRUPT_STATUS &&
> - drm_handle_vblank(dev, 0)) {
> + if (pipe_stats[0] & PIPE_VBLANK_INTERRUPT_STATUS) {
> if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
> intel_prepare_page_flip(dev, 0);
> intel_finish_page_flip(dev, 0);
> flip_mask &= ~I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT;
> }
> + drm_handle_vblank(dev, 0);
> }
>
> - if (pipe_stats[1] & PIPE_VBLANK_INTERRUPT_STATUS &&
> - drm_handle_vblank(dev, 1)) {
> + if (pipe_stats[1] & PIPE_VBLANK_INTERRUPT_STATUS) {
> if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) {
> intel_prepare_page_flip(dev, 1);
> intel_finish_page_flip(dev, 1);
> flip_mask &= ~I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
> }
> + drm_handle_vblank(dev, 1);
> }
>
> iir = new_iir;
> @@ -2418,13 +2417,13 @@ static irqreturn_t i915_irq_handler(DRM_IRQ_ARGS)
> int plane = pipe;
> if (IS_MOBILE(dev))
> plane = !plane;
> - if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS &&
> - drm_handle_vblank(dev, pipe)) {
> + if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS) {
> if (iir & flip[plane]) {
> intel_prepare_page_flip(dev, plane);
> intel_finish_page_flip(dev, pipe);
> flip_mask &= ~flip[plane];
> }
> + drm_handle_vblank(dev, pipe);
> }
>
> if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
> @@ -2662,17 +2661,16 @@ static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
> intel_prepare_page_flip(dev, 1);
>
> for_each_pipe(pipe) {
> - if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS &&
> - drm_handle_vblank(dev, pipe)) {
> + if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS) {
> i915_pageflip_stall_check(dev, pipe);
> intel_finish_page_flip(dev, pipe);
> + drm_handle_vblank(dev, pipe);
> }
>
> if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
> blc_event = true;
> }
>
> -
> if (blc_event || (iir & I915_ASLE_INTERRUPT))
> intel_opregion_asle_intr(dev);
>
> --
> 1.7.10.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
More information about the Intel-gfx
mailing list