drm/vc4: Don't wait for vblank when updating the cursor
authorMichael Zoran <mzoran@crowfest.net>
Fri, 24 Feb 2017 01:54:31 +0000 (17:54 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 28 Feb 2017 20:49:40 +0000 (12:49 -0800)
Commonly used desktop environments such as xfce4 and gnome
on debian sid can flood the graphics drivers with cursor
updates.  Because the current implementation is waiting
for a vblank between cursor updates, this will cause the
display to hang for a long time since a typical refresh
rate is only 60Hz.

This is unnecessary and unexpected by user mode software,
so simply swap out the cursor frame buffer without waiting.

Signed-off-by: Michael Zoran <mzoran@crowfest.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
Link: http://patchwork.freedesktop.org/patch/msgid/20170224015431.24583-1-mzoran@crowfest.net
drivers/gpu/drm/vc4/vc4_plane.c

index f7a229d..110224c 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "vc4_drv.h"
 #include "vc4_regs.h"
+#include "drm_atomic.h"
 #include "drm_atomic_helper.h"
 #include "drm_fb_cma_helper.h"
 #include "drm_plane_helper.h"
@@ -769,12 +770,6 @@ vc4_update_plane(struct drm_plane *plane,
        if (!plane_state)
                goto out;
 
-       /* If we're changing the cursor contents, do that in the
-        * normal vblank-synced atomic path.
-        */
-       if (fb != plane_state->fb)
-               goto out;
-
        /* No configuring new scaling in the fast path. */
        if (crtc_w != plane_state->crtc_w ||
            crtc_h != plane_state->crtc_h ||
@@ -783,6 +778,11 @@ vc4_update_plane(struct drm_plane *plane,
                goto out;
        }
 
+       if (fb != plane_state->fb) {
+               drm_atomic_set_fb_for_plane(plane->state, fb);
+               vc4_plane_async_set_fb(plane, fb);
+       }
+
        /* Set the cursor's position on the screen.  This is the
         * expected change from the drm_mode_cursor_universal()
         * helper.