Unfortunately those seem to be a consequence of using Xrandr transforms. It’s not a problem with the great high DPI work Marco’s done all over mutter for Wayland, but it is a problem with using Xrandr. You can see exactly the same two problems on any X desktop without using the PPA. For example on my machine the monitor is known as DP-2
so I can run this in a Xorg session:
xrandr --output DP-2 --scale 1.25x1.25
and it has the same problems of windows shrinking and the screen tearing.
In theory you can work around those by:
- Modifying all common toolkits/apps to honour fractional scaling at the right time; and
- Modifying Xorg and/or common graphics drivers, or maybe even mutter, to do an explicit wait for vblank when scaling (like with glXWaitVideoSyncSGI or glXWaitForMscOML).
However even if such workarounds existed it would probably still be a bad idea for performance to use Xrandr, because:
- GPU memory usage is higher due to virtual framebuffers being larger than the physical screen resolution.
- GPU fill rate will be lower if Xorg or the driver has to recomposite every frame. This hurts general performance and power usage.
- Xrandr scaling yields subpixel rendering, which makes rendering fractional scales a little blurry compared to integer scales.
- If you did modify Xorg or mutter to do an explicit wait for vblank with fractional scaling then there’s a chance that could lead to another frame higher latency than we already have (which is already too high).
- If you did modify mutter to do an explicit wait for vblank then that’s still not going to be perfect. We did that in Compiz up until 2012 and it did still tear a little near the top of the screen. To absolutely avoid tearing you need the final kernel page flip synchronized to the monitor’s vblank (frequency and phase). If Xrandr is abstracting that last step to support fractional scaling then we can’t control it properly in mutter, it would need to be done in Xorg and/or Xorg graphics drivers.
I am loving Marco’s high DPI work in Wayland sessions but think using Xrandr for this is a mistake.