]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm: re-allow no-op changes on non-primary planes in async flips
authorXaver Hugl <xaver.hugl@kde.org>
Fri, 22 Aug 2025 15:28:49 +0000 (17:28 +0200)
committerAndré Almeida <andrealmeid@igalia.com>
Fri, 22 Aug 2025 17:31:21 +0000 (14:31 -0300)
Commit fd40a63c63a1 ("drm/atomic: Let drivers decide which planes to
async flip") 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.hugl@kde.org>
Reviewed-by: André Almeida <andrealmeid@igalia.com>
Link: https://lore.kernel.org/r/20250822152849.87843-1-xaver.hugl@kde.org
[andrealmeid: fix checkpatch warning]
Signed-off-by: André Almeida <andrealmeid@igalia.com>
drivers/gpu/drm/drm_atomic_uapi.c

index ecc73d52bfae41a7ef455a7e13649ec56c690b90..85dbdaa4a2e25878c953b9b41539c8566d55c6d9 100644 (file)
@@ -1078,19 +1078,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);