Skip to content

Commit d710c8c

Browse files
SuperResolutionDLSS: factor common API logic into base classes
1 parent e8532a5 commit d710c8c

File tree

5 files changed

+120
-197
lines changed

5 files changed

+120
-197
lines changed

Graphics/SuperResolution/include/SuperResolutionDLSS.hpp

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@
3232
#include <vector>
3333

3434
#include <nvsdk_ngx_defs.h>
35+
#include <nvsdk_ngx_params.h>
3536

3637
#include "SuperResolutionFactory.h"
37-
#include "SuperResolution.h"
38+
#include "SuperResolutionProvider.hpp"
39+
#include "SuperResolutionBase.hpp"
3840

3941
struct NVSDK_NGX_Parameter;
4042

@@ -50,12 +52,77 @@ NVSDK_NGX_PerfQuality_Value OptimizationTypeToNGXPerfQuality(SUPER_RESOLUTION_OP
5052
/// Computes the full set of DLSS feature flags from the description and execution attributes.
5153
Int32 ComputeDLSSFeatureFlags(SUPER_RESOLUTION_FLAGS Flags, const ExecuteSuperResolutionAttribs& Attribs);
5254

53-
/// Populates DLSS variant info using NGX capability parameters.
54-
void EnumerateDLSSVariants(NVSDK_NGX_Parameter* pNGXParams, std::vector<SuperResolutionInfo>& Variants);
55+
class DLSSProviderBase : public SuperResolutionProvider
56+
{
57+
public:
58+
/// Populates DLSS variant info using NGX capability parameters.
59+
virtual void EnumerateVariants(std::vector<SuperResolutionInfo>& Variants) override final;
60+
61+
/// Queries DLSS optimal source settings using NGX capability parameters.
62+
virtual void GetSourceSettings(const SuperResolutionSourceSettingsAttribs& Attribs, SuperResolutionSourceSettings& Settings) override final;
63+
64+
protected:
65+
NVSDK_NGX_Parameter* m_pNGXParams = nullptr;
66+
};
67+
68+
template <auto CreateFeature, auto ReleaseFeature>
69+
class SuperResolutionDLSS : public SuperResolutionBase
70+
{
71+
public:
72+
SuperResolutionDLSS(IReferenceCounters* pRefCounters,
73+
const SuperResolutionDesc& Desc,
74+
const SuperResolutionInfo& Info,
75+
NVSDK_NGX_Parameter* pNGXParams) :
76+
SuperResolutionBase{pRefCounters, Desc, Info},
77+
m_pNGXParams{pNGXParams}
78+
{
79+
PopulateHaltonJitterPattern(m_JitterPattern, 64);
80+
}
81+
82+
~SuperResolutionDLSS()
83+
{
84+
if (m_pDLSSFeature != nullptr)
85+
ReleaseFeature(m_pDLSSFeature);
86+
}
87+
88+
protected:
89+
NVSDK_NGX_Handle* AcquireFeature(const ExecuteSuperResolutionAttribs& Attribs)
90+
{
91+
const Int32 DLSSCreateFeatureFlags = ComputeDLSSFeatureFlags(m_Desc.Flags, Attribs);
92+
if (m_pDLSSFeature != nullptr && m_DLSSFeatureFlags == DLSSCreateFeatureFlags)
93+
return m_pDLSSFeature;
94+
95+
if (m_pDLSSFeature != nullptr)
96+
{
97+
ReleaseFeature(m_pDLSSFeature);
98+
m_pDLSSFeature = nullptr;
99+
}
100+
m_DLSSFeatureFlags = DLSSCreateFeatureFlags;
101+
102+
NVSDK_NGX_DLSS_Create_Params DLSSCreateParams{};
103+
DLSSCreateParams.Feature.InWidth = m_Desc.InputWidth;
104+
DLSSCreateParams.Feature.InHeight = m_Desc.InputHeight;
105+
DLSSCreateParams.Feature.InTargetWidth = m_Desc.OutputWidth;
106+
DLSSCreateParams.Feature.InTargetHeight = m_Desc.OutputHeight;
107+
DLSSCreateParams.InFeatureCreateFlags = DLSSCreateFeatureFlags;
108+
109+
NVSDK_NGX_Handle* pFeature = nullptr;
110+
NVSDK_NGX_Result Result = CreateFeature(Attribs.pContext, m_pNGXParams, DLSSCreateParams, &pFeature);
111+
if (NVSDK_NGX_FAILED(Result))
112+
{
113+
LOG_ERROR_MESSAGE("Failed to create DLSS feature. NGX Result: ", static_cast<Uint32>(Result));
114+
return nullptr;
115+
}
116+
m_pDLSSFeature = pFeature;
117+
return m_pDLSSFeature;
118+
}
119+
120+
protected:
121+
NVSDK_NGX_Parameter* const m_pNGXParams;
55122

56-
/// Queries DLSS optimal source settings using NGX capability parameters.
57-
void GetDLSSSourceSettings(NVSDK_NGX_Parameter* pNGXParams,
58-
const SuperResolutionSourceSettingsAttribs& Attribs,
59-
SuperResolutionSourceSettings& Settings);
123+
private:
124+
NVSDK_NGX_Handle* m_pDLSSFeature = nullptr;
125+
Int32 m_DLSSFeatureFlags = 0;
126+
};
60127

61128
} // namespace Diligent

Graphics/SuperResolution/src/DLSSProviderD3D11.cpp

Lines changed: 12 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,24 @@ namespace Diligent
4545
namespace
4646
{
4747

48-
class SuperResolutionD3D11_DLSS final : public SuperResolutionBase
48+
NVSDK_NGX_Result CreateDLSSFeatureD3D11(IDeviceContext* pContext,
49+
NVSDK_NGX_Parameter* pNGXParams,
50+
NVSDK_NGX_DLSS_Create_Params& DLSSCreateParams,
51+
NVSDK_NGX_Handle** ppFeature)
52+
{
53+
ID3D11DeviceContext* pd3d11Ctx = ClassPtrCast<IDeviceContextD3D11>(pContext)->GetD3D11DeviceContext();
54+
return NGX_D3D11_CREATE_DLSS_EXT(pd3d11Ctx, ppFeature, pNGXParams, &DLSSCreateParams);
55+
}
56+
57+
class SuperResolutionD3D11_DLSS final : public SuperResolutionDLSS<CreateDLSSFeatureD3D11, NVSDK_NGX_D3D11_ReleaseFeature>
4958
{
5059
public:
5160
SuperResolutionD3D11_DLSS(IReferenceCounters* pRefCounters,
5261
const SuperResolutionDesc& Desc,
5362
const SuperResolutionInfo& Info,
5463
NVSDK_NGX_Parameter* pNGXParams) :
55-
SuperResolutionBase{pRefCounters, Desc, Info},
56-
m_pNGXParams{pNGXParams}
64+
SuperResolutionDLSS{pRefCounters, Desc, Info, pNGXParams}
5765
{
58-
PopulateHaltonJitterPattern(m_JitterPattern, 64);
59-
}
60-
61-
~SuperResolutionD3D11_DLSS()
62-
{
63-
if (m_pDLSSFeature != nullptr)
64-
NVSDK_NGX_D3D11_ReleaseFeature(m_pDLSSFeature);
6566
}
6667

6768
virtual void DILIGENT_CALL_TYPE Execute(const ExecuteSuperResolutionAttribs& Attribs) override final
@@ -103,47 +104,9 @@ class SuperResolutionD3D11_DLSS final : public SuperResolutionBase
103104
if (NVSDK_NGX_FAILED(Result))
104105
LOG_ERROR_MESSAGE("DLSS D3D11 evaluation failed. NGX Result: ", static_cast<Uint32>(Result));
105106
}
106-
107-
private:
108-
NVSDK_NGX_Handle* AcquireFeature(const ExecuteSuperResolutionAttribs& Attribs)
109-
{
110-
const Int32 DLSSCreateFeatureFlags = ComputeDLSSFeatureFlags(m_Desc.Flags, Attribs);
111-
if (m_pDLSSFeature != nullptr && m_DLSSFeatureFlags == DLSSCreateFeatureFlags)
112-
return m_pDLSSFeature;
113-
114-
if (m_pDLSSFeature != nullptr)
115-
{
116-
NVSDK_NGX_D3D11_ReleaseFeature(m_pDLSSFeature);
117-
m_pDLSSFeature = nullptr;
118-
}
119-
m_DLSSFeatureFlags = DLSSCreateFeatureFlags;
120-
121-
NVSDK_NGX_DLSS_Create_Params DLSSCreateParams{};
122-
DLSSCreateParams.Feature.InWidth = m_Desc.InputWidth;
123-
DLSSCreateParams.Feature.InHeight = m_Desc.InputHeight;
124-
DLSSCreateParams.Feature.InTargetWidth = m_Desc.OutputWidth;
125-
DLSSCreateParams.Feature.InTargetHeight = m_Desc.OutputHeight;
126-
DLSSCreateParams.InFeatureCreateFlags = DLSSCreateFeatureFlags;
127-
128-
NVSDK_NGX_Handle* pFeature = nullptr;
129-
ID3D11DeviceContext* pd3d11Ctx = ClassPtrCast<IDeviceContextD3D11>(Attribs.pContext)->GetD3D11DeviceContext();
130-
NVSDK_NGX_Result Result = NGX_D3D11_CREATE_DLSS_EXT(pd3d11Ctx, &pFeature, m_pNGXParams, &DLSSCreateParams);
131-
132-
if (NVSDK_NGX_FAILED(Result))
133-
{
134-
LOG_ERROR_MESSAGE("Failed to create DLSS D3D11 feature. NGX Result: ", static_cast<Uint32>(Result));
135-
return nullptr;
136-
}
137-
m_pDLSSFeature = pFeature;
138-
return m_pDLSSFeature;
139-
}
140-
141-
NVSDK_NGX_Handle* m_pDLSSFeature = nullptr;
142-
NVSDK_NGX_Parameter* m_pNGXParams = nullptr;
143-
Int32 m_DLSSFeatureFlags = 0;
144107
};
145108

146-
class DLSSProviderD3D11 final : public SuperResolutionProvider
109+
class DLSSProviderD3D11 final : public DLSSProviderBase
147110
{
148111
public:
149112
DLSSProviderD3D11(IRenderDevice* pDevice)
@@ -184,16 +147,6 @@ class DLSSProviderD3D11 final : public SuperResolutionProvider
184147
}
185148
}
186149

187-
virtual void EnumerateVariants(std::vector<SuperResolutionInfo>& Variants) override final
188-
{
189-
EnumerateDLSSVariants(m_pNGXParams, Variants);
190-
}
191-
192-
virtual void GetSourceSettings(const SuperResolutionSourceSettingsAttribs& Attribs, SuperResolutionSourceSettings& Settings) override final
193-
{
194-
GetDLSSSourceSettings(m_pNGXParams, Attribs, Settings);
195-
}
196-
197150
virtual void CreateSuperResolution(const SuperResolutionDesc& Desc, const SuperResolutionInfo& Info, ISuperResolution** ppUpscaler) override final
198151
{
199152
DEV_CHECK_ERR(ppUpscaler != nullptr, "ppUpscaler must not be null");
@@ -204,7 +157,6 @@ class DLSSProviderD3D11 final : public SuperResolutionProvider
204157

205158
private:
206159
CComPtr<ID3D11Device> m_pd3d11Device;
207-
NVSDK_NGX_Parameter* m_pNGXParams = nullptr;
208160
};
209161

210162
} // anonymous namespace

Graphics/SuperResolution/src/DLSSProviderD3D12.cpp

Lines changed: 15 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,24 @@ namespace Diligent
4545
namespace
4646
{
4747

48-
class SuperResolutionD3D12_DLSS final : public SuperResolutionBase
48+
NVSDK_NGX_Result CreateDLSSFeatureD3D12(IDeviceContext* pContext,
49+
NVSDK_NGX_Parameter* pNGXParams,
50+
NVSDK_NGX_DLSS_Create_Params& DLSSCreateParams,
51+
NVSDK_NGX_Handle** ppFeature)
52+
{
53+
ID3D12GraphicsCommandList* pCmdList = ClassPtrCast<IDeviceContextD3D12>(pContext)->GetD3D12CommandList();
54+
return NGX_D3D12_CREATE_DLSS_EXT(pCmdList, 1, 1, ppFeature, pNGXParams, &DLSSCreateParams);
55+
}
56+
57+
class SuperResolutionD3D12_DLSS final : public SuperResolutionDLSS<CreateDLSSFeatureD3D12, NVSDK_NGX_D3D12_ReleaseFeature>
4958
{
5059
public:
5160
SuperResolutionD3D12_DLSS(IReferenceCounters* pRefCounters,
5261
const SuperResolutionDesc& Desc,
5362
const SuperResolutionInfo& Info,
5463
NVSDK_NGX_Parameter* pNGXParams) :
55-
SuperResolutionBase{pRefCounters, Desc, Info},
56-
m_pNGXParams{pNGXParams}
64+
SuperResolutionDLSS{pRefCounters, Desc, Info, pNGXParams}
5765
{
58-
PopulateHaltonJitterPattern(m_JitterPattern, 64);
59-
}
60-
61-
~SuperResolutionD3D12_DLSS()
62-
{
63-
if (m_pDLSSFeature != nullptr)
64-
NVSDK_NGX_D3D12_ReleaseFeature(m_pDLSSFeature);
6566
}
6667

6768
virtual void DILIGENT_CALL_TYPE Execute(const ExecuteSuperResolutionAttribs& Attribs) override final
@@ -119,61 +120,23 @@ class SuperResolutionD3D12_DLSS final : public SuperResolutionBase
119120
pCtxImpl->TransitionTextureState(Attribs.pOutputTextureView->GetTexture(), D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE);
120121
pCtxImpl->Flush();
121122
}
122-
123-
private:
124-
NVSDK_NGX_Handle* AcquireFeature(const ExecuteSuperResolutionAttribs& Attribs)
125-
{
126-
const Int32 DLSSCreateFeatureFlags = ComputeDLSSFeatureFlags(m_Desc.Flags, Attribs);
127-
if (m_pDLSSFeature != nullptr && m_DLSSFeatureFlags == DLSSCreateFeatureFlags)
128-
return m_pDLSSFeature;
129-
130-
if (m_pDLSSFeature != nullptr)
131-
{
132-
NVSDK_NGX_D3D12_ReleaseFeature(m_pDLSSFeature);
133-
m_pDLSSFeature = nullptr;
134-
}
135-
m_DLSSFeatureFlags = DLSSCreateFeatureFlags;
136-
137-
NVSDK_NGX_DLSS_Create_Params DLSSCreateParams{};
138-
DLSSCreateParams.Feature.InWidth = m_Desc.InputWidth;
139-
DLSSCreateParams.Feature.InHeight = m_Desc.InputHeight;
140-
DLSSCreateParams.Feature.InTargetWidth = m_Desc.OutputWidth;
141-
DLSSCreateParams.Feature.InTargetHeight = m_Desc.OutputHeight;
142-
DLSSCreateParams.InFeatureCreateFlags = DLSSCreateFeatureFlags;
143-
144-
NVSDK_NGX_Handle* pFeature = nullptr;
145-
ID3D12GraphicsCommandList* pCmdList = ClassPtrCast<IDeviceContextD3D12>(Attribs.pContext)->GetD3D12CommandList();
146-
NVSDK_NGX_Result Result = NGX_D3D12_CREATE_DLSS_EXT(pCmdList, 1, 1, &pFeature, m_pNGXParams, &DLSSCreateParams);
147-
148-
if (NVSDK_NGX_FAILED(Result))
149-
{
150-
LOG_ERROR_MESSAGE("Failed to create DLSS D3D12 feature. NGX Result: ", static_cast<Uint32>(Result));
151-
return nullptr;
152-
}
153-
m_pDLSSFeature = pFeature;
154-
return m_pDLSSFeature;
155-
}
156-
157-
NVSDK_NGX_Handle* m_pDLSSFeature = nullptr;
158-
NVSDK_NGX_Parameter* m_pNGXParams = nullptr;
159-
Int32 m_DLSSFeatureFlags = 0;
160123
};
161124

162125

163-
class DLSSProviderD3D12 final : public SuperResolutionProvider
126+
class DLSSProviderD3D12 final : public DLSSProviderBase
164127
{
165128
public:
166129
DLSSProviderD3D12(IRenderDevice* pDevice)
167130
{
168131
if (pDevice == nullptr)
169132
LOG_ERROR_AND_THROW("Device must not be null");
170-
if (RefCntAutoPtr<IRenderDeviceD3D12> pDeviceD3D11{pDevice, IID_RenderDeviceD3D12})
133+
if (RefCntAutoPtr<IRenderDeviceD3D12> pDeviceD3D12{pDevice, IID_RenderDeviceD3D12})
171134
{
172-
m_pd3d12Device = pDeviceD3D11->GetD3D12Device();
135+
m_pd3d12Device = pDeviceD3D12->GetD3D12Device();
173136
}
174137
else
175138
{
176-
LOG_ERROR_AND_THROW("Device must be of type RENDER_DEVICE_TYPE_D3D11");
139+
LOG_ERROR_AND_THROW("Device must be of type RENDER_DEVICE_TYPE_D3D12");
177140
}
178141

179142
NVSDK_NGX_Result Result = NVSDK_NGX_D3D12_Init_with_ProjectID(DLSSProjectId, NVSDK_NGX_ENGINE_TYPE_CUSTOM, "0", DLSSAppDataPath, m_pd3d12Device);
@@ -201,16 +164,6 @@ class DLSSProviderD3D12 final : public SuperResolutionProvider
201164
}
202165
}
203166

204-
virtual void EnumerateVariants(std::vector<SuperResolutionInfo>& Variants) override final
205-
{
206-
EnumerateDLSSVariants(m_pNGXParams, Variants);
207-
}
208-
209-
virtual void GetSourceSettings(const SuperResolutionSourceSettingsAttribs& Attribs, SuperResolutionSourceSettings& Settings) override final
210-
{
211-
GetDLSSSourceSettings(m_pNGXParams, Attribs, Settings);
212-
}
213-
214167
virtual void CreateSuperResolution(const SuperResolutionDesc& Desc, const SuperResolutionInfo& Info, ISuperResolution** ppUpscaler) override final
215168
{
216169
DEV_CHECK_ERR(ppUpscaler != nullptr, "ppUpscaler must not be null");
@@ -221,7 +174,6 @@ class DLSSProviderD3D12 final : public SuperResolutionProvider
221174

222175
private:
223176
CComPtr<ID3D12Device> m_pd3d12Device;
224-
NVSDK_NGX_Parameter* m_pNGXParams = nullptr;
225177
};
226178

227179
} // anonymous namespace

0 commit comments

Comments
 (0)