[PATCH 0/6] drm: Add mouse cursor hotspot support to atomic KMS
kraxel at redhat.com
Tue Jun 7 14:30:23 UTC 2022
> Why are pointer cursors misplaced on paravirtualized drivers?
> It is because the paravirtualized drivers or VM viewers do *not* place
> the cursor plane at the CRTC_X, CRTC_Y position in the guest CRTC area.
> This is obvious: if CRTC_X, CRTC_Y were honoured, there would be no
> Instead, the VM stack plays clever tricks with cursor planes. I have
> understood only one of those tricks, and it goes something like this.
> To improve hand-eye coordination, that is to reduce the hand-to-eye
> response time a.k.a latency, the VM guest KMS driver relays the cursor
> plane separately to the VM viewer application.
Yes, the cursor is sent separately.
> The VM viewer application presents the cursor plane content by pushing
> them to the host window system as the pointer cursor.
Yes (i.e. gdk_window_set_cursor() on the host).
> This means the host window system will be autonomously moving the
> cursor plane image around, completely disregarding what the guest KMS
> client programmed into CRTC_X, CRTC_Y.
That is combined with a virtual input device sending absolute
coordinates (i.e. tablet), so mouse clicks land at the correct place.
And that is the point where having the hotspot information is essential
on the host side.
> Given this UAPI contract, it is very easy for userspace to make the
> conclusion that a cursor plane is just another plane it can use for
> whatever it wants. Weston and wlroots indeed leverage this, putting
> also normal windows and other stuff to the cursor plane when they
> happen to fit.
virtual machine display devices typically offer small (64x64) cursor
planes, so unlike the 512x512 planes I've seen offered by i915 they are
hardly usable for anything but cursors. Likewise additional overlay
planes typically not offered, so the classic primary+cursor setup is
pretty much the only reasonable option userspace has.
> I believe the solution has two parts:
> - The guest KMS driver needs to know whether the guest userspace is
> prepared for the cursor plane being commandeered. If userspace does
> not indicate it is prepared for it, commandeering must not happen.
Yes. That isn't much of a problem in practice though due to the limited
driver/device offerings outlined above.
> - Cursor hotspot needs new KMS properties, and a KMS client must set
> them if the KMS client indicates it is prepared for cursor plane
Yes, and that is what hurts in practice and thus caused the blacklists
> There are further problems with cursor plane commandeering. The 2020
> email thread Simon linked to discusses the problem of pointer devices:
> if VM guest userspace takes pointer input from multiple sources, how
> will the VM stack know which virtual input device, if any, should drive
> the cursor plane position?
Typically there is a communication path from guest to host for pointer
movements (i.e. crtc_x + crtc_y updates), so the host knows where the
guest wants the cursor plane being placed. So in case the pointer is
moved by other means (different input device, some application warping
the pointer, ...) the host can adapt.
Nevertheless behavior is not consistent here because in some cases the
feedback loop is not wired up end-to-end. The spice protocol has a
message type for that, so pointer warps work. The vnc protocol has not,
so they don't.
> To me the answer to this question seems it could be intimately tied to
> the first problem: commandeering the cursor plane is allowed only if
> guest userspace tells the guest KMS driver which input device the
> cursor plane shall be related to. If no input device is indicated,
> then commandeering must not happen.
Why require an input device? I just don't see how that would help.
For allowing the host freely move around the cursor place
("commandeering") I do see the point in enforcing that from a design
point of view, although I doubt it'll buy us much in practice given we
have broken drivers in the wild so userspace will continue to work with
Having some capability to negotiate "commandeering" between kernel and
userspace certainly makes sense, so we can get of the black lists
long-term (although it'll probably takes a few years ...).
> I can understand if people do not want to tackle this question,
> because it probably has not been a problem yet.
On a standard guest this isn't a problem indeed because there is only
one input device and only one crtc.
It actually is a problem for multihead configurations though. Having
some way to map input devices to scanouts would actually be helpful.
Years ago I checked how this works for touchscreens to see whenever it
is possible to leverage that for VMs somehow. There wasn't some obvious
way, and I forgot the details meanwhile ...
More information about the wayland-devel