Files
OptiScaler/CyberXeSS/XeSSFeature.cpp
T
2024-03-03 14:54:57 +03:00

197 lines
6.2 KiB
C++

#include "pch.h"
#include "XeSSFeature.h"
#include "Config.h"
inline void XeSSLogCallback(const char* Message, xess_logging_level_t Level)
{
spdlog::log((spdlog::level::level_enum)((int)Level + 1), "FeatureContext::LogCallback XeSS Runtime ({0})", Message);
}
bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters)
{
spdlog::debug("XeSSFeature::InitXeSS!");
if (IsInited())
return true;
if (device == nullptr)
{
spdlog::error("XeSSFeature::InitXeSS D3D12Device is null!");
return false;
}
xess_version_t ver;
auto ret = xessGetVersion(&ver);
if (ret == XESS_RESULT_SUCCESS)
spdlog::info("XeSSFeature::InitXeSS XeSS Version: {0}.{1}.{2}", ver.major, ver.minor, ver.patch);
else
spdlog::warn("XeSSFeature::InitXeSS xessGetVersion error: {0}", ResultToString(ret));
ret = xessD3D12CreateContext(device, &_xessContext);
if (ret != XESS_RESULT_SUCCESS)
{
spdlog::error("XeSSFeature::InitXeSS xessD3D12CreateContext error: {0}", ResultToString(ret));
return false;
}
ret = xessIsOptimalDriver(_xessContext);
spdlog::debug("XeSSFeature::InitXeSS xessIsOptimalDriver : {0}", ResultToString(ret));
ret = xessSetLoggingCallback(_xessContext, XESS_LOGGING_LEVEL_DEBUG, XeSSLogCallback);
spdlog::debug("XeSSFeature::InitXeSS xessSetLoggingCallback : {0}", ResultToString(ret));
xess_d3d12_init_params_t xessParams{};
xessParams.outputResolution.x = DisplayWidth();
xessParams.outputResolution.y = DisplayHeight();
if (Config::Instance()->OverrideQuality.has_value())
{
xessParams.qualitySetting = (xess_quality_settings_t)Config::Instance()->OverrideQuality.value();
}
else
{
switch (PerfQualityValue())
{
case NVSDK_NGX_PerfQuality_Value_UltraPerformance:
xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE;
break;
case NVSDK_NGX_PerfQuality_Value_MaxPerf:
xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE;
break;
case NVSDK_NGX_PerfQuality_Value_Balanced:
xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED;
break;
case NVSDK_NGX_PerfQuality_Value_MaxQuality:
xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY;
break;
case NVSDK_NGX_PerfQuality_Value_UltraQuality:
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY;
break;
case NVSDK_NGX_PerfQuality_Value_DLAA:
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY;
break;
default:
xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; //Set out-of-range value for non-existing XESS_QUALITY_SETTING_BALANCED mode
break;
}
}
xessParams.initFlags = XESS_INIT_FLAG_NONE;
int featureFlags;
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Feature_Create_Flags, &featureFlags);
bool Hdr = featureFlags & NVSDK_NGX_DLSS_Feature_Flags_IsHDR;
bool EnableSharpening = featureFlags & NVSDK_NGX_DLSS_Feature_Flags_DoSharpening;
bool DepthInverted = featureFlags & NVSDK_NGX_DLSS_Feature_Flags_DepthInverted;
bool JitterMotion = featureFlags & NVSDK_NGX_DLSS_Feature_Flags_MVJittered;
bool LowRes = featureFlags & NVSDK_NGX_DLSS_Feature_Flags_MVLowRes;
bool AutoExposure = featureFlags & NVSDK_NGX_DLSS_Feature_Flags_AutoExposure;
if (Config::Instance()->DepthInverted.value_or(DepthInverted))
{
Config::Instance()->DepthInverted = true;
xessParams.initFlags |= XESS_INIT_FLAG_INVERTED_DEPTH;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (DepthInverted) {0:b}", xessParams.initFlags);
}
if (Config::Instance()->AutoExposure.value_or(AutoExposure))
{
Config::Instance()->AutoExposure = true;
xessParams.initFlags |= XESS_INIT_FLAG_ENABLE_AUTOEXPOSURE;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (AutoExposure) {0:b}", xessParams.initFlags);
}
else
{
Config::Instance()->AutoExposure = false;
xessParams.initFlags |= XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (!AutoExposure) {0:b}", xessParams.initFlags);
}
if (!Config::Instance()->HDR.value_or(Hdr))
{
Config::Instance()->HDR = false;
xessParams.initFlags |= XESS_INIT_FLAG_LDR_INPUT_COLOR;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (!HDR) {0:b}", xessParams.initFlags);
}
else
{
Config::Instance()->HDR = true;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (HDR) {0:b}", xessParams.initFlags);
}
if (Config::Instance()->JitterCancellation.value_or(JitterMotion))
{
Config::Instance()->JitterCancellation = true;
xessParams.initFlags |= XESS_INIT_FLAG_JITTERED_MV;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (JitterCancellation) {0:b}", xessParams.initFlags);
}
if (Config::Instance()->DisplayResolution.value_or(!LowRes))
{
Config::Instance()->DisplayResolution = true;
xessParams.initFlags |= XESS_INIT_FLAG_HIGH_RES_MV;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (!LowResMV) {0:b}", xessParams.initFlags);
}
else
{
Config::Instance()->DisplayResolution = false;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (LowResMV) {0:b}", xessParams.initFlags);
}
if (!Config::Instance()->DisableReactiveMask.value_or(true))
{
Config::Instance()->DisableReactiveMask = false;
xessParams.initFlags |= XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK;
spdlog::info("XeSSFeature::InitXeSS xessParams.initFlags (ReactiveMaskActive) {0:b}", xessParams.initFlags);
}
if (Config::Instance()->BuildPipelines.value_or(true))
{
spdlog::debug("XeSSFeature::InitXeSS xessD3D12BuildPipelines!");
ret = xessD3D12BuildPipelines(_xessContext, NULL, false, xessParams.initFlags);
if (ret != XESS_RESULT_SUCCESS)
{
spdlog::error("XeSSFeature::InitXeSS xessD3D12BuildPipelines error: {0}", ResultToString(ret));
return false;
}
}
spdlog::debug("XeSSFeature::InitXeSS xessD3D12Init!");
ret = xessD3D12Init(_xessContext, &xessParams);
if (ret != XESS_RESULT_SUCCESS)
{
spdlog::error("XeSSFeature::InitXeSS xessD3D12Init error: {0}", ResultToString(ret));
return false;
}
SetInit(true);
return true;
}
XeSSFeature::~XeSSFeature()
{
spdlog::debug("XeSSFeature::XeSSFeature");
if (!_xessContext)
return;
auto result = xessDestroyContext(_xessContext);
if (result != XESS_RESULT_SUCCESS)
spdlog::error("XeSSFeature::Destroy xessDestroyContext error: {0}", ResultToString(result));
}