Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2453 commits
Select commit Hold shift + click to select a range
82ebebd
HACK: mfplat: Enable the new media source for all games.
rbernon Jan 23, 2024
f1908b1
winegstreamer: Expose a single audio media type from the media source.
rbernon Apr 30, 2024
27149a4
winegstreamer: Expose a single video media type from the media source.
rbernon Apr 30, 2024
5455e57
winegstreamer: Remove now unnecessary stream descriptor media type ar…
rbernon Apr 30, 2024
9ce740a
winegstreamer/media_source: Use media type major type when selecting …
rbernon Mar 29, 2024
3a160ff
winegstreamer/media_source: Translate media types directly in the med…
rbernon May 10, 2024
c9106eb
winegstreamer/wg_parser: Stop auto-plugging on demuxer element pads.
rbernon Mar 29, 2024
26e1641
winegstreamer/media_source: Output compressed samples from uridecodebin.
rbernon Mar 29, 2024
35aaee5
winegstreamer/new_media_source: Send EOS when reading past the end of…
rbernon May 21, 2024
0f633aa
mfreadwrite/reader: Make a copy of the output type in SetCurrentMedia…
rbernon May 21, 2024
42f8e23
mfreadwrite/reader: Set MF_MT_AUDIO_BITS_PER_SAMPLE attribute when mi…
rbernon May 21, 2024
537d8f3
mfreadwrite/reader: Send MFT_MESSAGE_NOTIFY_START_OF_STREAM on start …
rbernon May 22, 2024
4c136f3
winegstreamer: Implement drain and flush for the audio decoder.
rbernon May 22, 2024
d89eca2
winegstreamer: Generate timestamps relative to the first input sample.
rbernon May 22, 2024
da80271
winegstreamer/new_media_source: Snap seek to the previous keyframe.
rbernon May 22, 2024
ad6c860
winegstreamer/audio_decoder: Fill output block align and bytes per se…
rbernon Jun 19, 2024
c5cebd6
mfmediaengine: Ignore MEEndOfPresentation for the video frame sink.
rbernon Jun 26, 2024
1bbb744
mfmediaengine: Implement D3D-aware video frame sink.
rbernon Jun 26, 2024
060cad3
winegstreamer: Continue autoplugging after protonvideoconverter eleme…
rbernon Jul 2, 2024
fcf8a01
winegstreamer/wg_parser: HACK: Return untranscoded codec format for t…
ziqingh May 7, 2024
996a6c5
winegstreamer/video_decoder: HACK: Try use I420 input if failed to cr…
ziqingh Apr 30, 2024
a99c4b8
winegstreamer: Check and use embedded caps in codec data.
rbernon Jul 9, 2024
435baae
winegstreamer: Use H264 GUID when converting caps to video format.
rbernon Jul 9, 2024
343a47e
winegstreamer/media-converter: Avoid leaking lock when dumping is int…
rbernon Jul 9, 2024
6c5a7d3
winegstreamer/video_decoder: Register the generic video decoder with …
rbernon Jul 9, 2024
567c440
winegstreamer/new_media_source: Flush queued samples on flush-stop.
rbernon Jul 9, 2024
b15f7d8
mfplat: Flush D3D11 context after CopySubresourceRegion on unmap.
rbernon Jul 16, 2024
705c7fa
winegstreamer: Remove 'au' alignment for h264.
Jul 18, 2024
d57342c
winegstreamer: Use "avc" H264 stream format when "codec_data" is prov…
rbernon Aug 12, 2024
8be84bf
mfreadwrite: Always try inserting a converter for non-video streams.
rbernon Aug 12, 2024
ed849a3
mmdevapi: Support getting IAudioClockAdjustment interface.
Etaash-mathamsetty Jul 5, 2024
1612fde
winegstreamer: Avoid using the aperture for padding with the H264 dec…
rbernon Aug 13, 2024
30c3321
winegstreamer/resampler: Use WAVEFORMATEX for input/output media types.
rbernon Aug 16, 2024
aa6f201
winegstreamer/resampler: Recalculate resampler nBlockAlign and avgByt…
rbernon Aug 16, 2024
b9d8127
Revert "HACK: mmdevapi: Disable getting IAudioClockAdjustment via Get…
rbernon Sep 5, 2024
72abe01
Revert "mmdevapi: Support getting IAudioClockAdjustment interface."
rbernon Sep 5, 2024
29ef6a6
winegstreamer: Allow application to drain queue.
Sep 3, 2024
7cf687b
winegstreamer: Keep looking for demuxers after hlsdemux.
Jul 24, 2024
eb5a607
mfmediaengine: Retrieve frame size from frame sink.
Jul 24, 2024
6bdf837
winegstreamer: Fallback to provided sample duration and time.
Jul 23, 2024
25d9470
winegstreamer/video_processor: Support colorspace range in the D3D11 …
rbernon Sep 11, 2024
a799ca6
winegstreamer: Pass H264 codec data as "streamheader" when it's not p…
rbernon Sep 11, 2024
7ee7cda
ws2_32/Tests: Add tests for send buffering.
Sep 13, 2024
9b1fa2e
ntdll: Avoid short writes on nonblocking sockets.
Sep 13, 2024
c87a5da
ntdll: Locally duplicated socket fd for background send.
Sep 13, 2024
b7fca0c
ntdll: Don't cancel background socket sends.
Sep 13, 2024
f73d593
server: Correct STATUS_NOT_FOUND return from (cancel_async).
Sep 13, 2024
bb71e80
fixup! winevulkan: Share keyed mutex data.
Sep 20, 2024
9d08b87
winex11.drv: Set X window property to indicate if the presentation ma…
Sep 19, 2024
dfc29a9
nsiproxy: Only set the connection count from tcp_conns_enumerate_all …
misterfifths Sep 23, 2024
394fd40
nsiproxy: Only set the endpoint count from udp_endpoint_enumerate_all…
misterfifths Sep 23, 2024
d3a28f7
kernel32/tests: Add a test for TLS links.
Aug 27, 2024
ca85a96
ntdll: Reserve space for some TLS directories at once.
Aug 27, 2024
d411e70
ntdll: Iterate TEBs only once in alloc_tls_slot().
Aug 27, 2024
0e35f0f
ntdll: Do not use TlsLinks for enumerating TEBs.
Aug 27, 2024
1605977
ntdll/tests: Add more tests for process instrumentation callback.
Sep 3, 2024
7005751
ntdll: Call instrumentation callback from wine_syscall_dispatcher on …
Sep 4, 2024
cd1c13e
ntdll: Call instrumentation callback for KiUserExceptionDispatcher on…
Sep 4, 2024
b05741b
ntdll: Call instrumentation callback for LdrInitializeThunk on x64.
Sep 4, 2024
4965878
ntdll: Call instrumentation callback for KiUserModeCallback on x64.
Sep 4, 2024
f4e1f5b
ntdll: Support old parameter layout for NtSetInformationProcess( Proc…
Sep 5, 2024
b9a213d
fixup! ntdll: Support x86_64 syscall emulation.
Sep 24, 2024
ec5b076
Revert "ntdll: Change module search order in LdrFindEntryForAddress()."
Sep 24, 2024
39ec4ed
ntdll: Implement RtlRbInsertNodeEx().
Sep 20, 2024
6ed4065
ntdll: Implement RtlRbRemoveNode().
Sep 20, 2024
0eec236
ntdll/tests: Add tests for RTL RB tree.
Sep 19, 2024
47786a9
ntdll: Fill LDR_DATA_TABLE_ENTRY.BaseAddressIndexNode.
Sep 20, 2024
a9cfaa1
ntdll: Use base address tree in get_modref().
Sep 20, 2024
b0276ce
ntdll: Use base address tree in LdrFindEntryForAddress().
Sep 20, 2024
7890532
ntdll: Implement NtSetInformationProcess( ProcessTlsInformation ).
Sep 17, 2024
bb8a679
ntdll: Use NtSetInformationProcess( ProcessTlsInformation ) in alloc_…
Sep 24, 2024
d6387d1
ntdll: Match memory allocation layout for ThreadLocalStoragePointer.
Sep 24, 2024
ef19e29
ntdll/tests: Move unwinding tests to a separate file.
julliard Feb 19, 2024
68469b1
ntdll/tests: Add a test for module function table search.
Sep 24, 2024
e5eb311
ntdll: Maintain module exception directory table.
Sep 24, 2024
235d22f
HACK: wine.inf: Add native,builting override for TDUSC / xinput1_3.
Sep 24, 2024
1f7a5a0
fixup! winevulkan: Support waiting for and signalling d3d12 shared fe…
Sep 25, 2024
b27da2f
fixup! winex11.drv: Set X window property to indicate if the presenta…
Sep 25, 2024
9570a60
winhttp/tests: Add some tests for querying string options with NULL b…
nsivov Jul 8, 2024
4ba3726
winhttp: Fix error handling when returning string options.
nsivov Jul 8, 2024
08d2af1
winhttp: Implement WinHttpQueryOption(WINHTTP_OPTION_URL).
Jul 9, 2024
684cf35
winhttp/tests: Add some more tests for string options in WinHttpQuery…
nsivov Jul 16, 2024
2bff943
winhttp: Handle exact buffer length match in WinHttpQueryOption().
nsivov Jul 16, 2024
8a4c3f6
winegstreamer: HACK: Use last scanline for bottom padding.
Sep 23, 2024
d1b341e
winevulkan: Update to VK spec version 1.3.295.
DadSchoorse Aug 30, 2024
2cf1e89
winevulkan: Avoid empty struct extension conversions.
DadSchoorse Sep 26, 2024
62fa83b
winevulkan: Update to VK spec version 1.3.296.
DadSchoorse Sep 26, 2024
5b2a26d
winevulkan: Update vk.xml to 1.3.296.
ivyl Sep 27, 2024
9995111
comctl32: Implement EVENT_OBJECT_STATECHANGE for buttons.
madewokherd Jul 22, 2024
aff526a
user32: Handle WM_GETOBJECT in buttons.
madewokherd Jul 31, 2024
3a980fa
win32u: Implement EVENT_OBJECT_NAMECHANGE.
madewokherd Jul 31, 2024
3777e85
comctl32: Handle WM_GETOBJECT in tab control.
madewokherd Jul 24, 2024
f06ad04
win32u: Correctly fill new foreground window TID in WM_ACTIVATEAPP.
Sep 28, 2024
8c59a70
user32: Respond to OBJID_QUERYCLASSNAMEIDX in combo boxes.
madewokherd Sep 28, 2024
89f93d4
comctl32: Handle OBJID_QUERYCLASSNAMEIDX in trackbars.
madewokherd Sep 28, 2024
8f3cf55
ntdll: Skip dll file search when getting module handle.
Sep 29, 2024
12aadb9
atiadlxx: Bump driver version to 99.
Sep 29, 2024
3ba19d3
wine.inf: Enable builtin atiadlxx for FFXVI.
Sep 29, 2024
04de8cf
ntdll: HACK: Enable WINE_ALERT_SIMULATE_SCHED_QUANTUM option for Mary…
Sep 30, 2024
6ae2555
Revert "win32u: Correctly fill new foreground window TID in WM_ACTIVA…
Sep 30, 2024
6099e38
win32u: Call set_active_window() helper directly from handle_internal…
Sep 30, 2024
8ee1b71
win32u: Correctly fill new foreground window TID in WM_ACTIVATEAPP.
Sep 28, 2024
679c7fa
fixup! ntdll: Skip dll file search when getting module handle.
Sep 30, 2024
10b2792
ntdll: HACK: Force en-US locale for EAC launcher.
Oct 1, 2024
38fdba0
user32/tests: Add tests for QueryDisplayConfig( QDC_VIRTUAL_MODE_AWAR…
Oct 1, 2024
780daa4
win32u: Support QDC_VIRTUAL_MODE_AWARE in NtUserGetDisplayConfigBuffe…
Oct 1, 2024
4bc808b
win32u: Support QDC_VIRTUAL_MODE_AWARE in NtUserQueryDisplayConfig().
Oct 1, 2024
1a4a258
ntdll: Use pagesize alignment if MEM_REPLACE_PLACEHOLDER is set in fl…
jfmu Jan 10, 2024
aa4dc9a
ntdll: Include alloc_type argument in NtMapViewOfSection(Ex) traces.
alexhenrie Jan 7, 2024
b3d9d05
kernelbase/tests: Add a test for MapViewOfFile3 with MEM_REPLACE_PLAC…
jfmu Jan 10, 2024
6f66362
amd_ags_x64: Alias some AGS 3.2 agsDriverExtensions_ functions.
Oct 2, 2024
8095370
mscoree: Register mono log handler callback.
besentv Sep 27, 2024
de12886
server: Stop waiting on LL-hooks for non-injected input.
rbernon Jan 20, 2024
b6c3cae
Revert "esync, fsync: Support wait on completion ports."
Oct 7, 2024
798c696
Revert "kernelbase: Set the proper error code in GetQueuedCompletionS…
Oct 7, 2024
8875d37
Revert "server: Ensure completion port wait object exists after succe…
Oct 7, 2024
46bf899
Revert "server: Abandon wait when completion port is closed."
Oct 7, 2024
4c993e3
Revert "server: Split waitable object off completion port."
Oct 7, 2024
6e10690
ntdll: Introduce a separate per-thread object for internal completion…
Oct 8, 2024
e9a4987
ntdll: Assign completion to thread when wait for completion is satisf…
Oct 8, 2024
5caf0f6
ntdll: Handle user APCs explicitly in NtRemoveIoCompletionEx().
Oct 8, 2024
f6b8bdd
server: Signal completion port waits on handle close.
Oct 7, 2024
2978842
kernelbase: Set the proper error code in GetQueuedCompletionStatus{Ex…
AlexeyProkhin Apr 23, 2020
d771feb
ntdll/tests: Add tests for completion port signaling.
Dec 7, 2021
6c0bf12
ntdll: fsync: Introduce explicit server wait helper and use it for so…
Oct 7, 2024
95b1cb1
esync, fsync: Support wait on completion ports.
Oct 7, 2024
ed14565
ntdll: esync, fsync: Check for port signal state for zero timeout in …
Oct 8, 2024
ccf1a21
win32u: Use an internal message for XIM IME notifications.
rbernon Oct 8, 2024
7674a60
gdiplus: Assign box height when bounding box height is larger.
tati-frog Oct 1, 2024
73c59c4
shlwapi/tests: Add some tests for printf format.
Oct 9, 2024
6edaed1
shlwapi: Handle repeated modifiers in WPRINTF_ParseFormat().
Oct 9, 2024
b2223d6
shlwapi: Fix char width modifiers handling in WPRINTF_ParseFormat().
Oct 9, 2024
c9c9aaf
shlwapi: Handle ll in WPRINTF_ParseFormat().
Oct 9, 2024
af037f3
shlwapi: Skip some spaces in WPRINTF_ParseFormat().
Oct 9, 2024
cd40157
shlwapi: Skip duplicate '#' in WPRINTF_ParseFormat().
Oct 9, 2024
2e32720
shlwapi: Output unrecognized format symbol in wvnsprintf().
Oct 9, 2024
d13dcc8
winegstreamer/wm_reader: Use codec format only for compressed types.
ziqingh Sep 24, 2024
2d9efbe
ntdll: HACK: Introduce WINE_HEAP_TOP_DOWN hack.
Oct 11, 2024
c3654af
windowscodecs: Implement 48bppRGB -> 64bppRGBA conversion.
Oct 14, 2024
7f3e7a6
mmdevapi: Fix buffer overflow in pulse_set_sample_rate.
tati-frog Oct 3, 2024
58f3d92
windows.gaming.input: Invoke handlers outside of the handlers critica…
rbernon Oct 21, 2024
6a54107
setupapi: Implement SetupDiOpenDeviceInterface(A|W).
rbernon Oct 21, 2024
818c15a
explorer: Prevent apps from showing Wine specific shell tray window w…
Oct 24, 2024
5d82fb1
icu: Add stub dll.
Oct 24, 2024
69d63af
icu: Add ucal_getTimeZoneIDForWindowsID() stub.
Oct 24, 2024
9be2df0
icu: Add u_errorName() stub.
Oct 24, 2024
03435d0
winegstreamer: Use wmaversion = 4 for MFAudioFormat_WMAudio_Lossless.
rbernon Oct 12, 2024
195f7f9
Revert "server: Check wineserver privileges on init with -20 niceness."
rbernon Oct 25, 2024
15cef48
Revert "server: Use setpriority to update thread niceness when safe."
rbernon Oct 25, 2024
f57a4bf
Revert "ntdll: Set RLIMIT_NICE to its hard limit."
rbernon Oct 25, 2024
da27569
Revert "server: Introduce new set_thread_priority helper."
rbernon Oct 25, 2024
06c8219
server: Introduce new set_thread_priority helper.
rbernon Dec 1, 2023
78affb7
ntdll: Set RLIMIT_NICE to its hard limit.
rbernon Dec 1, 2023
7a96feb
server: Use setpriority to update thread niceness when safe.
marzent Jan 29, 2024
10993e6
server: Check wineserver privileges on init with -20 niceness.
rbernon Nov 29, 2023
8625d72
amend! server: Check wineserver privileges on init with -20 niceness.
rbernon Oct 25, 2024
bbe27e4
HACK: winegstreamer/wm_reader: Force faking compressed samples for so…
rbernon Oct 30, 2024
0bb7f5c
fixup! ntdll: Support gpuvis tracing.
Aug 29, 2024
4440f4f
server: Sync cursor position on window position change.
Oct 21, 2024
321e39e
Revert "icu: Add u_errorName() stub."
Oct 31, 2024
7343db0
Revert "icu: Add ucal_getTimeZoneIDForWindowsID() stub."
Oct 31, 2024
9c0d54c
icu: Forward function to Unicode library v68.
Oct 28, 2024
2814fbc
kernelbase: Handle missing PROCESS_QUERY_INFORMATION access right in …
Nov 4, 2024
8e77623
mountmgr.sys: Stub StorageDeviceSeekPenaltyProperty query.
Aug 16, 2024
5207004
gdi32: Implement D3DKMTEnumAdapters2
liam-middlebrook Oct 12, 2024
9637473
win32u: Move D3DKMTQueryAdapterInfo into gdi_dc_funcs
liam-middlebrook Oct 12, 2024
22a8cff
winex11.drv: Implement D3DKMTQueryAdapterInfo WDDM_2_7_CAPS
liam-middlebrook Oct 12, 2024
5f23175
opengl32: HACK: Do not check for extensions in wglGetProcAddress() fo…
Nov 6, 2024
680d20a
winex11.drv: fshack: Don't use real_settings_handler.get_id() in upda…
Oct 22, 2024
27376b6
server: Don't update cursor pos in (set_window_pos) if windows wasn't…
Nov 13, 2024
a3a833e
winegstreamer: Fallback to old media source for RE7 and RE8.
Nov 15, 2024
b60ad7a
opengl: Avoid inifinite recursion in bezier_approximate() in case of …
Nov 19, 2024
9054499
amend! opengl: Avoid inifinite recursion in bezier_approximate() in c…
Nov 19, 2024
eae1b9e
mshtml: Copy POST data in BindStatusCallback_GetBindInfo().
Nov 20, 2024
7eca544
mshtml: HACK: Always set document compatibility mode to IE11 in FFXIV…
LizzyFleckenstein03 Nov 13, 2024
f3a444f
jscript: Handle star and opt operators while matching global regex pr…
LizzyFleckenstein03 Nov 18, 2024
fb04979
fixup! winebus: Use evdev backend for the Steam Input virtual control…
ivyl Nov 20, 2024
2e95deb
Revert "fixup! winebus: Use evdev backend for the Steam Input virtual…
ivyl Nov 20, 2024
c648b4b
Revert "mshtml: Copy POST data in BindStatusCallback_GetBindInfo()."
Nov 21, 2024
6baf817
mshtml: Don't use cycle collection for nsChannel.
g-insn Nov 20, 2024
63819ec
dinput/tests: Add tests for joystick id.
Nov 22, 2024
2b91c62
dinput: Derive DIPROP_JOYSTICKID from device path enumeration.
Nov 22, 2024
a0251e8
dinput: Once again support creating joystick device with GUID_Joystick.
Nov 21, 2024
321a2d2
fixup! HACK: winex11, winevulkan: Support faking GPU PCI IDs.
Nov 22, 2024
0bf3ba6
user32/tests: Add some ReleaseCapture() tests.
zzhiyi Mar 8, 2024
82760c0
win32u: Only send mouse input in ReleaseCapture() when a window is ca…
zzhiyi Mar 8, 2024
c538978
winegstreamer: Fallback to old media source for Hell Let Loose.
Nov 27, 2024
b186b4d
ddraw/tests: Add tests for preserving d3d state during primary surfac…
Jun 18, 2024
579fd56
ddraw: Preserve d3d device state in ddraw_surface_create().
Jun 18, 2024
9b11543
ddraw: HACK: Blit to fullscreen window instead of desktop window in d…
Nov 27, 2024
c86c9b6
protontts: Implement basic TTS functionality using Piper.
shaunren Mar 6, 2024
ae4ef0e
sapi: Remove Wine Default Voice from sapi.rgs.
shaunren Mar 6, 2024
07ce567
wine.inf: Add protontts registry entries.
shaunren Mar 13, 2024
edf30f5
HACK: winegstreamer: avoid large buffer pushes in transform
Nov 27, 2024
5d4f920
gdbinit: Catch exceptions when trying to remove symbol files.
besentv Nov 28, 2024
a37fc62
mmdevapi/tests: Test for IAudioClockAdjustment.
tati-frog Oct 25, 2024
f15fdd6
mmdevapi: Do not modify buffer size after sample rate change.
tati-frog Oct 25, 2024
09af566
dinput8: Prefer the native DLL.
TheComputerGuy96 Sep 19, 2024
a970591
fixup! ntdll: Implement CPU topology override.
Dec 2, 2024
e451421
winegstreamer: Avoid pre-condition assertion failures.
Dec 2, 2024
9b3c739
winegstreamer: Fix segfault when stream->stream is NULL.
Dec 2, 2024
84dcb92
winegstreamer: HACK: Add MP3 as an input type for the audio decoder.
Dec 2, 2024
a17981e
fixup! ntdll: Implement CPU topology override.
Dec 2, 2024
8491cb1
kernelbase: HACK: Force disable direct composition for Willful.
Dec 4, 2024
9956936
fixup! vrclient: winevulkan: Add struct unwrappers for vrclient.
Dec 4, 2024
4af8d19
amend! sapi: Remove Wine Default Voice from sapi.rgs.
ivyl Dec 6, 2024
3ea11ba
winegstreamer: Handle null transform in video IMediaObject::Flush().
Dec 3, 2024
997c27b
winegstreamer: Handle null transform in video IMFTransform::ProcessMe…
Dec 3, 2024
7a06d14
winegstreamer: Handle null transform in video IMFTransform::ProcessMe…
Dec 3, 2024
0d0d25a
winegstreamer: Handle null transform in audio IMFTransform::ProcessMe…
Dec 3, 2024
e47b139
winegstreamer: Handle null transform in audio IMFTransform::ProcessMe…
Dec 3, 2024
fc3876d
winegstreamer: Handle null transform in WMA IMediaObject::Flush().
Dec 3, 2024
1296768
mshtml, jscript: HACK: Process sent messages and WM_TIMER often enoug…
Nov 15, 2024
19116f2
mscoree: Update Wine Mono to 9.3.1.
madewokherd Nov 15, 2024
4defc5b
dmime: AudioPathConfig is not AudioPath.
Jan 16, 2024
252130a
dmime: Parse AudioPathConfig.
Jan 17, 2024
102b853
dmime: IDirectMusicPerformance::CreateAudioPath should fail when conf…
Jan 16, 2024
f3531d8
dmime: Semi-support creating an audio path from config.
Jan 18, 2024
60f95ca
dmusic: Fix loading wave data from soundfont.
Feb 6, 2024
45c2c81
dmband: Implement getting/setting GUID_BandParam on band tracks.
Jan 31, 2024
78e4262
dmime/tests: Add MIDI loading test.
Jan 31, 2024
7824626
dmime: Parse MIDI headers.
Feb 7, 2024
5bf3cca
dmime: Don't skip chunk for MIDI files.
Feb 16, 2024
28e0bf1
dmime: Read through a MIDI file.
Feb 15, 2024
d8c7546
dmime/tests: Improve error reporting from expect_track.
Feb 21, 2024
6c3d8e1
dmband: Move band.c to dmusic.
Jan 31, 2024
fa12189
dmime: Better MIDI parsing interface.
Feb 27, 2024
486e939
dmime: Parse MIDI program change events and generate a bandtrack.
Feb 27, 2024
d523377
dmime: Add a stub chordtrack for MIDI segments.
Feb 15, 2024
0854e35
dmime: Use linked list for tempotrack.
Feb 15, 2024
d593287
dmime: Implement setting TempoParam for tempotracks.
Feb 15, 2024
9c6aa9f
dmime: Parse MIDI Set Tempo meta events and generate a tempotrack.
Feb 15, 2024
855d9a1
dmime/tests: Call the correct QueryInterface function for DirectMusic…
Feb 19, 2024
07827d8
dmime: Parse note on/off events and generate a seqtrack.
Feb 21, 2024
c612c37
dmime: Handle MIDI control events in MIDI files.
Feb 22, 2024
13448f7
HACK: winegstreamer: Don't force codec data length for WMA.
ziqingh Nov 7, 2024
bad2114
HACK: winegstreamer: Introduce stream_get_untranscoded_format.
ziqingh Nov 15, 2024
dcb2ac4
HACK: winegstreamer/wma_decoder: Try F32LE if stream is transcoded.
ziqingh Nov 15, 2024
a8346c2
HACK: winegstreamer: Disable OpenGL elements for KiriKiri games.
ziqingh Nov 15, 2024
7bb1c64
HACK: Always output uncompressed samples for kirikiri games.
ziqingh Dec 3, 2024
3229341
qasf: Return S_FALSE for flushing in dmo_wrapper_sink_Receive.
ziqingh Nov 27, 2024
20d3fc7
qasf/tests: Test dmo_wrapper_sink_Receive if downstream fail to receive.
ziqingh Nov 28, 2024
0dc902d
qasf: Return failure in dmo_wrapper_sink_Receive if process_output fa…
ziqingh Nov 28, 2024
646fbe6
qasf/tests: Add more tests for dmo_wrapper_sink_Receive.
ziqingh Dec 4, 2024
18a59d8
qasf: Correctly return failure in process_output.
ziqingh Dec 4, 2024
bef0c3c
HACK: winegstreamer: Add The "Ditzy Demons Are In Love With Me" to Ki…
ziqingh Dec 13, 2024
4b42621
wine.inf: Add UBR field to CurrentVersion.
Dec 16, 2024
1bfc824
wbemprox: Bump driver date.
Dec 16, 2024
6a45845
fixup! HACK: winegstreamer: Introduce stream_get_untranscoded_format.
ziqingh Dec 17, 2024
544c502
Prefer native versions of various DLLs
Tiagoquix Dec 17, 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
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -217,12 +217,12 @@ P: Zebediah Figura <z.figura12@gmail.com>
F: dlls/mf/tests/transform.c
F: dlls/winegstreamer/aac_decoder.c
F: dlls/winegstreamer/color_convert.c
F: dlls/winegstreamer/h264_decoder.c
F: dlls/winegstreamer/media_source.c
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
9 changes: 9 additions & 0 deletions autogen.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/sh
set -e
tools/make_requests
dlls/winevulkan/make_vulkan -x vk.xml
tools/make_specfiles
autoreconf -ifv
rm -rf autom4te.cache

echo "Now run ./configure"
Loading