Skip to content

Commit 4732759

Browse files
SuperResolutionDLSS: Implement fall back to lower quality modes
1 parent 8300b32 commit 4732759

File tree

1 file changed

+52
-26
lines changed

1 file changed

+52
-26
lines changed

Graphics/SuperResolution/src/SuperResolutionDLSS.cpp

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ namespace Diligent
3939
const char* DLSSProjectId = "750fed3a-efba-42ba-801b-22d4cbad9148";
4040
const wchar_t* DLSSAppDataPath = L".";
4141

42+
static const Char* GetOptimizationTypeName(SUPER_RESOLUTION_OPTIMIZATION_TYPE Type)
43+
{
44+
static_assert(SUPER_RESOLUTION_OPTIMIZATION_TYPE_COUNT == 5, "Please update the switch below to handle the new optimization type");
45+
switch (Type)
46+
{
47+
// clang-format off
48+
case SUPER_RESOLUTION_OPTIMIZATION_TYPE_MAX_QUALITY: return "Max Quality";
49+
case SUPER_RESOLUTION_OPTIMIZATION_TYPE_HIGH_QUALITY: return "High Quality";
50+
case SUPER_RESOLUTION_OPTIMIZATION_TYPE_BALANCED: return "Balanced";
51+
case SUPER_RESOLUTION_OPTIMIZATION_TYPE_HIGH_PERFORMANCE: return "High Performance";
52+
case SUPER_RESOLUTION_OPTIMIZATION_TYPE_MAX_PERFORMANCE: return "Max Performance";
53+
// clang-format on
54+
default:
55+
UNEXPECTED("Unexpected optimization type");
56+
return "Unknown";
57+
}
58+
}
59+
4260
NVSDK_NGX_PerfQuality_Value OptimizationTypeToNGXPerfQuality(SUPER_RESOLUTION_OPTIMIZATION_TYPE Type)
4361
{
4462
switch (Type)
@@ -118,34 +136,42 @@ void DLSSProviderBase::GetSourceSettings(const SuperResolutionSourceSettingsAttr
118136

119137
ValidateSourceSettingsAttribs(Attribs);
120138

121-
NVSDK_NGX_PerfQuality_Value PerfQuality = OptimizationTypeToNGXPerfQuality(Attribs.OptimizationType);
122-
123-
Uint32 OptimalWidth = 0;
124-
Uint32 OptimalHeight = 0;
125-
Uint32 MaxWidth = 0;
126-
Uint32 MaxHeight = 0;
127-
Uint32 MinWidth = 0;
128-
Uint32 MinHeight = 0;
129-
float Sharpness = 0.0f;
130-
131-
NVSDK_NGX_Result Result = NGX_DLSS_GET_OPTIMAL_SETTINGS(
132-
m_pNGXParams,
133-
Attribs.OutputWidth, Attribs.OutputHeight,
134-
PerfQuality,
135-
&OptimalWidth, &OptimalHeight,
136-
&MaxWidth, &MaxHeight,
137-
&MinWidth, &MinHeight,
138-
&Sharpness);
139-
140-
if (NVSDK_NGX_SUCCEED(Result) && OptimalWidth > 0 && OptimalHeight > 0)
141-
{
142-
Settings.OptimalInputWidth = OptimalWidth;
143-
Settings.OptimalInputHeight = OptimalHeight;
144-
}
145-
else
139+
for (SUPER_RESOLUTION_OPTIMIZATION_TYPE OptType = Attribs.OptimizationType; OptType < SUPER_RESOLUTION_OPTIMIZATION_TYPE_COUNT; OptType = static_cast<SUPER_RESOLUTION_OPTIMIZATION_TYPE>(OptType + 1))
146140
{
147-
LOG_WARNING_MESSAGE("Failed to get DLSS optimal settings. Result: ", static_cast<Uint32>(Result));
141+
NVSDK_NGX_PerfQuality_Value PerfQuality = OptimizationTypeToNGXPerfQuality(OptType);
142+
143+
Uint32 OptimalWidth = 0;
144+
Uint32 OptimalHeight = 0;
145+
Uint32 MaxWidth = 0;
146+
Uint32 MaxHeight = 0;
147+
Uint32 MinWidth = 0;
148+
Uint32 MinHeight = 0;
149+
float Sharpness = 0.0f;
150+
151+
NVSDK_NGX_Result Result = NGX_DLSS_GET_OPTIMAL_SETTINGS(
152+
m_pNGXParams,
153+
Attribs.OutputWidth, Attribs.OutputHeight,
154+
PerfQuality,
155+
&OptimalWidth, &OptimalHeight,
156+
&MaxWidth, &MaxHeight,
157+
&MinWidth, &MinHeight,
158+
&Sharpness);
159+
160+
if (NVSDK_NGX_SUCCEED(Result) && OptimalWidth > 0 && OptimalHeight > 0)
161+
{
162+
if (OptType != Attribs.OptimizationType)
163+
{
164+
LOG_WARNING_MESSAGE("DLSS quality mode '", GetOptimizationTypeName(Attribs.OptimizationType),
165+
"' is not available. Falling back to '", GetOptimizationTypeName(OptType), "'.");
166+
}
167+
Settings.OptimalInputWidth = OptimalWidth;
168+
Settings.OptimalInputHeight = OptimalHeight;
169+
return;
170+
}
148171
}
172+
173+
LOG_WARNING_MESSAGE("Failed to get DLSS optimal settings: no quality mode is available for ",
174+
Attribs.OutputWidth, "x", Attribs.OutputHeight, " output resolution.");
149175
}
150176

151177
} // namespace Diligent

0 commit comments

Comments
 (0)