From b41a44dd600c6d2deab30a4dd9068f0484ab9dce Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Tue, 13 Oct 2026 21:56:36 +0200 Subject: [PATCH] Factor out common OptiFG functions Slopped. --- OptiScaler/OptiScaler.vcxproj | 2 + OptiScaler/OptiScaler.vcxproj.filters | 6 ++ OptiScaler/inputs/FG/FSR3_Dx12_FG.cpp | 59 +------------- OptiScaler/inputs/FG/Upscaler_Inputs.cpp | 73 +++++++++++++++++ OptiScaler/inputs/FG/Upscaler_Inputs.h | 20 +++++ .../inputs/FG/Upscaler_Inputs_Dx11wDx12.cpp | 77 ++---------------- OptiScaler/inputs/FG/Upscaler_Inputs_Dx12.cpp | 78 ++----------------- OptiScaler/inputs/FG/Upscaler_Inputs_Vk.cpp | 73 ++--------------- 8 files changed, 121 insertions(+), 267 deletions(-) create mode 100644 OptiScaler/inputs/FG/Upscaler_Inputs.cpp create mode 100644 OptiScaler/inputs/FG/Upscaler_Inputs.h diff --git a/OptiScaler/OptiScaler.vcxproj b/OptiScaler/OptiScaler.vcxproj index f95473c9..12704e65 100644 --- a/OptiScaler/OptiScaler.vcxproj +++ b/OptiScaler/OptiScaler.vcxproj @@ -491,6 +491,7 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y + @@ -787,6 +788,7 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y + diff --git a/OptiScaler/OptiScaler.vcxproj.filters b/OptiScaler/OptiScaler.vcxproj.filters index 5ee20120..c99505ca 100644 --- a/OptiScaler/OptiScaler.vcxproj.filters +++ b/OptiScaler/OptiScaler.vcxproj.filters @@ -551,6 +551,9 @@ Header Files + + Header Files + Header Files @@ -1364,6 +1367,9 @@ Source Files + + Source Files + Source Files diff --git a/OptiScaler/inputs/FG/FSR3_Dx12_FG.cpp b/OptiScaler/inputs/FG/FSR3_Dx12_FG.cpp index 63221a9d..a07b1162 100644 --- a/OptiScaler/inputs/FG/FSR3_Dx12_FG.cpp +++ b/OptiScaler/inputs/FG/FSR3_Dx12_FG.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "FSR3_Dx12_FG.h" +#include "Upscaler_Inputs.h" #include "Config.h" #include "Util.h" @@ -1312,65 +1313,13 @@ void FSR3FG::SetUpscalerInputs(ID3D12GraphicsCommandList* InCmdList, NVSDK_NGX_P fg->EvaluateState(_device, _fgConst); - // FSR Camera values - float cameraNear = 0.0f; - float cameraFar = 0.0f; - float cameraVFov = 0.0f; - float meterFactor = 0.0f; float mvScaleX = 0.0f; float mvScaleY = 0.0f; float jitterX = 0.0f; float jitterY = 0.0f; - float tempCameraNear = 0.0f; - float tempCameraFar = 0.0f; - - auto& state = State::Instance(); - auto& cfg = *Config::Instance(); - const auto& ngxParams = *InParameters; - - ngxParams.Get(OptiKeys::FSR_NearPlane, &tempCameraNear); - ngxParams.Get(OptiKeys::FSR_FarPlane, &tempCameraFar); - - if (!cfg.FsrUseFsrInputValues.value_or_default() || (tempCameraNear == 0.0f && tempCameraFar == 0.0f)) - { - if (feature->DepthInverted()) - { - cameraFar = cfg.FsrCameraNear.value_or_default(); - cameraNear = cfg.FsrCameraFar.value_or_default(); - } - else - { - cameraFar = cfg.FsrCameraFar.value_or_default(); - cameraNear = cfg.FsrCameraNear.value_or_default(); - } - } - else - { - cameraNear = tempCameraNear; - cameraFar = tempCameraFar; - } - - if (!cfg.FsrUseFsrInputValues.value_or_default() || - ngxParams.Get(OptiKeys::FSR_CameraFovVertical, &cameraVFov) != NVSDK_NGX_Result_Success) - { - if (cfg.FsrVerticalFov.has_value()) - cameraVFov = GetRadiansFromDeg(cfg.FsrVerticalFov.value()); - else if (cfg.FsrHorizontalFov.value_or_default() > 0.0f) - { - const float hFovRad = GetRadiansFromDeg(cfg.FsrHorizontalFov.value()); - cameraVFov = - GetVerticalFovFromHorizontal(hFovRad, (float) feature->TargetWidth(), (float) feature->TargetHeight()); - } - else - cameraVFov = GetRadiansFromDeg(60); - } - - if (!cfg.FsrUseFsrInputValues.value_or_default()) - ngxParams.Get(OptiKeys::FSR_ViewSpaceToMetersFactor, &meterFactor); - - State::Instance().lastFsrCameraFar = cameraFar; - State::Instance().lastFsrCameraNear = cameraNear; + // FSR Camera values + auto camera = UpscalerInputs::GetCameraValues(*InParameters, feature); int reset = 0; InParameters->Get(NVSDK_NGX_Parameter_Reset, &reset); @@ -1381,7 +1330,7 @@ void FSR3FG::SetUpscalerInputs(ID3D12GraphicsCommandList* InCmdList, NVSDK_NGX_P InParameters->Get(NVSDK_NGX_Parameter_Jitter_Offset_Y, &jitterY); auto aspectRatio = (float) feature->DisplayWidth() / (float) feature->DisplayHeight(); - fg->SetCameraValues(cameraNear, cameraFar, cameraVFov, aspectRatio, meterFactor); + fg->SetCameraValues(camera.cameraNear, camera.cameraFar, camera.cameraVFov, aspectRatio, camera.meterFactor); fg->SetFrameTimeDelta(State::Instance().lastFGFrameTime); fg->SetMVScale(mvScaleX, mvScaleY); fg->SetJitter(jitterX, jitterY); diff --git a/OptiScaler/inputs/FG/Upscaler_Inputs.cpp b/OptiScaler/inputs/FG/Upscaler_Inputs.cpp new file mode 100644 index 00000000..f8500887 --- /dev/null +++ b/OptiScaler/inputs/FG/Upscaler_Inputs.cpp @@ -0,0 +1,73 @@ +#include "pch.h" +#include "Upscaler_Inputs.h" + +#include +#include +#include + +using namespace OptiMath; + +UpscalerInputs::CameraValues UpscalerInputs::GetCameraValues(const NVSDK_NGX_Parameter& parameters, IFeature* feature) +{ + auto& cfg = *Config::Instance(); + const bool useFsrInputs = cfg.FsrUseFsrInputValues.value_or_default(); + + CameraValues values {}; + + parameters.Get(OptiKeys::FSR_NearPlane, &values.cameraNear); + parameters.Get(OptiKeys::FSR_FarPlane, &values.cameraFar); + + if (!useFsrInputs || (values.cameraNear == 0.0f && values.cameraFar == 0.0f)) + { + values.cameraNear = cfg.FsrCameraNear.value_or_default(); + values.cameraFar = cfg.FsrCameraFar.value_or_default(); + + if (feature->DepthInverted()) + std::swap(values.cameraNear, values.cameraFar); + } + + if (!useFsrInputs || + parameters.Get(OptiKeys::FSR_CameraFovVertical, &values.cameraVFov) != NVSDK_NGX_Result_Success) + { + if (cfg.FsrVerticalFov.has_value()) + values.cameraVFov = GetRadiansFromDeg(cfg.FsrVerticalFov.value()); + else if (cfg.FsrHorizontalFov.value_or_default() > 0.0f) + values.cameraVFov = + GetVerticalFovFromHorizontal(GetRadiansFromDeg(cfg.FsrHorizontalFov.value()), + (float) feature->TargetWidth(), (float) feature->TargetHeight()); + else + values.cameraVFov = GetRadiansFromDeg(60); + } + + if (!useFsrInputs) + parameters.Get(OptiKeys::FSR_ViewSpaceToMetersFactor, &values.meterFactor); + + State::Instance().lastFsrCameraNear = values.cameraNear; + State::Instance().lastFsrCameraFar = values.cameraFar; + + return values; +} + +FG_Constants UpscalerInputs::GetFGConstants(IFeature* feature) +{ + FG_Constants constants {}; + constants.displayWidth = feature->DisplayWidth(); + constants.displayHeight = feature->DisplayHeight(); + + if (feature->IsHdr()) + constants.flags |= FG_Flags::Hdr; + + if (feature->DepthInverted()) + constants.flags |= FG_Flags::InvertedDepth; + + if (feature->JitteredMV()) + constants.flags |= FG_Flags::JitteredMVs; + + if (!feature->LowResMV()) + constants.flags |= FG_Flags::DisplayResolutionMVs; + + if (Config::Instance()->FGAsync.value_or_default()) + constants.flags |= FG_Flags::Async; + + return constants; +} diff --git a/OptiScaler/inputs/FG/Upscaler_Inputs.h b/OptiScaler/inputs/FG/Upscaler_Inputs.h new file mode 100644 index 00000000..b2efb619 --- /dev/null +++ b/OptiScaler/inputs/FG/Upscaler_Inputs.h @@ -0,0 +1,20 @@ +#pragma once +#include "SysUtils.h" +#include +#include +#include + +namespace UpscalerInputs +{ +struct CameraValues +{ + float cameraNear = 0.0f; + float cameraFar = 0.0f; + float cameraVFov = 0.0f; + float meterFactor = 0.0f; +}; + +// Also updates State::lastFsrCameraNear/Far +CameraValues GetCameraValues(const NVSDK_NGX_Parameter& parameters, IFeature* feature); +FG_Constants GetFGConstants(IFeature* feature); +} // namespace UpscalerInputs diff --git a/OptiScaler/inputs/FG/Upscaler_Inputs_Dx11wDx12.cpp b/OptiScaler/inputs/FG/Upscaler_Inputs_Dx11wDx12.cpp index d86059ca..f097b1f4 100644 --- a/OptiScaler/inputs/FG/Upscaler_Inputs_Dx11wDx12.cpp +++ b/OptiScaler/inputs/FG/Upscaler_Inputs_Dx11wDx12.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "Upscaler_Inputs_Dx11wDx12.h" +#include "Upscaler_Inputs.h" #include "MathUtils.h" @@ -92,64 +93,13 @@ void UpscalerInputsDx11wDx12::UpscaleStart(NVSDK_NGX_Parameter* InParameters, IF return; } - // FSR Camera values - float cameraNear = 0.0f; - float cameraFar = 0.0f; - float cameraVFov = 0.0f; - float meterFactor = 0.0f; float mvScaleX = 0.0f; float mvScaleY = 0.0f; float jitterX = 0.0f; float jitterY = 0.0f; - float tempCameraNear = 0.0f; - float tempCameraFar = 0.0f; - - auto& cfg = *Config::Instance(); - const auto& ngxParams = *InParameters; - - ngxParams.Get(OptiKeys::FSR_NearPlane, &tempCameraNear); - ngxParams.Get(OptiKeys::FSR_FarPlane, &tempCameraFar); - - if (!cfg.FsrUseFsrInputValues.value_or_default() || (tempCameraNear == 0.0f && tempCameraFar == 0.0f)) - { - if (feature->DepthInverted()) - { - cameraFar = cfg.FsrCameraNear.value_or_default(); - cameraNear = cfg.FsrCameraFar.value_or_default(); - } - else - { - cameraFar = cfg.FsrCameraFar.value_or_default(); - cameraNear = cfg.FsrCameraNear.value_or_default(); - } - } - else - { - cameraNear = tempCameraNear; - cameraFar = tempCameraFar; - } - - if (!cfg.FsrUseFsrInputValues.value_or_default() || - ngxParams.Get(OptiKeys::FSR_CameraFovVertical, &cameraVFov) != NVSDK_NGX_Result_Success) - { - if (cfg.FsrVerticalFov.has_value()) - cameraVFov = GetRadiansFromDeg(cfg.FsrVerticalFov.value()); - else if (cfg.FsrHorizontalFov.value_or_default() > 0.0f) - { - const float hFovRad = GetRadiansFromDeg(cfg.FsrHorizontalFov.value()); - cameraVFov = - GetVerticalFovFromHorizontal(hFovRad, (float) feature->TargetWidth(), (float) feature->TargetHeight()); - } - else - cameraVFov = GetRadiansFromDeg(60); - } - - if (!cfg.FsrUseFsrInputValues.value_or_default()) - ngxParams.Get(OptiKeys::FSR_ViewSpaceToMetersFactor, &meterFactor); - - State::Instance().lastFsrCameraFar = cameraFar; - State::Instance().lastFsrCameraNear = cameraNear; + // FSR Camera values + auto camera = UpscalerInputs::GetCameraValues(*InParameters, feature); if (State::Instance().activeFgInput != FGInput::Upscaler || _dx12Device == nullptr) return; @@ -174,24 +124,7 @@ void UpscalerInputsDx11wDx12::UpscaleStart(NVSDK_NGX_Parameter* InParameters, IF if (fg == nullptr) return; - FG_Constants fgConstants {}; - fgConstants.displayWidth = feature->DisplayWidth(); - fgConstants.displayHeight = feature->DisplayHeight(); - - if (feature->IsHdr()) - fgConstants.flags |= FG_Flags::Hdr; - - if (feature->DepthInverted()) - fgConstants.flags |= FG_Flags::InvertedDepth; - - if (feature->JitteredMV()) - fgConstants.flags |= FG_Flags::JitteredMVs; - - if (!feature->LowResMV()) - fgConstants.flags |= FG_Flags::DisplayResolutionMVs; - - if (Config::Instance()->FGAsync.value_or_default()) - fgConstants.flags |= FG_Flags::Async; + auto fgConstants = UpscalerInputs::GetFGConstants(feature); fg->EvaluateState(_dx12Device, fgConstants); @@ -206,7 +139,7 @@ void UpscalerInputsDx11wDx12::UpscaleStart(NVSDK_NGX_Parameter* InParameters, IF fg->StartNewFrame(); auto aspectRatio = (float) feature->DisplayWidth() / (float) feature->DisplayHeight(); - fg->SetCameraValues(cameraNear, cameraFar, cameraVFov, aspectRatio, meterFactor); + fg->SetCameraValues(camera.cameraNear, camera.cameraFar, camera.cameraVFov, aspectRatio, camera.meterFactor); fg->SetFrameTimeDelta(State::Instance().lastFGFrameTime); fg->SetMVScale(mvScaleX, mvScaleY); fg->SetJitter(jitterX, jitterY); diff --git a/OptiScaler/inputs/FG/Upscaler_Inputs_Dx12.cpp b/OptiScaler/inputs/FG/Upscaler_Inputs_Dx12.cpp index c581ff51..8e3bf305 100644 --- a/OptiScaler/inputs/FG/Upscaler_Inputs_Dx12.cpp +++ b/OptiScaler/inputs/FG/Upscaler_Inputs_Dx12.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "Upscaler_Inputs_Dx12.h" +#include "Upscaler_Inputs.h" #include #include #include "shaders/depth_scale/DS_Dx12.h" @@ -31,89 +32,20 @@ void UpscalerInputsDx12::UpscaleStart(ID3D12GraphicsCommandList* InCmdList, NVSD { Hudfix_Dx12::SetSkipStatus(true); - // FSR Camera values - float cameraNear = 0.0f; - float cameraFar = 0.0f; - float cameraVFov = 0.0f; - float meterFactor = 0.0f; float mvScaleX = 0.0f; float mvScaleY = 0.0f; float jitterX = 0.0f; float jitterY = 0.0f; - float tempCameraNear = 0.0f; - float tempCameraFar = 0.0f; - - auto& state = State::Instance(); - auto& cfg = *Config::Instance(); - const auto& ngxParams = *InParameters; - - ngxParams.Get(OptiKeys::FSR_NearPlane, &tempCameraNear); - ngxParams.Get(OptiKeys::FSR_FarPlane, &tempCameraFar); - - if (!cfg.FsrUseFsrInputValues.value_or_default() || (tempCameraNear == 0.0f && tempCameraFar == 0.0f)) - { - if (feature->DepthInverted()) - { - cameraFar = cfg.FsrCameraNear.value_or_default(); - cameraNear = cfg.FsrCameraFar.value_or_default(); - } - else - { - cameraFar = cfg.FsrCameraFar.value_or_default(); - cameraNear = cfg.FsrCameraNear.value_or_default(); - } - } - else - { - cameraNear = tempCameraNear; - cameraFar = tempCameraFar; - } - - if (!cfg.FsrUseFsrInputValues.value_or_default() || - ngxParams.Get(OptiKeys::FSR_CameraFovVertical, &cameraVFov) != NVSDK_NGX_Result_Success) - { - if (cfg.FsrVerticalFov.has_value()) - cameraVFov = GetRadiansFromDeg(cfg.FsrVerticalFov.value()); - else if (cfg.FsrHorizontalFov.value_or_default() > 0.0f) - { - const float hFovRad = GetRadiansFromDeg(cfg.FsrHorizontalFov.value()); - cameraVFov = - GetVerticalFovFromHorizontal(hFovRad, (float) feature->TargetWidth(), (float) feature->TargetHeight()); - } - else - cameraVFov = GetRadiansFromDeg(60); - } - - if (!cfg.FsrUseFsrInputValues.value_or_default()) - ngxParams.Get(OptiKeys::FSR_ViewSpaceToMetersFactor, &meterFactor); - - State::Instance().lastFsrCameraFar = cameraFar; - State::Instance().lastFsrCameraNear = cameraNear; + // FSR Camera values + auto camera = UpscalerInputs::GetCameraValues(*InParameters, feature); auto fg = State::Instance().currentFG; if (fg == nullptr || State::Instance().activeFgInput != FGInput::Upscaler || _device == nullptr) return; - FG_Constants fgConstants {}; - fgConstants.displayWidth = feature->DisplayWidth(); - fgConstants.displayHeight = feature->DisplayHeight(); - - if (feature->IsHdr()) - fgConstants.flags |= FG_Flags::Hdr; - - if (feature->DepthInverted()) - fgConstants.flags |= FG_Flags::InvertedDepth; - - if (feature->JitteredMV()) - fgConstants.flags |= FG_Flags::JitteredMVs; - - if (!feature->LowResMV()) - fgConstants.flags |= FG_Flags::DisplayResolutionMVs; - - if (Config::Instance()->FGAsync.value_or_default()) - fgConstants.flags |= FG_Flags::Async; + auto fgConstants = UpscalerInputs::GetFGConstants(feature); fg->EvaluateState(_device, fgConstants); @@ -128,7 +60,7 @@ void UpscalerInputsDx12::UpscaleStart(ID3D12GraphicsCommandList* InCmdList, NVSD fg->StartNewFrame(); auto aspectRatio = (float) feature->DisplayWidth() / (float) feature->DisplayHeight(); - fg->SetCameraValues(cameraNear, cameraFar, cameraVFov, aspectRatio, meterFactor); + fg->SetCameraValues(camera.cameraNear, camera.cameraFar, camera.cameraVFov, aspectRatio, camera.meterFactor); fg->SetFrameTimeDelta(State::Instance().lastFGFrameTime); fg->SetMVScale(mvScaleX, mvScaleY); fg->SetJitter(jitterX, jitterY); diff --git a/OptiScaler/inputs/FG/Upscaler_Inputs_Vk.cpp b/OptiScaler/inputs/FG/Upscaler_Inputs_Vk.cpp index 56d6a4e3..f63cab5b 100644 --- a/OptiScaler/inputs/FG/Upscaler_Inputs_Vk.cpp +++ b/OptiScaler/inputs/FG/Upscaler_Inputs_Vk.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "Upscaler_Inputs_Vk.h" +#include "Upscaler_Inputs.h" #include #include @@ -9,50 +10,6 @@ using namespace OptiMath; -// Same camera values as the DX12 OptiFG -static void SetCameraValues(IFGFeature* fg, const NVSDK_NGX_Parameter& parameters, IFeature* feature) -{ - auto& cfg = *Config::Instance(); - const bool useFsrInputs = cfg.FsrUseFsrInputValues.value_or_default(); - - float cameraNear = 0.0f; - float cameraFar = 0.0f; - float cameraVFov = 0.0f; - float meterFactor = 0.0f; - - parameters.Get(OptiKeys::FSR_NearPlane, &cameraNear); - parameters.Get(OptiKeys::FSR_FarPlane, &cameraFar); - - if (!useFsrInputs || (cameraNear == 0.0f && cameraFar == 0.0f)) - { - cameraNear = cfg.FsrCameraNear.value_or_default(); - cameraFar = cfg.FsrCameraFar.value_or_default(); - - if (feature->DepthInverted()) - std::swap(cameraNear, cameraFar); - } - - if (!useFsrInputs || parameters.Get(OptiKeys::FSR_CameraFovVertical, &cameraVFov) != NVSDK_NGX_Result_Success) - { - if (cfg.FsrVerticalFov.has_value()) - cameraVFov = GetRadiansFromDeg(cfg.FsrVerticalFov.value()); - else if (cfg.FsrHorizontalFov.value_or_default() > 0.0f) - cameraVFov = GetVerticalFovFromHorizontal(GetRadiansFromDeg(cfg.FsrHorizontalFov.value()), - (float) feature->TargetWidth(), (float) feature->TargetHeight()); - else - cameraVFov = GetRadiansFromDeg(60); - } - - if (!useFsrInputs) - parameters.Get(OptiKeys::FSR_ViewSpaceToMetersFactor, &meterFactor); - - State::Instance().lastFsrCameraNear = cameraNear; - State::Instance().lastFsrCameraFar = cameraFar; - - auto aspectRatio = (float) feature->DisplayWidth() / (float) feature->DisplayHeight(); - fg->SetCameraValues(cameraNear, cameraFar, cameraVFov, aspectRatio, meterFactor); -} - static void SetResource(IFGFeature_Vk* fg, NVSDK_NGX_Parameter* parameters, const char* name, FG_ResourceType type, VkCommandBuffer cmdBuffer, uint32_t width, uint32_t height) { @@ -87,27 +44,7 @@ void UpscalerInputsVk::UpscaleStart(VkCommandBuffer cmdBuffer, NVSDK_NGX_Paramet if (fg == nullptr || state.activeFgInput != FGInput::Upscaler || !fg->HasSwapchain()) return; - auto config = Config::Instance(); - - FG_Constants constants {}; - constants.displayWidth = feature->DisplayWidth(); - constants.displayHeight = feature->DisplayHeight(); - - if (feature->IsHdr()) - constants.flags |= FG_Flags::Hdr; - - if (feature->DepthInverted()) - constants.flags |= FG_Flags::InvertedDepth; - - if (feature->JitteredMV()) - constants.flags |= FG_Flags::JitteredMVs; - - if (!feature->LowResMV()) - constants.flags |= FG_Flags::DisplayResolutionMVs; - - if (config->FGAsync.value_or_default()) - constants.flags |= FG_Flags::Async; - + auto constants = UpscalerInputs::GetFGConstants(feature); fg->EvaluateState(constants); // Present dispatches the previous frame's data @@ -132,14 +69,16 @@ void UpscalerInputsVk::UpscaleStart(VkCommandBuffer cmdBuffer, NVSDK_NGX_Paramet parameters->Get(NVSDK_NGX_Parameter_Jitter_Offset_X, &jitterX); parameters->Get(NVSDK_NGX_Parameter_Jitter_Offset_Y, &jitterY); - SetCameraValues(fg, *parameters, feature); + auto camera = UpscalerInputs::GetCameraValues(*parameters, feature); + auto aspectRatio = (float) feature->DisplayWidth() / (float) feature->DisplayHeight(); + fg->SetCameraValues(camera.cameraNear, camera.cameraFar, camera.cameraVFov, aspectRatio, camera.meterFactor); fg->SetFrameTimeDelta(state.lastFGFrameTime); fg->SetMVScale(mvScaleX, mvScaleY); fg->SetJitter(jitterX, jitterY); fg->SetReset(reset); fg->SetInterpolationRect(feature->DisplayWidth(), feature->DisplayHeight()); - if (!config->IsFGEnabled()) + if (!Config::Instance()->IsFGEnabled()) return; if (!fg->IsActive() && !fg->IsPaused())