#pragma once
#include "SysUtils.h"
#include <ankerl/unordered_dense.h>

void PrepareLogger();
void CloseLogger();
void WaitForEnter();

#ifdef DLSS_PARAM_DUMP

inline static ankerl::unordered_dense::map<std::string, std::string> nvParamNames;

inline static void FillNvParamNames()
{
    if (nvParamNames.size() > 0)
        return;

    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved00", "#\x00" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_SuperSampling_Available", "#\x01" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_InPainting_Available", "#\x02" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ImageSuperResolution_Available", "#\x03" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_SlowMotion_Available", "#\x04" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_VideoSuperResolution_Available", "#\x05" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved06", "#\x06" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved07", "#\x07" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved08", "#\x08" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ImageSignalProcessing_Available", "#\x09" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ImageSuperResolution_ScaleFactor_2_1", "#\x0a" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ImageSuperResolution_ScaleFactor_3_1", "#\x0b" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ImageSuperResolution_ScaleFactor_3_2", "#\x0c" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ImageSuperResolution_ScaleFactor_4_3", "#\x0d" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_NumFrames", "#\x0e" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Scale", "#\x0f" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Width", "#\x10" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Height", "#\x11" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_OutWidth", "#\x12" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_OutHeight", "#\x13" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Sharpness", "#\x14" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Scratch", "#\x15" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Scratch_SizeInBytes", "#\x16" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_EvaluationNode", "#\x17" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Input1", "#\x18" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Input1_Format", "#\x19" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Input1_SizeInBytes", "#\x1a" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Input2", "#\x1b" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Input2_Format", "#\x1c" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Input2_SizeInBytes", "#\x1d" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Color", "#\x1e" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Color_Format", "#\x1f" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Color_SizeInBytes", "#\x20" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Albedo", "#\x21" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Output", "#\x22" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Output_Format", "#\x23" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Output_SizeInBytes", "#\x24" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reset", "#\x25" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_BlendFactor", "#\x26" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_MotionVectors", "#\x27" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Rect_X", "#\x28" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Rect_Y", "#\x29" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Rect_W", "#\x2a" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Rect_H", "#\x2b" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_MV_Scale_X", "#\x2c" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_MV_Scale_Y", "#\x2d" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Model", "#\x2e" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Format", "#\x2f" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_SizeInBytes", "#\x30" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ResourceAllocCallback", "#\x31" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_BufferAllocCallback", "#\x32" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Tex2DAllocCallback", "#\x33" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_ResourceReleaseCallback", "#\x34" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_CreationNodeMask", "#\x35" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_VisibilityNodeMask", "#\x36" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_PreviousOutput", "#\x37" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_MV_Offset_X", "#\x38" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_MV_Offset_Y", "#\x39" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Hint_UseFireflySwatter", "#\x3a" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Resource_Width", "#\x3b" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Resource_Height", "#\x3c" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Depth", "#\x3d" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_DLSSOptimalSettingsCallback", "#\x3e" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_PerfQualityValue", "#\x3f" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_RTXValue", "#\x40" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_DLSSMode", "#\x41" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_DeepResolve_Available", "#\x42" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Deprecated_43", "#\x43" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_OptLevel", "#\x44" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_IsDevSnippetBranch", "#\x45" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved_46", "#\x46" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Graphics_API", "#\x47" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved_48", "#\x48" });
    nvParamNames.insert({ "NVSDK_NGX_EParameter_Reserved_49", "#\x49" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OptLevel", "Snippet.OptLevel" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_IsDevSnippetBranch", "Snippet.IsDevBranch" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SuperSampling_ScaleFactor", "SuperSampling.ScaleFactor" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSignalProcessing_ScaleFactor", "ImageSignalProcessing.ScaleFactor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SuperSampling_Available", "SuperSampling.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_InPainting_Available", "InPainting.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ImageSuperResolution_Available", "ImageSuperResolution.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SlowMotion_Available", "SlowMotion.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_VideoSuperResolution_Available", "VideoSuperResolution.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ImageSignalProcessing_Available", "ImageSignalProcessing.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DeepResolve_Available", "DeepResolve.Available" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SuperSampling_NeedsUpdatedDriver", "SuperSampling.NeedsUpdatedDriver" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_InPainting_NeedsUpdatedDriver", "InPainting.NeedsUpdatedDriver" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSuperResolution_NeedsUpdatedDriver", "ImageSuperResolution.NeedsUpdatedDriver" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SlowMotion_NeedsUpdatedDriver", "SlowMotion.NeedsUpdatedDriver" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_VideoSuperResolution_NeedsUpdatedDriver", "VideoSuperResolution.NeedsUpdatedDriver" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSignalProcessing_NeedsUpdatedDriver", "ImageSignalProcessing.NeedsUpdatedDriver" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DeepResolve_NeedsUpdatedDriver", "DeepResolve.NeedsUpdatedDriver" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_FrameInterpolation_NeedsUpdatedDriver", "FrameInterpolation.NeedsUpdatedDriver" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_SuperSampling_MinDriverVersionMajor", "SuperSampling.MinDriverVersionMajor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_InPainting_MinDriverVersionMajor", "InPainting.MinDriverVersionMajor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ImageSuperResolution_MinDriverVersionMajor",
                          "ImageSuperResolution.MinDriverVersionMajor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SlowMotion_MinDriverVersionMajor", "SlowMotion.MinDriverVersionMajor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_VideoSuperResolution_MinDriverVersionMajor",
                          "VideoSuperResolution.MinDriverVersionMajor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ImageSignalProcessing_MinDriverVersionMajor",
                          "ImageSignalProcessing.MinDriverVersionMajor" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DeepResolve_MinDriverVersionMajor", "DeepResolve.MinDriverVersionMajor" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_FrameInterpolation_MinDriverVersionMajor", "FrameInterpolation.MinDriverVersionMajor" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_SuperSampling_MinDriverVersionMinor", "SuperSampling.MinDriverVersionMinor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_InPainting_MinDriverVersionMinor", "InPainting.MinDriverVersionMinor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ImageSuperResolution_MinDriverVersionMinor",
                          "ImageSuperResolution.MinDriverVersionMinor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SlowMotion_MinDriverVersionMinor", "SlowMotion.MinDriverVersionMinor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_VideoSuperResolution_MinDriverVersionMinor",
                          "VideoSuperResolution.MinDriverVersionMinor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ImageSignalProcessing_MinDriverVersionMinor",
                          "ImageSignalProcessing.MinDriverVersionMinor" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DeepResolve_MinDriverVersionMinor", "DeepResolve.MinDriverVersionMinor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SuperSampling_FeatureInitResult", "SuperSampling.FeatureInitResult" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_InPainting_FeatureInitResult", "InPainting.FeatureInitResult" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSuperResolution_FeatureInitResult", "ImageSuperResolution.FeatureInitResult" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SlowMotion_FeatureInitResult", "SlowMotion.FeatureInitResult" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_VideoSuperResolution_FeatureInitResult", "VideoSuperResolution.FeatureInitResult" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSignalProcessing_FeatureInitResult", "ImageSignalProcessing.FeatureInitResult" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DeepResolve_FeatureInitResult", "DeepResolve.FeatureInitResult" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_FrameInterpolation_FeatureInitResult", "FrameInterpolation.FeatureInitResult" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSuperResolution_ScaleFactor_2_1", "ImageSuperResolution.ScaleFactor.2.1" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSuperResolution_ScaleFactor_3_1", "ImageSuperResolution.ScaleFactor.3.1" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSuperResolution_ScaleFactor_3_2", "ImageSuperResolution.ScaleFactor.3.2" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_ImageSuperResolution_ScaleFactor_4_3", "ImageSuperResolution.ScaleFactor.4.3" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_NumFrames", "NumFrames" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Scale", "Scale" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Width", "Width" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Height", "Height" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OutWidth", "OutWidth" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OutHeight", "OutHeight" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Sharpness", "Sharpness" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Scratch", "Scratch" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Scratch_SizeInBytes", "Scratch.SizeInBytes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Input1", "Input1" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Input1_Format", "Input1.Format" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Input1_SizeInBytes", "Input1.SizeInBytes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Input2", "Input2" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Input2_Format", "Input2.Format" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Input2_SizeInBytes", "Input2.SizeInBytes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Color", "Color" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Color_Format", "Color.Format" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Color_SizeInBytes", "Color.SizeInBytes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Color1", "Color1" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Color2", "Color2" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Albedo", "Albedo" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Output", "Output" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Output_Format", "Output.Format" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Output_SizeInBytes", "Output.SizeInBytes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Output1", "Output1" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Output2", "Output2" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Output3", "Output3" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Reset", "Reset" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_BlendFactor", "BlendFactor" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MotionVectors", "MotionVectors" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_MotionVectors1", "MotionVectors1" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_MotionVectors2", "MotionVectors2" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Rect_X", "Rect.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Rect_Y", "Rect.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Rect_W", "Rect.W" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Rect_H", "Rect.H" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OutRect_X", "OutRect.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OutRect_Y", "OutRect.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OutRect_W", "OutRect.W" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_OutRect_H", "OutRect.H" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MV_Scale_X", "MV.Scale.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MV_Scale_Y", "MV.Scale.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Model", "Model" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Format", "Format" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_SizeInBytes", "SizeInBytes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ResourceAllocCallback", "ResourceAllocCallback" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_BufferAllocCallback", "BufferAllocCallback" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Tex2DAllocCallback", "Tex2DAllocCallback" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ResourceReleaseCallback", "ResourceReleaseCallback" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_CreationNodeMask", "CreationNodeMask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_VisibilityNodeMask", "VisibilityNodeMask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MV_Offset_X", "MV.Offset.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MV_Offset_Y", "MV.Offset.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Hint_UseFireflySwatter", "Hint.UseFireflySwatter" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Resource_Width", "ResourceWidth" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Resource_Height", "ResourceHeight" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Resource_OutWidth", "ResourceOutWidth" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Resource_OutHeight", "ResourceOutHeight" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Depth", "Depth" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Depth1", "Depth1" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Depth2", "Depth2" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSSOptimalSettingsCallback", "DLSSOptimalSettingsCallback" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSSGetStatsCallback", "DLSSGetStatsCallback" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_PerfQualityValue", "PerfQualityValue" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_RTXValue", "RTXValue" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSSMode", "DLSSMode" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_Mode", "FIMode" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_OF_Preset", "FIOFPreset" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FI_OF_GridSize", "FIOFGridSize" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Jitter_Offset_X", "Jitter.Offset.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Jitter_Offset_Y", "Jitter.Offset.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Denoise", "Denoise" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_TransparencyMask", "TransparencyMask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_ExposureTexture", "ExposureTexture" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Feature_Create_Flags", "DLSS.Feature.Create.Flags" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Checkerboard_Jitter_Hack", "DLSS.Checkerboard.Jitter.Hack" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Normals", "GBuffer.Normals" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Albedo", "GBuffer.Albedo" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Roughness", "GBuffer.Roughness" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_DiffuseAlbedo", "GBuffer.DiffuseAlbedo" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_SpecularAlbedo", "GBuffer.SpecularAlbedo" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_IndirectAlbedo", "GBuffer.IndirectAlbedo" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_SpecularMvec", "GBuffer.SpecularMvec" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_DisocclusionMask", "GBuffer.DisocclusionMask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Metallic", "GBuffer.Metallic" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Specular", "GBuffer.Specular" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Subsurface", "GBuffer.Subsurface" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_ShadingModelId", "GBuffer.ShadingModelId" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_MaterialId", "GBuffer.MaterialId" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_8", "GBuffer.Attrib.8" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_9", "GBuffer.Attrib.9" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_10", "GBuffer.Attrib.10" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_11", "GBuffer.Attrib.11" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_12", "GBuffer.Attrib.12" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_13", "GBuffer.Attrib.13" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_14", "GBuffer.Attrib.14" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_GBuffer_Atrrib_15", "GBuffer.Attrib.15" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_TonemapperType", "TonemapperType" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FreeMemOnReleaseFeature", "FreeMemOnReleaseFeature" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MotionVectors3D", "MotionVectors3D" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_IsParticleMask", "IsParticleMask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_AnimatedTextureMask", "AnimatedTextureMask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DepthHighRes", "DepthHighRes" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_Position_ViewSpace", "Position.ViewSpace" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_FrameTimeDeltaInMsec", "FrameTimeDeltaInMsec" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_RayTracingHitDistance", "RayTracingHitDistance" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_MotionVectorsReflection", "MotionVectorsReflection" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Enable_Output_Subrects", "DLSS.Enable.Output.Subrects" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_Color_Subrect_Base_X", "DLSS.Input.Color.Subrect.Base.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_Color_Subrect_Base_Y", "DLSS.Input.Color.Subrect.Base.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_Depth_Subrect_Base_X", "DLSS.Input.Depth.Subrect.Base.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_Depth_Subrect_Base_Y", "DLSS.Input.Depth.Subrect.Base.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_MV_SubrectBase_X", "DLSS.Input.MV.Subrect.Base.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_MV_SubrectBase_Y", "DLSS.Input.MV.Subrect.Base.Y" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Input_Translucency_SubrectBase_X", "DLSS.Input.Translucency.Subrect.Base.X" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Input_Translucency_SubrectBase_Y", "DLSS.Input.Translucency.Subrect.Base.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Output_Subrect_Base_X", "DLSS.Output.Subrect.Base.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Output_Subrect_Base_Y", "DLSS.Output.Subrect.Base.Y" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Render_Subrect_Dimensions_Width", "DLSS.Render.Subrect.Dimensions.Width" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Render_Subrect_Dimensions_Height", "DLSS.Render.Subrect.Dimensions.Height" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Pre_Exposure", "DLSS.Pre.Exposure" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Exposure_Scale", "DLSS.Exposure.Scale" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask", "DLSS.Input.Bias.Current.Color.Mask" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_SubrectBase_X",
                          "DLSS.Input.Bias.Current.Color.Subrect.Base.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_SubrectBase_Y",
                          "DLSS.Input.Bias.Current.Color.Subrect.Base.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Indicator_Invert_Y_Axis", "DLSS.Indicator.Invert.Y.Axis" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Indicator_Invert_X_Axis", "DLSS.Indicator.Invert.X.Axis" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_INV_VIEW_PROJECTION_MATRIX", "InvViewProjectionMatrix" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_CLIP_TO_PREV_CLIP_MATRIX", "ClipToPrevClipMatrix" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_TransparencyLayer", "DLSS.TransparencyLayer" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_TransparencyLayer_Subrect_Base_X", "DLSS.TransparencyLayer.Subrect.Base.X" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_TransparencyLayer_Subrect_Base_Y", "DLSS.TransparencyLayer.Subrect.Base.Y" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_TransparencyLayerOpacity", "DLSS.TransparencyLayerOpacity" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_TransparencyLayerOpacity_Subrect_Base_X",
                          "DLSS.TransparencyLayerOpacity.Subrect.Base.X" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_TransparencyLayerOpacity_Subrect_Base_Y",
                          "DLSS.TransparencyLayerOpacity.Subrect.Base.Y" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Max_Render_Width", "DLSS.Get.Dynamic.Max.Render.Width" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Max_Render_Height", "DLSS.Get.Dynamic.Max.Render.Height" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Min_Render_Width", "DLSS.Get.Dynamic.Min.Render.Width" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Min_Render_Height", "DLSS.Get.Dynamic.Min.Render.Height" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_DLAA", "DLSS.Hint.Render.Preset.DLAA" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Quality", "DLSS.Hint.Render.Preset.Quality" });
    nvParamNames.insert({ "NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Balanced", "DLSS.Hint.Render.Preset.Balanced" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Performance", "DLSS.Hint.Render.Preset.Performance" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_UltraPerformance", "DLSS.Hint.Render.Preset.UltraPerformance" });
    nvParamNames.insert(
        { "NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_UltraQuality", "DLSS.Hint.Render.Preset.UltraQuality" });
}

inline static void DumpNvParams(const NVSDK_NGX_Parameter* InParams)
{
    FillNvParamNames();

    spdlog::debug("DumpNvParams Dumping known NvParam values");

    for (const auto& [key, value] : nvParamNames)
    {
        unsigned long long ull = 0;
        float f = 0.0f;
        double d = 0.0;
        unsigned int ui = 0;
        int i = 0;
        void* v = nullptr;

        InParams->Get(value.c_str(), &ull);
        InParams->Get(value.c_str(), &f);
        InParams->Get(value.c_str(), &d);
        InParams->Get(value.c_str(), &ui);
        InParams->Get(value.c_str(), &i);
        InParams->Get(value.c_str(), &v);

        spdlog::debug("DumpNvParams {0} => ULL: {1}, F: {2}, D: {3}, UI: {4}, I: {5}, V*: {6:x}", key, ull, f, d, ui, i,
                      (UINT64) v);
    }
}

#endif
