Skip to content

Commit bbe43b7

Browse files
committed
combine xessfeature and xessfeature dx12 - d11on12 doesn't work yet
1 parent 19654a8 commit bbe43b7

File tree

7 files changed

+380
-250
lines changed

7 files changed

+380
-250
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: 99 additions & 217 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>
@@ -15,27 +15,37 @@ inline void XeSSLogCallback(const char* Message, xess_logging_level_t Level)
1515
}
1616

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

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

27-
if (IsInited())
28-
return true;
29-
30-
if (device == nullptr)
40+
if (!CheckInitializationContext(context))
3141
{
32-
LOG_ERROR("D3D12Device is null!");
42+
LOG_ERROR("XeSSFeature::Init context is not valid!");
3343
return false;
3444
}
3545

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

38-
auto ret = XeSSProxy::D3D12CreateContext()(device, &_xessContext);
48+
auto ret = CreateXessContext(context, &_xessContext);
3949

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

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

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

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

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

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

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

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

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

@@ -300,40 +124,98 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
300124

301125
SetInit(true);
302126

127+
InitMenuAndOutput(context);
128+
303129
return true;
304130
}
305131

306-
XeSSFeature::XeSSFeature(unsigned int handleId, NVSDK_NGX_Parameter* InParameters) : IFeature(handleId, InParameters)
132+
bool XeSSFeature::Evaluate(EvalContext* context, const NVSDK_NGX_Parameter* InParameters,
133+
const NVSDK_NGX_Parameter* OutParameters)
307134
{
308-
_initParameters = SetInitParameters(InParameters);
135+
return false;
309136
}
310137

311-
XeSSFeature::~XeSSFeature()
138+
uint32_t XeSSFeature::GetInitFlags()
312139
{
313-
if (State::Instance().isShuttingDown || _xessContext == nullptr)
314-
return;
140+
uint32_t initFlags = XESS_INIT_FLAG_NONE;
141+
if (DepthInverted())
142+
initFlags |= XESS_INIT_FLAG_INVERTED_DEPTH;
315143

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

322-
if (_localPipeline != nullptr)
158+
if (!Config::Instance()->DisableReactiveMask.value_or(true))
323159
{
324-
_localPipeline->Release();
325-
_localPipeline = nullptr;
160+
initFlags |= XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK;
161+
LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", initFlags);
326162
}
163+
return initFlags;
164+
}
327165

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

334-
if (_localTextureHeap != nullptr)
211+
XeSSFeature::~XeSSFeature()
212+
{
213+
if (State::Instance().isShuttingDown || _xessContext == nullptr)
214+
return;
215+
216+
if (_xessContext)
335217
{
336-
_localTextureHeap->Release();
337-
_localTextureHeap = nullptr;
218+
XeSSProxy::DestroyContext()(_xessContext);
219+
_xessContext = nullptr;
338220
}
339221
}

0 commit comments

Comments
 (0)