diff --git a/Source/Core/Core/Config/GraphicsSettings.cpp b/Source/Core/Core/Config/GraphicsSettings.cpp index dcf6e817d8..9a9bf41485 100644 --- a/Source/Core/Core/Config/GraphicsSettings.cpp +++ b/Source/Core/Core/Config/GraphicsSettings.cpp @@ -97,8 +97,8 @@ const Info GFX_CPU_CULL{{System::GFX, "Settings", "CPUCull"}, false}; const Info GFX_MTL_MANUALLY_UPLOAD_BUFFERS{ {System::GFX, "Settings", "ManuallyUploadBuffers"}, TriState::Auto}; -const Info GFX_MTL_USE_PRESENT_DRAWABLE{{System::GFX, "Settings", "MTLUsePresentDrawable"}, - false}; +const Info GFX_MTL_USE_PRESENT_DRAWABLE{ + {System::GFX, "Settings", "MTLUsePresentDrawable"}, TriState::Auto}; const Info GFX_SW_DUMP_OBJECTS{{System::GFX, "Settings", "SWDumpObjects"}, false}; const Info GFX_SW_DUMP_TEV_STAGES{{System::GFX, "Settings", "SWDumpTevStages"}, false}; diff --git a/Source/Core/Core/Config/GraphicsSettings.h b/Source/Core/Core/Config/GraphicsSettings.h index ad8d2aeb7f..c1f301a4a9 100644 --- a/Source/Core/Core/Config/GraphicsSettings.h +++ b/Source/Core/Core/Config/GraphicsSettings.h @@ -85,7 +85,7 @@ extern const Info GFX_PREFER_VS_FOR_LINE_POINT_EXPANSION; extern const Info GFX_CPU_CULL; extern const Info GFX_MTL_MANUALLY_UPLOAD_BUFFERS; -extern const Info GFX_MTL_USE_PRESENT_DRAWABLE; +extern const Info GFX_MTL_USE_PRESENT_DRAWABLE; extern const Info GFX_SW_DUMP_OBJECTS; extern const Info GFX_SW_DUMP_TEV_STAGES; diff --git a/Source/Core/VideoBackends/Metal/MTLRenderer.mm b/Source/Core/VideoBackends/Metal/MTLRenderer.mm index 7d6c583599..7e915f045a 100644 --- a/Source/Core/VideoBackends/Metal/MTLRenderer.mm +++ b/Source/Core/VideoBackends/Metal/MTLRenderer.mm @@ -459,7 +459,9 @@ void Metal::Renderer::PresentBackbuffer() // when windowed (or fullscreen with vsync enabled, but that's more understandable). // On the other hand, it helps Xcode's GPU captures start and stop on frame boundaries // which is convenient. Put it here as a default-off config, which we can override in Xcode. - if (g_ActiveConfig.bUsePresentDrawable) + // It also seems to improve frame pacing, so enable it by default with vsync + if (g_ActiveConfig.iUsePresentDrawable == TriState::On || + (g_ActiveConfig.iUsePresentDrawable == TriState::Auto && g_ActiveConfig.bVSyncActive)) [g_state_tracker->GetRenderCmdBuf() presentDrawable:m_drawable]; else [g_state_tracker->GetRenderCmdBuf() diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index eb00555487..f37d8e9595 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -56,7 +56,7 @@ void VideoConfig::Refresh() bVSync = Config::Get(Config::GFX_VSYNC); iAdapter = Config::Get(Config::GFX_ADAPTER); iManuallyUploadBuffers = Config::Get(Config::GFX_MTL_MANUALLY_UPLOAD_BUFFERS); - bUsePresentDrawable = Config::Get(Config::GFX_MTL_USE_PRESENT_DRAWABLE); + iUsePresentDrawable = Config::Get(Config::GFX_MTL_USE_PRESENT_DRAWABLE); bWidescreenHack = Config::Get(Config::GFX_WIDESCREEN_HACK); aspect_mode = Config::Get(Config::GFX_ASPECT_RATIO); diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index 036b5955ba..df6f608760 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -177,7 +177,7 @@ struct VideoConfig final // Metal only config TriState iManuallyUploadBuffers = TriState::Auto; - bool bUsePresentDrawable = false; + TriState iUsePresentDrawable = TriState::Auto; // Enable API validation layers, currently only supported with Vulkan. bool bEnableValidationLayer = false;