Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1341 commits
Select commit Hold shift + click to select a range
fe8b0bf
ntdll: Return STATUS_DEBUGGER_INACTIVE from NtSystemDebugControl() stub.
Jan 8, 2024
791bdd7
winex11: Make XIconifyWindow() on Gamescope game specific.
Jan 19, 2024
7bf7498
winex11: Sync with gdi_display before closing the threads display.
rbernon Jan 22, 2024
e17d492
crypt32: Pad R/S values with zeroes if smaller than their counterpart.
Jan 8, 2024
ef084d8
include: Add some ncrypt definitions.
zzhiyi Dec 21, 2023
154a84c
include: Add some bcrypt definitions.
zzhiyi Dec 21, 2023
6abef68
ncrypt/tests: Test default RSA key properties.
zzhiyi Dec 21, 2023
60ddfb2
ncrypt: Add some missing RSA key properties.
zzhiyi Dec 22, 2023
219a3f4
winex11: Consistently use set_focus to change foreground window.
rbernon Jan 23, 2024
a3d188e
fshack: winex11: Avoid calling into win32u with the fs_lock held.
rbernon Jan 23, 2024
a6733ea
winegstreamer: Ask GStreamer to stop messing with signal handlers.
rbernon Jan 24, 2024
6c0a373
winebus: Disable SDL2.30 new behavior for the SDL unix backend.
rbernon Jan 12, 2024
61ce3bb
gdiplus: Prefer Tahoma for generic sans serif font.
madewokherd Jan 26, 2024
11511df
kernelbase: Workaround forced stack aligment for SignalObjectAndWait().
Jan 27, 2024
75879a2
kernelbase: HACK: Add --use-gl=swiftshader for another game.
ivyl Jan 30, 2024
cdd0337
winebus.sys: Fix units used for hat switches.
ivyl Jan 29, 2024
d293e21
winebus.sys: Use 4 bits for hat switches.
ivyl Jan 29, 2024
90302c7
explorer: Create the standalone systray window with WS_EX_NOACTIVATE.
rbernon Jan 31, 2024
5475709
HACK: gamescope: user32: Disable gamescope undecorated windows hack f…
zzhiyi Feb 1, 2024
ef472ae
kernelbase: HACK: Force Vulkan rendering for EACefSubProcess.
Feb 6, 2024
8bcb205
ntdll: HACK: Enable WINE_SIMULATE_WRITECOPY for Dinogen Online.
Feb 6, 2024
24fb10a
wbemprox/tests: Test LIKE queries.
ivyl Feb 3, 2024
c5a4823
wbemprox: Reimplement LIKE.
ivyl Feb 1, 2024
67a77df
server: Check if we have waiting asyncs in (send_socket) before enfor…
Jan 30, 2024
fe1ca09
server: Check if we have waiting asyncs in sock_dispatch_asyncs() bef…
Jan 29, 2024
34145c8
ntdll: HACK: Enable WINE_NO_PRIV_ELEVATION for playway-launcher-insta…
Feb 14, 2024
c0b74b7
mlang/tests: Test for GetGlobalFontLinkObject.
tati-frog Oct 16, 2023
da13d96
mlang: Implement GetGlobalFontLinkObject.
tati-frog Oct 16, 2023
de86bec
mlang/tests: Test codepages priority bug in GetStrCodepages.
tati-frog Nov 28, 2023
c3e3bfe
mlang: Fix bug with codepage priority in GetStrCodePages.
tati-frog Nov 28, 2023
e8babc9
gdiplus: Replace HDC with GpGraphics in parameters.
tati-frog Jan 30, 2024
9de31d4
gdiplus/tests: Add interactive test for font linking.
tati-frog Dec 11, 2023
8957802
gdiplus: Implement font linking for gdiplus.
tati-frog Nov 14, 2023
8e385ea
include: Add HEAACWAVEINFO and HEAACWAVEFORMAT definitions.
rbernon Nov 16, 2023
d072d00
mfplat/tests: Test MFInitMediaTypeFromWaveFormatEx wrt MF_MT_FIXED_SI…
rbernon Nov 16, 2023
3fa8eaf
mfplat/tests: Add MFInitMediaTypeFromWaveFormatEx tests with HEAACWAV…
rbernon Nov 16, 2023
e8bbfd1
mfplat/tests: Test MFWaveFormatExConvertFlag_ForceExtensible with HEA…
rbernon Nov 16, 2023
f67042c
mfplat: Support AAC format attributes in MFInitMediaTypeFromWaveForma…
rbernon Nov 16, 2023
d2587d2
mfplat: Support compressed WAVEFORMATEX in MFCreateWaveFormatExFromMF…
rbernon Nov 16, 2023
4653d46
winegstreamer: Fix reading MF_MT_USER_DATA into HEAACWAVEFORMAT.
rbernon Jan 23, 2024
dc4d6b2
winegstreamer: Use MFCreateAudioMediaType in the AAC decoder.
rbernon Nov 16, 2023
26322a7
winegstreamer: Use an array for the audio decoder input types.
rbernon Nov 17, 2023
d1dbd2b
mf/tests: Check inserted topology loader transforms explicitly.
rbernon Jan 24, 2024
2799033
mf/topology_loader: Use a local variable for the indirect connection …
rbernon Jun 7, 2023
fdf5ac0
mf/topology_loader: Ignore SetOutputType errors when doing indirect c…
rbernon Jan 19, 2024
0642219
mf/topology_loader: Initialize transform output type before adding co…
rbernon Jan 19, 2024
ce52056
mf/topology_loader: Try to connect transform nodes with their current…
rbernon Jan 24, 2024
78d0ae9
winegstreamer: Implement H264 decoder GetInputCurrentType.
rbernon Jan 24, 2024
f63b1af
winegstreamer: Ask GStreamer to stop messing with signal handlers.
rbernon Jan 24, 2024
f08b437
winegstreamer: Trace wg_transform input and output caps.
rbernon Jan 30, 2024
a1982d7
winegstreamer: Handle allocation query in a separate helper.
rbernon Jan 30, 2024
fe82540
winegstreamer: Handle sink caps query in a separate helper.
rbernon Jan 30, 2024
00a6df8
winegstreamer: Handle sink event caps in a separate helper.
rbernon Jan 30, 2024
b077414
winegstreamer: Use GST_PTR_FORMAT to trace GStreamer objects.
rbernon Jan 30, 2024
370f34c
winegstreamer: Ignore wg_transform input / output video format fps.
rbernon Jan 30, 2024
6e060bb
winegstreamer: Allow wg_transform size changes with an explicit attri…
rbernon Jan 30, 2024
db22f40
mf/tests: Report more transform current type mismatches.
rbernon Jan 29, 2024
8caa133
mf/tests: Add some tests with video processor aperture handling.
rbernon Jan 29, 2024
80df4b5
mfreadwrite/tests: Initialize test source stream types from descriptors.
rbernon Jan 23, 2024
36a0c4a
mfreadwrite/tests: Test source reader exposed transforms and types.
rbernon Jan 23, 2024
98eb371
mfreadwrite/tests: Test source reader transforms with MF_SOURCE_READE…
rbernon Jan 23, 2024
1e0e932
mfreadwrite/tests: Test source reader transforms with MF_SOURCE_READE…
rbernon Feb 1, 2024
9506607
HACK: winegstreamer/new_media_source: Clone the media source to new_m…
rbernon Nov 22, 2023
c6d7a39
HACK: winegstreamer/new_media_source: Fallback to the old media sourc…
rbernon Nov 22, 2023
c80502e
winegstreamer/new_media_source: Introduce a new wg_source interface.
rbernon Aug 18, 2023
03d9fec
winegstreamer/new_media_source: Call (Begin|End)Read to read the byte…
rbernon Aug 18, 2023
dd14bb6
winegstreamer/new_media_source: Provide first block of data and strea…
rbernon Aug 18, 2023
05035df
winegstreamer/new_media_source: Prefer MF_BYTESTREAM_ORIGIN_NAME for …
rbernon Jul 27, 2023
8d12437
winegstreamer/new_media_source: Create a source pad on the wg_source.
rbernon Apr 26, 2023
cee6b45
winegstreamer/new_media_source: Create a demuxer element in wg_source…
rbernon Apr 27, 2023
e4be1a5
winegstreamer/new_media_source: Push a stream and segment event to th…
rbernon Nov 22, 2023
2b543c0
winegstreamer/new_media_source: Handle GST_QUERY_URI on wg_source src…
rbernon Nov 22, 2023
13bfa9f
winegstreamer/new_media_source: Handle GST_QUERY_DURATION on wg_sourc…
rbernon Nov 22, 2023
e6e2923
winegstreamer/new_media_source: Handle GST_QUERY_SCHEDULING on wg_sou…
rbernon Apr 26, 2023
903772f
winegstreamer/new_media_source: Create and link sink pads in the wg_s…
rbernon Apr 29, 2023
4e9a520
winegstreamer/new_media_source: Push the initial data from to the wg_…
rbernon Nov 22, 2023
e2bb2c0
winegstreamer/new_media_source: Push EOS event on stream or segment end.
rbernon Apr 28, 2023
084aa80
winegstreamer/new_media_source: Handle GST_EVENT_SEEK on wg_source sr…
rbernon Jul 24, 2023
2bec716
winegstreamer/new_media_source: Handle GST_EVENT_STREAM_START and cre…
rbernon Apr 28, 2023
c9ac74b
winegstreamer/new_media_source: Query stream duration from GST_EVENT_…
rbernon Jun 18, 2023
3af9d0a
winegstreamer/new_media_source: Handle GST_EVENT_CAPS and update wg_s…
rbernon Apr 28, 2023
44ca3c9
winegstreamer/new_media_source: Introduce a new wg_source_get_stream_…
rbernon Jun 18, 2023
799afbf
winegstreamer/new_media_source: Set the MF_PD_TOTAL_FILE_SIZE present…
rbernon Jun 18, 2023
ce316c3
winegstreamer/new_media_source: Read stream data and provide samples …
rbernon Jul 24, 2023
9ce1f5f
winegstreamer/new_media_source: Query the stream max duration from th…
rbernon Nov 29, 2023
3846972
winegstreamer/new_media_source: Set the MF_PD_MIME_TYPE presentation …
rbernon Jul 24, 2023
7d40c13
winegstreamer/new_media_source: Handle GST_EVENT_TAG and udpate wg_so…
rbernon Apr 29, 2023
3faccf2
winegstreamer/new_media_source: Use wg_source order to build media so…
rbernon Nov 19, 2023
2638b04
winegstreamer/new_media_source: Sort media source "video/mp4" streams…
rbernon Nov 19, 2023
10c14fa
winegstreamer/new_media_source: Initialize media source descriptor ta…
rbernon Mar 13, 2023
f7ea3db
winegstreamer/new_media_source: Set MF_SD_MUTUALLY_EXCLUSIVE stream d…
rbernon Apr 28, 2023
00c5d03
winegstreamer/new_media_source: Select one stream descriptor for each…
rbernon Apr 29, 2023
11e980e
winegstreamer/new_media_source: Use 1-based ids in media source strea…
rbernon Jun 29, 2023
135c44c
winegstreamer/new_media_source: Select the wg_source streams on media…
rbernon Jul 24, 2023
a7bc220
winegstreamer/new_media_source: Seek the wg_source streams on media s…
rbernon Dec 8, 2023
1f445af
winegstreamer/new_media_source: Read and discard compressed samples f…
rbernon Dec 8, 2023
47ff280
winegstreamer/new_media_source: Stop using wg_parser to read samples …
rbernon Jun 1, 2023
841ac07
winegstreamer: Call gst_audio_info_from_caps for all audio formats.
rbernon Nov 15, 2023
77f74e7
winegstreamer: Support generic audio / video encoded format.
rbernon Nov 15, 2023
3dcb087
winegstreamer: Skip encoded formats in format_is_compressed.
rbernon Nov 19, 2023
b980667
winegstreamer: Translate generic audio / video encoded media types.
rbernon Nov 15, 2023
fbea0ea
winegstreamer: Rename aac_decoder to audio_decoder.
rbernon Nov 17, 2023
8608e39
winegstreamer: Introduce a generic audio decoder transform.
rbernon Jul 28, 2023
9c86213
winegstreamer: Use MFCreateVideoMediaTypeFromSubtype in GetInputAvail…
rbernon Jan 23, 2024
e297f0b
winegstreamer: Use MFCreateVideoMediaTypeFromSubtype in GetOutputAvai…
rbernon Jan 23, 2024
e4cb607
winegstreamer: Remove unnecessary create_output_media_type checks.
rbernon Jan 23, 2024
7171538
winegstreamer: Use GUID arrays for H264 decoder media types.
rbernon Jan 23, 2024
cd234ee
winegstreamer: Use MFCalculateImageSize to compute output info size.
rbernon Jan 23, 2024
01823cf
ir50_32: Use the proper hr value for stream format change.
rbernon Nov 16, 2023
c3792c2
winegstreamer: Use the H264 decoder to implement the IV50 decoder.
rbernon Jan 23, 2024
caf1db5
winegstreamer: Rename struct h264_decoder to struct video_decoder.
rbernon Jan 23, 2024
0dfbb87
winegstreamer: Ignore input / output fps mismatch in video_processor.
rbernon Jan 23, 2024
9a96d36
winegstreamer: Expose the generic video decoder transform.
rbernon Jan 23, 2024
d89e62d
HACK: mfplat: Enable the new media source for some games.
rbernon Jan 23, 2024
6c1326b
ntdll: HACK: Try to load steamoverlay.so manually if LD_PRELOAD was l…
Nov 29, 2023
044acf4
winegstreamer: Support WMA with 5.1 and 7.1 audio.
ivyl Nov 23, 2023
92181d9
FAudio: Create fake codec data for WMA3.
ivyl Dec 29, 2023
4d110a8
xinput: Implement XInputGetCapabilitiesEx.
Etaash-mathamsetty Dec 10, 2023
c7b6134
xinput: Reimplement XInputGetCapabilities.
Etaash-mathamsetty Dec 10, 2023
5a7981f
windows.gaming.input: Stub IRawGameController2 interface.
rbernon Feb 21, 2022
262c60c
windows.gaming.input: Forward get_NonRoamableId to Wine provider.
rbernon Jan 8, 2024
2247fac
HACK: dinput: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
6aa6c4e
HACK: hidclass: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
c3e4576
HACK: ntdll: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
88ad474
HACK: win32u: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
71f8db3
HACK: windows.gaming.input: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
8c5fbf5
HACK: xinput: Emulate Steam Input native hooks.
rbernon Jan 8, 2024
532d8b0
HACK: winebus: Expose virtual controller for Steam Input hooks emulat…
rbernon Jan 8, 2024
0c21e0c
HACK: win32u: Report underlying VID/PID in Steam Input hooks emulation.
rbernon Jan 9, 2024
20a91d2
HACK: windows.gaming.input: Report underlying VID/PID in Steam Input …
rbernon Jan 9, 2024
ba11cd9
winhttp: Always return result at once if available in WinHttpQueryDat…
Jan 23, 2024
665742a
winhttp: Always return result at once if available in WinHttpReadData().
Jan 23, 2024
357c1ff
ntdll: HACK: Substitute different d3dcompiler version for BDO.
Jan 24, 2024
6117603
ntdll: Better track thread pool wait's wait_pending state.
Feb 7, 2024
25d2d4c
ntdll: Make sure wakeups from already unset events are ignored in wai…
Feb 7, 2024
f961d5e
win32u: Send message with timeout in send_erase().
Feb 9, 2024
99f8658
ntdll: HACK: Add WINE_HEAP_ZERO_MEMORY variable to force zeroing allo…
Feb 9, 2024
e311daf
winegstreamer: Introduce and use a new wg_task_pool helper.
rbernon May 12, 2023
3a3400a
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for aac decoder.
Jan 20, 2023
73410b6
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for resampler.
Jan 20, 2023
c6fe011
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for video processor.
Jan 20, 2023
d6fff9c
winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for wma decoder.
Jan 20, 2023
88da48b
HACK: winegstreamer: Do not report live latency for some games.
rbernon Aug 17, 2023
4bf150b
HACK: winegstreamer: Don't add unnecessary and slow? videoflip for so…
rbernon Aug 21, 2023
68f76f5
HACK: winegstreamer: Disable MF_SA_D3D11_AWARE for some games.
Aug 21, 2023
410b000
Revert "winhttp: Always return result at once if available in WinHttp…
Feb 14, 2024
6ae40c7
Revert "winhttp: Always return result at once if available in WinHttp…
Feb 14, 2024
a7c5931
winhttp: Always return result at once if available in WinHttpQueryDat…
Jan 23, 2024
c53c907
winhttp: Always return result at once if available in WinHttpReadData().
Jan 23, 2024
970f435
winex11.drv: Default swap interval to 0 for child window drawables in…
Jan 30, 2024
4bf230a
winex11.drv: Fix wglSwapBuffers() with NULL current context with chil…
Jan 22, 2024
7819be3
Revert "explorer: Don't pop start menu on "minimize all windows" syst…
Feb 14, 2024
b283265
explorer: Don't pop start menu on "minimize all windows" systray comm…
Jan 9, 2024
cf0afdc
explorer: Don't pop start menu on "undo minimize all windows" systray…
Feb 6, 2024
98ba5eb
mscoree: Update Wine Mono to 9.0.0.
madewokherd Feb 2, 2024
2455a0d
windows.media.speech: Add Vosk checks to autoconf.
besentv Feb 13, 2023
4a816dd
windows.media.speech: Add unixlib stub.
besentv Feb 12, 2023
186309d
windows.media.speech/tests: Get rid of duplicated hresult.
besentv Feb 6, 2023
3d1efbb
windows.media.speech/tests: Allow the SpeechRecognizer creation to fa…
besentv Feb 20, 2023
1076aa8
windows.media.speech: Implement Vosk create and release functions in …
besentv Feb 20, 2023
d6306d3
windows.media.speech: Move unix side recognizer creation to recognize…
besentv Mar 6, 2023
b500dc2
windows.media.speech: Implement recognition in the unixlib.
besentv Feb 27, 2023
615562d
windows.media.speech: Compare recognized words with available constra…
besentv May 25, 2022
402a6eb
windows.media.speech: Send event on recognition success.
besentv May 30, 2022
03cb575
windows.media.speech: Add ISpeechRecognitionSemanticInterpretation stub.
besentv May 30, 2022
fea0e6d
HACK: windows.media.speech: Stub semantic_interpretation_get_Properties.
rbernon Feb 20, 2024
8d38a0b
WIP: windows.media.speech: Implement grammar.
besentv Feb 28, 2023
50754d3
HACK: windows.media.speech/tests: Add tests for manual recognition te…
besentv Feb 28, 2023
00f6b2f
HACK: windows.media.speech: Load Vosk models from Phasmophobia.
besentv Mar 7, 2023
93c6322
windows.media.speech: Suppress verbose Unixlib traces.
besentv Mar 7, 2023
27e3221
winegstreamer: Register more VIDEO_EFFECT DMO classes.
rbernon Dec 7, 2023
a7657b9
HACK: winegstreamer: Register the video processor MFT as a decoder.
rbernon Dec 7, 2023
460715d
powershell: Read input command from stdin.
Feb 15, 2024
2f07584
ntdll: HACK: Disable kernel write watches for BDO.
Jan 30, 2024
5571713
mfmediaengine: Return S_OK in SetBalance().
besentv Mar 13, 2023
a4cf21c
ntdll: Don't leak objattr allocation in NtCreateSemaphore.
ishitatsuyuki Feb 17, 2024
1f51283
fixup! winebus: Disable SDL2.30 new behavior for the SDL unix backend.
rbernon Feb 20, 2024
63fafa5
winhttp: Mind read size when skipping async read in WinHttpReadData().
Feb 20, 2024
505f4df
HACK: gdiplus: Add HDC parameter back to gdi+ internal functions.
tati-frog Feb 21, 2024
657b2f1
sapi: Create a new engine only when needed in ISpVoice.
shaunren Jan 22, 2024
59ca532
sapi: Add ISpeechObjectToken stub.
shaunren Feb 2, 2024
3b57da5
sapi: Add ISpeechObjectTokens stub.
shaunren Feb 2, 2024
0ce4abd
sapi: Add stub implementation for ISpeechObjectTokens::get__NewEnum.
shaunren Feb 2, 2024
ca12f61
sapi: Implement ISpeechObjectToken::GetDescription.
shaunren Feb 9, 2024
9fbf40b
sapi: Implement ISpeechObjectToken::Invoke.
shaunren Feb 8, 2024
6b4b57b
sapi: Implement ISpeechObjectToken::GetIDsOfNames.
shaunren Feb 11, 2024
858b749
sapi: Implement ISpeechObjectTokens::get_Count.
shaunren Feb 6, 2024
09139f5
sapi: Implement IEnumVARIANT::Next for ISpeechObjectTokens.
shaunren Feb 6, 2024
bfcfe86
sapi: Implement ISpeechObjectTokens::Invoke.
shaunren Feb 11, 2024
39099ad
sapi: Free typelib on DLL detach.
shaunren Feb 15, 2024
ec589a5
sapi: Implement ISpeechVoice::Speak.
shaunren Feb 16, 2024
fe1772d
sapi: Handle zero-length attributes correctly in ISpObjectTokenCatego…
shaunren Feb 16, 2024
c843bc9
sapi: Introduce create_token_category helper in tts.
shaunren Feb 15, 2024
4fdd8ad
sapi: Implement ISpeechVoice::GetVoices.
shaunren Feb 16, 2024
26987b7
sapi: Implement ISpeechVoice::GetTypeInfoCount.
shaunren Feb 17, 2024
bffa5db
sapi: Implement ISpeechVoice::GetTypeInfo.
shaunren Feb 17, 2024
d3590aa
sapi: Implement ISpeechVoice::GetIDsOfNames.
shaunren Feb 17, 2024
fc74e49
sapi: Implement ISpeechVoice::Invoke.
shaunren Feb 17, 2024
55b78c5
winegstreamer/video_decoder: Reset sample timestamp on stream start.
rbernon Feb 21, 2024
5a67ab8
dsound/tests: Test that formats with more than two channels require W…
zzhiyi Feb 20, 2024
dda8157
dsound: Reject WAVEFORMATEX formats with more than two channels.
zzhiyi Feb 20, 2024
e8b8d2f
fixup! winex11.drv: Listen to RawMotion and RawButton* events in the …
zzhiyi Feb 22, 2024
000724f
amd_ags_x64: Implement multi draw instanced functions.
Feb 22, 2024
6861e8c
amd_ags_x64: Implement multi draw instanced indirect count functions.
Feb 22, 2024
322b88e
nsiproxy.sys: Fix ipv6 route table parsing on Linux.
Feb 24, 2024
11a9ad1
iphlpapi: Partially fill Ipv4 / Ipv6 metric in GetAdaptersAddresses().
Feb 23, 2024
13a01f8
Revert "win32u: Use font AA flags when querying glyph outline with GG…
Feb 26, 2024
c0cf13b
Revert "win32u: Store effective AA flags in gdi_font."
Feb 26, 2024
f027a1b
win32u: Store effective AA flags in font_physdev.
Feb 26, 2024
333aef5
win32u: Use font AA flags when querying glyph outline with GGO_METRICS.
Nov 16, 2023
73003ac
faudio: Take lock before accessing list in LinkedList_RemoveEntry().
Feb 27, 2024
d497be2
faudio: Don't destroy voice when it is output to other voices.
Feb 27, 2024
431fdeb
xaudio2: Check FAudioVoice_DestroyVoice result in destroy_voice().
Feb 27, 2024
448429c
xaudio2/tests: Test destroying a voice which is an output to another …
Feb 27, 2024
0d86a41
kernelbase: Use KEY_WOW64_64KEY flag when 64 bit registry access is a…
Feb 28, 2024
f55fa9a
amd_ags_x64: Support v3.2.
Feb 28, 2024
a0e1f53
amd_ags_x64: Support versions 3.0-3.1.
Feb 28, 2024
b900403
amd_ags_x64: Add agsDriverExtensionsDX11_SetDiskShaderCacheEnabled() …
Feb 28, 2024
b1f019e
Revert "faudio: Don't destroy voice when it is output to other voices."
Feb 27, 2024
3d9f50f
Revert "xaudio2: Check FAudioVoice_DestroyVoice result in destroy_voi…
Feb 27, 2024
a15d411
faudio: Don't destroy voice when it is output to other voices
Feb 29, 2024
4fb3f2e
xaudio2: Use FAudioVoice_DestroyVoiceSafeEXT() result in destroy_voic…
Feb 27, 2024
3a6319b
wine.inf: Add a font replacement for Segoe UI.
jactry Feb 28, 2024
cb977b5
amend! nsiproxy.sys: Fix ipv6 route table parsing on Linux.
ivyl Feb 29, 2024
2f38ce9
amend! iphlpapi: Partially fill Ipv4 / Ipv6 metric in GetAdaptersAddr…
ivyl Feb 29, 2024
f392d06
fixup! ntdll: Read process memory on the client side in NtReadVirtual…
Mar 1, 2024
c651e01
amd_ags_x64: Add spec stubs for some v3.x functions.
Mar 1, 2024
42de3d2
HACK: ntdll: Extend heap zero hack to private heaps.
zzhiyi Mar 4, 2024
4c1fd47
advapi32: Check NULL return key pointers when creating registry keys.
zzhiyi Mar 4, 2024
53ea94e
advapi32/tests: Test creating registry keys with a NULL return key po…
zzhiyi Mar 4, 2024
bed19d0
winex11: Process XInput2 events with QS_INPUT filter.
rbernon Jan 28, 2024
847dbe5
winex11: Initialize XInput2 extension on every thread.
rbernon Jan 28, 2024
ea3f64a
winex11: Always listen to XInput2 device changes events.
rbernon Feb 12, 2024
33e756b
fixup! winex11.drv: Keep track of pointer and device button mappings.
rbernon Mar 4, 2024
35e491c
dbghelp: Stop embedding unwind info in minidumps (X86_64).
Mar 4, 2024
3eeca96
amd_ags_x64: Add WINE_HIDE_APU option.
Mar 4, 2024
c45f4b8
winegstreamer: HACK: Do not enable low latency for Gungrave G.O.R.E.
Mar 4, 2024
ce93000
mshtml: Pass DOMEvent instead of nsIDOMEvent during handle_event.
Feb 29, 2024
5d34273
mshtml: Use generic event dispatcher for DOMContentLoaded.
Feb 21, 2024
2740d34
mshtml/tests: Add test for document mode after InitNew and Load.
Feb 26, 2024
5cddb13
mshtml: Always use the event target dispex.
Feb 26, 2024
8963a00
mshtml: Don't handle special case when doc != node->doc.
Feb 26, 2024
b028d34
sapi: Implement ISpeechVoice::{get/put}_Volume.
shaunren Mar 2, 2024
7ae726d
sapi: Implement ISpeechVoice::{get/putref}_Voice.
shaunren Mar 2, 2024
aff91e3
amd_ags_x64: Add stub implementation for DX12 marker functions.
Mar 4, 2024
6ad59c4
Revert "winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for video …
Mar 5, 2024
1170469
Revert "winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for resamp…
Mar 5, 2024
9cf34c9
Revert "winegstreamer: Implement MFT_MESSAGE_COMMAND_DRAIN for aac de…
Mar 5, 2024
34bbb1a
fixup! ntdll: Simulate async file read and IO cancellation to workaro…
Mar 5, 2024
b013c03
ntdll: HACK: Add WINE_DISABLE_SFN option.
NishiyamaPedro Nov 20, 2023
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