diff --git a/src/common/apple_utils.h b/src/common/apple_utils.h index 472982874..4354fbaa3 100644 --- a/src/common/apple_utils.h +++ b/src/common/apple_utils.h @@ -4,6 +4,7 @@ namespace AppleUtils { +float GetRefreshRate(); int IsLowPowerModeEnabled(); -} +} // namespace AppleUtils diff --git a/src/common/apple_utils.mm b/src/common/apple_utils.mm index 99a3d3235..5f9a2254b 100644 --- a/src/common/apple_utils.mm +++ b/src/common/apple_utils.mm @@ -2,10 +2,29 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#import +#import #import namespace AppleUtils { +float GetRefreshRate() { // TODO: How does this handle multi-monitor? -OS + NSScreen* screen = [NSScreen mainScreen]; + if (screen) { + NSDictionary* screenInfo = [screen deviceDescription]; + CGDirectDisplayID displayID = + (CGDirectDisplayID)[screenInfo[@"NSScreenNumber"] unsignedIntValue]; + CGDisplayModeRef displayMode = CGDisplayCopyDisplayMode(displayID); + if (displayMode) { + CGFloat refreshRate = CGDisplayModeGetRefreshRate(displayMode); + CFRelease(displayMode); + return refreshRate; + } + } + + return 60; // Something went wrong, so just return a generic value +} + int IsLowPowerModeEnabled() { return (int)[NSProcessInfo processInfo].lowPowerModeEnabled; } diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index db1b0f439..95bb7bd4b 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -60,7 +60,11 @@ constexpr static std::array PRESENT_BINDINGS namespace { static bool IsLowRefreshRate() { -#ifdef ENABLE_SDL2 +#if defined(__APPLE__) || defined(ENABLE_SDL2) +#ifdef __APPLE__ // Need a special implementation because MacOS kills itself in disgust if the + // input thread calls SDL_PumpEvents at the same time as we're in SDL_Init here. + const auto cur_refresh_rate = AppleUtils::GetRefreshRate(); +#elif defined(ENABLE_SDL2) if (SDL_Init(SDL_INIT_VIDEO) != 0) { LOG_ERROR(Render_Vulkan, "SDL video failed to initialize, unable to check refresh rate"); return false; @@ -71,6 +75,7 @@ static bool IsLowRefreshRate() { const auto cur_refresh_rate = cur_display_mode.refresh_rate; SDL_QuitSubSystem(SDL_INIT_VIDEO); +#endif // __APPLE__ if (cur_refresh_rate < SCREEN_REFRESH_RATE) { LOG_WARNING(Render_Vulkan, @@ -79,7 +84,7 @@ static bool IsLowRefreshRate() { cur_refresh_rate); return true; } -#endif +#endif // defined(__APPLE__) || defined(ENABLE_SDL2) #ifdef __APPLE__ // Apple's low power mode sometimes limits applications to 30fps without changing the refresh