Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1529 commits
Select commit Hold shift + click to select a range
f7b348a
HACK: xinput: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
2b117ec
HACK: winebus: Expose virtual controller for Steam Input hooks emulat…
rbernon Jan 8, 2024
bf1051a
HACK: win32u: Report underlying VID/PID in Steam Input hooks emulation.
rbernon Jan 9, 2024
8aa6dc0
HACK: windows.gaming.input: Report underlying VID/PID in Steam Input …
rbernon Jan 9, 2024
b701641
winhttp: Always return result at once if available in WinHttpQueryDat…
Jan 23, 2024
6b5c14f
winhttp: Always return result at once if available in WinHttpReadData().
Jan 23, 2024
8a3ea5e
ntdll: HACK: Substitute different d3dcompiler version for BDO.
Jan 24, 2024
eac437e
ntdll: Better track thread pool wait's wait_pending state.
Feb 7, 2024
1c12b17
ntdll: Make sure wakeups from already unset events are ignored in wai…
Feb 7, 2024
410bdc4
win32u: Send message with timeout in send_erase().
Feb 9, 2024
720804e
winegstreamer: Introduce and use a new wg_task_pool helper.
rbernon May 12, 2023
dda7080
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for aac decoder.
Jan 20, 2023
6358559
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for resampler.
Jan 20, 2023
b6b53a2
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for video processor.
Jan 20, 2023
667ebf7
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for wma decoder.
Jan 20, 2023
b6d45ab
HACK: winegstreamer: Do not report live latency for some games.
rbernon Aug 17, 2023
047a328
HACK: winegstreamer: Don't add unnecessary and slow? videoflip for so…
rbernon Aug 21, 2023
0e08853
HACK: winegstreamer: Disable MF_SA_D3D11_AWARE for some games.
Aug 21, 2023
af27ee2
Revert "winhttp: Always return result at once if available in WinHttp…
Feb 14, 2024
7282f73
Revert "winhttp: Always return result at once if available in WinHttp…
Feb 14, 2024
fe7516a
winhttp: Always return result at once if available in WinHttpQueryDat…
Jan 23, 2024
d31cc4d
winhttp: Always return result at once if available in WinHttpReadData().
Jan 23, 2024
87ffe79
winex11.drv: Default swap interval to 0 for child window drawables in…
Jan 30, 2024
d3adc98
winex11.drv: Fix wglSwapBuffers() with NULL current context with chil…
Jan 22, 2024
ec3d277
mscoree: Update Wine Mono to 9.0.0.
madewokherd Feb 2, 2024
ddc16cd
windows.media.speech: Add Vosk checks to autoconf.
besentv Feb 13, 2023
c4000dd
windows.media.speech: Add unixlib stub.
besentv Feb 12, 2023
17b07df
windows.media.speech/tests: Get rid of duplicated hresult.
besentv Feb 6, 2023
54ce787
windows.media.speech/tests: Allow the SpeechRecognizer creation to fa…
besentv Feb 20, 2023
903036c
windows.media.speech: Implement Vosk create and release functions in …
besentv Feb 20, 2023
f63b538
windows.media.speech: Move unix side recognizer creation to recognize…
besentv Mar 6, 2023
4a58b08
windows.media.speech: Implement recognition in the unixlib.
besentv Feb 27, 2023
2f5d303
windows.media.speech: Compare recognized words with available constra…
besentv May 25, 2022
615140c
windows.media.speech: Send event on recognition success.
besentv May 30, 2022
3858cf7
windows.media.speech: Add ISpeechRecognitionSemanticInterpretation stub.
besentv May 30, 2022
5ac801d
HACK: windows.media.speech: Stub semantic_interpretation_get_Properties.
rbernon Feb 20, 2024
ab94cce
WIP: windows.media.speech: Implement grammar.
besentv Feb 28, 2023
07f319e
HACK: windows.media.speech/tests: Add tests for manual recognition te…
besentv Feb 28, 2023
01b8aa2
HACK: windows.media.speech: Load Vosk models from Phasmophobia.
besentv Mar 7, 2023
dded948
windows.media.speech: Suppress verbose Unixlib traces.
besentv Mar 7, 2023
31af139
winegstreamer: Register more VIDEO_EFFECT DMO classes.
rbernon Dec 7, 2023
42de3e9
HACK: winegstreamer: Register the video processor MFT as a decoder.
rbernon Dec 7, 2023
d64cb2c
powershell: Read input command from stdin.
Feb 15, 2024
bce3392
mfmediaengine: Return S_OK in SetBalance().
besentv Mar 13, 2023
d719878
ntdll: Don't leak objattr allocation in NtCreateSemaphore.
ishitatsuyuki Feb 17, 2024
6dac9f8
winhttp: Mind read size when skipping async read in WinHttpReadData().
Feb 20, 2024
daff46e
HACK: gdiplus: Add HDC parameter back to gdi+ internal functions.
tati-frog Feb 21, 2024
8b4c52b
sapi: Create a new engine only when needed in ISpVoice.
shaunren Jan 22, 2024
75bf2da
sapi: Add ISpeechObjectToken stub.
shaunren Feb 2, 2024
981fc60
sapi: Add ISpeechObjectTokens stub.
shaunren Feb 2, 2024
0535794
sapi: Add stub implementation for ISpeechObjectTokens::get__NewEnum.
shaunren Feb 2, 2024
cd57f3f
sapi: Implement ISpeechObjectToken::GetDescription.
shaunren Feb 9, 2024
4af47d8
sapi: Implement ISpeechObjectToken::Invoke.
shaunren Feb 8, 2024
0e38594
sapi: Implement ISpeechObjectToken::GetIDsOfNames.
shaunren Feb 11, 2024
865fa53
sapi: Implement ISpeechObjectTokens::get_Count.
shaunren Feb 6, 2024
ca653c0
sapi: Implement IEnumVARIANT::Next for ISpeechObjectTokens.
shaunren Feb 6, 2024
c138fa7
sapi: Implement ISpeechObjectTokens::Invoke.
shaunren Feb 11, 2024
1127032
sapi: Free typelib on DLL detach.
shaunren Feb 15, 2024
33d3de9
sapi: Implement ISpeechVoice::Speak.
shaunren Feb 16, 2024
47133d6
sapi: Handle zero-length attributes correctly in ISpObjectTokenCatego…
shaunren Feb 16, 2024
7f29a72
sapi: Introduce create_token_category helper in tts.
shaunren Feb 15, 2024
391484c
sapi: Implement ISpeechVoice::GetVoices.
shaunren Feb 16, 2024
182f0b6
sapi: Implement ISpeechVoice::GetTypeInfoCount.
shaunren Feb 17, 2024
64ec697
sapi: Implement ISpeechVoice::GetTypeInfo.
shaunren Feb 17, 2024
b737934
sapi: Implement ISpeechVoice::GetIDsOfNames.
shaunren Feb 17, 2024
f8db8cc
sapi: Implement ISpeechVoice::Invoke.
shaunren Feb 17, 2024
0e810c7
winegstreamer/video_decoder: Reset sample timestamp on stream start.
rbernon Feb 21, 2024
5a3c506
dsound/tests: Test that formats with more than two channels require W…
zzhiyi Feb 20, 2024
dc7f506
dsound: Reject WAVEFORMATEX formats with more than two channels.
zzhiyi Feb 20, 2024
bad0bc0
nsiproxy.sys: Fix ipv6 route table parsing on Linux.
Feb 24, 2024
892506a
iphlpapi: Partially fill Ipv4 / Ipv6 metric in GetAdaptersAddresses().
Feb 23, 2024
f127395
Revert "win32u: Use font AA flags when querying glyph outline with GG…
Feb 26, 2024
a93c9e5
Revert "win32u: Store effective AA flags in gdi_font."
Feb 26, 2024
d178635
win32u: Store effective AA flags in font_physdev.
Feb 26, 2024
e9e3dc2
win32u: Use font AA flags when querying glyph outline with GGO_METRICS.
Nov 16, 2023
2760c85
faudio: Take lock before accessing list in LinkedList_RemoveEntry().
Feb 27, 2024
fde7629
faudio: Don't destroy voice when it is output to other voices.
Feb 27, 2024
7ee1cca
xaudio2: Check FAudioVoice_DestroyVoice result in destroy_voice().
Feb 27, 2024
718a43b
xaudio2/tests: Test destroying a voice which is an output to another …
Feb 27, 2024
270b45c
Revert "faudio: Don't destroy voice when it is output to other voices."
Feb 27, 2024
969c656
Revert "xaudio2: Check FAudioVoice_DestroyVoice result in destroy_voi…
Feb 27, 2024
c77c3ab
faudio: Don't destroy voice when it is output to other voices
Feb 29, 2024
2efc2ae
xaudio2: Use FAudioVoice_DestroyVoiceSafeEXT() result in destroy_voic…
Feb 27, 2024
0d82afc
wine.inf: Add a font replacement for Segoe UI.
jactry Feb 28, 2024
0a193b3
fixup! ntdll: Read process memory on the client side in NtReadVirtual…
Mar 1, 2024
1119321
advapi32: Check NULL return key pointers when creating registry keys.
zzhiyi Mar 4, 2024
6bf0aa2
advapi32/tests: Test creating registry keys with a NULL return key po…
zzhiyi Mar 4, 2024
1573cfe
dbghelp: Stop embedding unwind info in minidumps (X86_64).
Mar 4, 2024
55461e6
winegstreamer: HACK: Do not enable low latency for Gungrave G.O.R.E.
Mar 4, 2024
9970d96
mshtml: Pass DOMEvent instead of nsIDOMEvent during handle_event.
Feb 29, 2024
cc1698d
mshtml: Use generic event dispatcher for DOMContentLoaded.
Feb 21, 2024
af4a85d
mshtml/tests: Add test for document mode after InitNew and Load.
Feb 26, 2024
2086bb0
mshtml: Always use the event target dispex.
Feb 26, 2024
b3ba478
mshtml: Don't handle special case when doc != node->doc.
Feb 26, 2024
c1f557f
sapi: Implement ISpeechVoice::{get/put}_Volume.
shaunren Mar 2, 2024
b739aee
sapi: Implement ISpeechVoice::{get/putref}_Voice.
shaunren Mar 2, 2024
0692979
Revert "winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for video …
Mar 5, 2024
5dd480a
Revert "winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for resamp…
Mar 5, 2024
4384053
Revert "winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for aac de…
Mar 5, 2024
1ee1fd3
winevulkan: Prepare for VK_KHR_calibrated_timestamps.
DadSchoorse Feb 3, 2024
e732b99
winevulkan: Update to VK spec version 1.3.277.
DadSchoorse Feb 3, 2024
e236b1f
Update vk.xml to 1.3.277.
ivyl Mar 5, 2024
ce3c2eb
winevulkan: Update to VK spec version 1.3.278.
cjacek Feb 20, 2024
7212366
Update vk.xml to 1.3.278.
ivyl Mar 6, 2024
ce9dfe3
winevulkan: Remove no longer needed spec workarounds.
cjacek Feb 20, 2024
033ec3d
winevulkan: Update to VK spec version 1.3.279.
doitsujin Mar 2, 2024
2edc8b8
Update vk.xml to 1.3.279.
ivyl Mar 6, 2024
e3aca01
win32u: HACK: Clear queue QS_RAWINPUT if NtUserGetRawInputBuffer() go…
Mar 7, 2024
b5c7395
winex11.drv: Apply the GL vendor override for Intel GPUs too
renatopereyra Mar 7, 2024
b7d6d11
mscoree: Implement CLRRuntimeHost_Start.
madewokherd Mar 7, 2024
e3558b0
loader: Expose the standard debugging symbols for GDB.
rbernon Nov 26, 2023
cdcf675
ntdll: Maintain a PE module link map and expose it to GDB.
rbernon Nov 26, 2023
f783e27
tools: Add gdbunwind.py script with a syscall unwinder.
rbernon Nov 26, 2023
04e5178
HACK: loader: Map /run/host to / in the link map.
rbernon Jan 22, 2024
620216e
HACK: winevulkan: Add option to WINE_HIDE_NVK.
ivyl Mar 12, 2024
d455f1f
HACK: winex11: Add option to WINE_HIDE_NVK.
ivyl Mar 12, 2024
213f291
Revert "HACK: gdiplus: Add HDC parameter back to gdi+ internal functi…
tati-frog Mar 12, 2024
2dd4050
gdiplus: Switch to a struct for gdip_format_string callback args.
madewokherd Feb 23, 2024
1902635
gdiplus: Pass gdip_format_string_info to font link functions.
madewokherd Feb 23, 2024
b2a8b66
gdiplus: Restore hdc argument to gdip_format_string.
madewokherd Feb 23, 2024
03da124
ntdll: Wait for thread suspension in NtSuspendThread().
Mar 14, 2024
f7cd1ad
fixup! fshack: winex11: Always blit fs_hack in wglFlush and wglFinish…
Mar 15, 2024
79c7c4b
ddraw: Store material handles in ddraw object.
Mar 16, 2024
06c4161
ddraw: Store surface handles in ddraw object.
Mar 16, 2024
9104a74
ddraw: Support multiple devices per ddraw object.
Mar 16, 2024
7f1d686
ddraw/tests: Add tests for multiple devices.
Mar 16, 2024
637d92e
Revert "HACK: winex11: Add option to WINE_HIDE_NVK."
ivyl Mar 18, 2024
e6655a5
Revert "HACK: winevulkan: Add option to WINE_HIDE_NVK."
ivyl Mar 18, 2024
85b2b2b
gdiplus: Fix crash in GdipAddPathString.
madewokherd Feb 28, 2024
da87a70
gdiplus: Fix use after free in GdipAddPathString.
madewokherd Mar 1, 2024
614687b
gdiplus: Implement font linking in GdipAddPathString.
madewokherd Mar 1, 2024
ac0db78
amend! kernelbase: HACK: Force CEF swiftshader for Snares of Ruin 2.
Mar 25, 2024
8babfa7
wintypes: Report some API contracts as present in api_information_sta…
Mar 25, 2024
d32a706
windows.perception.stub: Add stub IHolographicSpaceInterop interface.
Mar 25, 2024
8043658
windows.perception.stub: HACK: Set WS_EX_NOACTIVATE for window in hol…
Mar 25, 2024
fa9a24c
mf: Make session_get_node_object() more robust.
zzhiyi Aug 7, 2023
1244141
mf: Add a session_flush_nodes() helper.
zzhiyi Aug 16, 2023
cab06c3
mf/tests: Add a create_test_topology() helper.
zzhiyi Aug 8, 2023
66f568e
mf: Support seeking while a session is started.
zzhiyi Oct 24, 2023
68110f4
mf/tests: Test IMFMediaSession::Start().
zzhiyi Aug 7, 2023
9fe8106
mfmediaengine: Implement IMFMediaEngineEx::SetCurrentTime().
zzhiyi Jul 28, 2023
3771bdb
mfmediaengine: Implement IMFMediaEngineEx::SetCurrentTimeEx().
zzhiyi Feb 20, 2024
74e945f
mfmediaengine/tests: Test IMFMediaEngineEx::SetCurrentTime/Ex().
zzhiyi Feb 20, 2024
7354ff7
Revert "ntdll: Validate xstate alignment in validate_context_xstate()."
Mar 26, 2024
93c7162
Revert "ntdll: Validate context xstate at once in NtGetContextThread()."
Mar 26, 2024
ca7394e
Revert "ntdll: Factor out validate_context_xstate() function."
Mar 26, 2024
f3ef0ee
ntdll: Fix exception list offset in call_user_mode_callback / user_mo…
Jan 18, 2024
473dd7d
ntdll: Don't hardcode xstate feature mask.
Jan 31, 2024
df7bee7
ntdll: Don't hardcode xstate size in syscall frame.
Jan 31, 2024
498040f
ntdll: Don't hardcode xstate size in exception stack layout.
Jan 31, 2024
d9b3809
ntdll: On x86_64, don't access %gs in signal_start_thread().
mrpippy Feb 21, 2024
f71659d
ntdll: Mind context compaction mask in context_from_server().
Feb 1, 2024
32dc479
ntdll: Don't copy xstate from / to syscall frame in usr1_handler().
Feb 1, 2024
90c7f90
ntdll: Support generic xstate config in context manipulation functions.
Jan 18, 2024
7505034
ntdll: Respect red zone in usr1_handler() on x64.
Mar 5, 2024
ba9eabc
ntdll: Only save AVX xstate in wine_syscall_dispatcher.
Mar 18, 2024
d049d28
ntdll: Preserve untouched parts of xstate in NtSetContextThread().
Feb 8, 2024
317f6ba
ntdll: Support generic xstate in Unix-side manipulation functions.
Jan 17, 2024
fccaa98
ntdll: Factor out xstate_from_server() function.
Mar 18, 2024
af23975
ntdll: Factor out context_to_server() function.
Mar 18, 2024
57170ea
ntdll: Mind generic xstate masks in server context conversion.
Mar 18, 2024
5705b3e
ntdll: Support more xstate features.
Jan 18, 2024
56d69bd
ntdll/tests: Add more tests for xstate.
Mar 18, 2024
68c2868
ntdll: Factor out validate_context_xstate() function.
Jun 16, 2022
907bbf2
ntdll: Validate context xstate at once in NtGetContextThread().
Jun 16, 2022
253d56c
ntdll: Validate xstate alignment in validate_context_xstate().
Jun 16, 2022
5165a89
winegstreamer: HACK: Disable MF_SA_D3D11_AWARE for The Finals.
Mar 28, 2024
5936b69
winegstreamer: Integrate media-converter to winegstreamer.
ziqingh Nov 15, 2023
bf2bfa8
Revert "mfmediaengine/tests: Test IMFMediaEngineEx::SetCurrentTime/Ex…
zzhiyi Mar 29, 2024
6e244ea
Revert "mfmediaengine: Implement IMFMediaEngineEx::SetCurrentTimeEx()."
zzhiyi Mar 29, 2024
c1de082
Revert "mfmediaengine: Implement IMFMediaEngineEx::SetCurrentTime()."
zzhiyi Mar 29, 2024
c099bc3
Revert "mf/tests: Test IMFMediaSession::Start()."
zzhiyi Mar 29, 2024
f8dcd06
Revert "mf: Support seeking while a session is started."
zzhiyi Mar 29, 2024
d48d465
Revert "mf/tests: Add a create_test_topology() helper."
zzhiyi Mar 29, 2024
a71d0ba
Revert "mf: Add a session_flush_nodes() helper."
zzhiyi Mar 29, 2024
ea60a19
explorer: Add an environment variable setting to start Xalia.
madewokherd Feb 25, 2023
4102ef7
winex11.drv: Mark Xalia overlay window as a gamescope overlay.
madewokherd Mar 8, 2023
c8c7b4d
winex11.drv: Do not shape layered windows in Gamescope.
madewokherd Mar 5, 2024
ca3dac2
win32u: Implement EVENT_OBJECT_STATECHANGE.
madewokherd Mar 12, 2024
a854a85
win32u: Implement EVENT_OBJECT_LOCATIONCHANGE.
madewokherd Mar 13, 2024
620b0fe
win32u: Add support for raising EVENT_OBJECT_DESTROY events on windows.
Conmanx360 Feb 16, 2023
f7050af
win32u: Implement cross-process GetScrollBarInfo.
madewokherd Aug 19, 2023
a3fc1f9
win32u: Implement cross-process GetScrollInfo.
madewokherd Aug 19, 2023
9bed822
win32u: Implement winevents for scrollbars.
madewokherd Mar 15, 2024
d778e9d
gdiplus/tests: Add tests for GdipPrivateAddMemoryFont().
zzhiyi Mar 29, 2024
3a28bd4
gdiplus: Search microsoft platform names first in load_ttf_name_id().
zzhiyi Mar 28, 2024
c0d9805
HACK: ntdll: Enable WINE_SIMULATE_WRITECOPY for Hentai Maid Memories.
zzhiyi Apr 3, 2024
1e5c02f
crypt32: Fix CryptBinaryToString not adding a separator.
tati-frog Mar 22, 2024
45f59c8
ntdll: Return STATUS_NO_YIELD_PERFORMED from NtYieldExecution() on Li…
Apr 5, 2024
940efde
winhttp: Set actual default receive response timeout to 21sec.
Apr 9, 2024
56b7e38
winhttp/tests: Add some tests for actual connection caching.
Apr 9, 2024
43b6027
winhttp: Do not cache connection if suggested by request headers.
Apr 9, 2024
8427e38
winegstreamer/media-converter: Split videoconv caps event handler to …
rbernon Mar 5, 2024
d3aea4b
winegstreamer/media-converter: Split videoconv upstream chunk dump to…
rbernon Mar 5, 2024
500acad
winegstreamer/media-converter: Split videoconv stream-start event pus…
rbernon Mar 5, 2024
ecb7dd7
winegstreamer/media-converter: Split videoconv event caps push to a s…
rbernon Mar 5, 2024
e61bf26
winegstreamer/media-converter: Open the blank file on videoconv state…
rbernon Mar 5, 2024
819d2a3
winegstreamer/media-converter: Use an enum for video conv state flags.
rbernon Mar 5, 2024
87946fb
winegstreamer/media-converter: Wrap around the blank video if shorter…
rbernon Mar 29, 2024
5f86fb7
winegstreamer/media-converter: Use gst_util_uint64_scale_round to rou…
rbernon Mar 29, 2024
c50f302
winegstreamer/media-converter: Implement support for push mode in vid…
rbernon Mar 29, 2024
a717652
winegstreamer/media-converter: Wrap videoconv and a demuxer in a new …
rbernon Mar 5, 2024
9524238
winegstreamer/media-converter: Automatically add an audio decoder to …
rbernon Mar 5, 2024
01b816d
HACK: winebuild: Include target arch in the hash used for timestamp.
ivyl Apr 9, 2024
68eb557
ntdll/tests: Add tests for CONTEXT_EXCEPTION_REQUEST.
Apr 5, 2024
2c005f9
ntdll: Set exception reporting flags in NtGetContextThread().
Apr 9, 2024
84a9a4b
ntdll: Store exception reporting flags in server context.
Apr 9, 2024
253b2ba
ntdll: Store exception reporting flags on suspend.
Apr 10, 2024
228480d
ntdll: Store exception reporting flags for debug events.
Apr 8, 2024
f490b50
Revert "ntdll: Add WINE_DISABLE_WRITE_WATCH env var to disable write …
Apr 10, 2024
b732274
winevulkan: Return result through NtCallbackReturn for the debug call…
julliard Jan 19, 2024
16527b7
winevulkan: Keep the create_info HWND on the surface wrappers.
rbernon Nov 25, 2023
fccd426
winevulkan: Rename wine_device_memory mapping to vm_map.
cjacek Feb 21, 2024
c211e2a
winevulkan: Use handle map for memory objects.
cjacek Feb 21, 2024
7236bc0
winevulkan: Remove handle mapping after host destory is called.
ivyl Apr 9, 2024
6456442
fshack: winex11.drv: Introduce fs_hack_is_window_rect_fullscreen().
zzhiyi Mar 26, 2024
9dafc27
win32u: Store desktop flags in shared memory and use that in is_virtu…
Apr 11, 2024
9157418
user32: HACK: Avoid triggering displays update in GetDisplayConfigBuf…
Apr 11, 2024
dce7a2f
winevulkan: Make client's device memory wrapper available to callback…
ivyl Apr 11, 2024
b94d5f5
HACK: mfplat: Enable new media source by default for more games.
rbernon Apr 12, 2024
4d5ffea
win32u: Update Nvidia's DriverVersion to match 552.12.
ivyl Apr 15, 2024
813d890
msvcrt/tests: Add tests for check buffering state of standard streams.
Apr 4, 2024
ffc895d
ucrtbase/tests: Add tests for checking buffering state of standard st…
Apr 4, 2024
b88b982
ucrtbase: Let stderr be always be unbuffered.
Apr 3, 2024
b519d8d
light.msstyles: Use #fefefe instead of #ffffff for scrollbar parts.
zzhiyi Apr 17, 2024
49a6a94
mscoree: Update Wine Mono to 9.1.0.
ivyl Apr 18, 2024
433fec0
winegstreamer: Destroy wg_transform in video_decoder/transform_SetInp…
Apr 4, 2024
a099e7b
Revert "winegstreamer: HACK: Disable MF_SA_D3D11_AWARE for The Finals."
Apr 18, 2024
79510d4
winex11.drv: Support _SHIFT_ARB attributes in X11DRV_wglGetPixelForma…
Apr 25, 2024
f819412
crypt32: Mind constructor tag in CRYPT_AsnDecodeOCSPSignatureInfoCert…
Apr 24, 2024
faca065
cryptnet: Do not use InternetCombineUrlW() in build_request_url().
Apr 25, 2024
fb3ec0a
msvcrt: Implement _mbsncpy_s[_l]().
Apr 27, 2024
3862f68
wmvcore: Start and stop read & delivery threads on OP_START/OP_STOP.
Feb 28, 2024
deb0ae1
fixup! ntdll: Support gpuvis tracing.
Apr 30, 2024
aa08566
kernelbase: HACK: Force angle d3d9 for Antenna.
Apr 30, 2024
e1d2148
kernelbase: HACK: Force angle d3d9 for A Raven Monologue.
Apr 30, 2024
9e10c1f
fixup! user32: Add or remove rawinput devices individually on WM_DEVI…
rbernon Apr 29, 2024
7cb0074
win32u: Move rawinput device cache ticks check to rawinput_update_dev…
rbernon May 2, 2024
b1a2335
win32u: Post device arrival messages in NtUserRegisterRawInputDevices.
rbernon May 2, 2024
71dc181
fshack: winex11.drv: Use a better fshack interpolation in xrender_bli…
May 3, 2024
dedc699
fshack: winex11.drv: Interpolate image in x11drv_surface_flush() with…
May 3, 2024
6c558cf
Revert "HACK: mfplat: Enable new media source by default for more gam…
ivyl May 3, 2024
93e737e
Revert "explorer: Don't pop start menu on "minimize all windows" syst…
Feb 14, 2024
6a82acb
Revert "win32u: Only send mouse input in ReleaseCapture() when a wind…
ivyl May 3, 2024
54b128a
Revert "user32/tests: Add some ReleaseCapture() tests."
ivyl May 3, 2024
195d861
explorer: Don't pop start menu on "minimize all windows" systray comm…
Jan 9, 2024
f6b6cee
explorer: Don't pop start menu on "undo minimize all windows" systray…
Feb 6, 2024
1e2448a
user32/tests: Add some ReleaseCapture() tests.
zzhiyi Mar 8, 2024
e8172fc
win32u: Only send mouse input in ReleaseCapture() when a window is ca…
zzhiyi Mar 8, 2024
cd5c7ea
winegstreamer: Fix wow64 support for wg_parser_connect.
May 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ F: dlls/winegstreamer/mfplat.c
F: dlls/winegstreamer/resampler.c
F: dlls/winegstreamer/video_decoder.c
F: dlls/winegstreamer/video_processor.c
F: dlls/winegstreamer/wg_source.c
F: dlls/winegstreamer/wg_sample.c
F: dlls/winegstreamer/wg_transform.c
F: dlls/winegstreamer/wma_decoder.c
Expand Down
196 changes: 196 additions & 0 deletions README.esync
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
This is eventfd-based synchronization, or 'esync' for short. Turn it on with
WINEESYNC=1; debug it with +esync.

== BUGS AND LIMITATIONS ==

Please let me know if you find any bugs. If you can, also attach a log with
+seh,+pid,+esync,+server,+timestamp.

If you get something like "eventfd: Too many open files" and then things start
crashing, you've probably run out of file descriptors. esync creates one
eventfd descriptor for each synchronization object, and some games may use a
large number of these. Linux by default limits a process to 4096 file
descriptors, which probably was reasonable back in the nineties but isn't
really anymore. (Fortunately Debian and derivatives [Ubuntu, Mint] already
have a reasonable limit.) To raise the limit you'll want to edit
/etc/security/limits.conf and add a line like

* hard nofile 1048576

then restart your session.

On distributions using systemd, the settings in `/etc/security/limits.conf`
will be overridden by systemd's own settings. If you run `ulimit -Hn` and it
returns a lower number than the one you've previously set, then you can set

DefaultLimitNOFILE=1024:1048576

in both `/etc/systemd/system.conf` and `/etc/systemd/user.conf`. You can then
execute `sudo systemctl daemon-reexec` and restart your session. Check again
with `ulimit -Hn` that the limit is correct.

Also note that if the wineserver has esync active, all clients also must, and
vice versa. Otherwise things will probably crash quite badly.

== EXPLANATION ==

The aim is to execute all synchronization operations in "user-space", that is,
without going through wineserver. We do this using Linux's eventfd
facility. The main impetus to using eventfd is so that we can poll multiple
objects at once; in particular we can't do this with futexes, or pthread
semaphores, or the like. The only way I know of to wait on any of multiple
objects is to use select/poll/epoll to wait on multiple fds, and eventfd gives
us those fds in a quite usable way.

Whenever a semaphore, event, or mutex is created, we have the server, instead
of creating a traditional server-side event/semaphore/mutex, instead create an
'esync' primitive. These live in esync.c and are very slim objects; in fact,
they don't even know what type of primitive they are. The server is involved
at all because we still need a way of creating named objects, passing handles
to another process, etc.

The server creates an eventfd file descriptor with the requested parameters
and passes it back to ntdll. ntdll creates an object of the appropriate type,
then caches it in a table. This table is copied almost wholesale from the fd
cache code in server.c.

Specific operations follow quite straightforwardly from eventfd:

* To release an object, or set an event, we simply write() to it.
* An object is signalled if read() succeeds on it. Notably, we create all
eventfd descriptors with O_NONBLOCK, so that we can atomically check if an
object is signalled and grab it if it is. This also lets us reset events.
* For objects whose state should not be reset upon waiting—e.g. manual-reset
events—we simply check for the POLLIN flag instead of reading.
* Semaphores are handled by the EFD_SEMAPHORE flag. This matches up quite well
(although with some difficulties; see below).
* Mutexes store their owner thread locally. This isn't reliable information if
a different process's thread owns the mutex, but this doesn't matter—a
thread should only care whether it owns the mutex, so it knows whether to
try waiting on it or simply to increase the recursion count.

The interesting part about esync is that (almost) all waits happen in ntdll,
including those on server-bound objects. The idea here is that on the server
side, for any waitable object, we create an eventfd file descriptor (not an
esync primitive), and then pass it to ntdll if the program tries to wait on
it. These are cached too, so only the first wait will require a round trip to
the server. Then the server signals the file descriptor as appropriate, and
thereby wakes up the client. So far this is implemented for processes,
threads, message queues (difficult; see below), and device managers (necessary
for drivers to work). All of these are necessarily server-bound, so we
wouldn't really gain anything by signalling on the client side instead. Of
course, except possibly for message queues, it's not likely that any program
(cutting-edge D3D game or not) is going to be causing a great wineserver load
by waiting on any of these objects; the motivation was rather to provide a way
to wait on ntdll-bound and server-bound objects at the same time.

Some cases are still passed to the server, and there's probably no reason not
to keep them that way. Those that I noticed while testing include: async
objects, which are internal to the file APIs and never exposed to userspace,
startup_info objects, which are internal to the loader and signalled when a
process starts, and keyed events, which are exposed through an ntdll API
(although not through kernel32) but can't be mixed with other objects (you
have to use NtWaitForKeyedEvent()). Other cases include: named pipes, debug
events, sockets, and timers. It's unlikely we'll want to optimize debug events
or sockets (or any of the other, rather rare, objects), but it is possible
we'll want to optimize named pipes or timers.

There were two sort of complications when working out the above. The first one
was events. The trouble is that (1) the server actually creates some events by
itself and (2) the server sometimes manipulates events passed by the
client. Resolving the first case was easy enough, and merely entailed creating
eventfd descriptors for the events the same way as for processes and threads
(note that we don't really lose anything this way; the events include
"LowMemoryCondition" and the event that signals system processes to shut
down). For the second case I basically had to hook the server-side event
functions to redirect to esync versions if the event was actually an esync
primitive.

The second complication was message queues. The difficulty here is that X11
signals events by writing into a pipe (at least I think it's a pipe?), and so
as a result wineserver has to poll on that descriptor. In theory we could just
let wineserver do so and then signal us as appropriate, except that wineserver
only polls on the pipe when the thread is waiting for events (otherwise we'd
get e.g. keyboard input while the thread is doing something else, and spin
forever trying to wake up a thread that doesn't care). The obvious solution is
just to poll on that fd ourselves, and that's what I did—it's just that
getting the fd from wineserver was kind of ugly, and the code for waiting was
also kind of ugly basically because we have to wait on both X11's fd and the
"normal" process/thread-style wineserver fd that we use to signal sent
messages. The upshot about the whole thing was that races are basically
impossible, since a thread can only wait on its own queue.

System APCs already work, since the server will forcibly suspend a thread if
it's not already waiting, and so we just need to check for EINTR from
poll(). User APCs and alertable waits are implemented in a similar style to
message queues (well, sort of): whenever someone executes an alertable wait,
we add an additional eventfd to the list, which the server signals when an APC
arrives. If that eventfd gets signaled, we hand it off to the server to take
care of, and return STATUS_USER_APC.

Originally I kept the volatile state of semaphores and mutexes inside a
variable local to the handle, with the knowledge that this would break if
someone tried to open the handle elsewhere or duplicate it. It did, and so now
this state is stored inside shared memory. This is of the POSIX variety, is
allocated by the server (but never mapped there) and lives under the path
"/wine-esync".

There are a couple things that this infrastructure can't handle, although
surprisingly there aren't that many. In particular:
* Implementing wait-all, i.e. WaitForMultipleObjects(..., TRUE, ...), is not
exactly possible the way we'd like it to be possible. In theory that
function should wait until it knows all objects are available, then grab
them all at once atomically. The server (like the kernel) can do this
because the server is single-threaded and can't race with itself. We can't
do this in ntdll, though. The approach I've taken I've laid out in great
detail in the relevant patch, but for a quick summary we poll on each object
until it's signaled (but don't grab it), check them all again, and if
they're all signaled we try to grab them all at once in a tight loop, and if
we fail on any of them we reset the count on whatever we shouldn't have
consumed. Such a blip would necessarily be very quick.
* The whole patchset only works on Linux, where eventfd is available. However,
it should be possible to make it work on a Mac, since eventfd is just a
quicker, easier way to use pipes (i.e. instead of writing 1 to the fd you'd
write 1 byte; instead of reading a 64-bit value from the fd you'd read as
many bytes as you can carry, which is admittedly less than 2**64 but
can probably be something reasonable.) It's also possible, although I
haven't yet looked, to use some different kind of synchronization
primitives, but pipes would be easiest to tack onto this framework.
* PulseEvent() can't work the way it's supposed to work. Fortunately it's rare
and deprecated. It's also explicitly mentioned on MSDN that a thread can
miss the notification for a kernel APC, so in a sense we're not necessarily
doing anything wrong.

There are some things that are perfectly implementable but that I just haven't
done yet:
* Other synchronizable server primitives. It's unlikely we'll need any of
these, except perhaps named pipes (which would honestly be rather difficult)
and (maybe) timers.
* Access masks. We'd need to store these inside ntdll, and validate them when
someone tries to execute esync operations.

This patchset was inspired by Daniel Santos' "hybrid synchronization"
patchset. My idea was to create a framework whereby even contended waits could
be executed in userspace, eliminating a lot of the complexity that his
synchronization primitives used. I do however owe some significant gratitude
toward him for setting me on the right path.

I've tried to maximize code separation, both to make any potential rebases
easier and to ensure that esync is only active when configured. All code in
existing source files is guarded with "if (do_esync())", and generally that
condition is followed by "return esync_version_of_this_method(...);", where
the latter lives in esync.c and is declared in esync.h. I've also tried to
make the patchset very clear and readable—to write it as if I were going to
submit it upstream. (Some intermediate patches do break things, which Wine is
generally against, but I think it's for the better in this case.) I have cut
some corners, though; there is some error checking missing, or implicit
assumptions that the program is behaving correctly.

I've tried to be careful about races. There are a lot of comments whose
purpose are basically to assure me that races are impossible. In most cases we
don't have to worry about races since all of the low-level synchronization is
done by the kernel.

Anyway, yeah, this is esync. Use it if you like.

--Zebediah Figura
8 changes: 8 additions & 0 deletions autogen.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/sh
set -e
tools/make_requests
dlls/winevulkan/make_vulkan -x vk.xml
autoreconf -ifv
rm -rf autom4te.cache

echo "Now run ./configure"
Loading