@@ -39,6 +39,24 @@ namespace Diligent
3939const char * DLSSProjectId = " 750fed3a-efba-42ba-801b-22d4cbad9148" ;
4040const 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+
4260NVSDK_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