#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)); }