lizzie
3 weeks ago
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
3 changed files with
32 additions and
20 deletions
src/common/steady_clock.cpp
src/common/thread.cpp
src/common/windows/timer_resolution.cpp
@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@ -25,15 +28,21 @@ static s64 WindowsQueryPerformanceCounter() {
}
static s64 GetSystemTimeNS ( ) {
static auto pf = ( decltype ( & GetSystemTimePreciseAsFileTime ) ) ( void * ) GetProcAddress ( GetModuleHandle ( TEXT ( " Kernel32.dll " ) ) , " GetSystemTimePreciseAsFileTime " ) ; // Windows 8+
if ( pf ) {
// GetSystemTimePreciseAsFileTime returns the file time in 100ns units.
static constexpr s64 Multiplier = 100 ;
constexpr s64 Multiplier = 100 ;
// Convert Windows epoch to Unix epoch.
static constexpr s64 WindowsEpochToUnixEpoch = 0x19DB1DED53E8000LL ;
constexpr s64 WindowsEpochToUnixEpoch = 0x19DB1DED53E8000LL ;
FILETIME filetime ;
GetSystemTimePreciseAsFileTime ( & filetime ) ;
return Multiplier * ( ( static_cast < s64 > ( filetime . dwHighDateTime ) < < 32 ) +
static_cast < s64 > ( filetime . dwLowDateTime ) - WindowsEpochToUnixEpoch ) ;
pf ( & filetime ) ;
return Multiplier * ( ( s64 ( filetime . dwHighDateTime ) < < 32 ) + s64 ( filetime . dwLowDateTime ) - WindowsEpochToUnixEpoch ) ;
} else {
// Only Windows XP and below error out here
LARGE_INTEGER ticks ;
QueryPerformanceCounter ( & ticks ) ;
return ticks . QuadPart ;
}
}
# endif
@ -81,10 +81,9 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) {
// Sets the debugger-visible name of the current thread.
void SetCurrentThreadName ( const char * name ) {
if ( auto pf = ( decltype ( & SetThreadDescription ) ) ( void * ) GetProcAddress ( GetModuleHandle ( TEXT ( " KernelBase.dll " ) ) , " SetThreadDescription " ) ; pf )
static auto pf = ( decltype ( & SetThreadDescription ) ) ( void * ) GetProcAddress ( GetModuleHandle ( TEXT ( " KernelBase.dll " ) ) , " SetThreadDescription " ) ;
if ( pf )
pf ( GetCurrentThread ( ) , UTF8ToUTF16W ( name ) . data ( ) ) ; // Windows 10+
else
; // No-op
}
# else // !MSVC_VER, so must be POSIX threads
@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@ -62,14 +65,15 @@ TimerResolution GetTimerResolution() {
void SetHighQoS ( ) {
// https://learn.microsoft.com/en-us/windows/win32/procthread/quality-of-service
static auto pf = ( decltype ( & SetProcessInformation ) ) ( void * ) GetProcAddress ( GetModuleHandle ( TEXT ( " Kernel32.dll " ) ) , " SetProcessInformation " ) ;
if ( pf ) {
PROCESS_POWER_THROTTLING_STATE PowerThrottling {
. Version { PROCESS_POWER_THROTTLING_CURRENT_VERSION } ,
. ControlMask { PROCESS_POWER_THROTTLING_EXECUTION_SPEED |
PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION } ,
. StateMask { } ,
. Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION ,
. ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED | PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION ,
. StateMask = 0 ,
} ;
SetProcessInformation ( GetCurrentProcess ( ) , ProcessPowerThrottling , & PowerThrottling ,
sizeof ( PROCESS_POWER_THROTTLING_STATE ) ) ;
pf ( GetCurrentProcess ( ) , ProcessPowerThrottling , & PowerThrottling , sizeof ( PROCESS_POWER_THROTTLING_STATE ) ) ; // Windows 7+
}
}
} // Anonymous namespace