Commit b065bd21 authored by Xaver Hugl's avatar Xaver Hugl Committed by André Almeida
Browse files

drm: re-allow no-op changes on non-primary planes in async flips

Commit fd40a63c ("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: fd40a63c ("drm/atomic: Let drivers decide which planes to async flip")
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4263


Signed-off-by: default avatarXaver Hugl <xaver.hugl@kde.org>
Reviewed-by: default avatarAndré Almeida <andrealmeid@igalia.com>
Link: https://lore.kernel.org/r/20250822152849.87843-1-xaver.hugl@kde.org


[andrealmeid: fix checkpatch warning]
Signed-off-by: default avatarAndré Almeida <andrealmeid@igalia.com>
parent 3f13bcc8
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -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)) {
			/* 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);

			/* 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->type != DRM_PLANE_TYPE_PRIMARY) {
				ret = -EINVAL;

				if (plane_funcs && plane_funcs->atomic_async_check)
					ret = plane_funcs->atomic_async_check(plane, state, true);