Skip to content

Commit 5e4b028

Browse files
committed
combine xessfeature and xessfeature dx12 - d11on12 doesn't work yet
1 parent 6130509 commit 5e4b028

File tree

7 files changed

+381
-251
lines changed

7 files changed

+381
-251
lines changed

OptiScaler/pch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define _CRT_SECURE_NO_DEPRECATE
99
#include <Windows.h>
1010
#include <string>
11+
#include <variant>
1112
#include <stdint.h>
1213
#include <libloaderapi.h>
1314

Lines changed: 100 additions & 218 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma once
1+
#pragma once
22
#include "XeSSFeature.h"
33

44
#include <pch.h>
@@ -10,31 +10,41 @@
1010

1111
inline void XeSSLogCallback(const char* Message, xess_logging_level_t Level)
1212
{
13-
spdlog::log((spdlog::level::level_enum) ((int) Level + 1), "XeSSFeature::LogCallback XeSS Runtime ({0})", Message);
13+
spdlog::log((spdlog::level::level_enum)((int) Level + 1), "XeSSFeature::LogCallback XeSS Runtime ({0})", Message);
1414
}
1515

1616
bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters)
17+
{
18+
19+
return true;
20+
}
21+
22+
XeSSFeature::XeSSFeature(unsigned int handleId, NVSDK_NGX_Parameter* InParameters) : IFeature(handleId, InParameters)
23+
{
24+
_initParameters = SetInitParameters(InParameters);
25+
}
26+
27+
bool XeSSFeature::Init(ApiContext* context, const NVSDK_NGX_Parameter* InParameters)
1728
{
1829
LOG_FUNC();
30+
if (IsInited())
31+
return true;
1932

2033
if (!_moduleLoaded)
2134
{
2235
LOG_ERROR("libxess.dll not loaded!");
2336
return false;
2437
}
2538

26-
if (IsInited())
27-
return true;
28-
29-
if (device == nullptr)
39+
if (!CheckInitializationContext(context))
3040
{
31-
LOG_ERROR("D3D12Device is null!");
41+
LOG_ERROR("XeSSFeature::Init context is not valid!");
3242
return false;
3343
}
3444

3545
State::Instance().skipSpoofing = true;
3646

37-
auto ret = XeSSProxy::D3D12CreateContext()(device, &_xessContext);
47+
auto ret = CreateXessContext(context, &_xessContext);
3848

3949
if (ret != XESS_RESULT_SUCCESS)
4050
{
@@ -48,88 +58,9 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
4858
ret = XeSSProxy::SetLoggingCallback()(_xessContext, XESS_LOGGING_LEVEL_DEBUG, XeSSLogCallback);
4959
LOG_DEBUG("xessSetLoggingCallback : {0}", ResultToString(ret));
5060

51-
xess_d3d12_init_params_t xessParams{};
52-
53-
xessParams.initFlags = XESS_INIT_FLAG_NONE;
54-
55-
if (DepthInverted())
56-
xessParams.initFlags |= XESS_INIT_FLAG_INVERTED_DEPTH;
57-
58-
if (AutoExposure())
59-
xessParams.initFlags |= XESS_INIT_FLAG_ENABLE_AUTOEXPOSURE;
60-
else
61-
xessParams.initFlags |= XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE;
62-
63-
if (!IsHdr())
64-
xessParams.initFlags |= XESS_INIT_FLAG_LDR_INPUT_COLOR;
65-
66-
if (JitteredMV())
67-
xessParams.initFlags |= XESS_INIT_FLAG_JITTERED_MV;
68-
69-
if (!LowResMV())
70-
xessParams.initFlags |= XESS_INIT_FLAG_HIGH_RES_MV;
71-
72-
if (!Config::Instance()->DisableReactiveMask.value_or(true))
73-
{
74-
xessParams.initFlags |= XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK;
75-
LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", xessParams.initFlags);
76-
}
77-
78-
switch (PerfQualityValue())
79-
{
80-
case NVSDK_NGX_PerfQuality_Value_UltraPerformance:
81-
if (Version().major >= 1 && Version().minor >= 3)
82-
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_PERFORMANCE;
83-
else
84-
xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE;
85-
86-
break;
87-
88-
case NVSDK_NGX_PerfQuality_Value_MaxPerf:
89-
if (Version().major >= 1 && Version().minor >= 3)
90-
xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED;
91-
else
92-
xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE;
93-
94-
break;
95-
96-
case NVSDK_NGX_PerfQuality_Value_Balanced:
97-
if (Version().major >= 1 && Version().minor >= 3)
98-
xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY;
99-
else
100-
xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED;
101-
102-
break;
103-
104-
case NVSDK_NGX_PerfQuality_Value_MaxQuality:
105-
if (Version().major >= 1 && Version().minor >= 3)
106-
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY;
107-
else
108-
xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY;
109-
110-
break;
61+
uint32_t initFlags = GetInitFlags();
11162

112-
case NVSDK_NGX_PerfQuality_Value_UltraQuality:
113-
if (Version().major >= 1 && Version().minor >= 3)
114-
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY_PLUS;
115-
else
116-
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY;
117-
118-
break;
119-
120-
case NVSDK_NGX_PerfQuality_Value_DLAA:
121-
if (Version().major >= 1 && Version().minor >= 3)
122-
xessParams.qualitySetting = XESS_QUALITY_SETTING_AA;
123-
else
124-
xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY;
125-
126-
break;
127-
128-
default:
129-
xessParams.qualitySetting =
130-
XESS_QUALITY_SETTING_BALANCED; // Set out-of-range value for non-existing XESS_QUALITY_SETTING_BALANCED mode
131-
break;
132-
}
63+
xess_quality_settings_t qualitySetting = GetQualitySetting();
13364

13465
if (Config::Instance()->OutputScalingEnabled.value_or(false) && LowResMV())
13566
{
@@ -168,114 +99,9 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
16899
}
169100
}
170101

171-
xessParams.outputResolution.x = TargetWidth();
172-
xessParams.outputResolution.y = TargetHeight();
173-
174-
// create heaps to prevent create heap errors of xess
175-
if (Config::Instance()->CreateHeaps.value_or(true))
176-
{
177-
HRESULT hr;
178-
xess_properties_t xessProps{};
179-
ret = XeSSProxy::GetProperties()(_xessContext, &xessParams.outputResolution, &xessProps);
180-
181-
if (ret == XESS_RESULT_SUCCESS)
182-
{
183-
CD3DX12_HEAP_DESC bufferHeapDesc(xessProps.tempBufferHeapSize, D3D12_HEAP_TYPE_DEFAULT);
184-
State::Instance().skipHeapCapture = true;
185-
hr = device->CreateHeap(&bufferHeapDesc, IID_PPV_ARGS(&_localBufferHeap));
186-
State::Instance().skipHeapCapture = false;
187-
188-
if (SUCCEEDED(hr))
189-
{
190-
D3D12_HEAP_DESC textureHeapDesc{
191-
xessProps.tempTextureHeapSize,
192-
{D3D12_HEAP_TYPE_DEFAULT, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0},
193-
0,
194-
D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES};
195-
196-
State::Instance().skipHeapCapture = true;
197-
hr = device->CreateHeap(&textureHeapDesc, IID_PPV_ARGS(&_localTextureHeap));
198-
State::Instance().skipHeapCapture = false;
199-
200-
if (SUCCEEDED(hr))
201-
{
202-
Config::Instance()->CreateHeaps = true;
203-
204-
LOG_DEBUG("using _localBufferHeap & _localTextureHeap!");
205-
206-
xessParams.bufferHeapOffset = 0;
207-
xessParams.textureHeapOffset = 0;
208-
xessParams.pTempBufferHeap = _localBufferHeap;
209-
xessParams.pTempTextureHeap = _localTextureHeap;
210-
}
211-
else
212-
{
213-
_localBufferHeap->Release();
214-
LOG_ERROR("CreateHeap textureHeapDesc failed {0:x}!", (UINT) hr);
215-
}
216-
}
217-
else
218-
{
219-
LOG_ERROR("CreateHeap bufferHeapDesc failed {0:x}!", (UINT) hr);
220-
}
221-
}
222-
else
223-
{
224-
LOG_ERROR("xessGetProperties failed {0}!", ResultToString(ret));
225-
}
226-
}
227-
228-
// try to build pipelines with local pipeline object
229-
if (Config::Instance()->BuildPipelines.value_or(true))
230-
{
231-
LOG_DEBUG("xessD3D12BuildPipelines!");
232-
State::Instance().skipHeapCapture = true;
102+
xess_2d_t outputResolution = {TargetWidth(), TargetHeight()};
233103

234-
ID3D12Device1* device1;
235-
if (FAILED(device->QueryInterface(IID_PPV_ARGS(&device1))))
236-
{
237-
LOG_ERROR("QueryInterface device1 failed!");
238-
ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags);
239-
}
240-
else
241-
{
242-
HRESULT hr = device1->CreatePipelineLibrary(nullptr, 0, IID_PPV_ARGS(&_localPipeline));
243-
244-
if (FAILED(hr) || !_localPipeline)
245-
{
246-
LOG_ERROR("CreatePipelineLibrary failed {0:x}!", (UINT) hr);
247-
ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags);
248-
}
249-
else
250-
{
251-
ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, _localPipeline, false, xessParams.initFlags);
252-
253-
if (ret != XESS_RESULT_SUCCESS)
254-
{
255-
LOG_ERROR("xessD3D12BuildPipelines error with _localPipeline: {0}", ResultToString(ret));
256-
ret = XeSSProxy::D3D12BuildPipelines()(_xessContext, NULL, false, xessParams.initFlags);
257-
}
258-
else
259-
{
260-
LOG_DEBUG("using _localPipelines!");
261-
xessParams.pPipelineLibrary = _localPipeline;
262-
}
263-
}
264-
}
265-
266-
if (device1 != nullptr)
267-
device1->Release();
268-
269-
State::Instance().skipHeapCapture = false;
270-
271-
if (ret != XESS_RESULT_SUCCESS)
272-
{
273-
LOG_ERROR("xessD3D12BuildPipelines error: {0}", ResultToString(ret));
274-
return false;
275-
}
276-
}
277-
278-
LOG_DEBUG("xessD3D12Init!");
104+
XessInitParams xessParams = CreateInitParams(outputResolution, qualitySetting, initFlags);
279105

280106
if (Config::Instance()->NetworkModel.has_value() && Config::Instance()->NetworkModel.value() >= 0 &&
281107
Config::Instance()->NetworkModel.value() <= 5)
@@ -285,9 +111,7 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
285111
LOG_ERROR("xessSelectNetworkModel result: {0}", ResultToString(ret));
286112
}
287113

288-
State::Instance().skipHeapCapture = true;
289-
ret = XeSSProxy::D3D12Init()(_xessContext, &xessParams);
290-
State::Instance().skipHeapCapture = false;
114+
ret = ApiInit(context, &xessParams);
291115

292116
State::Instance().skipSpoofing = false;
293117

@@ -299,40 +123,98 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
299123

300124
SetInit(true);
301125

126+
InitMenuAndOutput(context);
127+
302128
return true;
303129
}
304130

305-
XeSSFeature::XeSSFeature(unsigned int handleId, NVSDK_NGX_Parameter* InParameters) : IFeature(handleId, InParameters)
131+
bool XeSSFeature::Evaluate(EvalContext* context, const NVSDK_NGX_Parameter* InParameters,
132+
const NVSDK_NGX_Parameter* OutParameters)
306133
{
307-
_initParameters = SetInitParameters(InParameters);
134+
return false;
308135
}
309136

310-
XeSSFeature::~XeSSFeature()
137+
uint32_t XeSSFeature::GetInitFlags()
311138
{
312-
if (State::Instance().isShuttingDown || _xessContext == nullptr)
313-
return;
139+
uint32_t initFlags = XESS_INIT_FLAG_NONE;
140+
if (DepthInverted())
141+
initFlags |= XESS_INIT_FLAG_INVERTED_DEPTH;
314142

315-
if (_xessContext)
316-
{
317-
XeSSProxy::DestroyContext()(_xessContext);
318-
_xessContext = nullptr;
319-
}
143+
if (AutoExposure())
144+
initFlags |= XESS_INIT_FLAG_ENABLE_AUTOEXPOSURE;
145+
else
146+
initFlags |= XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE;
147+
148+
if (!IsHdr())
149+
initFlags |= XESS_INIT_FLAG_LDR_INPUT_COLOR;
150+
151+
if (JitteredMV())
152+
initFlags |= XESS_INIT_FLAG_JITTERED_MV;
153+
154+
if (!LowResMV())
155+
initFlags |= XESS_INIT_FLAG_HIGH_RES_MV;
320156

321-
if (_localPipeline != nullptr)
157+
if (!Config::Instance()->DisableReactiveMask.value_or(true))
322158
{
323-
_localPipeline->Release();
324-
_localPipeline = nullptr;
159+
initFlags |= XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK;
160+
LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", initFlags);
325161
}
162+
return initFlags;
163+
}
326164

327-
if (_localBufferHeap != nullptr)
165+
xess_quality_settings_t XeSSFeature::GetQualitySetting()
166+
{
167+
switch (PerfQualityValue())
328168
{
329-
_localBufferHeap->Release();
330-
_localBufferHeap = nullptr;
169+
case NVSDK_NGX_PerfQuality_Value_UltraPerformance:
170+
if (Version().major >= 1 && Version().minor >= 3)
171+
return XESS_QUALITY_SETTING_ULTRA_PERFORMANCE;
172+
else
173+
return XESS_QUALITY_SETTING_PERFORMANCE;
174+
break;
175+
case NVSDK_NGX_PerfQuality_Value_MaxPerf:
176+
if (Version().major >= 1 && Version().minor >= 3)
177+
return XESS_QUALITY_SETTING_BALANCED;
178+
else
179+
return XESS_QUALITY_SETTING_PERFORMANCE;
180+
break;
181+
case NVSDK_NGX_PerfQuality_Value_Balanced:
182+
if (Version().major >= 1 && Version().minor >= 3)
183+
return XESS_QUALITY_SETTING_QUALITY;
184+
else
185+
return XESS_QUALITY_SETTING_BALANCED;
186+
break;
187+
case NVSDK_NGX_PerfQuality_Value_MaxQuality:
188+
if (Version().major >= 1 && Version().minor >= 3)
189+
return XESS_QUALITY_SETTING_ULTRA_QUALITY;
190+
else
191+
return XESS_QUALITY_SETTING_QUALITY;
192+
break;
193+
case NVSDK_NGX_PerfQuality_Value_UltraQuality:
194+
if (Version().major >= 1 && Version().minor >= 3)
195+
return XESS_QUALITY_SETTING_ULTRA_QUALITY_PLUS;
196+
else
197+
return XESS_QUALITY_SETTING_ULTRA_QUALITY;
198+
break;
199+
200+
case NVSDK_NGX_PerfQuality_Value_DLAA:
201+
if (Version().major >= 1 && Version().minor >= 3)
202+
return XESS_QUALITY_SETTING_AA;
203+
else
204+
return XESS_QUALITY_SETTING_ULTRA_QUALITY;
205+
break;
331206
}
207+
return XESS_QUALITY_SETTING_BALANCED;
208+
}
332209

333-
if (_localTextureHeap != nullptr)
210+
XeSSFeature::~XeSSFeature()
211+
{
212+
if (State::Instance().isShuttingDown || _xessContext == nullptr)
213+
return;
214+
215+
if (_xessContext)
334216
{
335-
_localTextureHeap->Release();
336-
_localTextureHeap = nullptr;
217+
XeSSProxy::DestroyContext()(_xessContext);
218+
_xessContext = nullptr;
337219
}
338220
}

0 commit comments

Comments
 (0)