mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-10-18 17:59:12 +00:00
227 lines
8.1 KiB
C++
227 lines
8.1 KiB
C++
#include "pch.h"
|
|
#include "XeSSFeature_Dx12.h"
|
|
#include "Config.h"
|
|
|
|
void XeSSFeatureDx12::SetInit(bool value)
|
|
{
|
|
XeSSFeature::SetInit(value);
|
|
}
|
|
|
|
bool XeSSFeatureDx12::IsInited()
|
|
{
|
|
return XeSSFeature::IsInited();
|
|
}
|
|
|
|
bool XeSSFeatureDx12::Init(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters)
|
|
{
|
|
if (IsInited())
|
|
return true;
|
|
|
|
Device = device;
|
|
|
|
return InitXeSS(device, InParameters);
|
|
}
|
|
|
|
bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* commandList, const NVSDK_NGX_Parameter* InParameters)
|
|
{
|
|
if (!IsInited() || !_xessContext)
|
|
return false;
|
|
|
|
xess_result_t xessResult;
|
|
xess_d3d12_execute_params_t params{};
|
|
|
|
InParameters->Get(NVSDK_NGX_Parameter_Jitter_Offset_X, ¶ms.jitterOffsetX);
|
|
InParameters->Get(NVSDK_NGX_Parameter_Jitter_Offset_Y, ¶ms.jitterOffsetY);
|
|
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_DLSS_Exposure_Scale, ¶ms.exposureScale) != NVSDK_NGX_Result_Success)
|
|
params.exposureScale = 1.0f;
|
|
|
|
InParameters->Get(NVSDK_NGX_Parameter_Reset, ¶ms.resetHistory);
|
|
|
|
XeSSFeature::SetRenderResolution(InParameters, ¶ms);
|
|
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Input Resolution: {0}x{1}", params.inputWidth, params.inputHeight);
|
|
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_Color, ¶ms.pColorTexture) != NVSDK_NGX_Result_Success)
|
|
InParameters->Get(NVSDK_NGX_Parameter_Color, (void**)¶ms.pColorTexture);
|
|
|
|
if (params.pColorTexture)
|
|
{
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Color exist..");
|
|
|
|
if (Config::Instance()->ColorResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pColorTexture,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->ColorResourceBarrier.value(),
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
|
|
}
|
|
else
|
|
{
|
|
spdlog::error("XeSSFeatureDx12::Evaluate Color not exist!!");
|
|
return false;
|
|
}
|
|
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_MotionVectors, ¶ms.pVelocityTexture) != NVSDK_NGX_Result_Success)
|
|
InParameters->Get(NVSDK_NGX_Parameter_MotionVectors, (void**)¶ms.pVelocityTexture);
|
|
|
|
if (params.pVelocityTexture)
|
|
{
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate MotionVectors exist..");
|
|
|
|
if (Config::Instance()->MVResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pVelocityTexture,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->MVResourceBarrier.value(),
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
|
|
}
|
|
else
|
|
{
|
|
spdlog::error("XeSSFeatureDx12::Evaluate MotionVectors not exist!!");
|
|
return false;
|
|
}
|
|
|
|
ID3D12Resource* paramOutput;
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_Output, ¶mOutput) != NVSDK_NGX_Result_Success)
|
|
InParameters->Get(NVSDK_NGX_Parameter_Output, (void**)¶mOutput);
|
|
|
|
if (paramOutput)
|
|
{
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Output exist..");
|
|
|
|
if (Config::Instance()->OutputResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, paramOutput,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->OutputResourceBarrier.value(),
|
|
D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
|
|
|
|
params.pOutputTexture = paramOutput;
|
|
}
|
|
else
|
|
{
|
|
spdlog::error("XeSSFeatureDx12::Evaluate Output not exist!!");
|
|
return false;
|
|
}
|
|
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_Depth, ¶ms.pDepthTexture) != NVSDK_NGX_Result_Success)
|
|
InParameters->Get(NVSDK_NGX_Parameter_Depth, (void**)¶ms.pDepthTexture);
|
|
|
|
if (params.pDepthTexture)
|
|
{
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Depth exist..");
|
|
|
|
if (Config::Instance()->DepthResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pDepthTexture,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->DepthResourceBarrier.value(),
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
|
|
}
|
|
else
|
|
{
|
|
if (!Config::Instance()->DisplayResolution.value_or(false))
|
|
spdlog::error("XeSSFeatureDx12::Evaluate Depth not exist!!");
|
|
else
|
|
spdlog::info("XeSSFeatureDx12::Evaluate Using high res motion vectors, depth is not needed!!");
|
|
|
|
params.pDepthTexture = nullptr;
|
|
}
|
|
|
|
if (!Config::Instance()->AutoExposure.value_or(false))
|
|
{
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_ExposureTexture, ¶ms.pExposureScaleTexture) != NVSDK_NGX_Result_Success)
|
|
InParameters->Get(NVSDK_NGX_Parameter_ExposureTexture, (void**)¶ms.pExposureScaleTexture);
|
|
|
|
if (params.pExposureScaleTexture)
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate ExposureTexture exist..");
|
|
else
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate AutoExposure disabled but ExposureTexture is not exist, it may cause problems!!");
|
|
|
|
if (Config::Instance()->ExposureResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pExposureScaleTexture,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->ExposureResourceBarrier.value(),
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
|
|
}
|
|
else
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate AutoExposure enabled!");
|
|
|
|
if (!Config::Instance()->DisableReactiveMask.value_or(true))
|
|
{
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, ¶ms.pResponsivePixelMaskTexture) != NVSDK_NGX_Result_Success)
|
|
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**)¶ms.pResponsivePixelMaskTexture);
|
|
|
|
if (params.pResponsivePixelMaskTexture)
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Bias mask exist..");
|
|
else
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Bias mask not exist and its enabled in config, it may cause problems!!");
|
|
|
|
if (Config::Instance()->MaskResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pResponsivePixelMaskTexture,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->MaskResourceBarrier.value(),
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
|
|
}
|
|
|
|
float MVScaleX;
|
|
float MVScaleY;
|
|
|
|
if (InParameters->Get(NVSDK_NGX_Parameter_MV_Scale_X, &MVScaleX) == NVSDK_NGX_Result_Success &&
|
|
InParameters->Get(NVSDK_NGX_Parameter_MV_Scale_Y, &MVScaleY) == NVSDK_NGX_Result_Success)
|
|
{
|
|
xessResult = xessSetVelocityScale(_xessContext, MVScaleX, MVScaleY);
|
|
|
|
if (xessResult != XESS_RESULT_SUCCESS)
|
|
{
|
|
spdlog::error("XeSSFeatureDx12::Evaluate xessSetVelocityScale: {0}", ResultToString(xessResult));
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
spdlog::warn("XeSSFeatureDx12::Evaluate Can't get motion vector scales!");
|
|
|
|
spdlog::debug("XeSSFeatureDx12::Evaluate Executing!!");
|
|
xessResult = xessD3D12Execute(_xessContext, commandList, ¶ms);
|
|
|
|
if (xessResult != XESS_RESULT_SUCCESS)
|
|
{
|
|
spdlog::error("XeSSFeatureDx12::Evaluate xessD3D12Execute error: {0}", ResultToString(xessResult));
|
|
return false;
|
|
}
|
|
|
|
// restore resource states
|
|
if (params.pColorTexture && Config::Instance()->ColorResourceBarrier.value_or(false))
|
|
ResourceBarrier(commandList, params.pColorTexture,
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->ColorResourceBarrier.value());
|
|
|
|
if (params.pVelocityTexture && Config::Instance()->MVResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pVelocityTexture,
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->MVResourceBarrier.value());
|
|
|
|
if (paramOutput && Config::Instance()->OutputResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, paramOutput,
|
|
D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->OutputResourceBarrier.value());
|
|
|
|
if (params.pDepthTexture && Config::Instance()->DepthResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pDepthTexture,
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->DepthResourceBarrier.value());
|
|
|
|
if (params.pExposureScaleTexture && Config::Instance()->ExposureResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pExposureScaleTexture,
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->ExposureResourceBarrier.value());
|
|
|
|
if (params.pResponsivePixelMaskTexture && Config::Instance()->MaskResourceBarrier.has_value())
|
|
ResourceBarrier(commandList, params.pResponsivePixelMaskTexture,
|
|
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
|
|
(D3D12_RESOURCE_STATES)Config::Instance()->MaskResourceBarrier.value());
|
|
|
|
return true;
|
|
}
|
|
|
|
void XeSSFeatureDx12::ReInit(const NVSDK_NGX_Parameter* InParameters)
|
|
{
|
|
SetInit(false);
|
|
|
|
if (_xessContext)
|
|
xessDestroyContext(_xessContext);
|
|
|
|
SetInit(Init(Device, InParameters));
|
|
}
|