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)
committerRaspbian kernel package updater <root@raspbian.org>
Sat, 31 Mar 2018 14:45:43 +0000 (15:45 +0100)
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>
drivers/gpu/drm/vc4/vc4_plane.c

index 881bf489478b01b34e9e4df6013fe608c42215ee..14d69bb4967dedcd3bbc475639a8c27e38662fb3 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.