Created attachment 136500 [details]
After a kernel upgrade to 4.12, moving the mouse in some games under wine (namely Mount & Blade Warband and Supreme Commander) causes the mouse cursor to flicker and video performance to drop considerably (the screen remains frozen while the mouse is moving), as well as cause some CPU load. Bisecting led to a commit a5509abda48e:
commit a5509abda48ecfc133fac6268e83fc1a93dba039 (refs/bisect/bad)
Author: Ville Syrjälä <email@example.com>
Date: Fri Feb 17 17:01:59 2017 +0200
drm/i915: Fix legacy cursor vs. watermarks for ILK-BDW
Steps to reproduce:
1. Install wine (tested with wine staging 2.19)
2. Install one of mentioned games (I only tested retail versions, but Mount & Blade Warband demo might exhibit similar issues)
3. Move the mouse around after the game loads
Mouse moves without flickers or performance issues.
Mouse flickers, CPU load is increased. The screen is frozen until the mouse stops moving.
My laptop has an optimus setup with an integrated Intel and discrete Nvidia card. During tests I did not load the nvidia or the bbswitch driver and tested with the integrated card only.
Created attachment 136501 [details]
kernel config used for bisecting
Hello Igor, could you try this branch https://cgit.freedesktop.org/drm-tip and attach dmesg with debug info, drm.debug=0x1e on grub? Thank you.
Ville, could you give a quick look at this? Thank you.
I tried the drm-tip kernel, the issue is still there although less pronounced (still heavy cursor flicker, but freezing turned into stuttering).
Created attachment 136534 [details]
dmesg with drm.debug=0x1e and drm-tip kernel
Looks like a bug/feature of the game (or maybe wine) that it actually keeps turning the cursor off and on all the time. That causes us to drop off the unthrottled cursor fastpath. No idea why the game/wine does that. Can't imagine anyone wants to look at a randomly flickering cursor for length of time.
The following hack in wine will eliminate the problem, but it would also leave a stale cursor on screen if the game actually wants to turn the cursor off:
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 186899fb16..9aaa9a18f9 100644
@@ -223,6 +223,8 @@ void set_window_cursor( Window window, HCURSOR handle )
XUnlockDisplay( gdi_display );
+ if (!handle)
XDefineCursor( gdi_display, window, cursor );
/* make the change take effect immediately */
XFlush( gdi_display );
While making all cursor updates unthrottled would be possible from the hardware point of view, it'd be a lot of work to shoehorn that into the current driver architecture. So I'm going declare this as "not our bug" and move on ;)