From bbe43b7cf03b03d849e460bfdc73099c4bac0d60 Mon Sep 17 00:00:00 2001 From: PotatoOfDoom <8769019+PotatoOfDoom@users.noreply.github.com> Date: Tue, 27 May 2025 17:32:37 +0200 Subject: [PATCH] combine xessfeature and xessfeature dx12 - d11on12 doesn't work yet --- OptiScaler/pch.h | 1 + OptiScaler/upscalers/xess/XeSSFeature.cpp | 316 ++++++------------ OptiScaler/upscalers/xess/XeSSFeature.h | 54 ++- .../upscalers/xess/XeSSFeature_Dx11on12.cpp | 23 ++ .../upscalers/xess/XeSSFeature_Dx11on12.h | 9 + .../upscalers/xess/XeSSFeature_Dx12.cpp | 210 ++++++++++-- OptiScaler/upscalers/xess/XeSSFeature_Dx12.h | 17 +- 7 files changed, 380 insertions(+), 250 deletions(-) diff --git a/OptiScaler/pch.h b/OptiScaler/pch.h index 7ca3d8be..4b5f4b75 100644 --- a/OptiScaler/pch.h +++ b/OptiScaler/pch.h @@ -8,6 +8,7 @@ #define _CRT_SECURE_NO_DEPRECATE #include #include +#include #include #include diff --git a/OptiScaler/upscalers/xess/XeSSFeature.cpp b/OptiScaler/upscalers/xess/XeSSFeature.cpp index 16e129c8..bdc52e70 100644 --- a/OptiScaler/upscalers/xess/XeSSFeature.cpp +++ b/OptiScaler/upscalers/xess/XeSSFeature.cpp @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "XeSSFeature.h" #include @@ -15,8 +15,21 @@ inline void XeSSLogCallback(const char* Message, xess_logging_level_t Level) } bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters) +{ + + return true; +} + +XeSSFeature::XeSSFeature(unsigned int handleId, NVSDK_NGX_Parameter* InParameters) : IFeature(handleId, InParameters) +{ + _initParameters = SetInitParameters(InParameters); +} + +bool XeSSFeature::Init(ApiContext* context, const NVSDK_NGX_Parameter* InParameters) { LOG_FUNC(); + if (IsInited()) + return true; if (!_moduleLoaded) { @@ -24,18 +37,15 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa return false; } - if (IsInited()) - return true; - - if (device == nullptr) + if (!CheckInitializationContext(context)) { - LOG_ERROR("D3D12Device is null!"); + LOG_ERROR("XeSSFeature::Init context is not valid!"); return false; } State::Instance().skipSpoofing = true; - auto ret = XeSSProxy::D3D12CreateContext()(device, &_xessContext); + auto ret = CreateXessContext(context, &_xessContext); if (ret != XESS_RESULT_SUCCESS) { @@ -49,88 +59,9 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa ret = XeSSProxy::SetLoggingCallback()(_xessContext, XESS_LOGGING_LEVEL_DEBUG, XeSSLogCallback); LOG_DEBUG("xessSetLoggingCallback : {0}", ResultToString(ret)); - xess_d3d12_init_params_t xessParams {}; - - xessParams.initFlags = XESS_INIT_FLAG_NONE; - - if (DepthInverted()) - xessParams.initFlags |= XESS_INIT_FLAG_INVERTED_DEPTH; - - if (AutoExposure()) - xessParams.initFlags |= XESS_INIT_FLAG_ENABLE_AUTOEXPOSURE; - else - xessParams.initFlags |= XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE; - - if (!IsHdr()) - xessParams.initFlags |= XESS_INIT_FLAG_LDR_INPUT_COLOR; - - if (JitteredMV()) - xessParams.initFlags |= XESS_INIT_FLAG_JITTERED_MV; - - if (!LowResMV()) - xessParams.initFlags |= XESS_INIT_FLAG_HIGH_RES_MV; - - if (!Config::Instance()->DisableReactiveMask.value_or(true)) - { - xessParams.initFlags |= XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK; - LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", xessParams.initFlags); - } - - switch (PerfQualityValue()) - { - case NVSDK_NGX_PerfQuality_Value_UltraPerformance: - if (Version().major >= 1 && Version().minor >= 3) - xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_PERFORMANCE; - else - xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE; - - break; - - case NVSDK_NGX_PerfQuality_Value_MaxPerf: - if (Version().major >= 1 && Version().minor >= 3) - xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; - else - xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE; - - break; - - case NVSDK_NGX_PerfQuality_Value_Balanced: - if (Version().major >= 1 && Version().minor >= 3) - xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY; - else - xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; - - break; - - case NVSDK_NGX_PerfQuality_Value_MaxQuality: - if (Version().major >= 1 && Version().minor >= 3) - xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY; - else - xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY; - - break; + uint32_t initFlags = GetInitFlags(); - case NVSDK_NGX_PerfQuality_Value_UltraQuality: - if (Version().major >= 1 && Version().minor >= 3) - xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY_PLUS; - else - xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY; - - break; - - case NVSDK_NGX_PerfQuality_Value_DLAA: - if (Version().major >= 1 && Version().minor >= 3) - xessParams.qualitySetting = XESS_QUALITY_SETTING_AA; - else - 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; - } + xess_quality_settings_t qualitySetting = GetQualitySetting(); if (Config::Instance()->OutputScalingEnabled.value_or(false) && LowResMV()) { @@ -169,114 +100,9 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa } } - xessParams.outputResolution.x = TargetWidth(); - xessParams.outputResolution.y = TargetHeight(); - - // create heaps to prevent create heap errors of xess - if (Config::Instance()->CreateHeaps.value_or(true)) - { - HRESULT hr; - xess_properties_t xessProps {}; - ret = XeSSProxy::GetProperties()(_xessContext, &xessParams.outputResolution, &xessProps); - - if (ret == XESS_RESULT_SUCCESS) - { - CD3DX12_HEAP_DESC bufferHeapDesc(xessProps.tempBufferHeapSize, D3D12_HEAP_TYPE_DEFAULT); - State::Instance().skipHeapCapture = true; - hr = device->CreateHeap(&bufferHeapDesc, IID_PPV_ARGS(&_localBufferHeap)); - State::Instance().skipHeapCapture = false; - - if (SUCCEEDED(hr)) - { - D3D12_HEAP_DESC textureHeapDesc { xessProps.tempTextureHeapSize, - { D3D12_HEAP_TYPE_DEFAULT, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, - D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, - 0, - D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES }; - - State::Instance().skipHeapCapture = true; - hr = device->CreateHeap(&textureHeapDesc, IID_PPV_ARGS(&_localTextureHeap)); - State::Instance().skipHeapCapture = false; - - if (SUCCEEDED(hr)) - { - Config::Instance()->CreateHeaps = true; - - LOG_DEBUG("using _localBufferHeap & _localTextureHeap!"); - - xessParams.bufferHeapOffset = 0; - xessParams.textureHeapOffset = 0; - xessParams.pTempBufferHeap = _localBufferHeap; - xessParams.pTempTextureHeap = _localTextureHeap; - } - else - { - _localBufferHeap->Release(); - LOG_ERROR("CreateHeap textureHeapDesc failed {0:x}!", (UINT) hr); - } - } - else - { - LOG_ERROR("CreateHeap bufferHeapDesc failed {0:x}!", (UINT) hr); - } - } - else - { - LOG_ERROR("xessGetProperties failed {0}!", ResultToString(ret)); - } - } - - // try to build pipelines with local pipeline object - if (Config::Instance()->BuildPipelines.value_or(true)) - { - LOG_DEBUG("xessD3D12BuildPipelines!"); - State::Instance().skipHeapCapture = true; + xess_2d_t outputResolution = {TargetWidth(), TargetHeight()}; - ID3D12Device1* device1; - if (FAILED(device->QueryInterface(IID_PPV_ARGS(&device1)))) - { - LOG_ERROR("QueryInterface device1 failed!"); - ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags); - } - else - { - HRESULT hr = device1->CreatePipelineLibrary(nullptr, 0, IID_PPV_ARGS(&_localPipeline)); - - if (FAILED(hr) || !_localPipeline) - { - LOG_ERROR("CreatePipelineLibrary failed {0:x}!", (UINT) hr); - ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags); - } - else - { - ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, _localPipeline, false, xessParams.initFlags); - - if (ret != XESS_RESULT_SUCCESS) - { - LOG_ERROR("xessD3D12BuildPipelines error with _localPipeline: {0}", ResultToString(ret)); - ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags); - } - else - { - LOG_DEBUG("using _localPipelines!"); - xessParams.pPipelineLibrary = _localPipeline; - } - } - } - - if (device1 != nullptr) - device1->Release(); - - State::Instance().skipHeapCapture = false; - - if (ret != XESS_RESULT_SUCCESS) - { - LOG_ERROR("xessD3D12BuildPipelines error: {0}", ResultToString(ret)); - return false; - } - } - - LOG_DEBUG("xessD3D12Init!"); + XessInitParams xessParams = CreateInitParams(outputResolution, qualitySetting, initFlags); if (Config::Instance()->NetworkModel.has_value() && Config::Instance()->NetworkModel.value() >= 0 && Config::Instance()->NetworkModel.value() <= 5) @@ -286,9 +112,7 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa LOG_ERROR("xessSelectNetworkModel result: {0}", ResultToString(ret)); } - State::Instance().skipHeapCapture = true; - ret = XeSSProxy::D3D12Init()(_xessContext, &xessParams); - State::Instance().skipHeapCapture = false; + ret = ApiInit(context, &xessParams); State::Instance().skipSpoofing = false; @@ -300,40 +124,98 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa SetInit(true); + InitMenuAndOutput(context); + return true; } -XeSSFeature::XeSSFeature(unsigned int handleId, NVSDK_NGX_Parameter* InParameters) : IFeature(handleId, InParameters) +bool XeSSFeature::Evaluate(EvalContext* context, const NVSDK_NGX_Parameter* InParameters, + const NVSDK_NGX_Parameter* OutParameters) { - _initParameters = SetInitParameters(InParameters); + return false; } -XeSSFeature::~XeSSFeature() +uint32_t XeSSFeature::GetInitFlags() { - if (State::Instance().isShuttingDown || _xessContext == nullptr) - return; + uint32_t initFlags = XESS_INIT_FLAG_NONE; + if (DepthInverted()) + initFlags |= XESS_INIT_FLAG_INVERTED_DEPTH; - if (_xessContext) - { - XeSSProxy::DestroyContext()(_xessContext); - _xessContext = nullptr; - } + if (AutoExposure()) + initFlags |= XESS_INIT_FLAG_ENABLE_AUTOEXPOSURE; + else + initFlags |= XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE; + + if (!IsHdr()) + initFlags |= XESS_INIT_FLAG_LDR_INPUT_COLOR; + + if (JitteredMV()) + initFlags |= XESS_INIT_FLAG_JITTERED_MV; + + if (!LowResMV()) + initFlags |= XESS_INIT_FLAG_HIGH_RES_MV; - if (_localPipeline != nullptr) + if (!Config::Instance()->DisableReactiveMask.value_or(true)) { - _localPipeline->Release(); - _localPipeline = nullptr; + initFlags |= XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK; + LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", initFlags); } + return initFlags; +} - if (_localBufferHeap != nullptr) +xess_quality_settings_t XeSSFeature::GetQualitySetting() +{ + switch (PerfQualityValue()) { - _localBufferHeap->Release(); - _localBufferHeap = nullptr; + case NVSDK_NGX_PerfQuality_Value_UltraPerformance: + if (Version().major >= 1 && Version().minor >= 3) + return XESS_QUALITY_SETTING_ULTRA_PERFORMANCE; + else + return XESS_QUALITY_SETTING_PERFORMANCE; + break; + case NVSDK_NGX_PerfQuality_Value_MaxPerf: + if (Version().major >= 1 && Version().minor >= 3) + return XESS_QUALITY_SETTING_BALANCED; + else + return XESS_QUALITY_SETTING_PERFORMANCE; + break; + case NVSDK_NGX_PerfQuality_Value_Balanced: + if (Version().major >= 1 && Version().minor >= 3) + return XESS_QUALITY_SETTING_QUALITY; + else + return XESS_QUALITY_SETTING_BALANCED; + break; + case NVSDK_NGX_PerfQuality_Value_MaxQuality: + if (Version().major >= 1 && Version().minor >= 3) + return XESS_QUALITY_SETTING_ULTRA_QUALITY; + else + return XESS_QUALITY_SETTING_QUALITY; + break; + case NVSDK_NGX_PerfQuality_Value_UltraQuality: + if (Version().major >= 1 && Version().minor >= 3) + return XESS_QUALITY_SETTING_ULTRA_QUALITY_PLUS; + else + return XESS_QUALITY_SETTING_ULTRA_QUALITY; + break; + + case NVSDK_NGX_PerfQuality_Value_DLAA: + if (Version().major >= 1 && Version().minor >= 3) + return XESS_QUALITY_SETTING_AA; + else + return XESS_QUALITY_SETTING_ULTRA_QUALITY; + break; } + return XESS_QUALITY_SETTING_BALANCED; +} - if (_localTextureHeap != nullptr) +XeSSFeature::~XeSSFeature() +{ + if (State::Instance().isShuttingDown || _xessContext == nullptr) + return; + + if (_xessContext) { - _localTextureHeap->Release(); - _localTextureHeap = nullptr; + XeSSProxy::DestroyContext()(_xessContext); + _xessContext = nullptr; } } diff --git a/OptiScaler/upscalers/xess/XeSSFeature.h b/OptiScaler/upscalers/xess/XeSSFeature.h index b9bb4370..fd48ca64 100644 --- a/OptiScaler/upscalers/xess/XeSSFeature.h +++ b/OptiScaler/upscalers/xess/XeSSFeature.h @@ -1,8 +1,10 @@ #pragma once +#include #include #include #include +#include inline static std::string ResultToString(xess_result_t result) { @@ -42,13 +44,36 @@ inline static std::string ResultToString(xess_result_t result) } } -class XeSSFeature : public virtual IFeature +struct D3D11Context +{ + ID3D11DeviceContext* d3d11Context; + ID3D11Device* d3d11Device; +}; + +struct D3D12Context { - private: - ID3D12PipelineLibrary* _localPipeline = nullptr; - ID3D12Heap* _localBufferHeap = nullptr; - ID3D12Heap* _localTextureHeap = nullptr; + ID3D12Device* d3d12Device; + ID3D12GraphicsCommandList* d3d12CommandList; +}; + +struct VulkanContext +{ + vk::Instance* vkInstance; + vk::PhysicalDevice* vkPhysicalDevice; + vk::Device* vkDevice; + vk::CommandBuffer* vkCommandBuffer; + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; + PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; +}; + +using ApiContext = std::variant; + +using EvalContext = std::variant; + +using XessInitParams = std::variant; +class XeSSFeature : public virtual IFeature +{ protected: xess_context_handle_t _xessContext = nullptr; @@ -65,5 +90,24 @@ class XeSSFeature : public virtual IFeature XeSSFeature(unsigned int handleId, NVSDK_NGX_Parameter* InParameters); + bool Init(ApiContext* context, const NVSDK_NGX_Parameter* InParameters); + + bool Evaluate(EvalContext* context, const NVSDK_NGX_Parameter* InParameters, + const NVSDK_NGX_Parameter* OutParameters); + + uint32_t GetInitFlags(); + + xess_quality_settings_t GetQualitySetting(); + + virtual XessInitParams CreateInitParams(xess_2d_t outputResolution, xess_quality_settings_t qualitySetting, uint32_t initFlags) = 0; + + virtual bool CheckInitializationContext(ApiContext* context) = 0; + + virtual xess_result_t CreateXessContext(ApiContext* context, xess_context_handle_t* pXessContext) = 0; + + virtual xess_result_t ApiInit(ApiContext* context, XessInitParams* xessInitParams) = 0; + + virtual void InitMenuAndOutput(ApiContext* context) = 0; + ~XeSSFeature(); }; diff --git a/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.cpp b/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.cpp index 3f43c81c..3b678f98 100644 --- a/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.cpp +++ b/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.cpp @@ -406,3 +406,26 @@ bool XeSSFeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_N } XeSSFeatureDx11on12::~XeSSFeatureDx11on12() {} + +// TODO +bool XeSSFeatureDx11on12::CheckInitializationContext(ApiContext* context) { return false; } + +// TODO +xess_result_t XeSSFeatureDx11on12::CreateXessContext(ApiContext* context, xess_context_handle_t* pXessContext) +{ + return xess_result_t(); +} + +// TODO +xess_result_t XeSSFeatureDx11on12::ApiInit(ApiContext* context, XessInitParams* xessInitParams) +{ + return xess_result_t(); +} + +XessInitParams XeSSFeatureDx11on12::CreateInitParams(xess_2d_t outputResolution, xess_quality_settings_t qualitySetting, + uint32_t initFlags) +{ + return XessInitParams(); +} + +void XeSSFeatureDx11on12::InitMenuAndOutput(ApiContext* context) {} diff --git a/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.h b/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.h index 00bc9667..fd7b217a 100644 --- a/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.h +++ b/OptiScaler/upscalers/xess/XeSSFeature_Dx11on12.h @@ -17,4 +17,13 @@ class XeSSFeatureDx11on12 : public XeSSFeature, public IFeature_Dx11wDx12 bool Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_Parameter* InParameters) override; ~XeSSFeatureDx11on12(); + + bool CheckInitializationContext(ApiContext* context) override; + xess_result_t CreateXessContext(ApiContext* context, xess_context_handle_t* pXessContext) override; + xess_result_t ApiInit(ApiContext* context, XessInitParams* xessInitParams) override; + + XessInitParams CreateInitParams(xess_2d_t outputResolution, xess_quality_settings_t qualitySetting, + uint32_t initFlags) override; + + void InitMenuAndOutput(ApiContext* context) override; }; diff --git a/OptiScaler/upscalers/xess/XeSSFeature_Dx12.cpp b/OptiScaler/upscalers/xess/XeSSFeature_Dx12.cpp index 49446483..f53bf78e 100644 --- a/OptiScaler/upscalers/xess/XeSSFeature_Dx12.cpp +++ b/OptiScaler/upscalers/xess/XeSSFeature_Dx12.cpp @@ -4,31 +4,6 @@ #include "XeSSFeature_Dx12.h" -bool XeSSFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCommandList, - NVSDK_NGX_Parameter* InParameters) -{ - LOG_FUNC(); - - if (IsInited()) - return true; - - Device = InDevice; - - if (InitXeSS(InDevice, InParameters)) - { - if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr)) - Imgui = std::make_unique(Util::GetProcessWindow(), InDevice); - - OutputScaler = std::make_unique("Output Scaling", InDevice, (TargetWidth() < DisplayWidth())); - RCAS = std::make_unique("RCAS", InDevice); - Bias = std::make_unique("Bias", InDevice); - - return true; - } - - return false; -} - bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_NGX_Parameter* InParameters) { LOG_FUNC(); @@ -444,4 +419,187 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N return true; } -XeSSFeatureDx12::~XeSSFeatureDx12() {} +XeSSFeatureDx12::~XeSSFeatureDx12() +{ + if (_localPipeline != nullptr) + { + _localPipeline->Release(); + _localPipeline = nullptr; + } + + if (_localBufferHeap != nullptr) + { + _localBufferHeap->Release(); + _localBufferHeap = nullptr; + } + + if (_localTextureHeap != nullptr) + { + _localTextureHeap->Release(); + _localTextureHeap = nullptr; + } +} + +bool XeSSFeatureDx12::CheckInitializationContext(ApiContext* context) +{ + D3D12Context* d3d12Context = &std::get(*context); + + if (d3d12Context->d3d12Device == nullptr) + return false; + + if (d3d12Context->d3d12CommandList == nullptr) + return false; + + return true; +} + +xess_result_t XeSSFeatureDx12::CreateXessContext(ApiContext* context, xess_context_handle_t* pXessContext) +{ + return XeSSProxy::D3D12CreateContext()(std::get(*context).d3d12Device, pXessContext); +} + +xess_result_t XeSSFeatureDx12::ApiInit(ApiContext* context, XessInitParams* xessInitParams) +{ + xess_result_t ret = {}; + auto xessParams = std::get(*xessInitParams); + auto d3d12Context = &std::get(*context); + auto device = d3d12Context->d3d12Device; + + // create heaps to prevent create heap errors of xess + if (Config::Instance()->CreateHeaps.value_or(true)) + { + HRESULT hr; + xess_properties_t xessProps{}; + ret = XeSSProxy::GetProperties()(_xessContext, &xessParams.outputResolution, &xessProps); + + if (ret == XESS_RESULT_SUCCESS) + { + CD3DX12_HEAP_DESC bufferHeapDesc(xessProps.tempBufferHeapSize, D3D12_HEAP_TYPE_DEFAULT); + State::Instance().skipHeapCapture = true; + hr = device->CreateHeap(&bufferHeapDesc, IID_PPV_ARGS(&_localBufferHeap)); + State::Instance().skipHeapCapture = false; + + if (SUCCEEDED(hr)) + { + D3D12_HEAP_DESC textureHeapDesc{ + xessProps.tempTextureHeapSize, + {D3D12_HEAP_TYPE_DEFAULT, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0}, + 0, + D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES}; + + State::Instance().skipHeapCapture = true; + hr = device->CreateHeap(&textureHeapDesc, IID_PPV_ARGS(&_localTextureHeap)); + State::Instance().skipHeapCapture = false; + + if (SUCCEEDED(hr)) + { + Config::Instance()->CreateHeaps = true; + + LOG_DEBUG("using _localBufferHeap & _localTextureHeap!"); + + xessParams.bufferHeapOffset = 0; + xessParams.textureHeapOffset = 0; + xessParams.pTempBufferHeap = _localBufferHeap; + xessParams.pTempTextureHeap = _localTextureHeap; + } + else + { + _localBufferHeap->Release(); + LOG_ERROR("CreateHeap textureHeapDesc failed {0:x}!", (UINT) hr); + } + } + else + { + LOG_ERROR("CreateHeap bufferHeapDesc failed {0:x}!", (UINT) hr); + } + } + else + { + LOG_ERROR("xessGetProperties failed {0}!", ResultToString(ret)); + } + } + + // try to build pipelines with local pipeline object + if (Config::Instance()->BuildPipelines.value_or(true)) + { + LOG_DEBUG("xessD3D12BuildPipelines!"); + State::Instance().skipHeapCapture = true; + + ID3D12Device1* device1; + if (FAILED(device->QueryInterface(IID_PPV_ARGS(&device1)))) + { + LOG_ERROR("QueryInterface device1 failed!"); + ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags); + } + else + { + HRESULT hr = device1->CreatePipelineLibrary(nullptr, 0, IID_PPV_ARGS(&_localPipeline)); + + if (FAILED(hr) || !_localPipeline) + { + LOG_ERROR("CreatePipelineLibrary failed {0:x}!", (UINT) hr); + ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags); + } + else + { + ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, _localPipeline, false, xessParams.initFlags); + + if (ret != XESS_RESULT_SUCCESS) + { + LOG_ERROR("xessD3D12BuildPipelines error with _localPipeline: {0}", ResultToString(ret)); + ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags); + } + else + { + LOG_DEBUG("using _localPipelines!"); + xessParams.pPipelineLibrary = _localPipeline; + } + } + } + + if (device1 != nullptr) + device1->Release(); + + State::Instance().skipHeapCapture = false; + + if (ret != XESS_RESULT_SUCCESS) + { + LOG_ERROR("xessD3D12BuildPipelines error: {0}", ResultToString(ret)); + } + } + + State::Instance().skipHeapCapture = true; + ret = XeSSProxy::D3D12Init()(_xessContext, &xessParams); + State::Instance().skipHeapCapture = false; + + return ret; +} + +XessInitParams XeSSFeatureDx12::CreateInitParams(xess_2d_t outputResolution, xess_quality_settings_t qualitySetting, + uint32_t initFlags) +{ + xess_d3d12_init_params_t xessParams{}; + xessParams.initFlags = initFlags; + xessParams.outputResolution = outputResolution; + xessParams.qualitySetting = qualitySetting; + + return XessInitParams(xessParams); +} + +void XeSSFeatureDx12::InitMenuAndOutput(ApiContext* context) +{ + auto InDevice = std::get(*context).d3d12Device; + if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr)) + Imgui = std::make_unique(Util::GetProcessWindow(), InDevice); + + OutputScaler = std::make_unique("Output Scaling", InDevice, (TargetWidth() < DisplayWidth())); + RCAS = std::make_unique("RCAS", InDevice); + Bias = std::make_unique("Bias", InDevice); +} + +bool XeSSFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCommandList, + NVSDK_NGX_Parameter* InParameters) +{ + ApiContext apiCtx = D3D12Context({.d3d12Device = InDevice, .d3d12CommandList = InCommandList}); + return XeSSFeature::Init(&apiCtx, InParameters); +} diff --git a/OptiScaler/upscalers/xess/XeSSFeature_Dx12.h b/OptiScaler/upscalers/xess/XeSSFeature_Dx12.h index 7016c2c3..e6fa7bb1 100644 --- a/OptiScaler/upscalers/xess/XeSSFeature_Dx12.h +++ b/OptiScaler/upscalers/xess/XeSSFeature_Dx12.h @@ -6,6 +6,10 @@ class XeSSFeatureDx12 : public XeSSFeature, public IFeature_Dx12 { private: + ID3D12PipelineLibrary* _localPipeline = nullptr; + ID3D12Heap* _localBufferHeap = nullptr; + ID3D12Heap* _localTextureHeap = nullptr; + protected: public: std::string Name() const { return "XeSS"; } @@ -20,9 +24,18 @@ class XeSSFeatureDx12 : public XeSSFeature, public IFeature_Dx12 _moduleLoaded = XeSSProxy::Module() != nullptr && XeSSProxy::D3D12CreateContext() != nullptr; } - bool Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCommandList, - NVSDK_NGX_Parameter* InParameters) override; bool Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_NGX_Parameter* InParameters) override; ~XeSSFeatureDx12(); + + bool CheckInitializationContext(ApiContext* context) override; + xess_result_t CreateXessContext(ApiContext* context, xess_context_handle_t* pXessContext) override; + xess_result_t ApiInit(ApiContext* context, XessInitParams* xessInitParams) override; + XessInitParams CreateInitParams(xess_2d_t outputResolution, xess_quality_settings_t qualitySetting, + uint32_t initFlags) override; + void InitMenuAndOutput(ApiContext* context) override; + + //Hotfix until using the real init method works directly + bool Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCommandList, + NVSDK_NGX_Parameter* InParameters) override; };