diff options
author | riperiperi <rhy3756547@hotmail.com> | 2023-11-30 10:39:42 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-30 15:39:42 -0300 |
commit | 1be668e68a1937f2af239e2707ab914286018892 (patch) | |
tree | d3ecb590d444ab9b392928ae1e223930313615e6 /src/Ryujinx.Common/PreciseSleep/IPreciseSleepEvent.cs | |
parent | 21cd4c0c00e4a06e399c93419c8f9eff0e663bfb (diff) |
HLE: Add OS-specific precise sleep methods to reduce spinwaiting (#5948)1.1.1094
* feat: add nanosleep for linux and macos
* Add Windows 0.5ms sleep
- Imprecise waits for longer waits with clock alignment
- 1/4 the spin time on vsync timer
* Remove old experiment
* Fix event leak
* Tweaking for MacOS
* Linux tweaks, nanosleep vsync improvement
* Fix overbias
* Cleanup
* Fix realignment
* Add some docs and some cleanup
NanosleepPool needs more, Nanosleep has some benchmark code that needs removed.
* Rename "Microsleep" to "PreciseSleep"
Might have been confused with "microseconds", which no measurement is performed in.
* Remove nanosleep measurement
* Remove unused debug logging
* Nanosleep Pool Documentation
* More cleanup
* Whitespace
* Formatting
* Address Feedback
* Allow SleepUntilTimePoint to take EventWaitHandle
* Remove `_chrono` stopwatch in SurfaceFlinger
* Move spinwaiting logic to PreciseSleepHelper
Technically, these achieve different things, but having them here makes them easier to reuse or tune.
Diffstat (limited to 'src/Ryujinx.Common/PreciseSleep/IPreciseSleepEvent.cs')
-rw-r--r-- | src/Ryujinx.Common/PreciseSleep/IPreciseSleepEvent.cs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/Ryujinx.Common/PreciseSleep/IPreciseSleepEvent.cs b/src/Ryujinx.Common/PreciseSleep/IPreciseSleepEvent.cs new file mode 100644 index 00000000..26b5ab68 --- /dev/null +++ b/src/Ryujinx.Common/PreciseSleep/IPreciseSleepEvent.cs @@ -0,0 +1,38 @@ +using System; + +namespace Ryujinx.Common.PreciseSleep +{ + /// <summary> + /// An event which works similarly to an AutoResetEvent, but is backed by a + /// more precise timer that allows waits of less than a millisecond. + /// </summary> + public interface IPreciseSleepEvent : IDisposable + { + /// <summary> + /// Adjust a timepoint to better fit the host clock. + /// When no adjustment is made, the input timepoint will be returned. + /// </summary> + /// <param name="timePoint">Timepoint to adjust</param> + /// <param name="timeoutNs">Requested timeout in nanoseconds</param> + /// <returns>Adjusted timepoint</returns> + long AdjustTimePoint(long timePoint, long timeoutNs); + + /// <summary> + /// Sleep until a timepoint, or a signal is received. + /// Given no signal, may wake considerably before, or slightly after the timeout. + /// </summary> + /// <param name="timePoint">Timepoint to sleep until</param> + /// <returns>True if signalled or waited, false if a wait could not be performed</returns> + bool SleepUntil(long timePoint); + + /// <summary> + /// Sleep until a signal is received. + /// </summary> + void Sleep(); + + /// <summary> + /// Signal the event, waking any sleeping thread or the next attempted sleep. + /// </summary> + void Signal(); + } +} |