https://bugs.winehq.org/show_bug.cgi?id=53017
Bug ID: 53017 Summary: user32:monitor killed by X Error on Debian 11 + Intel GPU Product: Wine Version: unspecified Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: user32 Assignee: wine-bugs@winehq.org Reporter: fgouget@codeweavers.com Distribution: ---
user32:monitor gets killed by an X Error while running test_ChangeDisplaySettingsEx() on my Debian 11 + Intel GPU machine (see fg-deb64-*). This results in this type of failure:
monitor.c:61: GetProcAddress(user32, DisplayConfigSetDeviceInfo) failed. user32:monitor:0834 done (0) in 0s The main process has no test summary line
The lack of a summary line is what indicates that the process was summarily killed, typically by a Unix library call.
Looking into some more details it is this call which causes the X Error:
res = ChangeDisplaySettingsExA(devices[device].name, &dm3, NULL, CDS_RESET, NULL);
And adding traces in winex11.drv shows more precisely that the crash happens because bad physical size values are passed to XRRSetScreenSize():
dmFields=BITSPERPEL,PELSWIDTH,PELSHEIGHT,DISPLAYFLAGS,DISPLAYFREQUENCY,DISPLAYORIENTATION dmBitsPerPel=8 dmPelsWidth=720 dmPelsHeight=400 dmDisplayFrequency=70 dmDisplayFlags=0 dmDisplayOrientation=0 0024:trace:x11settings:apply_display_settings handler:XRandR 1.4 changing L"\\.\DISPLAY1" to position:(0,0) resolution:720x400 frequency:70Hz depth:8bits orientation:0. 0024:warn:xrandr:xrandr14_set_current_mode Cannot change screen color depth from 32bits to 8bits! 0024:trace:xrandr:set_screen_size mm_width=0 = 720 * 1 / 3840 0024:trace:xrandr:set_screen_size mm_height=0 = 400 * 2 / 2160 0024:trace:xrandr:xrandr14_set_current_mode 1638 X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 7 (RRSetScreenSize) Value in failed request: 0x0 Serial number of failed request: 209 Current serial number in output stream: 210
So there are two questions: * Should set_screen_size() have defensive code that prevents using 0 as the physical sizes? Using 1 instead seems to avoid the crashes. * Why do DisplayWidthMM() and DisplayHeightMM() return bad values? Weirder, I just got a bunch of runs with correct Display*MM() values and now that I removed traces it's bad again. Memory corruption?
Note that xrandr knows the right physical dimensions for my screen:
$ xrandr Screen 0: minimum 320 x 200, current 3840 x 2160, maximum 16384 x 16384 VGA-1 disconnected (normal left inverted right x axis y axis) HDMI-1 disconnected (normal left inverted right x axis y axis) DP-1 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 698mm x 393mm 3840x2160 60.00*+ 30.00 25.00 24.00 29.97 23.98 29.98 2560x1600 59.94 2560x1440 59.95 1920x1080 60.00 60.00 50.00 59.94 30.00 25.00 24.00 29.97 23.98 1920x1080i 60.00 50.00 59.94 1680x1050 59.95 1600x900 60.00 1280x1024 75.02 60.02 1280x800 59.81 1152x864 75.00 1280x720 60.00 50.00 59.94 1024x768 75.03 60.00 832x624 74.55 800x600 75.00 60.32 720x576 50.00 720x480 60.00 59.94 640x480 75.00 60.00 59.94 720x400 70.08 HDMI-2 disconnected (normal left inverted right x axis y axis) HDMI-3 disconnected (normal left inverted right x axis y axis)