From 77eab92c0d69263d22b83247b8ba351bece010ef Mon Sep 17 00:00:00 2001 From: cdozdil Date: Wed, 8 Jul 2026 00:48:19 +0300 Subject: [PATCH] Added Force FG render size motion vectors quirk for WWM --- OptiScaler/dllmain.cpp | 3 +++ OptiScaler/framegen/ffx/FSRFG_Dx12.cpp | 5 ++++- OptiScaler/framegen/xefg/XeFG_Dx12.cpp | 3 ++- OptiScaler/menu/menu_common.cpp | 4 +++- OptiScaler/misc/Quirks.h | 3 ++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/OptiScaler/dllmain.cpp b/OptiScaler/dllmain.cpp index e7f138c6..7580c65c 100644 --- a/OptiScaler/dllmain.cpp +++ b/OptiScaler/dllmain.cpp @@ -1337,6 +1337,9 @@ static void printQuirks(flag_set& quirks) if (quirks & GameQuirk::IgnoreValidUntilEvaluateForFG) stringQuirks.push_back("Ignore ValidUntilEvaluate resources for FG"); + if (quirks & GameQuirk::ForceFGRenderSizeMVs) + stringQuirks.push_back("Force FG render size motion vectors"); + state->detectedQuirks.append_range(stringQuirks); for (auto& stringQuirk : stringQuirks) spdlog::info("Quirk: {}", stringQuirk); diff --git a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp index 38d3f13b..07b9b528 100644 --- a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp +++ b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp @@ -1081,8 +1081,11 @@ void FSRFG_Dx12::CreateContext(ID3D12Device* device, FG_Constants& fgConstants) if (fgConstants.flags & FG_Flags::JitteredMVs) createFg.flags |= FFX_FRAMEGENERATION_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION; - if (fgConstants.flags & FG_Flags::DisplayResolutionMVs) + if ((fgConstants.flags & FG_Flags::DisplayResolutionMVs) && + !(State::Instance().gameQuirks & GameQuirk::ForceFGRenderSizeMVs)) + { createFg.flags |= FFX_FRAMEGENERATION_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS; + } if (fgConstants.flags & FG_Flags::Async) createFg.flags |= FFX_FRAMEGENERATION_ENABLE_ASYNC_WORKLOAD_SUPPORT; diff --git a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp index c9a30abe..edf83ba5 100644 --- a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp +++ b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp @@ -609,7 +609,8 @@ void XeFG_Dx12::Activate() nativeAA = currentFeature->RenderWidth() == currentFeature->DisplayWidth(); if (_swapChainContext != nullptr && _fgContext != nullptr && !_isActive && - (IsLowResMV() || nativeAA || Config::Instance()->FGXeFGIgnoreInitChecks.value_or_default())) + (IsLowResMV() || nativeAA || (State::Instance().gameQuirks & GameQuirk::ForceFGRenderSizeMVs) || + Config::Instance()->FGXeFGIgnoreInitChecks.value_or_default())) { auto result = XeFGProxy::SetEnabled()(_swapChainContext, true); diff --git a/OptiScaler/menu/menu_common.cpp b/OptiScaler/menu/menu_common.cpp index f0cabd8d..1e755537 100644 --- a/OptiScaler/menu/menu_common.cpp +++ b/OptiScaler/menu/menu_common.cpp @@ -4356,7 +4356,9 @@ bool MenuCommon::RenderMenu() nativeAA = currentFeature->RenderWidth() == currentFeature->DisplayWidth(); auto fgOutput = reinterpret_cast(state.currentFG); - const bool correctMVs = fgOutput && fgOutput->IsLowResMV() || nativeAA || ignoreChecks; + const bool correctMVs = fgOutput && fgOutput->IsLowResMV() || nativeAA || + (State::Instance().gameQuirks & GameQuirk::ForceFGRenderSizeMVs) || + ignoreChecks; if (!correctMVs || state.realExclusiveFullscreen) { diff --git a/OptiScaler/misc/Quirks.h b/OptiScaler/misc/Quirks.h index 0579c4ca..4bbcd869 100644 --- a/OptiScaler/misc/Quirks.h +++ b/OptiScaler/misc/Quirks.h @@ -63,6 +63,7 @@ enum class GameQuirk : uint64_t ForceDepthD32S8, PregmataFixDLSSModes, IgnoreValidUntilEvaluateForFG, + ForceFGRenderSizeMVs, // Don't forget to add the new entry to printQuirks _ }; @@ -121,7 +122,7 @@ static const QuirkEntry quirkTable[] = { // Where Winds Meet // Required to avoid forced DLSS dilated MVs - QUIRK_ENTRY("wwm.exe", GameQuirk::DisableXeFGChecks), + QUIRK_ENTRY("wwm.exe", GameQuirk::ForceFGRenderSizeMVs), // Arknights: Endfield // Reflex hooking crashes the game