Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Graphics/SuperResolution/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Graphics/SuperResolution/shaders/FSRStructures.fxh
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct FSRAttribs
};

#ifdef CHECK_STRUCT_ALIGNMENT
CHECK_STRUCT_ALIGNMENT(FSRAttribs);
CHECK_STRUCT_ALIGNMENT(FSRAttribs)
#endif


Expand Down
9 changes: 2 additions & 7 deletions Graphics/SuperResolution/shaders/FSR_FullQuad.fx
Original file line number Diff line number Diff line change
@@ -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);
}
1 change: 1 addition & 0 deletions Graphics/SuperResolution/src/DLSSProviderVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
17 changes: 9 additions & 8 deletions Graphics/SuperResolution/src/FSRProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<IShader> pShader;
pDevice->CreateShader(ShaderCI, &pShader);
return pShader;
Expand All @@ -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
Expand Down
78 changes: 52 additions & 26 deletions Graphics/SuperResolution/src/SuperResolutionDLSS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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<SUPER_RESOLUTION_OPTIMIZATION_TYPE>(OptType + 1))
{
LOG_WARNING_MESSAGE("Failed to get DLSS optimal settings. Result: ", static_cast<Uint32>(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
Loading