diff --git a/Graphics/SuperResolution/CMakeLists.txt b/Graphics/SuperResolution/CMakeLists.txt index 11a4207cb..0449e5e45 100644 --- a/Graphics/SuperResolution/CMakeLists.txt +++ b/Graphics/SuperResolution/CMakeLists.txt @@ -73,6 +73,7 @@ if(DILIGENT_FSR_SUPPORTED) ${CMAKE_CURRENT_SOURCE_DIR}/shaders/FSR_ContrastAdaptiveSharpening.fx ${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/ffx_common_types.h ${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/ffx_core.h + ${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/ffx_core_cpu.h ${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/ffx_core_glsl.h ${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/ffx_core_gpu_common.h ${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/ffx_core_gpu_common_half.h diff --git a/Graphics/SuperResolution/shaders/FSRStructures.fxh b/Graphics/SuperResolution/shaders/FSRStructures.fxh index 58e92fcef..76ffa9402 100644 --- a/Graphics/SuperResolution/shaders/FSRStructures.fxh +++ b/Graphics/SuperResolution/shaders/FSRStructures.fxh @@ -26,7 +26,7 @@ struct FSRAttribs }; #ifdef CHECK_STRUCT_ALIGNMENT -CHECK_STRUCT_ALIGNMENT(FSRAttribs); +CHECK_STRUCT_ALIGNMENT(FSRAttribs) #endif diff --git a/Graphics/SuperResolution/shaders/FSR_FullQuad.fx b/Graphics/SuperResolution/shaders/FSR_FullQuad.fx index 03535a368..e72676e35 100644 --- a/Graphics/SuperResolution/shaders/FSR_FullQuad.fx +++ b/Graphics/SuperResolution/shaders/FSR_FullQuad.fx @@ -1,14 +1,9 @@ -struct FSR_VSOutput -{ - float4 Position : SV_Position; -}; - -void FSR_FullQuadVS(in uint VertexId : SV_VertexID, out FSR_VSOutput VSOut) +float4 FSR_FullQuadVS(in uint VertexId : SV_VertexID) : SV_Position { float2 PosXY[3]; PosXY[0] = float2(-1.0, -1.0); PosXY[1] = float2(-1.0, +3.0); PosXY[2] = float2(+3.0, -1.0); - VSOut.Position = float4(PosXY[VertexId % 3u], 0.0, 1.0); + return float4(PosXY[VertexId % 3u], 0.0, 1.0); } diff --git a/Graphics/SuperResolution/src/DLSSProviderVk.cpp b/Graphics/SuperResolution/src/DLSSProviderVk.cpp index 699dd5a7c..dc915e6d3 100644 --- a/Graphics/SuperResolution/src/DLSSProviderVk.cpp +++ b/Graphics/SuperResolution/src/DLSSProviderVk.cpp @@ -199,6 +199,7 @@ class DLSSProviderVk final : public DLSSProviderBase { if (m_pNGXParams != nullptr) { + m_pDevice->IdleGPU(); NVSDK_NGX_VULKAN_DestroyParameters(m_pNGXParams); NVSDK_NGX_VULKAN_Shutdown1(m_pDevice->GetVkDevice()); } diff --git a/Graphics/SuperResolution/src/FSRProvider.cpp b/Graphics/SuperResolution/src/FSRProvider.cpp index 5f55d326f..9b7b74dbb 100644 --- a/Graphics/SuperResolution/src/FSRProvider.cpp +++ b/Graphics/SuperResolution/src/FSRProvider.cpp @@ -248,13 +248,14 @@ FSRProvider::FSRProvider(IRenderDevice* pDevice) : auto CreateShader = [&](SHADER_TYPE Type, const char* Name, const char* EntryPoint, const char* FilePath, const ShaderMacroArray& ShaderMacros = {}) { ShaderCreateInfo ShaderCI; - ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; - ShaderCI.Desc.ShaderType = Type; - ShaderCI.Desc.Name = Name; - ShaderCI.EntryPoint = EntryPoint; - ShaderCI.FilePath = FilePath; - ShaderCI.Macros = ShaderMacros; - ShaderCI.pShaderSourceStreamFactory = m_pShaderSourceFactory; + ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; + ShaderCI.Desc.ShaderType = Type; + ShaderCI.Desc.Name = Name; + ShaderCI.Desc.UseCombinedTextureSamplers = true; + ShaderCI.EntryPoint = EntryPoint; + ShaderCI.FilePath = FilePath; + ShaderCI.Macros = ShaderMacros; + ShaderCI.pShaderSourceStreamFactory = m_pShaderSourceFactory; RefCntAutoPtr pShader; pDevice->CreateShader(ShaderCI, &pShader); return pShader; @@ -278,7 +279,7 @@ FSRProvider::PipelineData& FSRProvider::GetOrCreatePipelines(TEXTURE_FORMAT Outp ResourceLayout .SetDefaultVariableType(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC) .AddVariable(SHADER_TYPE_PIXEL, "cbFSRAttribs", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE) - .AddImmutableSampler(SHADER_TYPE_PIXEL, "g_TextureSource_sampler", Sam_PointClamp); + .AddImmutableSampler(SHADER_TYPE_PIXEL, "g_TextureSource", Sam_PointClamp); GraphicsPipelineStateCreateInfoX PSOCreateInfo{"FSR::EASU PSO"}; PSOCreateInfo diff --git a/Graphics/SuperResolution/src/SuperResolutionDLSS.cpp b/Graphics/SuperResolution/src/SuperResolutionDLSS.cpp index 5468d39df..6fb9f2c0f 100644 --- a/Graphics/SuperResolution/src/SuperResolutionDLSS.cpp +++ b/Graphics/SuperResolution/src/SuperResolutionDLSS.cpp @@ -39,6 +39,24 @@ namespace Diligent const char* DLSSProjectId = "750fed3a-efba-42ba-801b-22d4cbad9148"; const wchar_t* DLSSAppDataPath = L"."; +static const Char* GetOptimizationTypeName(SUPER_RESOLUTION_OPTIMIZATION_TYPE Type) +{ + static_assert(SUPER_RESOLUTION_OPTIMIZATION_TYPE_COUNT == 5, "Please update the switch below to handle the new optimization type"); + switch (Type) + { + // clang-format off + case SUPER_RESOLUTION_OPTIMIZATION_TYPE_MAX_QUALITY: return "Max Quality"; + case SUPER_RESOLUTION_OPTIMIZATION_TYPE_HIGH_QUALITY: return "High Quality"; + case SUPER_RESOLUTION_OPTIMIZATION_TYPE_BALANCED: return "Balanced"; + case SUPER_RESOLUTION_OPTIMIZATION_TYPE_HIGH_PERFORMANCE: return "High Performance"; + case SUPER_RESOLUTION_OPTIMIZATION_TYPE_MAX_PERFORMANCE: return "Max Performance"; + // clang-format on + default: + UNEXPECTED("Unexpected optimization type"); + return "Unknown"; + } +} + NVSDK_NGX_PerfQuality_Value OptimizationTypeToNGXPerfQuality(SUPER_RESOLUTION_OPTIMIZATION_TYPE Type) { switch (Type) @@ -118,34 +136,42 @@ void DLSSProviderBase::GetSourceSettings(const SuperResolutionSourceSettingsAttr ValidateSourceSettingsAttribs(Attribs); - NVSDK_NGX_PerfQuality_Value PerfQuality = OptimizationTypeToNGXPerfQuality(Attribs.OptimizationType); - - Uint32 OptimalWidth = 0; - Uint32 OptimalHeight = 0; - Uint32 MaxWidth = 0; - Uint32 MaxHeight = 0; - Uint32 MinWidth = 0; - Uint32 MinHeight = 0; - float Sharpness = 0.0f; - - NVSDK_NGX_Result Result = NGX_DLSS_GET_OPTIMAL_SETTINGS( - m_pNGXParams, - Attribs.OutputWidth, Attribs.OutputHeight, - PerfQuality, - &OptimalWidth, &OptimalHeight, - &MaxWidth, &MaxHeight, - &MinWidth, &MinHeight, - &Sharpness); - - if (NVSDK_NGX_SUCCEED(Result) && OptimalWidth > 0 && OptimalHeight > 0) - { - Settings.OptimalInputWidth = OptimalWidth; - Settings.OptimalInputHeight = OptimalHeight; - } - else + for (SUPER_RESOLUTION_OPTIMIZATION_TYPE OptType = Attribs.OptimizationType; OptType < SUPER_RESOLUTION_OPTIMIZATION_TYPE_COUNT; OptType = static_cast(OptType + 1)) { - LOG_WARNING_MESSAGE("Failed to get DLSS optimal settings. Result: ", static_cast(Result)); + NVSDK_NGX_PerfQuality_Value PerfQuality = OptimizationTypeToNGXPerfQuality(OptType); + + Uint32 OptimalWidth = 0; + Uint32 OptimalHeight = 0; + Uint32 MaxWidth = 0; + Uint32 MaxHeight = 0; + Uint32 MinWidth = 0; + Uint32 MinHeight = 0; + float Sharpness = 0.0f; + + NVSDK_NGX_Result Result = NGX_DLSS_GET_OPTIMAL_SETTINGS( + m_pNGXParams, + Attribs.OutputWidth, Attribs.OutputHeight, + PerfQuality, + &OptimalWidth, &OptimalHeight, + &MaxWidth, &MaxHeight, + &MinWidth, &MinHeight, + &Sharpness); + + if (NVSDK_NGX_SUCCEED(Result) && OptimalWidth > 0 && OptimalHeight > 0) + { + if (OptType != Attribs.OptimizationType) + { + LOG_WARNING_MESSAGE("DLSS quality mode '", GetOptimizationTypeName(Attribs.OptimizationType), + "' is not available. Falling back to '", GetOptimizationTypeName(OptType), "'."); + } + Settings.OptimalInputWidth = OptimalWidth; + Settings.OptimalInputHeight = OptimalHeight; + return; + } } + + LOG_WARNING_MESSAGE("Failed to get DLSS optimal settings: no quality mode is available for ", + Attribs.OutputWidth, "x", Attribs.OutputHeight, " output resolution."); } } // namespace Diligent