From 3de4924a09519fa70b668eae36bd9c23bb389144 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 27 Nov 2025 07:00:04 +0000 Subject: [PATCH] windows 7 stuffs --- src/common/steady_clock.cpp | 24 +++++++++++++++--------- src/common/thread.cpp | 3 ++- src/common/windows/timer_resolution.cpp | 17 +++++++++++------ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/common/steady_clock.cpp b/src/common/steady_clock.cpp index 9415eed29b..f142000688 100644 --- a/src/common/steady_clock.cpp +++ b/src/common/steady_clock.cpp @@ -25,15 +25,21 @@ static s64 WindowsQueryPerformanceCounter() { } static s64 GetSystemTimeNS() { - // GetSystemTimePreciseAsFileTime returns the file time in 100ns units. - static constexpr s64 Multiplier = 100; - // Convert Windows epoch to Unix epoch. - static constexpr s64 WindowsEpochToUnixEpoch = 0x19DB1DED53E8000LL; - - FILETIME filetime; - GetSystemTimePreciseAsFileTime(&filetime); - return Multiplier * ((static_cast(filetime.dwHighDateTime) << 32) + - static_cast(filetime.dwLowDateTime) - WindowsEpochToUnixEpoch); + static auto pf = (decltype(&GetSystemTimePreciseAsFileTime))(void*)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "GetSystemTimePreciseAsFileTime"); // Windows 8+ + if (pf) { + // GetSystemTimePreciseAsFileTime returns the file time in 100ns units. + constexpr s64 Multiplier = 100; + // Convert Windows epoch to Unix epoch. + constexpr s64 WindowsEpochToUnixEpoch = 0x19DB1DED53E8000LL; + FILETIME filetime; + GetSystemTimePreciseAsFileTime(&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 diff --git a/src/common/thread.cpp b/src/common/thread.cpp index cc78587c36..482848b244 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -81,7 +81,8 @@ 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+ } diff --git a/src/common/windows/timer_resolution.cpp b/src/common/windows/timer_resolution.cpp index bf29823455..b742c32bd4 100644 --- a/src/common/windows/timer_resolution.cpp +++ b/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 @@ -62,13 +65,15 @@ TimerResolution GetTimerResolution() { void SetHighQoS() { // https://learn.microsoft.com/en-us/windows/win32/procthread/quality-of-service - PROCESS_POWER_THROTTLING_STATE PowerThrottling{ - .Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION, - .ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED | PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION, - .StateMask = 0, - }; - if (auto pf = (decltype(&SetProcessInformation))(void*)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "SetProcessInformation"); pf) + static auto 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 = 0, + }; pf(GetCurrentProcess(), ProcessPowerThrottling, &PowerThrottling, sizeof(PROCESS_POWER_THROTTLING_STATE)); // Windows 7+ + } } } // Anonymous namespace