From 326bcfbfcd05df6bef12fa7295af18f3e3a7aaac Mon Sep 17 00:00:00 2001 From: cdozdil Date: Wed, 21 Feb 2024 02:22:40 +0300 Subject: [PATCH] changed resource state parameter added xess quality override changed min render height and width --- CyberXeSS/Config.cpp | 1 + CyberXeSS/Config.h | 13 ++--- CyberXeSS/CyberXess.h | 102 ++++++++++++++++++++++----------------- CyberXeSS/NGXParameter.h | 16 +++--- nvngx.ini | 57 +++++++++++++++++++--- 5 files changed, 122 insertions(+), 67 deletions(-) diff --git a/CyberXeSS/Config.cpp b/CyberXeSS/Config.cpp index 11685a65..7d6e2036 100644 --- a/CyberXeSS/Config.cpp +++ b/CyberXeSS/Config.cpp @@ -22,6 +22,7 @@ void Config::Reload() DelayedInit = readBool("XeSS", "DelayedInit"); BuildPipelines = readBool("XeSS", "BuildPipelines"); NetworkModel = readInt("XeSS", "NetworkModel"); + OverrideQuality = readInt("XeSS", "OverrideQuality"); LoggingEnabled = readBool("Log", "LoggingEnabled"); diff --git a/CyberXeSS/Config.h b/CyberXeSS/Config.h index 62ff76e2..8f5538c8 100644 --- a/CyberXeSS/Config.h +++ b/CyberXeSS/Config.h @@ -29,6 +29,7 @@ public: std::optional DelayedInit; std::optional BuildPipelines; std::optional NetworkModel; + std::optional OverrideQuality; // CAS std::optional CasEnabled; @@ -51,12 +52,12 @@ public: //Hotfixes std::optional DisableReactiveMask; - std::optional ColorResourceBarrier; - std::optional MVResourceBarrier; - std::optional DepthResourceBarrier; - std::optional ExposureResourceBarrier; - std::optional MaskResourceBarrier; - std::optional OutputResourceBarrier; + std::optional ColorResourceBarrier; + std::optional MVResourceBarrier; + std::optional DepthResourceBarrier; + std::optional ExposureResourceBarrier; + std::optional MaskResourceBarrier; + std::optional OutputResourceBarrier; void Reload(); diff --git a/CyberXeSS/CyberXess.h b/CyberXeSS/CyberXess.h index 501e77a5..79fbd406 100644 --- a/CyberXeSS/CyberXess.h +++ b/CyberXeSS/CyberXess.h @@ -240,7 +240,7 @@ class FeatureContext xess_context_handle_t xessContext = nullptr; bool xessMaskEnabled = true; bool xessInit = false; - + // cas FfxCasContext casContext; bool casInit = false; @@ -607,29 +607,36 @@ public: int pqValue; initParams->Get(NVSDK_NGX_Parameter_PerfQualityValue, &pqValue); - switch ((NVSDK_NGX_PerfQuality_Value)pqValue) + if (CyberXessContext::instance()->MyConfig->OverrideQuality.has_value()) { - case NVSDK_NGX_PerfQuality_Value_UltraPerformance: - xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE; - break; - case NVSDK_NGX_PerfQuality_Value_MaxPerf: - xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE; - break; - case NVSDK_NGX_PerfQuality_Value_Balanced: - xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; - break; - case NVSDK_NGX_PerfQuality_Value_MaxQuality: - xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY; - break; - case NVSDK_NGX_PerfQuality_Value_UltraQuality: - xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY; - break; - case NVSDK_NGX_PerfQuality_Value_DLAA: - xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY; - break; - default: - xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; //Set out-of-range value for non-existing XESS_QUALITY_SETTING_BALANCED mode - break; + xessParams.qualitySetting = (xess_quality_settings_t)CyberXessContext::instance()->MyConfig->OverrideQuality.value(); + } + else + { + switch ((NVSDK_NGX_PerfQuality_Value)pqValue) + { + case NVSDK_NGX_PerfQuality_Value_UltraPerformance: + xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE; + break; + case NVSDK_NGX_PerfQuality_Value_MaxPerf: + xessParams.qualitySetting = XESS_QUALITY_SETTING_PERFORMANCE; + break; + case NVSDK_NGX_PerfQuality_Value_Balanced: + xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; + break; + case NVSDK_NGX_PerfQuality_Value_MaxQuality: + xessParams.qualitySetting = XESS_QUALITY_SETTING_QUALITY; + break; + case NVSDK_NGX_PerfQuality_Value_UltraQuality: + xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY; + break; + case NVSDK_NGX_PerfQuality_Value_DLAA: + xessParams.qualitySetting = XESS_QUALITY_SETTING_ULTRA_QUALITY; + break; + default: + xessParams.qualitySetting = XESS_QUALITY_SETTING_BALANCED; //Set out-of-range value for non-existing XESS_QUALITY_SETTING_BALANCED mode + break; + } } xessParams.initFlags = XESS_INIT_FLAG_NONE; @@ -722,8 +729,12 @@ public: return false; } + + CasInit(); - CreateCasContext(); + + if (casActive) + CreateCasContext(); xessInit = true; @@ -803,12 +814,12 @@ public: { spdlog::debug("FeatureContext::XeSSExecuteDx12 Color exist.."); - if (instance->MyConfig->ColorResourceBarrier.value_or(false)) + if (instance->MyConfig->ColorResourceBarrier.has_value()) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = params.pColorTexture; - barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; + barrier.Transition.StateBefore = (D3D12_RESOURCE_STATES)instance->MyConfig->ColorResourceBarrier.value(); barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; barrier.Transition.Subresource = 0; commandList->ResourceBarrier(1, &barrier); @@ -827,12 +838,12 @@ public: { spdlog::debug("FeatureContext::XeSSExecuteDx12 MotionVectors exist.."); - if (instance->MyConfig->MVResourceBarrier.value_or(false)) + if (instance->MyConfig->MVResourceBarrier.has_value()) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = params.pVelocityTexture; - barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + barrier.Transition.StateBefore = (D3D12_RESOURCE_STATES)instance->MyConfig->MVResourceBarrier.value(); barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; barrier.Transition.Subresource = 0; commandList->ResourceBarrier(1, &barrier); @@ -852,12 +863,12 @@ public: { spdlog::debug("FeatureContext::XeSSExecuteDx12 Output exist.."); - if (instance->MyConfig->OutputResourceBarrier.value_or(false)) + if (instance->MyConfig->OutputResourceBarrier.has_value()) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = paramOutput; - barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + barrier.Transition.StateBefore = (D3D12_RESOURCE_STATES)instance->MyConfig->OutputResourceBarrier.value(); barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_UNORDERED_ACCESS; barrier.Transition.Subresource = 0; commandList->ResourceBarrier(1, &barrier); @@ -889,12 +900,12 @@ public: { spdlog::debug("FeatureContext::XeSSExecuteDx12 Depth exist.."); - if (instance->MyConfig->DepthResourceBarrier.value_or(false)) + if (instance->MyConfig->DepthResourceBarrier.has_value()) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = params.pDepthTexture; - barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + barrier.Transition.StateBefore = (D3D12_RESOURCE_STATES)instance->MyConfig->DepthResourceBarrier.value(); barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; barrier.Transition.Subresource = 0; commandList->ResourceBarrier(1, &barrier); @@ -915,12 +926,12 @@ public: if (initParams->Get(NVSDK_NGX_Parameter_ExposureTexture, ¶ms.pExposureScaleTexture) != NVSDK_NGX_Result_Success) initParams->Get(NVSDK_NGX_Parameter_ExposureTexture, (void**)¶ms.pExposureScaleTexture); - if (instance->MyConfig->ExposureResourceBarrier.value_or(false)) + if (instance->MyConfig->ExposureResourceBarrier.has_value()) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = params.pExposureScaleTexture; - barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + barrier.Transition.StateBefore = (D3D12_RESOURCE_STATES)instance->MyConfig->ExposureResourceBarrier.value(); barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; barrier.Transition.Subresource = 0; commandList->ResourceBarrier(1, &barrier); @@ -939,12 +950,12 @@ public: if (initParams->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, ¶ms.pResponsivePixelMaskTexture) != NVSDK_NGX_Result_Success) initParams->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**)¶ms.pResponsivePixelMaskTexture); - if (instance->MyConfig->MaskResourceBarrier.value_or(false)) + if (instance->MyConfig->MaskResourceBarrier.has_value()) { D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; barrier.Transition.pResource = params.pResponsivePixelMaskTexture; - barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + barrier.Transition.StateBefore = (D3D12_RESOURCE_STATES)instance->MyConfig->MaskResourceBarrier.value(); barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; barrier.Transition.Subresource = 0; commandList->ResourceBarrier(1, &barrier); @@ -976,6 +987,16 @@ public: spdlog::debug("FeatureContext::XeSSExecuteDx12 Executing!!"); xessResult = xessD3D12Execute(xessContext, commandList, ¶ms); + if (xessResult != XESS_RESULT_SUCCESS) + { + spdlog::error("FeatureContext::XeSSExecuteDx12 xessD3D12Execute error: {0}", ResultToString(xessResult)); + return false; + } + + //apply cas + if (casActive && !CasDispatch(commandList, initParams, casBuffer, paramOutput)) + return false; + if (params.pColorTexture && instance->MyConfig->ColorResourceBarrier.value_or(false)) { D3D12_RESOURCE_BARRIER barrier = {}; @@ -987,15 +1008,6 @@ public: commandList->ResourceBarrier(1, &barrier); } - if (xessResult != XESS_RESULT_SUCCESS) - { - spdlog::error("FeatureContext::XeSSExecuteDx12 xessD3D12Execute error: {0}", ResultToString(xessResult)); - return false; - } - - //apply cas - if (casActive && !CasDispatch(commandList, initParams, casBuffer, paramOutput)) - return false; return true; } diff --git a/CyberXeSS/NGXParameter.h b/CyberXeSS/NGXParameter.h index 81ab86b4..52bce19d 100644 --- a/CyberXeSS/NGXParameter.h +++ b/CyberXeSS/NGXParameter.h @@ -83,9 +83,9 @@ inline NVSDK_NGX_Result NVSDK_CONV NVSDK_NGX_DLSS_GetOptimalSettingsCallback(NVS scalingRatio = 0.5f; break; case NVSDK_NGX_PerfQuality_Value_Balanced: - OutHeight = (unsigned int)((float)Height / 1.699115044247788); - OutWidth = (unsigned int)((float)Width / 1.699115044247788); - scalingRatio = 0.58854167f; + OutHeight = (unsigned int)((float)Height / 1.699215044247788); + OutWidth = (unsigned int)((float)Width / 1.699215044247788); + scalingRatio = 0.58850703f; break; case NVSDK_NGX_PerfQuality_Value_MaxQuality: OutHeight = (unsigned int)((float)Height / 1.5); @@ -103,9 +103,9 @@ inline NVSDK_NGX_Result NVSDK_CONV NVSDK_NGX_DLSS_GetOptimalSettingsCallback(NVS scalingRatio = 1.0f; break; default: - OutHeight = (unsigned int)((float)Height / 1.699115044247788); - OutWidth = (unsigned int)((float)Width / 1.699115044247788); - scalingRatio = 0.58854167f; + OutHeight = (unsigned int)((float)Height / 1.699215044247788); + OutWidth = (unsigned int)((float)Width / 1.699215044247788); + scalingRatio = 0.58850703f; break; } } @@ -120,10 +120,10 @@ inline NVSDK_NGX_Result NVSDK_CONV NVSDK_NGX_DLSS_GetOptimalSettingsCallback(NVS InParams->Set(NVSDK_NGX_Parameter_Scale, scalingRatio); InParams->Set(NVSDK_NGX_Parameter_OutWidth, OutWidth); - InParams->Set(NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Min_Render_Width, OutWidth); + InParams->Set(NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Min_Render_Width, (unsigned int)((float)Width / 2.5)); InParams->Set(NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Max_Render_Width, Width); InParams->Set(NVSDK_NGX_Parameter_OutHeight, OutHeight); - InParams->Set(NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Min_Render_Height, OutHeight); + InParams->Set(NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Min_Render_Height, (unsigned int)((float)Height / 2.5)); InParams->Set(NVSDK_NGX_Parameter_DLSS_Get_Dynamic_Max_Render_Height, Height); InParams->Set(NVSDK_NGX_Parameter_SizeInBytes, Width * Height * 31); diff --git a/nvngx.ini b/nvngx.ini index 55358e4e..cbb0c3da 100644 --- a/nvngx.ini +++ b/nvngx.ini @@ -43,6 +43,14 @@ BuildPipelines=auto ;Always returns unsupported when setting network model ;NetworkModel=0 +;Override XeSS quality mode (will not change scale ratio, experimental) +; XESS_QUALITY_SETTING_PERFORMANCE = 101, +; XESS_QUALITY_SETTING_BALANCED = 102, +; XESS_QUALITY_SETTING_QUALITY = 103, +; XESS_QUALITY_SETTING_ULTRA_QUALITY = 104, +; Default (auto) is DLSS value +OverrideQuality=auto + [CAS] ;Enables CAS shapening - Default (auto) is false Enabled=auto @@ -87,7 +95,7 @@ UpscaleRatioOverrideEnabled=auto ;resolution values are calculated in this way: ;OutHeight = Height / ratio; ;OutWidth = Width / ratio; -;example ratios: Quality preset = 1.5; Ultra performance preset = 3.0 - Default (auto) is 1.3 +;example ratios: Quality preset = 1.5; Ultra performance preset = 2.5 - Default (auto) is 1.3 UpscaleRatioOverrideValue=auto [QualityOverrides] @@ -101,7 +109,7 @@ QualityRatioOverrideEnabled=auto ; Quality : 1.5 ; Balanced : 1.7 ; Performance : 2.0 -; Ultra Performance : 3.0 +; Ultra Performance : 2.5 QualityRatioUltraQuality=auto QualityRatioQuality=auto QualityRatioBalanced=auto @@ -113,15 +121,48 @@ QualityRatioUltraPerformance=auto ; You can enable and test if it fix or break something ; Default (auto) is false DisableReactiveMask=auto -; Color texture resource barrier fix for rainbow colors on AMD cards (for mostly UE games) - Default (auto) is false + +; Resource barrier values +; ---------------------------------------------------- +; D3D12_RESOURCE_STATE_COMMON = 0, +; D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER = 1, +; D3D12_RESOURCE_STATE_INDEX_BUFFER = 2, +; D3D12_RESOURCE_STATE_RENDER_TARGET = 4, +; D3D12_RESOURCE_STATE_UNORDERED_ACCESS = 8, +; D3D12_RESOURCE_STATE_DEPTH_WRITE = 16, +; D3D12_RESOURCE_STATE_DEPTH_READ = 32, +; D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE = 64, +; D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE = 128, +; D3D12_RESOURCE_STATE_STREAM_OUT = 256, +; D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT = 512, +; D3D12_RESOURCE_STATE_COPY_DEST = 1024, +; D3D12_RESOURCE_STATE_COPY_SOURCE = 2048, +; D3D12_RESOURCE_STATE_RESOLVE_DEST = 4096, +; D3D12_RESOURCE_STATE_RESOLVE_SOURCE = 8192, +; D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE = 4194304, +; D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE = 16777216, +; D3D12_RESOURCE_STATE_GENERIC_READ = 2755, +; D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE = 192, +; D3D12_RESOURCE_STATE_PRESENT = 0, +; D3D12_RESOURCE_STATE_PREDICATION = 310, +; D3D12_RESOURCE_STATE_VIDEO_DECODE_READ = 65536, +; D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE = 131072, +; D3D12_RESOURCE_STATE_VIDEO_PROCESS_READ = 262144, +; D3D12_RESOURCE_STATE_VIDEO_PROCESS_WRITE = 524288, +; D3D12_RESOURCE_STATE_VIDEO_ENCODE_READ = 2097152, +; D3D12_RESOURCE_STATE_VIDEO_ENCODE_WRITE = 8388608 +;------------------------------------------------------ +; +; Color texture resource state to fix for rainbow colors on AMD cards (for mostly UE games) - Default (auto) is false +; For UE engine games on AMD, set it to D3D12_RESOURCE_STATE_RENDER_TARGET (4) ColorResourceBarrier=auto -; MotionVector texture resource barrier to D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false +; MotionVector texture resource state, from this to D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false MotionVectorResourceBarrier=auto -; Depth texture resource barrier to D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false +; Depth texture resource state, from this D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false DepthResourceBarrier=auto -; Color mask texture resource barrier to D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false +; Color mask texture resource state, from this D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false ColorMaskResourceBarrier=auto -; Exposure texture resource barrier to D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false +; Exposure texture resource state, from this D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE (for mostly debugging) - Default (auto) is false ExposureResourceBarrier=auto -; Output texture resource barrier to D3D12_RESOURCE_STATE_UNORDERED_ACCESS (for mostly debugging) - Default (auto) is false +; Output texture resource state, from this D3D12_RESOURCE_STATE_UNORDERED_ACCESS (for mostly debugging) - Default (auto) is false OutputResourceBarrier=auto \ No newline at end of file