This patch series reworks `D3DXSaveSurfaceToFileInMemory()` to use the new `d3dx_save_pixels_to_memory()` function.
It also adds support for selecting a replacement pixel format when the image file format being saved to doesn't have direct support for the pixel format being saved. The code for calculating the best replacement format was inspired by the code in `check_texture_requirements()` in `d3dx9_36/texture.c`. This should fix WineHQ bug 51584, but I haven't tested that.
--
v2: d3dx9: Add support for saving DIB files in d3dx_save_pixels_to_memory().
d3dx9: Add support for saving paletted pixel formats in d3dx_pixels_save_wic().
d3dx9: Add support for saving BMP files in d3dx_save_pixels_to_memory().
d3dx9: Add support for saving JPG files in d3dx_save_pixels_to_memory().
d3dx9: Add support for saving PNG files in d3dx_save_pixels_to_memory().
https://gitlab.winehq.org/wine/wine/-/merge_requests/7436
If the lock is deactivated, mouselook won't work properly, and the user
probably doesn't want mouselook to be active. For example:
* if the user is making their compositor inhibit constraints to
temporarily prevent applications from disrupting pointer movement.
* if the keyboard is unfocused on the window, the lock is almost
certainly deactivated.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56681
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7475
`WINE_UNICODE_NATIVE` handles non-PE targets where appropriate, but on PE targets, we should always use `wchar_t`. This is particularly important for C++, where `wchar_t` is a distinct built-in type.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7488
On Tue Mar 4 12:15:46 2025 +0000, Bernhard Übelacker wrote:
> Sorry, this was not my intention. This line should make sure
> `check_PropVariantToBSTR2` is never called with anything else than
> `VT_R4`, but I have not considered this to be inside a `todo_wine` altogether.
> I created !7487 to fix this.
No worries, thanks for the fix :)
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7460#note_96759
On Tue Mar 4 12:15:46 2025 +0000, Rémi Bernon wrote:
> This now causes a "Test succeeded inside todo block" test failure on linux.
Sorry, this was not my intention. This line should make sure `check_PropVariantToBSTR2` is never called with anything else than `VT_R4`, but I have not considered this to be inside a `todo_wine` altogether.
I created !7487 to fix this.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7460#note_96755
Cannot use always succeeding ok statement,
because check_PropVariantToBSTR2 is used inside a todo_wine block.
Followup to a1637b167f.
This was intended to make sure check_PropVariantToBSTR2 is just called with `VT_R4`, but makes now more problems than good.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7487
This is an adjustment of 7324.
d3d9:visual already has a test that's relatively close to what a simplified
version of the tests in 7324 looked like, so I made the few changes to expand
that test to match and then ported it to ddraw.
Implementation-wise, this removes the SD/HD difference (which only exists on
NVidia and is not necessary to improve the mentioned application).
It also removes the clamping of YUV values, which as the tests show is not
correct.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7416
## Context
This is a problem discovered when running "Max: The Curse of Brotherhood" under proton. This game writes 4MB a piece into `wg_transform`, which contains about 4 seconds of compressed video. `wg_transform` calls `gst_pad_push` in `transform_ProcessOutput`, which takes \~300ms (i.e. 20 frames @ 60fps) to decode this buffer of video. So the end result is the game hitches every 4 seconds while playing cut scene videos.
Proton currently has a special case for this particular game, for which it breaks up the buffer into small chunks to avoid long blocks. This MR adopts that and applies it generally.
One concern raised by @redmcg is:
> The only issue I can think of is if there are any decoders which don't have a parser; then they might not know how to deal with an arbitrary 4096 byte buffer (the parser is generally responsible for taking arbitrary buffers and producing something the decoder can work with, for example: a full frame).
So this MR only enables this strategy when there is a parser element.
--
v10: winegstreamer: Avoid large buffer pushes in wg_transform.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7288
`AdjustWindowRect(Ex)` were using the system DPI even in non-DPI-aware applications, leading to some bizarre behavior.
An easy test for this is to remove the DPI awareness from `winemine`'s manifest, set the system DPI to 192, then run `winemine` and click the smiley face. Every click on the smiley face will move the window up by ~30 pixels.
A copy of ioquake3 with DPI awareness removed would also constantly enlarge its window vertically.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7478
There is no ([not yet?](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requ…) dedicated protocol for requesting pointer warps, but it's possible to request one with `zwp_locked_pointer_v1.set_cursor_position_hint` which may be performed when the pointer is unlocked. The idea is to quickly lock/set position/unlock. This is used by SDL (in some cases: [SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE](https://wiki.libsdl.org/SDL3/SDL_HINT…) and Xwayland. The limitation is/will be that the compositor will ignore requests to warp the pointer outside of surface bounds.
What I'd like to have working is the auto cursor placement feature of some applications, where they just want to call SetCursorPos towards specific UI elements inside their single window, and usually they'll be unclipped and have a visible cursor while doing this.
This patch also happens to allow mouselook to work in applications which use SetCursorPos for mouselook and aren't getting covered by the heuristics that turn on Wayland relative motion (for some reason the driver thinks the cursor is visible). Seems to affect Half-Life (GoldSrc) on my system. Though force enabling relative motion with an environment variable in a custom build or somehow improving the heuristics will also fix that.
~~A suface/pointer can only have one lock or confinement, and this implementation depends on the pointer lock. So if needed, I temporarily unlock/unconfine in order to do the warp then relock/reconfine. I modified `wayland_pointer_update_constraint` so I don't have to temporarily disable relative motion during this in case it's enabled. I think it's safe/a no-op to attempt pointer warps while using relative motion, as according to the protocol the warp will not generate a relative motion event, and while there will be a wl_pointer motion event, they're ignored while relative motion is being used.~~
--
v6: winewayland: Implement SetCursorPos via pointer lock.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7353
This MR fixes a mf:transform test that started failing as a result of MR !7417.
It also adds new tests to mf:transform to test different values of `MF_MT_USER_DATA` against the aac decoder.
It adds validation of `cbSize` to the aac decoder, which, in addition to fixing the previous test, allows some of these new tests to pass. But it does not validate the content of the user data (as the new tests seem to indicate Windows does).
--
v2: winegstreamer: Validate the value of cbSize in aac decoder.
mf/tests: Test different length user_data against aac decoder.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7465
This MR adds the ability to support float encoding (which will be used by the IMFTransform interface).
It also adds tests and addresses a number of small discrepancies discovered between the Wine and native implementation.
--
v4: mp3dmod: Ensure nChannels is greater than zero on input.
mp3dmod/tests: Add test for nChannels = 0 on input.
mp3dmod: Only allow 1/2 and 1/4 subsampling.
mp3dmod: Return error if requested output format values don't agree.
mp3dmod/tests: Test different output sample rates.
mp3dmod: Add support for 32-bit sample size.
mp3dmod/tests: Add test for 32-bit sample size.
mp3dmod: Return S_OK in Allocate/Free Resources.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7432
Current code requires entering a newline character in order to continue past DIR /P prompts. This change allows any key to be pressed instead.
Code to handle this was similar to existing WCMD_pause() so we leveraged that code for this purpose as well. Key to the fix was the removal of ENABLE_LINE_INPUT from the console flags, and ENABLE_PROCESSED_INPUT was added in order to preserve the ability to abort the operation via Ctrl-C.
--
v32: cmd: Allow any key to continue past DIR /P pauses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7400
This MR adds the ability to support float encoding (which will be used by the IMFTransform interface).
It also adds tests and addresses a number of small discrepancies discovered between the Wine and native implementation.
--
v3: mp3dmod: Ensure nChannels is greater than zero on input.
mp3dmod/tests: Add test for nChannels = 0 on input.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7432
These changes are enough to allow building the entirety of the native (ELF) side with `-flto`.
--
v3: loader: Mark thread_ldt, thread_data, wld_start "used".
ntdll: Mark call_init_thunk and abort_thread "used".
https://gitlab.winehq.org/wine/wine/-/merge_requests/7119
On Mon Mar 3 23:25:58 2025 +0000, Huw Davies wrote:
> It would be better to implement `SendARP()` in terms of `ResolveIpNetEntry2()`.
> Further, `ResolveIpNetEntry2()` should likely use the `Nsi` functions to
> retrieve the neighbour info from `nsiproxy`.
I think I saw ResolveIpNetEntry2() function documentation in the past. Maybe because I could not find sources(help please), end up not using it. Or I asked somebody. Not sure.
Does ResolveIpNetEntry2() need linux privileges ?
Thanks
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/6884#note_96714
I am proposing to do something about the "Broken NVIDIA RandR detected" error line, i think that this error serves no good purpose.
Motivation:
* fallback
Firstly, if wine merely switches to a fallback in case of a problem - that's not an error, that's an expected and handled issue that is successfully worked around. If there are potential issues with the workaround - that's what should be noted.
Programs run with wine do work well (enough) when this "error" is present. I do understand that you can change certain settings to change the codepath so that this error to not appear, is this actually necessary to fix an actual problem?
Sending someone on a path to fix this "error" when the program they're running is working perfectly well is not a great thing.
* calling it an error
More commonly, wine output is ignored when everything is running correctly, and only looked at when problems arise, so if you log an "error" around the time that a different issue happens it is reasonable to assume that the user will treat the error as the cause of the problem. So we end up with lots of threads like this: https://forum.winehq.org/viewtopic.php?t=32583 quote:
"Please don't title a forum thread with:Broken NVIDIA RandR detected, falling back to RandR 1.0. **This is totally meaningless and does not provide any description - what-so-ever - of what the thread is about. ** Wine outputs this terminal message, for anyone using the Nvidia proprietary driver. Whether they have a crappy, ancient video card or a shiny new Geforce RTX 2080 Ti ! **I patch out this warning message, on my Gentoo wine ebuild's, because it is so annoying.**
* error spam
So it confuses inexperienced users very much. I shouldn't have to point out the search engine keyword irrelevancy. But even for experienced users (the quoted user uses gentoo), it is annoying enough to patch out. If the quoted example wasn't enough here's a random pastebin from 2022 i found removing the line: https://pastebin.com/6auSsL4B, and i've got at least one personal example of someone patching the error out. It is repeated just too frequently. Spam makes reading more important errors harder too.
* recommending nouveau
This line is in a codepath commonly used in games. Recommending nouveau to usually inexperienced linux users - gamers is a horrible idea. Don't get me wrong, i'm all for a free solution, i'd love for nouveau to be just as good, but it is simply not. For a user without a reasonable understanding of linux a messup with video drivers costs a complete reinstall. Mindshare of free software is probably out of scope for wine, but i'm sure we can agree there's some general value there.
There is a wiki entry about this error: https://gitlab.winehq.org/wine/wine/-/wikis/FAQ#broken-nvidia-randr-detecte…
It all generally makes sense, and if you read it carefully it does say "for users who do not need the proprietary driver", but for an inexperienced user that's an encouragement that assumes they do not in fact need the proprietary driver. Also if you do understand what RandR is you're likely to understand that a program not launching for example probably isn't related to the "error", though i think even a knowing user would still consider it a possibility.
* keywords used
The workaround described under that is of legitemate value, but i think the correlation between the "error" keywords and the actual problematic behavior is not great. If we wish to point the user towards the workaround the line should be something along the lines of "program starts fullscreen at low resolution".
* code
I am not a maintainer and am not experienced enough to just pick up a codebase like this, so i'll start off with admitting i don't really know the specifics of the code. But just by looking at it, the comment on line 511 in dlls/winex11.drv/xrandr.c says that the check that causes the "error" line to print just checks if the driver is nvidia? Isn't that not even checking the specific behavior that it supposedly doesn't implement? (if it was fixed since that code was written)
Proposed solutions:
Plain and simple - delete the line. This would solve all the problems mentioned above, perhaps with the exception of >keywords used. This pull request.
Change the message type to debug or trace or similar. This would address >calling it an error
Only print error on first use of function or in startup. This would address >error spam
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7461
This patch series reworks `D3DXSaveSurfaceToFileInMemory()` to use the new `d3dx_save_pixels_to_memory()` function.
It also adds support for selecting a replacement pixel format when the image file format being saved to doesn't have direct support for the pixel format being saved. The code for calculating the best replacement format was inspired by the code in `check_texture_requirements()` in `d3dx9_36/texture.c`. This should fix WineHQ bug 51584, but I haven't tested that.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7436
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
--
v4: windowscodecs: Implement GetPreferredVendorGUID().
windowscodecs/metadata: Implement GetClassID().
windowscodecs/tests: Add some tests for metadata handler GetClassID().
windowscodecs/metadata: Replicate original stream position when creating writer instances from readers.
windowscodecs/metadata: Restore original stream position on GetStream().
windowscodecs/tests: Add some tests for stream position handling when nested readers are used.
windowscodecs: Implement CreateQueryWriterFromReader().
windowscodecs/metadata: Do not decorate 'wstr' items with a type name in returned queries.
windowscodecs/tests: Add some more tests for query enumeration.
windowscodecs: Implement query strings enumerator.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7407
Current code requires entering a newline character in order to continue past DIR /P prompts. This change allows any key to be pressed instead.
Code to handle this was similar to existing WCMD_pause() so we leveraged that code for this purpose as well. Key to the fix was the removal of ENABLE_LINE_INPUT from the console flags, and ENABLE_PROCESSED_INPUT was added in order to preserve the ability to abort the operation via Ctrl-C.
--
v29: cmd: Allow any key to continue past DIR /P pauses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7400
This MR fixes a mf:transform test that started failing as a result of MR !7417.
It also adds new tests to mf:transform to test different values of `MF_MT_USER_DATA` against the aac decoder.
It adds validation of `cbSize` to the aac decoder, which, in addition to fixing the previous test, allows some of these new tests to pass. But it does not validate the content of the user data (as the new tests seem to indicate Windows does).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7465
Related Wine issue: https://bugs.winehq.org/show_bug.cgi?id=52714
I'm starting work on updating/extending Linux force feedback API and one of my goals is to expose the number and an array that contains the device's ffb-enabled axes. As I'm mainly working with USB PID driver, I already have a POC of obtaining this data.
What prompted this is that currently Wine always creates virtual joysticks with two PID ffb axes. This causes issues with [Richard Burns Rally](https://github.com/ValveSoftware/Proton/issues/6702#issuecomment-267…, as this game incorrectly initializes a `CONSTANT_FORCE` effect with all the FFB axes that contain `DIDOI_FFACTUATOR` flag and then trying to update `cAxes` and `rgdwAxes` values which leads to `DIERR_INVALIDPARAM`.
Now, this flag is set by wine while enumerating virtual device's axes and while `(axis index < FFB axes)`, flag is applied. This means, that every device which has FFB functionality and at least two axes, will report FFB on `X`, `Y`.
While updated API would mean a lot of steering wheels would correctly report only 1 axis, a lot of USB PID wheels still include `X` and `Y` in their `AXES_ENABLE` and `DIRECTION` usages. This, again, would lead to broken FFB (in affected games).
On Windows, there's a possibility of overwriting some joystick capabilities with registry entries, which ends up removing `DIDOI_FFACTUATOR` flag from a selected axis. This doesn't work in Wine.
This MR allows Wine to add an arbitrary number (up to `PID_AXES_MAX`) of axes to the PID descriptor, based on the value of Haptic Axes from SDL or from Linux FF api in the future (I'm working on it). Additionally, to work around RBR and other games with similar, wrong FFB handling, I introduced a [hint](https://github.com/libsdl-org/SDL/issues/12341) to SDL that allows a dynamic overwrite of the number of haptic axes. For the Linux API, I'll figure out a nice way to override when the number of axes will be exposed.
With these changes, I was able to successfully get force feedback on my Moza Racing R9 with all axes usable. With additional traces in the dinput code, I confirmed that with one axis defined in the PID descriptor, the game created a constant force effect with just one axis and `cAxes = 1`.
--
v6:
https://gitlab.winehq.org/wine/wine/-/merge_requests/7422
The plan is to move as much GL code as possible to win32u, similarly to what's been done with vulkan. While I intend to keep the existing driver-specific GL backend (GLX, macos?), I win32u can use EGL more directly while delegating only the platform specific display and surface creation to the drivers.
At the same time, it could also make it possible to use EGL for memory DCs too, as osmesa is being removed from Mesa3D main branch (still going to be present in a separate historical branch iiuc).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7468
While some host includes may work, we can't assume they will. Additionally, they may interfere with the code being built. In my case, LLVM's libc++ build with winegcc was failing due to an [unexpected `__has_include`](https://github.com/llvm/llvm-project/blob/44607666b3429868bce9f0489715eb367d0e08f8/libcxx/include/__mbstate_t.h#L42).
--
v2: winegcc: Don't include host include paths when compiling with MSVCRT.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7469
While some host includes may work, we can't assume they will. Additionally, they may interfere with the code being built. In my case, LLVM's libc++ build with winegcc was failing due to an [unexpected `__has_include`](https://github.com/llvm/llvm-project/blob/44607666b3429868bce9f0489715eb367d0e08f8/libcxx/include/__mbstate_t.h#L42).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7469
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
--
v3: windowscodecs: Implement GetPreferredVendorGUID().
windowscodecs/metadata: Implement GetClassID().
windowscodecs/tests: Add some tests for metadata handler GetClassID().
windowscodecs/metadata: Replicate original stream position when creating writer instances from readers.
windowscodecs/metadata: Restore original stream position on GetStream().
windowscodecs/tests: Add some tests for stream position handling when nested readers are used.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7407
The icons and texts are too tiny in KDE Plasma 6 with 100% scaling on my 4K monitor, so I adjust it to 200%, and the window of my game just becomes 2x bigger, much bigger than my monitor.
This doesn't make any sense!
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/6805#note_96557
Tests show test propsys:propsys is failing for many Windows 7 machines. https://test.winehq.org/data/patterns-tb-win.html#propsys:propsys
It looks like windows 7 processes VT_R4 like VT_R8. (`0.125f / 0x3e000000 (float/4 byte)` becomes `5.1392085562440189e-315 / 0x3e000000 (double/8 byte)`.
Is this worth the effort to remove the failures from the test patterns page?
--
v3: propsys/tests: Add broken for unexpected value in windows 7.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7460
The spec says if the passed pointer is NULL then return E_POINTER
and not to just unconditionally deref then set NULL.
Signed-off-by: Edward O'Callaghan <edward(a)antitrust.cc>
--
v2: dlls/shell32: Fix IUnknown::QueryInterface() to meet spec
https://gitlab.winehq.org/wine/wine/-/merge_requests/7451
Tests show test propsys:propsys is failing for many Windows 7 machines. https://test.winehq.org/data/patterns-tb-win.html#propsys:propsys
It looks like windows 7 processes VT_R4 like VT_R8. (`0.125f / 0x3e000000 (float/4 byte)` becomes `5.1392085562440189e-315 / 0x3e000000 (double/8 byte)`.
Is this worth the effort to remove the failures from the test patterns page?
--
v2: propsys/tests: Add broken for unexpected value in windows 7.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7460
Supersedes !741.
On macOS 10.14+ `thread_get_register_pointer_values` is called on every thread of the process.
On Linux 4.14+ `membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED, ...)` is used.
On x86 Linux <= 4.13 and on other platforms it falls back to calling `NtGetContextThread()` on each thread.
The fast path patches from @tmatthies are slightly modified in the following ways:
1. On unsupported platforms, the `try_*()` functions return `FALSE` instead of `0`.
2. `try_exp_membarrier()` is called first, then `try_mach_tgrpvs()`.
---
Known applications fixed by this MR:
- osu! (rhythm game) song selection menu stuttering
- .NET CoreCLR GC
- HotSpot JVM (-XX:+UseSystemMemoryBarrier) safepoints
--
v4: kernel32/tests: Add a store buffering litmus test involving FlushProcessWriteBuffers.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7250
On Mon Mar 3 11:04:01 2025 +0000, Jinoh Kang wrote:
> My two cents:
> This PR is a no-op change except for the test. While this PR improves
> readability a little, I guess we could go further and handle flip
> horz/vert flags in a more readable way if we want to go that direction?
> (Otherwise just keeping the test should be fine too.)
In any case, the commit message is misleading and should be reworded on commit.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7459#note_96526
On Mon Mar 3 08:08:34 2025 +0000, Dmitry Timoshkov wrote:
> It looks like you are right, new tests actually pass with current
> implementation. Although the patch makes support for
> WICBitmapTransformRotate270 more explicit I'm not opposed to leave the
> code intact. I'm open to suggestions.
My two cents:
This PR is a no-op change except for the test. While this PR improves readability a little, I guess we could go further and handle flip horz/vert flags in a more readable way if we want to go that direction? (Otherwise just keeping the test should be fine too.)
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7459#note_96525
## Context
This is a problem discovered when running "Max: The Curse of Brotherhood" under proton. This game writes 4MB a piece into `wg_transform`, which contains about 4 seconds of compressed video. `wg_transform` calls `gst_pad_push` in `transform_ProcessOutput`, which takes \~300ms (i.e. 20 frames @ 60fps) to decode this buffer of video. So the end result is the game hitches every 4 seconds while playing cut scene videos.
Proton currently has a special case for this particular game, for which it breaks up the buffer into small chunks to avoid long blocks. This MR adopts that and applies it generally.
One concern raised by @redmcg is:
> The only issue I can think of is if there are any decoders which don't have a parser; then they might not know how to deal with an arbitrary 4096 byte buffer (the parser is generally responsible for taking arbitrary buffers and producing something the decoder can work with, for example: a full frame).
So this MR only enables this strategy when there is a parser element.
--
v9: winegstreamer: Avoid large buffer pushes in wg_transform.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7288
On Mon Mar 3 06:33:06 2025 +0000, Dmitry Timoshkov wrote:
> The tests don't pass with existing code.
It looks like you are right, new tests actually pass with current implementation. Although the patch makes support for WICBitmapTransformRotate270 more explicit I'm not opposed to leave the code intact. I'm open to suggestions.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7459#note_96507
On Mon Mar 3 06:33:06 2025 +0000, Elizabeth Figura wrote:
> Wait, isn't this already implemented? WICBitmapTransformRotate270 is the
> bitwise OR of 90 and 180, and the code seems to take that into account,
> am I missing something?
The tests don't pass with existing code.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7459#note_96498
This fixes failure to play the prologue video in Planet of the Apes: Last Frontier, which unpauses by calling Start() with a location. The exact state leading to this issue does not occur in the Start() tests, and it's not clear how to reproduce it reliably.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7466