All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christopher Snowhill" <chris@kode54.net>
To: "Christopher Snowhill" <chris@kode54.net>,
	"Christopher Snowhill" <kode54@gmail.com>,
	<amd-gfx@lists.freedesktop.org>
Cc: "Alex Deucher" <alexander.deucher@amd.com>,
	"Christian König" <christian.koenig@amd.com>
Subject: Re: [RFC PATCH] drm/amdgpu: Enable async flip for cursor planes
Date: Mon, 23 Jun 2025 03:46:05 -0700	[thread overview]
Message-ID: <DATUOZZD8316.2INSL3KL5RA80@kode54.net> (raw)
In-Reply-To: <DARA1U86AS72.QOIEVZWCFPYC@kode54.net>

On Fri Jun 20, 2025 at 3:10 AM PDT, Christopher Snowhill wrote:
> Here's another alternative change, which may be more thorough. It does
> seem to fix the issue, at least. The issue does indeed appear to be
> no-op plane changes sent to the cursor plane.
>
> If anyone wants to propose style changes, and suggest a proper commit
> message, if this is indeed a welcome fix for the problem, please let me
> know.
>
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index c2726af6698e..b741939698e8 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -1087,17 +1087,22 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
>  			}
>
>  			/* ask the driver if this non-primary plane is supported */
> -			if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
> -				ret = -EINVAL;
> +			else if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
> +				ret = drm_atomic_plane_get_property(plane, plane_state,
> +								    prop, &old_val);
> +
> +				if (ret || old_val != prop_value) {
> +					ret = -EINVAL;
>
> -				if (plane_funcs && plane_funcs->atomic_async_check)
> -					ret = plane_funcs->atomic_async_check(plane, state, true);
> +					if (plane_funcs && plane_funcs->atomic_async_check)
> +						ret = plane_funcs->atomic_async_check(plane, state, true);
>
> -				if (ret) {
> -					drm_dbg_atomic(prop->dev,
> -						       "[PLANE:%d:%s] does not support async flips\n",
> -						       obj->id, plane->name);
> -					break;
> +					if (ret) {
> +						drm_dbg_atomic(prop->dev,
> +							       "[PLANE:%d:%s] does not support async flips\n",
> +							       obj->id, plane->name);
> +						break;
> +					}
>  				}
>  			}
>  		}

Upon further testing and reflection, I have come to the conclusion that
this is indeed best handled by a kernel fix, rather than breaking user
space.

I attempted to work around this in wlroots, adjusting 0.18, 0.19, and
0.20 git with similar patches. First I attempted to stash all the
written properties for the atomic code, storing an initial value of all
0xFE so it was always likely to write the first time, and only setting a
property if it changed from the last commit.

This resulted in whole commits breaking for one or both framebuffers
until I ctrl-alt-fx switched to a tty and back again, and this would
work again temporarily.

So I went back to the drawing board and only withheld seemingly
duplicate plane properties. This "worked", until I attempted to play a
game, and then it started glitching spectacularly, and not updating at
all if the game was doing direct scanout and vrr.

Clearly this is wrong.

The wlroots library queues up properties for each commit. On every
commit where the cursor is disabled, it queues up both fb_id=0 and
crtc_id=0. Every commit. Is this wrong? Should it only be queueing up
the disablement properties once? It also queues up the full plane and
hotspot properties when enabled, even if the cursor doesn't change
position or appearance.

  reply	other threads:[~2025-06-23 10:51 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-19 12:55 [RFC PATCH] drm/amdgpu: Enable async flip for cursor planes Christopher Snowhill
2025-06-20  9:22 ` Christopher Snowhill
2025-06-20 10:10 ` Christopher Snowhill
2025-06-23 10:46   ` Christopher Snowhill [this message]
2025-06-23 11:06     ` Christopher Snowhill
2025-06-23 13:38       ` Christopher Snowhill
2025-06-23 15:33         ` Alex Deucher
2025-08-15 13:17           ` Alex Deucher
2025-08-15 23:21             ` Christopher Snowhill
2025-08-15 16:11         ` Leo Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DATUOZZD8316.2INSL3KL5RA80@kode54.net \
    --to=chris@kode54.net \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=kode54@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.