Factor out common OptiFG functions

Slopped.
This commit is contained in:
FakeMichau committed 2026-10-13 21:56:36 +02:00
1 parent 880402ba20
commit b41a44dd60
8 files changed
+121 -267

No files matched your search

+2
View File
@@ -491,6 +491,7 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y
<ClInclude Include="inputs\FG\XeFG_Inputs_Dx12.h" />
<ClInclude Include="inputs\FfxApi_Vk.h" />
<ClInclude Include="inputs\FG\Upscaler_Inputs_Dx12.h" />
<ClInclude Include="inputs\FG\Upscaler_Inputs.h" />
<ClInclude Include="inputs\FG\Upscaler_Inputs_Vk.h" />
<ClInclude Include="inputs\NVNGX_DLSS.h" />
<ClInclude Include="inputs\XeSS_Base.h" />
@@ -787,6 +788,7 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y
<ClCompile Include="inputs\FG\XeFG_Inputs_Dx12.cpp" />
<ClCompile Include="inputs\FfxApi_Vk.cpp" />
<ClCompile Include="inputs\FG\Upscaler_Inputs_Dx12.cpp" />
<ClCompile Include="inputs\FG\Upscaler_Inputs.cpp" />
<ClCompile Include="inputs\FG\Upscaler_Inputs_Vk.cpp" />
<ClCompile Include="inputs\XeSS_Base.cpp" />
<ClCompile Include="inputs\XeSS_Common.cpp" />
+6
View File
@@ -551,6 +551,9 @@
<ClInclude Include="inputs\FG\Upscaler_Inputs_Dx12.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="inputs\FG\Upscaler_Inputs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="inputs\FG\Upscaler_Inputs_Vk.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -1364,6 +1367,9 @@
<ClCompile Include="inputs\FG\Upscaler_Inputs_Dx12.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="inputs\FG\Upscaler_Inputs.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="inputs\FG\Upscaler_Inputs_Vk.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+4 -55
View File
@@ -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);
+73
View File
@@ -0,0 +1,73 @@
#include "pch.h"
#include "Upscaler_Inputs.h"
#include <State.h>
#include <Config.h>
#include <MathUtils.h>
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;
}
+20
View File
@@ -0,0 +1,20 @@
#pragma once
#include "SysUtils.h"
#include <NVNGX_Parameter.h>
#include <upscalers/IFeature.h>
#include <framegen/IFGFeature.h>
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
@@ -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);
+5 -73
View File
@@ -1,5 +1,6 @@
#include "pch.h"
#include "Upscaler_Inputs_Dx12.h"
#include "Upscaler_Inputs.h"
#include <hudfix/Hudfix_Dx12.h>
#include <resource_tracking/ResTrack_dx12.h>
#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);
+6 -67
View File
@@ -1,5 +1,6 @@
#include "pch.h"
#include "Upscaler_Inputs_Vk.h"
#include "Upscaler_Inputs.h"
#include <State.h>
#include <Config.h>
@@ -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())