Commit fd40a63c63a1 unintentionally disallowed no-op changes on non-primary
planes that the driver doesn't allow async flips on. This broke async flips
for compositors that disable the cursor plane in every async atomic commit.
To fix that, change drm_atomic_set_property to again only run atomic_async_check
if the plane would actually be changed by the atomic commit.

Fixes: fd40a63c63a1 ("drm/atomic: Let drivers decide which planes to async 
flip")
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4263

Signed-off-by: Xaver Hugl <xaver.h...@kde.org>
Reviewed-by: André Almeida <andrealm...@igalia.com>
---
 drivers/gpu/drm/drm_atomic_uapi.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_uapi.c 
b/drivers/gpu/drm/drm_atomic_uapi.c
index c2726af6698e..317303cf5b8c 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1077,19 +1077,20 @@ int drm_atomic_set_property(struct drm_atomic_state 
*state,
                }
 
                if (async_flip) {
-                       /* check if the prop does a nop change */
-                       if ((prop != config->prop_fb_id &&
-                            prop != config->prop_in_fence_fd &&
-                            prop != config->prop_fb_damage_clips)) {
-                               ret = drm_atomic_plane_get_property(plane, 
plane_state,
-                                                                   prop, 
&old_val);
-                               ret = drm_atomic_check_prop_changes(ret, 
old_val, prop_value, prop);
-                       }
+                       /* no-op changes are always allowed */
+                       ret = drm_atomic_plane_get_property(plane, plane_state,
+                                                           prop, &old_val);
+                       ret = drm_atomic_check_prop_changes(ret, old_val, 
prop_value, prop);
 
-                       /* ask the driver if this non-primary plane is 
supported */
-                       if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
-                               ret = -EINVAL;
+                       /* fail everything that isn't no-op or a pure flip */
+                       if (ret && prop != config->prop_fb_id &&
+                           prop != config->prop_in_fence_fd &&
+                           prop != config->prop_fb_damage_clips) {
+                               break;
+                       }
 
+                       if (ret && plane->type != DRM_PLANE_TYPE_PRIMARY) {
+                               /* ask the driver if this non-primary plane is 
supported */
                                if (plane_funcs && 
plane_funcs->atomic_async_check)
                                        ret = 
plane_funcs->atomic_async_check(plane, state, true);
 
-- 
2.50.1

Reply via email to