From fd333e3cc2c7eec09c0cfdbc0fd3a8bf1e189cd1 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:34:53 -0300 Subject: [PATCH 01/12] Add temporal render domains --- .../Blender_Recorder_StandartBinding.cpp | 34 +++++++++ .../Layers/xrRender/RenderTargetPhaseAA.cpp | 74 +++++++++++++++++-- .../xrRender/RenderTargetRenderScreenQuad.cpp | 2 +- .../Layers/xrRender/xrRender_console.cpp | 13 +++- .../Layers/xrRender/xrRender_console.h | 10 +++ ogsr_engine/Layers/xrRenderPC_R4/r4.cpp | 9 +-- .../Layers/xrRenderPC_R4/r4_R_render.cpp | 3 + .../Layers/xrRenderPC_R4/r4_rendertarget.cpp | 12 ++- .../Layers/xrRenderPC_R4/r4_rendertarget.h | 33 +++++++++ .../r4_rendertarget_phase_combine.cpp | 5 ++ 10 files changed, 181 insertions(+), 14 deletions(-) diff --git a/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp b/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp index d4a33aa70a..fe35376be0 100644 --- a/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp +++ b/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp @@ -345,6 +345,37 @@ static class cl_screen_res final : public R_constant_setup } } binder_screen_res; +static class cl_render_res final : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + const CRenderTarget* target = RImplementation.Target; + const float width = static_cast(target ? target->GetRenderWidth() : Device.dwWidth); + const float height = static_cast(target ? target->GetRenderHeight() : Device.dwHeight); + cmd_list.set_c(C, width, height, 1.f / width, 1.f / height); + } +} binder_render_res; + +static class cl_display_res final : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + const CRenderTarget* target = RImplementation.Target; + const float width = static_cast(target ? target->GetDisplayWidth() : Device.dwWidth); + const float height = static_cast(target ? target->GetDisplayHeight() : Device.dwHeight); + cmd_list.set_c(C, width, height, 1.f / width, 1.f / height); + } +} binder_display_res; + +static class cl_render_subrect final : public R_constant_setup +{ + void setup(CBackend& cmd_list, R_constant* C) override + { + const CRenderTarget* target = RImplementation.Target; + cmd_list.set_c(C, target ? target->GetRenderSubrectScaleX() : 1.f, target ? target->GetRenderSubrectScaleY() : 1.f, 0.f, 0.f); + } +} binder_render_subrect; + static class cl_screen_params final : public R_constant_setup { Fvector4 result; @@ -820,6 +851,9 @@ void CBlender_Compile::SetMapping() const r_Constant("L_hemi_color", &binder_hemi_color); r_Constant("screen_res", &binder_screen_res); + r_Constant("render_res", &binder_render_res); + r_Constant("display_res", &binder_display_res); + r_Constant("render_subrect", &binder_render_subrect); r_Constant("ogse_c_screen", &binder_screen_params); // misc diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp index a5dfb82c0a..bcee9e5294 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp @@ -39,6 +39,14 @@ void CRenderTarget::ProcessTAA(CBackend& cmd_list) #endif #endif +struct DlssResolutionInfo +{ + u32 renderWidth{}, renderHeight{}; + u32 minRenderWidth{}, minRenderHeight{}; + u32 maxRenderWidth{}, maxRenderHeight{}; + float sharpness{}; +}; + static class NGXWrapper { NVSDK_NGX_Parameter* NgxParameters{}; @@ -46,12 +54,32 @@ static class NGXWrapper bool DLSSCreated{}, DLSSInited{}; ID3D11Resource* OutputRT{}; NVSDK_NGX_Dimensions saved_renderSize{}; + bool resetHistory{true}; public: u32 saved_w{}, saved_h{}; - uint32_t dlssPreset{}, dlssQuality{}; + uint32_t dlssPreset{}, dlssQuality{}, requestedQuality{}; + + bool QueryOptimalSettings(const u32 displayWidth, const u32 displayHeight, const NVSDK_NGX_PerfQuality_Value quality, DlssResolutionInfo& out) const + { + if (!NgxParameters) + return false; + + const NVSDK_NGX_Result result = NGX_DLSS_GET_OPTIMAL_SETTINGS(NgxParameters, displayWidth, displayHeight, quality, &out.renderWidth, &out.renderHeight, + &out.maxRenderWidth, &out.maxRenderHeight, &out.minRenderWidth, &out.minRenderHeight, &out.sharpness); + if (result != NVSDK_NGX_Result_Success) + { + Msg("!![%s] failed for quality [%d]. result: [%d]", __FUNCTION__, quality, result); + return false; + } + + Msg("--[DLSS] quality: [%d], output: [%ux%u], recommended render: [%ux%u], range: [%ux%u]-[%ux%u], sharpness: [%.3f]", quality, + displayWidth, displayHeight, out.renderWidth, out.renderHeight, out.minRenderWidth, out.minRenderHeight, out.maxRenderWidth, out.maxRenderHeight, out.sharpness); + return true; + } - bool Create(const u64 appid, const NVSDK_NGX_Dimensions& renderSize, const NVSDK_NGX_Dimensions& displaySize, ref_rt& out_rt, const u32 quality, u32& preset) + bool Create(const u64 appid, const NVSDK_NGX_Dimensions& renderSize, const NVSDK_NGX_Dimensions& displaySize, ref_rt& out_rt, const u32 quality, u32& preset, + const NVSDK_NGX_PerfQuality_Value requested_quality) { OutputRT = out_rt->pSurface; saved_w = out_rt->dwWidth; @@ -105,6 +133,10 @@ static class NGXWrapper return false; } + requestedQuality = requested_quality; + DlssResolutionInfo resolutionInfo{}; + QueryOptimalSettings(displaySize.Width, displaySize.Height, requested_quality, resolutionInfo); + const char* preset_name{}; switch (quality) { @@ -171,6 +203,7 @@ static class NGXWrapper } DLSSCreated = true; + resetHistory = true; return true; } @@ -197,7 +230,7 @@ static class NGXWrapper DLSSCreated = false; } - bool Draw() const + bool Draw() { if (!DLSSCreated) { @@ -225,6 +258,7 @@ static class NGXWrapper dlssEvalParams.InMVScaleX = -static_cast(saved_renderSize.Width) * 0.5f; dlssEvalParams.InMVScaleY = static_cast(saved_renderSize.Height) * 0.5f; + dlssEvalParams.InReset = resetHistory ? 1 : 0; const NVSDK_NGX_Result result = NGX_D3D11_EVALUATE_DLSS_EXT(HW.get_context(CHW::IMM_CTX_ID), Handle, NgxParameters, &dlssEvalParams); if (result != NVSDK_NGX_Result_Success) @@ -233,6 +267,7 @@ static class NGXWrapper return false; } + resetHistory = false; return true; } @@ -276,8 +311,20 @@ void CRenderTarget::InitDLSS() { NGXWrapper.Destroy(); + SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); const NVSDK_NGX_Dimensions RenderParams{Device.dwWidth, Device.dwHeight}; - if (!NGXWrapper.Create(20082024151405ull, RenderParams, RenderParams, rt_Generic_combine, NVSDK_NGX_PerfQuality_Value_DLAA, ps_r_dlss_preset)) + NVSDK_NGX_PerfQuality_Value requestedQuality = NVSDK_NGX_PerfQuality_Value_DLAA; + switch (ps_r_dlss_quality) + { + case DLSS_QUALITY_QUALITY: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxQuality; break; + case DLSS_QUALITY_BALANCED: requestedQuality = NVSDK_NGX_PerfQuality_Value_Balanced; break; + case DLSS_QUALITY_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxPerf; break; + case DLSS_QUALITY_ULTRA_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_UltraPerformance; break; + } + + // Resolution-domain work is intentionally staged separately. Until that + // abstraction is visually neutral, the active feature remains native DLAA. + if (!NGXWrapper.Create(20082024151405ull, RenderParams, RenderParams, rt_Generic_combine, NVSDK_NGX_PerfQuality_Value_DLAA, ps_r_dlss_preset, requestedQuality)) { if (ps_r_pp_aa_mode == DLSS) ps_r_pp_aa_mode = FSR3; @@ -293,7 +340,17 @@ bool CRenderTarget::ProcessDLSS() { PIX_EVENT(DLSS); - if (ps_r_dlss_preset != NGXWrapper.dlssPreset) + NVSDK_NGX_PerfQuality_Value requestedQuality = NVSDK_NGX_PerfQuality_Value_DLAA; + switch (ps_r_dlss_quality) + { + case DLSS_QUALITY_QUALITY: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxQuality; break; + case DLSS_QUALITY_BALANCED: requestedQuality = NVSDK_NGX_PerfQuality_Value_Balanced; break; + case DLSS_QUALITY_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxPerf; break; + case DLSS_QUALITY_ULTRA_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_UltraPerformance; break; + } + + if (ps_r_dlss_preset != NGXWrapper.dlssPreset || static_cast(requestedQuality) != NGXWrapper.requestedQuality || NGXWrapper.saved_w != Device.dwWidth || + NGXWrapper.saved_h != Device.dwHeight) { InitDLSS(); } @@ -545,7 +602,11 @@ bool CRenderTarget::ProcessFSR_3DSS(const bool need_reset) void CRenderTarget::PhaseAA(CBackend& cmd_list) { if (ps_pnv_mode > 1) // skip AA for heatvision + { + EndTemporalUpscaleInput(); + RImplementation.rmNormal(cmd_list); return; + } switch (ps_r_pp_aa_mode) { @@ -566,6 +627,9 @@ void CRenderTarget::PhaseAA(CBackend& cmd_list) case SMAA: ProcessSMAA(cmd_list); break; } + EndTemporalUpscaleInput(); + RImplementation.rmNormal(cmd_list); + if (ps_r_pp_aa_mode != SMAA) ProcessCAS(cmd_list); } diff --git a/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp b/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp index 2fb8439c21..e8a50f6275 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp @@ -2,7 +2,7 @@ void CRenderTarget::RenderScreenTriangle(CBackend& cmd_list, const ref_rt& rt, ref_selement& sh, const std::function& lambda) { - u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, rt->pRT, nullptr, nullptr, nullptr); + u_setrt(cmd_list, GetActiveWidth(), GetActiveHeight(), rt->pRT, nullptr, nullptr, nullptr); cmd_list.set_CullMode(CULL_NONE); cmd_list.set_Stencil(FALSE); diff --git a/ogsr_engine/Layers/xrRender/xrRender_console.cpp b/ogsr_engine/Layers/xrRender/xrRender_console.cpp index 8cf0046315..9c344ee4c9 100644 --- a/ogsr_engine/Layers/xrRender/xrRender_console.cpp +++ b/ogsr_engine/Layers/xrRender/xrRender_console.cpp @@ -44,7 +44,7 @@ constexpr xr_token pp_aa_mode_token[] = { {nullptr, 0}, }; -u32 ps_r_dlss_preset = NVSDK_NGX_DLSS_Hint_Render_Preset_F; +u32 ps_r_dlss_preset = NVSDK_NGX_DLSS_Hint_Render_Preset_Default; constexpr xr_token dlss_mode_token[]{ {"st_opt_dlss_default", NVSDK_NGX_DLSS_Hint_Render_Preset_Default}, // default behavior, may or may not change after OTA {"st_opt_dlss_f", NVSDK_NGX_DLSS_Hint_Render_Preset_F}, @@ -53,6 +53,16 @@ constexpr xr_token dlss_mode_token[]{ {}, }; +u32 ps_r_dlss_quality = DLSS_QUALITY_DLAA; +constexpr xr_token dlss_quality_token[]{ + {"st_opt_dlaa", DLSS_QUALITY_DLAA}, + {"st_opt_dlss_quality", DLSS_QUALITY_QUALITY}, + {"st_opt_dlss_balanced", DLSS_QUALITY_BALANCED}, + {"st_opt_dlss_performance", DLSS_QUALITY_PERFORMANCE}, + {"st_opt_dlss_ultra_performance", DLSS_QUALITY_ULTRA_PERFORMANCE}, + {}, +}; + float ps_r_dlss_3dss_scale_factor{1.0f}; u32 ps_r_sunshafts_mode = SS_SS_OGSE; @@ -821,6 +831,7 @@ void xrRender_initconsole() CMD4(CCC_Float, "r2_visor_refl_radius", &ps_r2_visor_refl_radius, 0.3f, 0.6f); CMD3(CCC_Token, "r_aa_mode", &ps_r_pp_aa_mode, pp_aa_mode_token); + CMD3(CCC_Token, "r_aa_dlss_quality", &ps_r_dlss_quality, dlss_quality_token); //CMD3(CCC_Token, "r_aa_dlss_preset", &ps_r_dlss_preset, dlss_mode_token); CMD4(CCC_Float, "r_3dss_scale_factor", &ps_r_dlss_3dss_scale_factor, 1.f, 2.5f); diff --git a/ogsr_engine/Layers/xrRender/xrRender_console.h b/ogsr_engine/Layers/xrRender/xrRender_console.h index a57d3b88d6..4a1ef2c7db 100644 --- a/ogsr_engine/Layers/xrRender/xrRender_console.h +++ b/ogsr_engine/Layers/xrRender/xrRender_console.h @@ -5,8 +5,18 @@ extern ECORE_API u32 r2_SmapCascade0Size, /*r2_SmapCascade1Size,*/ r2_SmapCascad extern ECORE_API u32 ps_r_pp_aa_mode; extern ECORE_API u32 ps_r_dlss_preset; +extern ECORE_API u32 ps_r_dlss_quality; extern float ps_r_dlss_3dss_scale_factor; +enum : u32 +{ + DLSS_QUALITY_DLAA, + DLSS_QUALITY_QUALITY, + DLSS_QUALITY_BALANCED, + DLSS_QUALITY_PERFORMANCE, + DLSS_QUALITY_ULTRA_PERFORMANCE, +}; + extern ECORE_API u32 ps_r_sun_shafts; extern ECORE_API u32 ps_r_sunshafts_mode; diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp index 7ffe76935b..18dbfce03c 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp @@ -381,22 +381,19 @@ void CRender::clear_static_wallmarks() { Wallmarks->Clear(); } void CRender::rmNear(CBackend& cmd_list) { - IRender_Target* T = getTarget(); - const D3D_VIEWPORT viewport = {0, 0, T->get_width(cmd_list), T->get_height(cmd_list), 0.f, 0.02f}; + const D3D_VIEWPORT viewport = {0, 0, Target->GetViewportWidth(cmd_list), Target->GetViewportHeight(cmd_list), 0.f, 0.02f}; cmd_list.SetViewport(viewport); } void CRender::rmFar(CBackend& cmd_list) { - IRender_Target* T = getTarget(); - const D3D_VIEWPORT viewport = {0, 0, T->get_width(cmd_list), T->get_height(cmd_list), 0.99999f, 1.f}; + const D3D_VIEWPORT viewport = {0, 0, Target->GetViewportWidth(cmd_list), Target->GetViewportHeight(cmd_list), 0.99999f, 1.f}; cmd_list.SetViewport(viewport); } void CRender::rmNormal(CBackend& cmd_list) { - IRender_Target* T = getTarget(); - const D3D_VIEWPORT viewport = {0, 0, T->get_width(cmd_list), T->get_height(cmd_list), 0.f, 1.f}; + const D3D_VIEWPORT viewport = {0, 0, Target->GetViewportWidth(cmd_list), Target->GetViewportHeight(cmd_list), 0.f, 1.f}; cmd_list.SetViewport(viewport); } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp index 1f57c498cd..5d4dd17565 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp @@ -276,10 +276,12 @@ void CRender::Render() VERIFY(0 == mapDistort.size()); + Target->BeginTemporalUpscaleInput(); rmNormal(cmd_list); if (ShouldSkipRender()) { + Target->EndTemporalUpscaleInput(); Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, Target->get_base_zb()); return; } @@ -287,6 +289,7 @@ void CRender::Render() if (m_bFirstFrameAfterReset) { m_bFirstFrameAfterReset = false; + Target->EndTemporalUpscaleInput(); return; } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp index 40315bd42a..b8c8d787e4 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp @@ -173,10 +173,20 @@ void CRenderTarget::reset_target_dimensions() } } +void CRenderTarget::SetTemporalRenderSize(u32 renderWidth, u32 renderHeight, u32 displayWidth, u32 displayHeight) +{ + m_displayWidth = _max(1u, displayWidth); + m_displayHeight = _max(1u, displayHeight); + m_renderWidth = std::clamp(renderWidth, 1u, m_displayWidth); + m_renderHeight = std::clamp(renderHeight, 1u, m_displayHeight); +} + CRenderTarget::CRenderTarget() { const auto& options = RImplementation.o; + SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); + param_blur = 0.f; param_gray = 0.f; param_noise = 0.f; @@ -633,4 +643,4 @@ bool CRenderTarget::need_to_render_sunshafts() if (fValue(m_renderWidth) / static_cast(m_displayWidth); } + float GetRenderSubrectScaleY() const { return static_cast(m_renderHeight) / static_cast(m_displayHeight); } + bool IsTemporalUpscaleInput() const { return m_temporalUpscaleInput; } + + void SetTemporalRenderSize(u32 renderWidth, u32 renderHeight, u32 displayWidth, u32 displayHeight); + void BeginTemporalUpscaleInput() { m_temporalUpscaleInput = true; } + void EndTemporalUpscaleInput() { m_temporalUpscaleInput = false; } + virtual void set_cm_imfluence(float f) { param_color_map_influence = f; } virtual void set_cm_interpolate(float f) { param_color_map_interpolate = f; } virtual void set_cm_textures(const shared_str& tex0, const shared_str& tex1) { color_map_manager.SetTextures(tex0, tex1); } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp index 1e496caf1b..a7ebefce6c 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp @@ -194,6 +194,11 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) { PhaseAA(cmd_list); // anti - aliasing } + else + { + EndTemporalUpscaleInput(); + RImplementation.rmNormal(cmd_list); + } if (!need_heatvision) // должны быть до 3DSS { // Screen space sunshafts From c1e8550d6d6ce07fd1bf581c0457ff849320a32c Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:35:05 -0300 Subject: [PATCH 02/12] Add physical upscale render domains --- .../gamedata/shaders/r3/combine.s | 4 +- .../shaders/r3/contrast_adaptive_sharpening.s | 2 +- .../shaders/r3/effects_ss_sunshafts_mrmnwar.s | 6 +- .../shaders/r3/effects_ss_sunshafts_ogse.s | 6 +- .../gamedata/shaders/r3/night_vision.h | 8 +- .../gamedata/shaders/r3/ogsr_blur.ps | Bin 10320 -> 10318 bytes .../gamedata/shaders/r3/ogsr_blur.s | 8 +- .../gamedata/shaders/r3/ogsr_dof.s | 2 +- .../gamedata/shaders/r3/ogsr_fakescope.s | 2 +- .../gamedata/shaders/r3/ogsr_gasmask.s | 8 +- .../gamedata/shaders/r3/ogsr_lut.s | 2 +- .../gamedata/shaders/r3/ogsr_nightvision.s | 4 +- .../gamedata/shaders/r3/ogsr_rain_drops.s | 2 +- .../gamedata/shaders/r3/shared/common.h | 2 + .../gamedata/shaders/r3/slb_motion_blur.h | 2 +- .../gamedata/shaders/r3/ssss_mrmnwar_mask.ps | Bin 428 -> 429 bytes .../gamedata/shaders/r3/ssss_ogse_final.ps | Bin 2700 -> 2701 bytes .../gamedata/shaders/r3/ssss_ogse_mask.ps | Bin 868 -> 868 bytes .../Blender_Recorder_StandartBinding.cpp | 15 +- .../Layers/xrRender/RenderTargetPhaseAA.cpp | 228 +++++++++++------- .../xrRender/RenderTargetPhaseRainDrops.cpp | 2 +- .../Layers/xrRender/RenderTargetPhaseSSSS.cpp | 4 +- .../xrRender/rendertarget_phase_dof.cpp | 2 +- .../xrRender/rendertarget_phase_fakescope.cpp | 2 +- .../rendertarget_phase_gasmask_dudv.cpp | 6 +- .../rendertarget_phase_nightvision.cpp | 4 +- .../rendertarget_phase_thermalvision.cpp | 4 +- ogsr_engine/Layers/xrRenderPC_R4/r4.cpp | 4 +- .../Layers/xrRenderPC_R4/r4_R_render.cpp | 13 +- .../Layers/xrRenderPC_R4/r4_rendertarget.cpp | 58 ++--- .../Layers/xrRenderPC_R4/r4_rendertarget.h | 4 + .../r4_rendertarget_accum_direct.cpp | 4 +- .../r4_rendertarget_draw_rain.cpp | 6 +- .../r4_rendertarget_phase_bloom.cpp | 4 +- .../r4_rendertarget_phase_combine.cpp | 20 +- .../r4_rendertarget_phase_lut.cpp | 4 +- 36 files changed, 261 insertions(+), 181 deletions(-) diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/combine.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/combine.s index 2a5ca5864d..24b55cecb5 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/combine.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/combine.s @@ -53,7 +53,7 @@ function element_3(shader, t_base, t_second, t_detail) :fog(false) :zb(false, false) shader:dx10texture("s_position", "$user$position") - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_bloom", "$user$bloom1") shader:dx10texture("s_ssfx_bloom", "$user$ssfx_bloom1") @@ -65,4 +65,4 @@ function element_3(shader, t_base, t_second, t_detail) shader:dx10sampler("smp_nofilter") shader:dx10sampler("smp_rtlinear") shader:dx10sampler("smp_linear") -end \ No newline at end of file +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/contrast_adaptive_sharpening.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/contrast_adaptive_sharpening.s index c371c647ba..3c75e056d2 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/contrast_adaptive_sharpening.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/contrast_adaptive_sharpening.s @@ -2,6 +2,6 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "postprocess_cas") :fog(false) :zb(false, false) - shader:dx10texture("t_current", "$user$generic0") + shader:dx10texture("t_current", "$user$postprocess0") shader:dx10sampler("SamplerLinearClamp") end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_mrmnwar.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_mrmnwar.s index 27e0fba518..4cc1a986f9 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_mrmnwar.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_mrmnwar.s @@ -3,7 +3,7 @@ function element_0(shader, t_base, t_second, t_detail) -- [0] :fog (false) :zb (false, false) shader:dx10texture ("s_position", "$user$position") - shader:dx10texture ("s_image", "$user$generic0") + shader:dx10texture ("s_image", "$user$postprocess0") shader:dx10sampler("smp_nofilter") end @@ -34,6 +34,6 @@ function element_4(shader, t_base, t_second, t_detail) -- [4] shader:begin("stub_screen_space", "ssss_mrmnwar_display") :fog (false) :zb (false, false) - shader:dx10texture ("s_image", "$user$generic0") + shader:dx10texture ("s_image", "$user$postprocess0") shader:dx10texture ("s_sunshafts", "$user$SunShaftsMaskSmoothed") -end \ No newline at end of file +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_ogse.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_ogse.s index 828a5fd851..49e1155d7f 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_ogse.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_ss_sunshafts_ogse.s @@ -3,7 +3,7 @@ function element_0(shader, t_base, t_second, t_detail) -- [0] generation of sun :fog (false) :zb (false, false) shader:dx10texture ("s_position", "$user$position") - shader:dx10texture ("s_image", "$user$generic0") + shader:dx10texture ("s_image", "$user$postprocess0") shader:dx10sampler("smp_nofilter") end @@ -33,7 +33,7 @@ function element_4(shader, t_base, t_second, t_detail) -- [4] combine pass :fog (false) :zb (false, false) shader:dx10texture ("s_position", "$user$position") - shader:dx10texture ("s_image", "$user$generic0") + shader:dx10texture ("s_image", "$user$postprocess0") shader:dx10texture ("s_sun_shafts", "$user$sun_shafts1") -- Jitter shader:dx10texture ("jitter0", "$user$jitter_0") @@ -43,4 +43,4 @@ function element_4(shader, t_base, t_second, t_detail) -- [4] combine pass shader:dx10sampler ("smp_jitter") shader:dx10sampler("smp_rtlinear") shader:dx10sampler("smp_nofilter") -end \ No newline at end of file +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/night_vision.h b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/night_vision.h index 013a6c34bb..4a4a3f9810 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/night_vision.h +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/night_vision.h @@ -296,10 +296,10 @@ float blurred_depth(float2 tc) float Directions = 12.0; // BLUR DIRECTIONS (Default 16.0 - More is better but slower) float Quality = 4.0; // BLUR QUALITY (Default 4.0 - More is better but slower) float Size = 6; - float2 Radius = Size / screen_res.xy; + float2 Radius = Size / render_res.xy; // how far away is the center of our COC - float center_depth = s_position.Load(int3((tc)*screen_res.xy, 0), 0).z; + float center_depth = s_position.Load(int3(tc * render_res.xy, 0), 0).z; if (center_depth == 0) { center_depth = 10000; @@ -321,7 +321,7 @@ float blurred_depth(float2 tc) for (float d = 0.0; d < Pi; d += Pi / Directions) // where are we around the circle { // pull depth at our sample point - depth_sample = s_position.Load(int3(((tc + float2(cos(d), sin(d)) * Radius * i) * screen_res.xy), 0), 0).z; + depth_sample = s_position.Load(int3((tc + float2(cos(d), sin(d)) * Radius * i) * render_res.xy, 0), 0).z; // if we hit the sky, give it a depth of 10k if (depth_sample == 0) @@ -399,4 +399,4 @@ float3 glitchEffect(float3 image, float2 tc, float power) wsum += 1.0f; } return sum.rgb /= wsum; -} \ No newline at end of file +} diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.ps index ce25ffc3c44df18c2dd7dc125d2aaee684e39b30..9cf03308ebc571d26df0e0fe9ef54fdf2bef1020 100644 GIT binary patch delta 39 pcmcZ*a4uj&2{WIkUP-cnf|f#2YFXa3Nqr3A2EPr(Q|2fu@3%LUD3YYHHr*CT4ABHYj^D+iXPuEpiS+ diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.s index bc44ac0b36..b9bb99a11c 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.s @@ -10,7 +10,7 @@ local function elemets(shader, t_base, t_second, t_detail, s_image) end function element_0(shader, t_base, t_second, t_detail) - elemets(shader, t_base, t_second, t_detail, "$user$generic0") + elemets(shader, t_base, t_second, t_detail, "$user$postprocess0") end function element_1(shader, t_base, t_second, t_detail) @@ -18,7 +18,7 @@ function element_1(shader, t_base, t_second, t_detail) end function element_2(shader, t_base, t_second, t_detail) - elemets(shader, t_base, t_second, t_detail, "$user$generic0") + elemets(shader, t_base, t_second, t_detail, "$user$postprocess0") end function element_3(shader, t_base, t_second, t_detail) @@ -26,9 +26,9 @@ function element_3(shader, t_base, t_second, t_detail) end function element_4(shader, t_base, t_second, t_detail) - elemets(shader, t_base, t_second, t_detail, "$user$generic0") + elemets(shader, t_base, t_second, t_detail, "$user$postprocess0") end function element_5(shader, t_base, t_second, t_detail) elemets(shader, t_base, t_second, t_detail, "$user$blur_h_8") -end \ No newline at end of file +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_dof.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_dof.s index c5baaeb024..73f60e9b26 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_dof.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_dof.s @@ -2,7 +2,7 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_dof") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_position", "$user$position") shader:dx10texture("s_blur_2", "$user$blur_2") shader:dx10texture("t_zbuffer", "$user$zbuffer_dof"); diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_fakescope.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_fakescope.s index c931a70280..9d2f6e353b 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_fakescope.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_fakescope.s @@ -2,7 +2,7 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_fakescope") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_position", "$user$position") shader:dx10texture("s_blur_2", "$user$blur_2") diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_gasmask.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_gasmask.s index 243fb1f0e2..ba25a17c43 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_gasmask.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_gasmask.s @@ -2,7 +2,7 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_gasmask") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_blur_2", "$user$blur_2") shader:dx10texture("s_mask_nm_1", "shaders\\gasmasks\\mask_nm_1") @@ -26,7 +26,7 @@ function element_1(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_gasmask_blur") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10sampler("smp_base") shader:dx10sampler("smp_nofilter") @@ -38,7 +38,7 @@ function element_2(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_gasmask_breath") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_image_blurred", "$user$mask_drops_blur") shader:dx10texture("s_breath_noise", "shaders\\gasmasks\\mask_breath_noise") shader:dx10texture("s_blur_2", "$user$blur_2") @@ -49,4 +49,4 @@ function element_2(shader, t_base, t_second, t_detail) shader:dx10sampler("smp_nofilter") shader:dx10sampler("smp_rtlinear") shader:dx10sampler("smp_linear") -end \ No newline at end of file +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_lut.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_lut.s index a6a333c7ae..91532e9077 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_lut.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_lut.s @@ -2,7 +2,7 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "pp_lut") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_lut_atlas", "shaders\\lut_atlas") shader:dx10sampler("smp_base") diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_nightvision.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_nightvision.s index ff4f4ce3f8..6ff3eccda3 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_nightvision.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_nightvision.s @@ -2,7 +2,7 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_nightvision") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10texture("s_position", "$user$position") shader:dx10texture("s_bloom_new", "$user$pp_bloom") @@ -15,4 +15,4 @@ function element_0(shader, t_base, t_second, t_detail) shader:dx10sampler("smp_base") shader:dx10sampler("smp_nofilter") shader:dx10sampler("smp_rtlinear") -end \ No newline at end of file +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_rain_drops.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_rain_drops.s index fbdfa771fd..fd9040c9b2 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_rain_drops.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_rain_drops.s @@ -2,7 +2,7 @@ function element_0(shader, t_base, t_second, t_detail) shader:begin("stub_screen_space", "ogsr_rain_drops") :fog(false) :zb(false, false) - shader:dx10texture("s_image", "$user$generic0") + shader:dx10texture("s_image", "$user$postprocess0") shader:dx10sampler("smp_nofilter") shader:dx10sampler("smp_rtlinear") end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/shared/common.h b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/shared/common.h index bf66baed98..019dcc130b 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/shared/common.h +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/shared/common.h @@ -61,6 +61,8 @@ cbuffer static_globals uniform float4 parallax; uniform float4 rain_params; // x = raindensity, y = wetness uniform float4 screen_res; // Screen resolution (x-Width,y-Height, zw - 1/resolution) + uniform float4 render_res; // Physical scene resolution (xy) and reciprocal (zw) + uniform float4 display_res; // Display/post-process resolution (xy) and reciprocal (zw) uniform float4 pp_img_corrections; uniform float4 pp_img_cg; diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/slb_motion_blur.h b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/slb_motion_blur.h index 4a781848a4..b40f12c47f 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/slb_motion_blur.h +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/slb_motion_blur.h @@ -11,7 +11,7 @@ float4 SLB_Screen_GetPosition(float2 tc, uint iSample) #ifdef SLB_GLSL /// return dummy return float4(0.5, 0.5, float(abs(tc.x - 0.5) < 0.25) * 10.0 + 0.01, 0.0); #else - return SLB_SAMPLER_LOAD(s_position, int3(tc * screen_res.xy - 0.25, 0)); + return SLB_SAMPLER_LOAD(s_position, int3(tc * render_res.xy - 0.25, 0)); #endif } diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ssss_mrmnwar_mask.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ssss_mrmnwar_mask.ps index 6f6f50df557c15ce6e1214d5521cdc6ad049ddd1..5366026c133f129cb4fd3b8ffcba97ab965d4259 100644 GIT binary patch delta 19 acmZ3(yq0+ZBU@2wUP@}wWH!cSj9dUe%>~i` delta 13 VcmZ3>yoPxJgy4oDl#(tOgqZ diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ssss_ogse_mask.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ssss_ogse_mask.ps index da8ced3dc4fe0667492aa36fc396c505e6eb7db5..cb0554bfcee3b02ceecfd7189c5274e9f8730bbf 100644 GIT binary patch delta 96 zcmaFD_JnQ1D)FM!yp+_U_@dNey{d9e1uX@Lz{G>0xTRz#dofz#mKNT;mT@~H0P$BO A5C8xG delta 96 zcmaFD_JnQ1D)HjvqSVy9_@dNey{d9e1uX@Lz{G>0xTRz#dofz#mKNT;mT@~H0P&e5 A5C8xG diff --git a/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp b/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp index fe35376be0..5ee6c1d4d5 100644 --- a/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp +++ b/ogsr_engine/Layers/xrRender/Blender_Recorder_StandartBinding.cpp @@ -341,7 +341,10 @@ static class cl_screen_res final : public R_constant_setup { void setup(CBackend& cmd_list, R_constant* C) override { - cmd_list.set_c(C, (float)Device.dwWidth, (float)Device.dwHeight, 1.0f / (float)Device.dwWidth, 1.0f / (float)Device.dwHeight); + const CRenderTarget* target = RImplementation.Target; + const float width = static_cast(target ? target->GetActiveWidth() : Device.dwWidth); + const float height = static_cast(target ? target->GetActiveHeight() : Device.dwHeight); + cmd_list.set_c(C, width, height, 1.f / width, 1.f / height); } } binder_screen_res; @@ -699,7 +702,10 @@ static class cl_pos_decompress_params : public R_constant_setup const float VertTan = -1.0f * tanf(deg2rad(Device.fFOV / 2.0f)); const float HorzTan = -VertTan / Device.fASPECT; - cmd_list.set_c(C, HorzTan, VertTan, (2.0f * HorzTan) / (float)Device.dwWidth, (2.0f * VertTan) / (float)Device.dwHeight); + const CRenderTarget* target = RImplementation.Target; + const float width = static_cast(target ? target->GetActiveWidth() : Device.dwWidth); + const float height = static_cast(target ? target->GetActiveHeight() : Device.dwHeight); + cmd_list.set_c(C, HorzTan, VertTan, (2.0f * HorzTan) / width, (2.0f * VertTan) / height); } } binder_pos_decompress_params; @@ -707,7 +713,10 @@ static class cl_pos_decompress_params2 : public R_constant_setup { virtual void setup(CBackend& cmd_list, R_constant* C) { - cmd_list.set_c(C, (float)Device.dwWidth, (float)Device.dwHeight, 1.0f / (float)Device.dwWidth, 1.0f / (float)Device.dwHeight); + const CRenderTarget* target = RImplementation.Target; + const float width = static_cast(target ? target->GetActiveWidth() : Device.dwWidth); + const float height = static_cast(target ? target->GetActiveHeight() : Device.dwHeight); + cmd_list.set_c(C, width, height, 1.f / width, 1.f / height); } } binder_pos_decompress_params2; diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp index bcee9e5294..be9286f115 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp @@ -6,19 +6,19 @@ void CRenderTarget::ProcessSMAA(CBackend& cmd_list) RenderScreenTriangle(cmd_list, rt_smaa_edgetex, s_pp_antialiasing->E[2]); RenderScreenTriangle(cmd_list, rt_smaa_blendtex, s_pp_antialiasing->E[3]); - RenderScreenTriangle(cmd_list, rt_Generic_combine, s_pp_antialiasing->E[4]); + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_pp_antialiasing->E[4]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); } void CRenderTarget::ProcessTAA(CBackend& cmd_list) { PIX_EVENT(TAA); - RenderScreenTriangle(cmd_list, rt_Generic_combine, s_taa->E[0]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_taa->E[0]); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0_prev->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0_prev->pSurface, rt_Generic_scene_scratch->pSurface); } //***************************************************************************************************** @@ -47,6 +47,18 @@ struct DlssResolutionInfo float sharpness{}; }; +static NVSDK_NGX_PerfQuality_Value GetRequestedDlssQuality() +{ + switch (ps_r_dlss_quality) + { + case DLSS_QUALITY_QUALITY: return NVSDK_NGX_PerfQuality_Value_MaxQuality; + case DLSS_QUALITY_BALANCED: return NVSDK_NGX_PerfQuality_Value_Balanced; + case DLSS_QUALITY_PERFORMANCE: return NVSDK_NGX_PerfQuality_Value_MaxPerf; + case DLSS_QUALITY_ULTRA_PERFORMANCE: return NVSDK_NGX_PerfQuality_Value_UltraPerformance; + default: return NVSDK_NGX_PerfQuality_Value_DLAA; + } +} + static class NGXWrapper { NVSDK_NGX_Parameter* NgxParameters{}; @@ -60,6 +72,51 @@ static class NGXWrapper u32 saved_w{}, saved_h{}; uint32_t dlssPreset{}, dlssQuality{}, requestedQuality{}; + bool Initialize(const u64 appid) + { + if (HW.FeatureLevel < D3D_FEATURE_LEVEL_11_1) + Msg("!![%s] Low FeatureLevel: [%d]", __FUNCTION__, HW.FeatureLevel); + + NVSDK_NGX_Result result{}; + if (!DLSSInited) + { + result = NVSDK_NGX_D3D11_Init(appid, L"", HW.pDevice); + if (result != NVSDK_NGX_Result_Success) + { + Msg("!![%s] failed NVSDK_NGX_D3D11_Init. result: [%d]", __FUNCTION__, result); + return false; + } + DLSSInited = true; + } + + if (!NgxParameters) + { + result = NVSDK_NGX_D3D11_GetCapabilityParameters(&NgxParameters); + if (result != NVSDK_NGX_Result_Success) + { + Msg("!![%s] failed NVSDK_NGX_D3D11_GetCapabilityParameters. result: [%d]", __FUNCTION__, result); + return false; + } + + uint32_t needsUpdatedDriver{1}; + NgxParameters->Get(NVSDK_NGX_Parameter_SuperSampling_NeedsUpdatedDriver, &needsUpdatedDriver); + if (needsUpdatedDriver) + Msg("!![%s] PLEASE UPDATE YOUR DRIVER", __FUNCTION__); + + uint32_t dlssAvailable{}; + NgxParameters->Get(NVSDK_NGX_Parameter_SuperSampling_Available, &dlssAvailable); + if (!dlssAvailable) + { + Msg("!![%s] DLSS NOT AVAILABLE", __FUNCTION__); + NVSDK_NGX_D3D11_DestroyParameters(NgxParameters); + NgxParameters = nullptr; + return false; + } + } + + return true; + } + bool QueryOptimalSettings(const u32 displayWidth, const u32 displayHeight, const NVSDK_NGX_PerfQuality_Value quality, DlssResolutionInfo& out) const { if (!NgxParameters) @@ -81,62 +138,18 @@ static class NGXWrapper bool Create(const u64 appid, const NVSDK_NGX_Dimensions& renderSize, const NVSDK_NGX_Dimensions& displaySize, ref_rt& out_rt, const u32 quality, u32& preset, const NVSDK_NGX_PerfQuality_Value requested_quality) { + DestroyFeature(); + if (!Initialize(appid)) + return false; + OutputRT = out_rt->pSurface; saved_w = out_rt->dwWidth; saved_h = out_rt->dwHeight; saved_renderSize = renderSize; - if (DLSSCreated) - { - Destroy(); - } - - if (HW.FeatureLevel < D3D_FEATURE_LEVEL_11_1) - { - Msg("!![%s] Low FeatureLevel: [%d]", __FUNCTION__, HW.FeatureLevel); - // return false; - } - NVSDK_NGX_Result result{}; - if (!DLSSInited) - { - result = NVSDK_NGX_D3D11_Init(appid, L"", HW.pDevice); - if (result != NVSDK_NGX_Result_Success) - { - Msg("!![%s] failed NVSDK_NGX_D3D11_Init. result: [%d]", __FUNCTION__, result); - return false; - } - - DLSSInited = true; - } - - result = NVSDK_NGX_D3D11_GetCapabilityParameters(&NgxParameters); - if (result != NVSDK_NGX_Result_Success) - { - Msg("!![%s] failed NVSDK_NGX_D3D11_GetCapabilityParameters. result: [%d]", __FUNCTION__, result); - return false; - } - - uint32_t needsUpdatedDriver{1}; - result = NgxParameters->Get(NVSDK_NGX_Parameter_SuperSampling_NeedsUpdatedDriver, &needsUpdatedDriver); - if (needsUpdatedDriver) - { - Msg("!![%s] PLEASE UPDATE YOUR DRIVER", __FUNCTION__); - } - - uint32_t dlssAvailable{}; - result = NgxParameters->Get(NVSDK_NGX_Parameter_SuperSampling_Available, &dlssAvailable); - if (!dlssAvailable) - { - Msg("!![%s] DLSS NOT AVAILABLE", __FUNCTION__); - NVSDK_NGX_D3D11_DestroyParameters(NgxParameters); - return false; - } requestedQuality = requested_quality; - DlssResolutionInfo resolutionInfo{}; - QueryOptimalSettings(displaySize.Width, displaySize.Height, requested_quality, resolutionInfo); - const char* preset_name{}; switch (quality) { @@ -209,11 +222,7 @@ static class NGXWrapper void Destroy() { - if (Handle) - { - NVSDK_NGX_D3D11_ReleaseFeature(Handle); - Handle = nullptr; - } + DestroyFeature(); if (NgxParameters) { @@ -226,8 +235,17 @@ static class NGXWrapper NVSDK_NGX_D3D11_Shutdown1(nullptr); DLSSInited = false; } + } + void DestroyFeature() + { + if (Handle) + { + NVSDK_NGX_D3D11_ReleaseFeature(Handle); + Handle = nullptr; + } DLSSCreated = false; + OutputRT = nullptr; } bool Draw() @@ -274,6 +292,26 @@ static class NGXWrapper ~NGXWrapper() { Destroy(); } } NGXWrapper; +void CRenderTarget::ConfigureDLSSRenderSize() +{ + SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); + if (ps_r_pp_aa_mode != DLSS) + return; + + const NVSDK_NGX_PerfQuality_Value quality = GetRequestedDlssQuality(); + if (!NGXWrapper.Initialize(20082024151405ull)) + { + ps_r_pp_aa_mode = FSR3; + return; + } + + DlssResolutionInfo resolutionInfo{}; + if (NGXWrapper.QueryOptimalSettings(Device.dwWidth, Device.dwHeight, quality, resolutionInfo)) + SetTemporalRenderSize(resolutionInfo.renderWidth, resolutionInfo.renderHeight, Device.dwWidth, Device.dwHeight); + + Msg("--[DLSS] physical render domain: [%ux%u] -> [%ux%u]", GetRenderWidth(), GetRenderHeight(), GetDisplayWidth(), GetDisplayHeight()); +} + static float saved_3dss_scale_factor{}; bool CRenderTarget::reset_3dss_rendertarget(const bool need_reset) { @@ -309,22 +347,14 @@ bool CRenderTarget::reset_3dss_rendertarget(const bool need_reset) void CRenderTarget::InitDLSS() { - NGXWrapper.Destroy(); + if (ps_r_pp_aa_mode != DLSS) + return; - SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); - const NVSDK_NGX_Dimensions RenderParams{Device.dwWidth, Device.dwHeight}; - NVSDK_NGX_PerfQuality_Value requestedQuality = NVSDK_NGX_PerfQuality_Value_DLAA; - switch (ps_r_dlss_quality) - { - case DLSS_QUALITY_QUALITY: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxQuality; break; - case DLSS_QUALITY_BALANCED: requestedQuality = NVSDK_NGX_PerfQuality_Value_Balanced; break; - case DLSS_QUALITY_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxPerf; break; - case DLSS_QUALITY_ULTRA_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_UltraPerformance; break; - } + const NVSDK_NGX_Dimensions renderSize{GetRenderWidth(), GetRenderHeight()}; + const NVSDK_NGX_Dimensions displaySize{GetDisplayWidth(), GetDisplayHeight()}; + const NVSDK_NGX_PerfQuality_Value requestedQuality = GetRequestedDlssQuality(); - // Resolution-domain work is intentionally staged separately. Until that - // abstraction is visually neutral, the active feature remains native DLAA. - if (!NGXWrapper.Create(20082024151405ull, RenderParams, RenderParams, rt_Generic_combine, NVSDK_NGX_PerfQuality_Value_DLAA, ps_r_dlss_preset, requestedQuality)) + if (!NGXWrapper.Create(20082024151405ull, renderSize, displaySize, rt_Generic_combine, requestedQuality, ps_r_dlss_preset, requestedQuality)) { if (ps_r_pp_aa_mode == DLSS) ps_r_pp_aa_mode = FSR3; @@ -340,17 +370,21 @@ bool CRenderTarget::ProcessDLSS() { PIX_EVENT(DLSS); - NVSDK_NGX_PerfQuality_Value requestedQuality = NVSDK_NGX_PerfQuality_Value_DLAA; - switch (ps_r_dlss_quality) + const NVSDK_NGX_PerfQuality_Value requestedQuality = GetRequestedDlssQuality(); + + const bool qualityMatchesPhysicalTargets = static_cast(requestedQuality) == NGXWrapper.requestedQuality; + if (!qualityMatchesPhysicalTargets) { - case DLSS_QUALITY_QUALITY: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxQuality; break; - case DLSS_QUALITY_BALANCED: requestedQuality = NVSDK_NGX_PerfQuality_Value_Balanced; break; - case DLSS_QUALITY_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_MaxPerf; break; - case DLSS_QUALITY_ULTRA_PERFORMANCE: requestedQuality = NVSDK_NGX_PerfQuality_Value_UltraPerformance; break; + static u32 lastReportedQuality = u32(-1); + if (lastReportedQuality != static_cast(requestedQuality)) + { + Msg("--[DLSS] quality changes resize physical render targets; apply video settings or run vid_restart"); + lastReportedQuality = static_cast(requestedQuality); + } } - if (ps_r_dlss_preset != NGXWrapper.dlssPreset || static_cast(requestedQuality) != NGXWrapper.requestedQuality || NGXWrapper.saved_w != Device.dwWidth || - NGXWrapper.saved_h != Device.dwHeight) + if (qualityMatchesPhysicalTargets && (ps_r_dlss_preset != NGXWrapper.dlssPreset || NGXWrapper.saved_w != Device.dwWidth || + NGXWrapper.saved_h != Device.dwHeight)) { InitDLSS(); } @@ -361,10 +395,20 @@ bool CRenderTarget::ProcessDLSS() return false; } - HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); return true; } +void CRenderTarget::BeginPostprocess(CBackend& cmd_list, const bool temporalOutput) +{ + // The last scene target is physically render-sized. Switch both the cached + // target dimensions and the D3D viewport before any display-sized pass. + u_setrt(cmd_list, GetDisplayWidth(), GetDisplayHeight(), nullptr, nullptr, nullptr, nullptr); + RImplementation.rmNormal(cmd_list); + + ID3D11Resource* source = temporalOutput ? rt_Generic_combine->pSurface : rt_Generic_0->pSurface; + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, source); +} + //***************************************************************************************************** void CRenderTarget::ProcessCAS(CBackend& cmd_list) @@ -376,7 +420,7 @@ void CRenderTarget::ProcessCAS(CBackend& cmd_list) const Fvector4 params{std::max(ps_r_cas, 0.01f), 0.f, 0.f, 0.f}; RenderScreenTriangle(cmd_list, rt_Generic_combine, s_cas->E[0], [&]() { cmd_list.set_c("f_cas_intensity", params); }); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } //***************************************************************************************************** @@ -544,9 +588,10 @@ void CRenderTarget::InitFSR() Fsr3Wrapper.Destroy(); Fsr3WrapperScope.Destroy(); - const FfxDimensions2D displaySize{Device.dwWidth, Device.dwHeight}; + const FfxDimensions2D renderSize{GetRenderWidth(), GetRenderHeight()}; + const FfxDimensions2D displaySize{GetDisplayWidth(), GetDisplayHeight()}; - if (!Fsr3Wrapper.Create(displaySize, displaySize, rt_Generic_combine)) + if (!Fsr3Wrapper.Create(renderSize, displaySize, rt_Generic_combine)) { if (ps_r_pp_aa_mode == FSR3) ps_r_pp_aa_mode = TAA; @@ -576,7 +621,6 @@ bool CRenderTarget::ProcessFSR() const return false; } - HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); return true; } @@ -603,23 +647,32 @@ void CRenderTarget::PhaseAA(CBackend& cmd_list) { if (ps_pnv_mode > 1) // skip AA for heatvision { + const bool temporalOutput = ProcessFSR(); EndTemporalUpscaleInput(); RImplementation.rmNormal(cmd_list); + BeginPostprocess(cmd_list, temporalOutput); return; } + bool temporalOutput = false; + switch (ps_r_pp_aa_mode) { case DLSS: { - if (!ProcessDLSS()) + temporalOutput = ProcessDLSS(); + if (!temporalOutput) + { ps_r_pp_aa_mode = FSR3; + temporalOutput = ProcessFSR(); + } break; } case FSR3: { u_setrt(cmd_list, get_width(cmd_list), get_height(cmd_list), nullptr, nullptr, nullptr, nullptr); RImplementation.rmNormal(cmd_list); - if (!ProcessFSR()) + temporalOutput = ProcessFSR(); + if (!temporalOutput) ps_r_pp_aa_mode = TAA; break; } @@ -629,6 +682,7 @@ void CRenderTarget::PhaseAA(CBackend& cmd_list) EndTemporalUpscaleInput(); RImplementation.rmNormal(cmd_list); + BeginPostprocess(cmd_list, temporalOutput); if (ps_r_pp_aa_mode != SMAA) ProcessCAS(cmd_list); diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseRainDrops.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseRainDrops.cpp index 5f4a543dbd..d5bdde857b 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseRainDrops.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseRainDrops.cpp @@ -80,5 +80,5 @@ void CRenderTarget::phase_rain_drops(CBackend& cmd_list) const Fvector4 params{rain_drops_factor, ps_r2_rain_drops_intensity, ps_r2_rain_drops_speed, 0.0f}; RenderScreenTriangle(cmd_list, rt_Generic_combine, s_rain_drops->E[0], [&]() { cmd_list.set_c("rain_drops_params", params); }); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseSSSS.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseSSSS.cpp index 22f3d34600..9fff22f659 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseSSSS.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseSSSS.cpp @@ -35,7 +35,7 @@ void CRenderTarget::PhaseSSSS(CBackend& cmd_list) // Combine RenderScreenTriangle(cmd_list, rt_Generic_combine, s_ssss_mrmnwar->E[4], [&]() { cmd_list.set_c("ssss_params", intensity, ps_r_prop_ss_blend, 0.0f, 0.0f); }); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } else if (mode == SS_SS_OGSE) { @@ -65,6 +65,6 @@ void CRenderTarget::PhaseSSSS(CBackend& cmd_list) RenderScreenTriangle(cmd_list, rt_Generic_combine, s_ssss_ogse->E[4], [&]() { cmd_list.set_c("ssss_params", intensity, ps_r_ss_sunshafts_length, 0.0f, ps_r_ss_sunshafts_radius); }); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } } diff --git a/ogsr_engine/Layers/xrRender/rendertarget_phase_dof.cpp b/ogsr_engine/Layers/xrRender/rendertarget_phase_dof.cpp index 17a31d2af4..52093b9ffc 100644 --- a/ogsr_engine/Layers/xrRender/rendertarget_phase_dof.cpp +++ b/ogsr_engine/Layers/xrRender/rendertarget_phase_dof.cpp @@ -12,5 +12,5 @@ void CRenderTarget::phase_dof(CBackend& cmd_list) RenderScreenTriangle(cmd_list, rt_Generic_combine, s_dof->E[1]); //Resolve RT - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } diff --git a/ogsr_engine/Layers/xrRender/rendertarget_phase_fakescope.cpp b/ogsr_engine/Layers/xrRender/rendertarget_phase_fakescope.cpp index bace154415..60bc1d35c5 100644 --- a/ogsr_engine/Layers/xrRender/rendertarget_phase_fakescope.cpp +++ b/ogsr_engine/Layers/xrRender/rendertarget_phase_fakescope.cpp @@ -8,5 +8,5 @@ void CRenderTarget::phase_fakescope(CBackend& cmd_list) RenderScreenTriangle(cmd_list, rt_Generic_combine, s_fakescope->E[0]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } diff --git a/ogsr_engine/Layers/xrRender/rendertarget_phase_gasmask_dudv.cpp b/ogsr_engine/Layers/xrRender/rendertarget_phase_gasmask_dudv.cpp index ae8b614528..e287776828 100644 --- a/ogsr_engine/Layers/xrRender/rendertarget_phase_gasmask_dudv.cpp +++ b/ogsr_engine/Layers/xrRender/rendertarget_phase_gasmask_dudv.cpp @@ -11,10 +11,10 @@ void CRenderTarget::phase_gasmask_dudv(CBackend& cmd_list) cmd_list.set_c("mask_control", params); cmd_list.set_c("addon_VControl", ps_r2_visor_refl_intensity, ps_r2_visor_refl_radius, 0.f, 1.f); }); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); RenderScreenTriangle(cmd_list, rt_mask_drops_blur, s_gasmask_dudv->E[1]); RenderScreenTriangle(cmd_list, rt_Generic_combine, s_gasmask_dudv->E[2]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); -} \ No newline at end of file + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); +} diff --git a/ogsr_engine/Layers/xrRender/rendertarget_phase_nightvision.cpp b/ogsr_engine/Layers/xrRender/rendertarget_phase_nightvision.cpp index 265212ae31..a5b4409b41 100644 --- a/ogsr_engine/Layers/xrRender/rendertarget_phase_nightvision.cpp +++ b/ogsr_engine/Layers/xrRender/rendertarget_phase_nightvision.cpp @@ -5,5 +5,5 @@ void CRenderTarget::phase_nightvision(CBackend& cmd_list) PIX_EVENT(phase_nightvision); RenderScreenTriangle(cmd_list, rt_Generic_combine, s_nightvision->E[0]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); -} \ No newline at end of file + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); +} diff --git a/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp b/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp index 2f98adc52c..ea68409375 100644 --- a/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp +++ b/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp @@ -4,6 +4,6 @@ void CRenderTarget::phase_heatvision(CBackend& cmd_list) { PIX_EVENT(phase_heatvision); - RenderScreenTriangle(cmd_list, rt_Generic_combine, s_heatvision->E[0]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_heatvision->E[0]); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp index 18dbfce03c..bd523ae2ec 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp @@ -120,7 +120,7 @@ void CRender::create() #ifdef DX10_FLUID_ENABLE FluidManager.Initialize(70, 70, 70); // FluidManager.Initialize( 100, 100, 100 ); - FluidManager.SetScreenSize(Device.dwWidth, Device.dwHeight); + FluidManager.SetScreenSize(Target->GetRenderWidth(), Target->GetRenderHeight()); #endif } @@ -203,7 +203,7 @@ void CRender::reset_end() //-AVO #ifdef DX10_FLUID_ENABLE - FluidManager.SetScreenSize(Device.dwWidth, Device.dwHeight); + FluidManager.SetScreenSize(Target->GetRenderWidth(), Target->GetRenderHeight()); #endif cleanup_contexts(); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp index 5d4dd17565..2837bb379a 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp @@ -282,7 +282,8 @@ void CRender::Render() if (ShouldSkipRender()) { Target->EndTemporalUpscaleInput(); - Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, Target->get_base_zb()); + Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, nullptr); + rmNormal(cmd_list); return; } @@ -290,16 +291,20 @@ void CRender::Render() { m_bFirstFrameAfterReset = false; Target->EndTemporalUpscaleInput(); + Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, nullptr); + rmNormal(cmd_list); return; } if (ps_pnv_mode < 2 && (ps_r_pp_aa_mode == DLSS || ps_r_pp_aa_mode == FSR3 || ps_r_pp_aa_mode == TAA || ps_r2_ls_flags.test(R2FLAG_DBG_TAA_JITTER_ENABLE))) { - auto jitterPhaseCount = ffxFsr3UpscalerGetJitterPhaseCount(static_cast(Device.dwWidth), static_cast(Device.dwWidth)); + const u32 renderWidth = Target->GetRenderWidth(); + const u32 renderHeight = Target->GetRenderHeight(); + auto jitterPhaseCount = ffxFsr3UpscalerGetJitterPhaseCount(static_cast(renderWidth), static_cast(Target->GetDisplayWidth())); ffxFsr3UpscalerGetJitterOffset(&ps_r_taa_jitter_full.x, &ps_r_taa_jitter_full.y, Device.dwFrame, jitterPhaseCount); - ps_r_taa_jitter.x = 2.0f * ps_r_taa_jitter_full.x / Device.dwWidth; - ps_r_taa_jitter.y = -2.0f * ps_r_taa_jitter_full.y / Device.dwHeight; + ps_r_taa_jitter.x = 2.0f * ps_r_taa_jitter_full.x / renderWidth; + ps_r_taa_jitter.y = -2.0f * ps_r_taa_jitter_full.y / renderHeight; ps_r_taa_jitter.z = static_cast(Device.dwFrame % jitterPhaseCount) / static_cast(jitterPhaseCount) + EPS; } else diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp index b8c8d787e4..3e00bf8696 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp @@ -186,6 +186,7 @@ CRenderTarget::CRenderTarget() const auto& options = RImplementation.o; SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); + ConfigureDLSSRenderSize(); param_blur = 0.f; param_gray = 0.f; @@ -209,14 +210,15 @@ CRenderTarget::CRenderTarget() // NORMAL { - u32 w = Device.dwWidth, h = Device.dwHeight; + const u32 w = GetRenderWidth(), h = GetRenderHeight(); + const u32 displayW = GetDisplayWidth(), displayH = GetDisplayHeight(); rt_base.resize(1); for (u32 i = 0; i < 1; i++) { string32 temp; xr_sprintf(temp, "%s%u", r2_RT_base, i); - rt_base[i].create(temp, w, h, DXGI_FORMAT_R8G8B8A8_UNORM, 1, {CRT::CreateBase}); + rt_base[i].create(temp, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM, 1, {CRT::CreateBase}); } rt_Base_Depth.create(r2_RT_base_depth, w, h, DXGI_FORMAT_R24G8_TYPELESS); @@ -236,39 +238,39 @@ CRenderTarget::CRenderTarget() rt_Generic_3.create(r2_RT_generic3, w, h, DXGI_FORMAT_R16G16B16A16_FLOAT); // RT Blur - rt_blur_h_2.create(r2_RT_blur_h_2, u32(w / 2), u32(h / 2), DXGI_FORMAT_R8G8B8A8_UNORM); - rt_blur_2.create(r2_RT_blur_2, u32(w / 2), u32(h / 2), DXGI_FORMAT_R8G8B8A8_UNORM); + rt_blur_h_2.create(r2_RT_blur_h_2, u32(displayW / 2), u32(displayH / 2), DXGI_FORMAT_R8G8B8A8_UNORM); + rt_blur_2.create(r2_RT_blur_2, u32(displayW / 2), u32(displayH / 2), DXGI_FORMAT_R8G8B8A8_UNORM); - rt_blur_h_4.create(r2_RT_blur_h_4, u32(w / 4), u32(h / 4), DXGI_FORMAT_R8G8B8A8_UNORM); - rt_blur_4.create(r2_RT_blur_4, u32(w / 4), u32(h / 4), DXGI_FORMAT_R8G8B8A8_UNORM); + rt_blur_h_4.create(r2_RT_blur_h_4, u32(displayW / 4), u32(displayH / 4), DXGI_FORMAT_R8G8B8A8_UNORM); + rt_blur_4.create(r2_RT_blur_4, u32(displayW / 4), u32(displayH / 4), DXGI_FORMAT_R8G8B8A8_UNORM); - rt_blur_h_8.create(r2_RT_blur_h_8, u32(w / 8), u32(h / 8), DXGI_FORMAT_R8G8B8A8_UNORM); - rt_blur_8.create(r2_RT_blur_8, u32(w / 8), u32(h / 8), DXGI_FORMAT_R8G8B8A8_UNORM); + rt_blur_h_8.create(r2_RT_blur_h_8, u32(displayW / 8), u32(displayH / 8), DXGI_FORMAT_R8G8B8A8_UNORM); + rt_blur_8.create(r2_RT_blur_8, u32(displayW / 8), u32(displayH / 8), DXGI_FORMAT_R8G8B8A8_UNORM); rt_pp_bloom.create(r2_RT_pp_bloom, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - rt_ssfx_bloom1.create(r2_RT_ssfx_bloom1, u32(w / 2), u32(h / 2), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom + rt_ssfx_bloom1.create(r2_RT_ssfx_bloom1, u32(displayW / 2), u32(displayH / 2), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom rt_ssfx_bloom_emissive.create(r2_RT_ssfx_bloom_emissive, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // Emissive - rt_ssfx_bloom_lens.create(r2_RT_ssfx_bloom_lens, u32(w / 4), u32(h / 4), DXGI_FORMAT_R8G8B8A8_UNORM); // Lens - rt_ssfx_bloom_tmp2.create(r2_RT_ssfx_bloom_tmp2, u32(w / 2), u32(h / 2), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 2 - rt_ssfx_bloom_tmp4.create(r2_RT_ssfx_bloom_tmp4, u32(w / 4), u32(h / 4), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 4 - rt_ssfx_bloom_tmp8.create(r2_RT_ssfx_bloom_tmp8, u32(w / 8), u32(h / 8), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 8 - rt_ssfx_bloom_tmp16.create(r2_RT_ssfx_bloom_tmp16, u32(w / 16), u32(h / 16), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 16 - rt_ssfx_bloom_tmp32.create(r2_RT_ssfx_bloom_tmp32, u32(w / 32), u32(h / 32), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 32 - rt_ssfx_bloom_tmp64.create(r2_RT_ssfx_bloom_tmp64, u32(w / 64), u32(h / 64), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 64 - rt_ssfx_bloom_tmp32_2.create(r2_RT_ssfx_bloom_tmp32_2, u32(w / 32), u32(h / 32), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 32 - rt_ssfx_bloom_tmp16_2.create(r2_RT_ssfx_bloom_tmp16_2, u32(w / 16), u32(h / 16), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 16 - rt_ssfx_bloom_tmp8_2.create(r2_RT_ssfx_bloom_tmp8_2, u32(w / 8), u32(h / 8), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 8 - rt_ssfx_bloom_tmp4_2.create(r2_RT_ssfx_bloom_tmp4_2, u32(w / 4), u32(h / 4), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 4 + rt_ssfx_bloom_lens.create(r2_RT_ssfx_bloom_lens, u32(displayW / 4), u32(displayH / 4), DXGI_FORMAT_R8G8B8A8_UNORM); // Lens + rt_ssfx_bloom_tmp2.create(r2_RT_ssfx_bloom_tmp2, u32(displayW / 2), u32(displayH / 2), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 2 + rt_ssfx_bloom_tmp4.create(r2_RT_ssfx_bloom_tmp4, u32(displayW / 4), u32(displayH / 4), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 4 + rt_ssfx_bloom_tmp8.create(r2_RT_ssfx_bloom_tmp8, u32(displayW / 8), u32(displayH / 8), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 8 + rt_ssfx_bloom_tmp16.create(r2_RT_ssfx_bloom_tmp16, u32(displayW / 16), u32(displayH / 16), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 16 + rt_ssfx_bloom_tmp32.create(r2_RT_ssfx_bloom_tmp32, u32(displayW / 32), u32(displayH / 32), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 32 + rt_ssfx_bloom_tmp64.create(r2_RT_ssfx_bloom_tmp64, u32(displayW / 64), u32(displayH / 64), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 64 + rt_ssfx_bloom_tmp32_2.create(r2_RT_ssfx_bloom_tmp32_2, u32(displayW / 32), u32(displayH / 32), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 32 + rt_ssfx_bloom_tmp16_2.create(r2_RT_ssfx_bloom_tmp16_2, u32(displayW / 16), u32(displayH / 16), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 16 + rt_ssfx_bloom_tmp8_2.create(r2_RT_ssfx_bloom_tmp8_2, u32(displayW / 8), u32(displayH / 8), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 8 + rt_ssfx_bloom_tmp4_2.create(r2_RT_ssfx_bloom_tmp4_2, u32(displayW / 4), u32(displayH / 4), DXGI_FORMAT_R16G16B16A16_FLOAT); // Bloom / 4 - rt_dof.create(r2_RT_dof, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); + rt_dof.create(r2_RT_dof, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); - rt_second_vp.create(r2_RT_secondVP, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); //--#SM+#-- +SecondVP+ + rt_second_vp.create(r2_RT_secondVP, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); //--#SM+#-- +SecondVP+ - rt_fakescope.create(r2_RT_scopert, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // crookr fakescope + rt_fakescope.create(r2_RT_scopert, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); // crookr fakescope rt_heat.create(r2_RT_heat, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - rt_mask_drops_blur.create(r2_RT_mask_drops_blur, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // Create RT, full resolution + rt_mask_drops_blur.create(r2_RT_mask_drops_blur, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); // Create RT, full resolution rt_ssr1.create(r2_RT_ssr1, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // Generic RT rt_ssr2.create(r2_RT_ssr2, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // Temp RT 8B @@ -285,7 +287,9 @@ CRenderTarget::CRenderTarget() if (HW.FeatureLevel >= D3D_FEATURE_LEVEL_11_0) flg = {CRT::CreateUAV}; - rt_Generic_combine.create(r2_RT_generic_combine, w, h, DXGI_FORMAT_R16G16B16A16_FLOAT, 1, flg); + rt_Generic_scene_scratch.create("$user$generic_scene_scratch", w, h, DXGI_FORMAT_R16G16B16A16_FLOAT, 1, flg); + rt_Generic_combine.create(r2_RT_generic_combine, displayW, displayH, DXGI_FORMAT_R16G16B16A16_FLOAT, 1, flg); + rt_Postprocess_0.create("$user$postprocess0", displayW, displayH, DXGI_FORMAT_R16G16B16A16_FLOAT); //if (!m_ImguiTex) @@ -599,8 +603,8 @@ void CRenderTarget::reset_light_marker(CBackend& cmd_list, bool bResetStencil) if (bResetStencil) { u32 Offset; - const float _w = float(Device.dwWidth); - const float _h = float(Device.dwHeight); + const float _w = float(get_width(cmd_list)); + const float _h = float(get_height(cmd_list)); const u32 C = color_rgba(255, 255, 255, 255); const float eps = 0; const float _dw = 0.5f; diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h index 4506c1b856..f96db03c96 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h @@ -50,7 +50,9 @@ class CRenderTarget : public IRender_Target ref_rt rt_Generic_0; // 32bit (r,g,b,a) // post-process, intermidiate results, etc. ref_rt rt_Generic_0_prev; // r2_RT_generic0_prev ref_rt rt_Generic_1; // 32bit (r,g,b,a) // post-process, intermidiate results, etc. + ref_rt rt_Generic_scene_scratch; // low-resolution scene ping-pong target ref_rt rt_Generic_combine; // r2_RT_generic_combine + ref_rt rt_Postprocess_0; // full-resolution color after temporal upscaling ref_rt rt_Generic_0_temp; ref_rt rt_Generic_combine_scope; @@ -320,6 +322,7 @@ class CRenderTarget : public IRender_Target bool IsTemporalUpscaleInput() const { return m_temporalUpscaleInput; } void SetTemporalRenderSize(u32 renderWidth, u32 renderHeight, u32 displayWidth, u32 displayHeight); + void ConfigureDLSSRenderSize(); void BeginTemporalUpscaleInput() { m_temporalUpscaleInput = true; } void EndTemporalUpscaleInput() { m_temporalUpscaleInput = false; } @@ -373,6 +376,7 @@ class CRenderTarget : public IRender_Target bool reset_3dss_rendertarget(const bool need_reset = false); void ProcessCAS(CBackend& cmd_list); + void BeginPostprocess(CBackend& cmd_list, bool temporalOutput); void PhaseSSSS(CBackend& cmd_list); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp index 767c175159..9052b34500 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_accum_direct.cpp @@ -43,8 +43,8 @@ void CRenderTarget::accum_direct_cascade(CBackend& cmd_list, u32 sub_phase, Fmat // Common calc for quad-rendering u32 Offset; constexpr u32 C = color_rgba(255, 255, 255, 255); - float _w = float(Device.dwWidth); - float _h = float(Device.dwHeight); + float _w = float(get_width(cmd_list)); + float _h = float(get_height(cmd_list)); Fvector2 p0, p1; p0.set(.5f / _w, .5f / _h); p1.set((_w + .5f) / _w, (_h + .5f) / _h); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_draw_rain.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_draw_rain.cpp index 919c34e9a1..e61a0f9cbf 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_draw_rain.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_draw_rain.cpp @@ -5,8 +5,8 @@ void CRenderTarget::draw_rain(CBackend& cmd_list, light& RainSetup) // Common calc for quad-rendering u32 Offset; u32 C = color_rgba(255, 255, 255, 255); - float _w = float(Device.dwWidth); - float _h = float(Device.dwHeight); + float _w = float(get_width(cmd_list)); + float _h = float(get_height(cmd_list)); Fvector2 p0, p1; p0.set(.5f / _w, .5f / _h); p1.set((_w + .5f) / _w, (_h + .5f) / _h); @@ -111,7 +111,7 @@ void CRenderTarget::draw_rain(CBackend& cmd_list, light& RainSetup) // Make jitter texture Fvector2 j0, j1; - float scale_X = float(Device.dwWidth) / float(TEX_jitter); + float scale_X = _w / float(TEX_jitter); float offset = (.5f / float(TEX_jitter)); j0.set(offset, offset); j1.set(scale_X, scale_X).add(offset); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_bloom.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_bloom.cpp index 175fb32016..ee25d82469 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_bloom.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_bloom.cpp @@ -24,8 +24,8 @@ void CRenderTarget::phase_bloom(CBackend& cmd_list) // Transfer into Bloom1 { - float _w = float(Device.dwWidth); - float _h = float(Device.dwHeight); + float _w = float(GetRenderWidth()); + float _h = float(GetRenderHeight()); float _2w = _w / 2; float tw = BLOOM_size_X; float _2h = _h / 2; diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp index a7ebefce6c..f082905879 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp @@ -117,12 +117,12 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_ssr1->pSurface, rt_ssr2->pSurface); - RenderScreenTriangle(cmd_list, rt_Generic_combine, s_ssr->E[1], [&]() { + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_ssr->E[1], [&]() { cmd_list.set_c("ssr_setup", ps_ssfx_ssr_1); cmd_list.set_c("ssfx_ssr_2", ps_ssfx_ssr_2); }); - HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); } // Forward rendering @@ -163,8 +163,8 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) { PIX_EVENT(combine_distort); - RenderScreenTriangle(cmd_list, rt_Generic_combine, s_combine->E[1]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_combine->E[1]); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); } } @@ -176,8 +176,8 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) { PIX_EVENT(combine_tonemap); - RenderScreenTriangle(cmd_list, rt_Generic_combine, s_combine->E[2]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_combine->E[2]); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); } const bool need_heatvision = (ps_pnv_mode == 2 || ps_pnv_mode == 3); @@ -198,6 +198,7 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) { EndTemporalUpscaleInput(); RImplementation.rmNormal(cmd_list); + BeginPostprocess(cmd_list, false); } if (!need_heatvision) // должны быть до 3DSS @@ -211,7 +212,7 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) { PIX_EVENT(phase_3DSSReticle); - u_setrt(cmd_list, rt_Generic_0, nullptr, nullptr, nullptr, get_base_zb()); + u_setrt(cmd_list, rt_Postprocess_0, nullptr, nullptr, nullptr, get_base_zb()); cmd_list.set_CullMode(CULL_CCW); cmd_list.set_Stencil(FALSE); @@ -279,7 +280,7 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) cmd_list.set_c("m_blur", m_blur_scale.x, m_blur_scale.y, 0, 0); }); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); } { @@ -309,7 +310,8 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) phase_flares(cmd_list); - u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, get_base_rt(), nullptr, nullptr, get_base_zb()); /// TODO: check cmd_list + u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, get_base_rt(), nullptr, nullptr, nullptr); + RImplementation.rmNormal(cmd_list); #ifdef DEBUG cmd_list.set_CullMode(CULL_CCW); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_lut.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_lut.cpp index 75b1536417..39e29ad2b1 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_lut.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_lut.cpp @@ -8,5 +8,5 @@ void CRenderTarget::phase_lut(CBackend& cmd_list) PIX_EVENT(phase_LUT); RenderScreenTriangle(cmd_list, rt_Generic_combine, s_lut->E[0]); - HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_combine->pSurface); -} \ No newline at end of file + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); +} From 758d63aa1942ca5a30a50244278d059c810c636c Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:35:21 -0300 Subject: [PATCH 03/12] Add DLSS and FSR quality presets --- .../gamedata/config/text/eng/ui_st_mm.xml | 48 ++++ .../gamedata/config/text/rus/ui_st_mm.xml | 48 ++++ .../gamedata/config/ui/ui_mm_opt.xml | 26 ++ .../gamedata/scripts/ui_mm_opt_main.script | 4 + .../scripts/ui_mm_opt_video_adv.script | 30 +++ .../gamedata/shaders/r3/temporal_resolve.ps | Bin 0 -> 191 bytes .../gamedata/shaders/r3/temporal_resolve.s | 7 + .../Layers/xrRender/RenderTargetPhaseAA.cpp | 240 +++++++++++++++--- .../xrRender/RenderTargetRenderScreenQuad.cpp | 4 +- .../Layers/xrRender/xrRender_console.cpp | 13 +- .../Layers/xrRender/xrRender_console.h | 10 + ogsr_engine/Layers/xrRenderPC_R4/r4.cpp | 8 +- .../Layers/xrRenderPC_R4/r4_R_render.cpp | 1 + .../Layers/xrRenderPC_R4/r4_rendertarget.cpp | 6 +- .../Layers/xrRenderPC_R4/r4_rendertarget.h | 23 +- .../r4_rendertarget_phase_PP.cpp | 3 +- .../r4_rendertarget_phase_combine.cpp | 5 +- .../r4_rendertarget_phase_occq.cpp | 5 +- 18 files changed, 418 insertions(+), 63 deletions(-) create mode 100644 Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.ps create mode 100644 Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.s diff --git a/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml b/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml index 5f48be00fe..c9ff78ed8f 100644 --- a/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml +++ b/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml @@ -295,6 +295,42 @@ TAA + + DLSS quality + + + FSR3 quality + + + DLAA + + + Quality + + + Balanced + + + Performance + + + Ultra Performance + + + Native AA + + + Quality + + + Balanced + + + Performance + + + Ultra Performance + Antialiasing mode (R2) @@ -886,6 +922,12 @@ Image upscaling in 3D scopes - r_3dss_scale_factor + + DLSS quality - r_aa_dlss_quality + + + FSR3 quality - r_aa_fsr3_quality + Motion blur - blurring of the image when turning the camera, playing scenes of movement or fast-moving objects. @@ -1080,5 +1122,11 @@ If DLSS or FSR is enabled, this setting adjusts the scaling of the image in the 3D scopes to improve its clarity. %c[yellow] \nWhen set to 1, the image is not scaled. %c[green] \nOptimal value: 2. %c[red] \nValues ??greater than 2 may noticeably reduce FPS. + + Sets the NVIDIA DLSS internal render scale. DLAA renders at native resolution for maximum image quality. Quality, Balanced, Performance and Ultra Performance render at progressively lower internal resolutions to gain FPS. Apply video settings or run vid_restart after changing this option. + + + Sets the AMD FSR3 internal render scale. Native AA renders at native resolution for maximum image quality. Quality, Balanced, Performance and Ultra Performance render at progressively lower internal resolutions to gain FPS. Apply video settings or run vid_restart after changing this option. + diff --git a/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml b/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml index 24c75b1b71..d42e9719e4 100644 --- a/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml +++ b/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml @@ -289,6 +289,42 @@ AMD FSR3 + + Êà÷åñòâî DLSS + + + Êà÷åñòâî FSR 3 + + + DLAA + + + Êà÷åñòâî + + + Áàëàíñ + + + Ïðîèçâîäèòåëüíîñòü + + + Óëüòðàïðîèçâîäèòåëüíîñòü + + + Ñãëàæèâàíèå â íàòèâíîì ðàçðåøåíèè + + + Êà÷åñòâî + + + Áàëàíñ + + + Ïðîèçâîäèòåëüíîñòü + + + Óëüòðàïðîèçâîäèòåëüíîñòü + TAA @@ -861,6 +897,12 @@ Àïñêåéëèíã èçîáðàæåíèÿ â 3D ïðèöåëàõ - r_3dss_scale_factor + + Êà÷åñòâî DLSS - r_aa_dlss_quality + + + Êà÷åñòâî FSR 3 - r_aa_fsr3_quality + Motion blur - ðàçìûòèå èçîáðàæåíèÿ ïðè ïîâîðîòå êàìåðû, âîñïðîèçâåäåíèè ñöåí äâèæåíèÿ èëè áûñòðî äâèæóùèõñÿ îáúåêòîâ. @@ -1046,5 +1088,11 @@ Åñëè âêëþ÷åí DLSS èëè FSR, ýòà íàñòðîéêà ðåãóëèðóåò ìàñøòàáèðîâàíèå èçîáðàæåíèÿ â 3D ïðèöåëå äëÿ óëó÷øåíèÿ åãî ÷¸òêîñòè. %c[yellow] \nÏðè çíà÷åíèè 1 èçîáðàæåíèå íå ìàñøòàáèðóåòñÿ. %c[green] \nÎïòèìàëüíîå çíà÷åíèå: 2. %c[red] \nÏðè çíà÷åíèÿõ áîëüøå 2 ìîæåò çàìåòíî ïàäàòü FPS. + + Çàäà¸ò âíóòðåííåå ðàçðåøåíèå NVIDIA DLSS. DLAA ðåíäåðèò â íàòèâíîì ðàçðåøåíèè äëÿ ìàêñèìàëüíîãî êà÷åñòâà. Quality, Balanced, Performance è Ultra Performance ïîñòåïåííî ñíèæàþò âíóòðåííåå ðàçðåøåíèå ðàäè FPS. Ïîñëå èçìåíåíèÿ ïðèìåíèòå âèäåî íàñòðîéêè (vid_restart). + + + Çàäà¸ò âíóòðåííåå ðàçðåøåíèå AMD FSR 3. Íàòèâíîå ñãëàæèâàíèå ðåíäåðèò â íàòèâíîì ðàçðåøåíèè äëÿ ìàêñèìàëüíîãî êà÷åñòâà. Quality, Balanced, Performance è Ultra Performance ïîñòåïåííî ñíèæàþò âíóòðåííåå ðàçðåøåíèå ðàäè FPS. Ïîñëå èçìåíåíèÿ ïðèìåíèòå âèäåî íàñòðîéêè (vid_restart). + diff --git a/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml b/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml index 6fcbc9ee9e..95ed018ac4 100644 --- a/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml +++ b/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml @@ -364,6 +364,32 @@ + + ui_mm_dlss_quality + + + + + + + + + + + + + ui_mm_fsr3_quality + + + + + + + + + + + ui_mm_cas diff --git a/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_main.script b/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_main.script index ffb03535ca..2320324f2d 100644 --- a/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_main.script +++ b/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_main.script @@ -133,6 +133,10 @@ function options_dialog:OnPresetChanged() opt:SetCurrentValues("mm_opt_video") opt:SetCurrentValues("mm_opt_video_adv") + if self.dlg_video_adv and self.dlg_video_adv.UpdateUpscalerQualityRows then + self.dlg_video_adv:UpdateUpscalerQualityRows() + end + self:show_need_restart_wnd() end diff --git a/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script b/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script index 84f61e1cf8..e214684cb9 100644 --- a/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script +++ b/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script @@ -12,6 +12,8 @@ local adv_vid_opt_params = { { "hud_fov", "track", 0, hint_colors.green , "video_settings_name_62", "video_settings_desc_62" }, -- { "aa", "list", 0, hint_colors.green , "video_settings_name_19", "video_settings_desc_19" }, + { "dlss_quality", "list", 0, hint_colors.green , "video_settings_name_70", "video_settings_desc_70" }, + { "fsr3_quality", "list", 0, hint_colors.green , "video_settings_name_71", "video_settings_desc_71" }, { "cas", "track", 0, hint_colors.green , "video_settings_name_20", "video_settings_desc_20" }, -- { "3dss_scale_factor", "track", 0, hint_colors.yellow, "video_settings_name_69", "video_settings_desc_69" }, -- @@ -81,6 +83,7 @@ function opt_video_adv:InitControls(x, y, xml, handler) xml:InitFrame("frame", self) self.scroll_v = xml:InitScrollView("video_adv:scroll_v", self) + self.upscaler_rows = {} -- перебираем Ñ� конца, поÑ�кольку в наÑ�тройках scroll view в xml Ñ�тоит параметр flip_vert="1", -- который инвертирует порÑ�док Ñ�лементов, что в Ñ�вою очередь Ñ�делано длÑ� того, чтобы визуально первые Ñ�лементы @@ -119,8 +122,35 @@ function opt_video_adv:InitControls(x, y, xml, handler) _st:Enable(enabled) _st2:Enable(enabled) + + if opt == "aa" then + self.aa_list = ctl + elseif opt == "dlss_quality" or opt == "fsr3_quality" then + self.upscaler_rows[opt] = _st + end end + if self.aa_list then + handler:Register(self.aa_list, "video_adv:list_aa") + handler:AddCallback("video_adv:list_aa", ui_events.LIST_ITEM_SELECT, function() + self:UpdateUpscalerQualityRows() + end) + end + self:UpdateUpscalerQualityRows() + local btn = xml:Init3tButton("video_adv:btn_to_simply", self) handler:Register(btn, "btn_simply_graphic") end + +function opt_video_adv:UpdateUpscalerQualityRows() + local mode = get_console():get_string("r_aa_mode") or "" + if self.upscaler_rows.dlss_quality then + self.upscaler_rows.dlss_quality:Show(mode == "st_opt_dlss") + end + if self.upscaler_rows.fsr3_quality then + self.upscaler_rows.fsr3_quality:Show(mode == "st_opt_fsr3") + end + if self.scroll_v then + self.scroll_v:ForceUpdate() + end +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.ps new file mode 100644 index 0000000000000000000000000000000000000000..681adffa9664741a888a8724b3342de482d5a603 GIT binary patch literal 191 zcmZXNK?{OF5QXpaD+aqL$Rg1xql;YxZ%S8Lwy}iWQKm71=)bpM(4lvGJihO3Ms|L= z5GHO4VPbPj06Kc=BD6gn20vNd9Z`F?h!ATDtqrp$Y1Jy>w=^S@mCDDd1Xv*qcI0&K u?@ovq>kRkUp8L+ql@wlpF+%Z&e|EF_8hVgV|J^y(MqQC(VTvIu;SC?wa6r}o literal 0 HcmV?d00001 diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.s new file mode 100644 index 0000000000..d4411ada42 --- /dev/null +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/temporal_resolve.s @@ -0,0 +1,7 @@ +function element_0(shader, t_base, t_second, t_detail) + shader:begin("stub_screen_space", "temporal_resolve") + :fog(false) + :zb(false, false) + shader:dx10texture("t_current", "$user$generic0") + shader:dx10sampler("SamplerLinearClamp") +end diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp index be9286f115..b60565e020 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp @@ -1,4 +1,6 @@ #include "stdafx.h" +#include "FidelityFX/host/ffx_fsr3.h" +#include "FidelityFX/host/backends/dx11/ffx_dx11.h" void CRenderTarget::ProcessSMAA(CBackend& cmd_list) { @@ -15,6 +17,12 @@ void CRenderTarget::ProcessTAA(CBackend& cmd_list) { PIX_EVENT(TAA); + if (m_resetTemporalHistory) + { + HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0_prev->pSurface, rt_Generic_0->pSurface); + m_resetTemporalHistory = false; + } + RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_taa->E[0]); HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); @@ -289,27 +297,66 @@ static class NGXWrapper return true; } + void RequestHistoryReset() { resetHistory = true; } + ~NGXWrapper() { Destroy(); } } NGXWrapper; -void CRenderTarget::ConfigureDLSSRenderSize() +static FfxFsr3UpscalerQualityMode GetRequestedFsr3Quality() +{ + return static_cast( + std::clamp(ps_r_fsr3_quality, static_cast(FSR3_QUALITY_NATIVE_AA), static_cast(FSR3_QUALITY_ULTRA_PERFORMANCE))); +} + +void CRenderTarget::ConfigureTemporalRenderSize() { SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); - if (ps_r_pp_aa_mode != DLSS) + + if (ps_r_pp_aa_mode == DLSS) + { + const NVSDK_NGX_PerfQuality_Value quality = GetRequestedDlssQuality(); + if (!NGXWrapper.Initialize(20082024151405ull)) + { + ps_r_pp_aa_mode = FSR3; + } + else + { + DlssResolutionInfo resolutionInfo{}; + if (NGXWrapper.QueryOptimalSettings(Device.dwWidth, Device.dwHeight, quality, resolutionInfo)) + { + SetTemporalRenderSize(resolutionInfo.renderWidth, resolutionInfo.renderHeight, Device.dwWidth, Device.dwHeight); + } + else + { + // Do not create an upscaling feature against native-sized + // resources after a failed quality query. + ps_r_dlss_quality = DLSS_QUALITY_DLAA; + Msg("!![DLSS] falling back to DLAA because optimal settings could not be queried"); + } + + Msg("--[DLSS] physical render domain: [%ux%u] -> [%ux%u]", GetRenderWidth(), GetRenderHeight(), GetDisplayWidth(), GetDisplayHeight()); + return; + } + } + + if (ps_r_pp_aa_mode != FSR3) return; - const NVSDK_NGX_PerfQuality_Value quality = GetRequestedDlssQuality(); - if (!NGXWrapper.Initialize(20082024151405ull)) + u32 renderWidth{}; + u32 renderHeight{}; + const FfxFsr3UpscalerQualityMode quality = GetRequestedFsr3Quality(); + const FfxErrorCode result = + ffxFsr3UpscalerGetRenderResolutionFromQualityMode(&renderWidth, &renderHeight, Device.dwWidth, Device.dwHeight, quality); + if (result != FFX_OK) { - ps_r_pp_aa_mode = FSR3; + Msg("!![FSR3] failed to calculate render resolution for quality [%u]. Error: [%d]", ps_r_fsr3_quality, result); + ps_r_fsr3_quality = FSR3_QUALITY_NATIVE_AA; return; } - DlssResolutionInfo resolutionInfo{}; - if (NGXWrapper.QueryOptimalSettings(Device.dwWidth, Device.dwHeight, quality, resolutionInfo)) - SetTemporalRenderSize(resolutionInfo.renderWidth, resolutionInfo.renderHeight, Device.dwWidth, Device.dwHeight); - - Msg("--[DLSS] physical render domain: [%ux%u] -> [%ux%u]", GetRenderWidth(), GetRenderHeight(), GetDisplayWidth(), GetDisplayHeight()); + SetTemporalRenderSize(renderWidth, renderHeight, Device.dwWidth, Device.dwHeight); + Msg("--[FSR3] quality: [%u], physical render domain: [%ux%u] -> [%ux%u]", ps_r_fsr3_quality, GetRenderWidth(), GetRenderHeight(), GetDisplayWidth(), + GetDisplayHeight()); } static float saved_3dss_scale_factor{}; @@ -405,8 +452,20 @@ void CRenderTarget::BeginPostprocess(CBackend& cmd_list, const bool temporalOutp u_setrt(cmd_list, GetDisplayWidth(), GetDisplayHeight(), nullptr, nullptr, nullptr, nullptr); RImplementation.rmNormal(cmd_list); - ID3D11Resource* source = temporalOutput ? rt_Generic_combine->pSurface : rt_Generic_0->pSurface; - HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, source); + if (temporalOutput) + { + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); + } + else if (GetRenderWidth() == GetDisplayWidth() && GetRenderHeight() == GetDisplayHeight()) + { + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_0->pSurface); + } + else + { + // CopyResource cannot scale. If a temporal upscaler is unavailable, + // stretch the render-sized scene so failure remains full-screen. + RenderScreenTriangle(cmd_list, rt_Postprocess_0, s_temporal_resolve->E[0]); + } } //***************************************************************************************************** @@ -424,12 +483,71 @@ void CRenderTarget::ProcessCAS(CBackend& cmd_list) } //***************************************************************************************************** -#include "FidelityFX/host/ffx_fsr3.h" -#include "FidelityFX/host/backends/dx11/ffx_dx11.h" +static DXGI_FORMAT GetDxgiFormat(const FfxSurfaceFormat format) +{ + switch (format) + { + case FFX_SURFACE_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_TYPELESS; + case FFX_SURFACE_FORMAT_R32G32B32A32_UINT: return DXGI_FORMAT_R32G32B32A32_UINT; + case FFX_SURFACE_FORMAT_R32G32B32A32_FLOAT: return DXGI_FORMAT_R32G32B32A32_FLOAT; + case FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT: return DXGI_FORMAT_R16G16B16A16_FLOAT; + case FFX_SURFACE_FORMAT_R32G32_FLOAT: return DXGI_FORMAT_R32G32_FLOAT; + case FFX_SURFACE_FORMAT_R8_UINT: return DXGI_FORMAT_R8_UINT; + case FFX_SURFACE_FORMAT_R32_UINT: return DXGI_FORMAT_R32_UINT; + case FFX_SURFACE_FORMAT_R10G10B10A2_UNORM: return DXGI_FORMAT_R10G10B10A2_UNORM; + case FFX_SURFACE_FORMAT_R8G8B8A8_TYPELESS: return DXGI_FORMAT_R8G8B8A8_TYPELESS; + case FFX_SURFACE_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM; + case FFX_SURFACE_FORMAT_R8G8B8A8_SNORM: return DXGI_FORMAT_R8G8B8A8_SNORM; + case FFX_SURFACE_FORMAT_R8G8B8A8_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case FFX_SURFACE_FORMAT_R11G11B10_FLOAT: return DXGI_FORMAT_R11G11B10_FLOAT; + case FFX_SURFACE_FORMAT_R16G16_FLOAT: return DXGI_FORMAT_R16G16_FLOAT; + case FFX_SURFACE_FORMAT_R16G16_UINT: return DXGI_FORMAT_R16G16_UINT; + case FFX_SURFACE_FORMAT_R16G16_SINT: return DXGI_FORMAT_R16G16_SINT; + case FFX_SURFACE_FORMAT_R16_FLOAT: return DXGI_FORMAT_R16_FLOAT; + case FFX_SURFACE_FORMAT_R16_UINT: return DXGI_FORMAT_R16_UINT; + case FFX_SURFACE_FORMAT_R16_UNORM: return DXGI_FORMAT_R16_UNORM; + case FFX_SURFACE_FORMAT_R16_SNORM: return DXGI_FORMAT_R16_SNORM; + case FFX_SURFACE_FORMAT_R8_UNORM: return DXGI_FORMAT_R8_UNORM; + case FFX_SURFACE_FORMAT_R8G8_UNORM: return DXGI_FORMAT_R8G8_UNORM; + case FFX_SURFACE_FORMAT_R8G8_UINT: return DXGI_FORMAT_R8G8_UINT; + case FFX_SURFACE_FORMAT_R32_FLOAT: return DXGI_FORMAT_R32_FLOAT; + default: return DXGI_FORMAT_UNKNOWN; + } +} + +static HRESULT CreateFsrSharedTexture(const FfxCreateResourceDescription& createDescription, ID3D11Texture2D** texture) +{ + const FfxResourceDescription& resource = createDescription.resourceDescription; + if (resource.type != FFX_RESOURCE_TYPE_TEXTURE2D) + return E_INVALIDARG; + + D3D11_TEXTURE2D_DESC description{}; + description.Width = resource.width; + description.Height = resource.height; + description.MipLevels = resource.mipCount; + description.ArraySize = _max(1u, resource.depth); + description.Format = GetDxgiFormat(resource.format); + description.SampleDesc.Count = 1; + description.Usage = D3D11_USAGE_DEFAULT; + description.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + if (resource.usage & FFX_RESOURCE_USAGE_UAV) + description.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; + if (resource.usage & FFX_RESOURCE_USAGE_RENDERTARGET) + description.BindFlags |= D3D11_BIND_RENDER_TARGET; + if (resource.usage & FFX_RESOURCE_USAGE_DEPTHTARGET) + description.BindFlags |= D3D11_BIND_DEPTH_STENCIL; + + if (description.Format == DXGI_FORMAT_UNKNOWN || !description.Width || !description.Height || !description.MipLevels) + return E_INVALIDARG; + + return HW.pDevice->CreateTexture2D(&description, nullptr, texture); +} static class Fsr3Wrapper { bool fsr_created{}; + bool resetHistory{true}; FfxFsr3UpscalerContext m_UpscalerContext{}; xr_vector m_scratchBuffer; ID3D11Resource* OutputRT{}; @@ -439,15 +557,16 @@ static class Fsr3Wrapper ID3D11Texture2D* dilatedMotionVectors{}; ID3D11Texture2D* reconstructedPrevNearestDepth{}; public: - u32 saved_w{}, saved_h{}; + u32 saved_w{}, saved_h{}, requestedQuality{}; - bool Create(const FfxDimensions2D& maxRenderSize, const FfxDimensions2D& displaySize, ref_rt& out_rt) + bool Create(const FfxDimensions2D& maxRenderSize, const FfxDimensions2D& displaySize, ref_rt& out_rt, const u32 quality) { OutputRT = out_rt->pSurface; saved_w = out_rt->dwWidth; saved_h = out_rt->dwHeight; saved_maxRenderSize = maxRenderSize; saved_displaySize = displaySize; + requestedQuality = quality; if (fsr_created) { @@ -475,6 +594,7 @@ static class Fsr3Wrapper m_UpscalercontextDesc.backendInterface = fsrInterface; m_UpscalercontextDesc.maxRenderSize = maxRenderSize; m_UpscalercontextDesc.maxUpscaleSize = displaySize; + m_UpscalercontextDesc.flags = FFX_FSR3UPSCALER_ENABLE_HIGH_DYNAMIC_RANGE; errorCode = ffxFsr3UpscalerContextCreate(&m_UpscalerContext, &m_UpscalercontextDesc); if (errorCode != FFX_OK) @@ -484,26 +604,30 @@ static class Fsr3Wrapper return false; } - auto CreateTexture = [&](const DXGI_FORMAT fmt, const bool need_rt, ID3D11Texture2D** out) { - D3D11_TEXTURE2D_DESC Desc{}; - Desc.Width = maxRenderSize.width; - Desc.Height = maxRenderSize.height; - Desc.MipLevels = 1; - Desc.ArraySize = 1; - Desc.Format = fmt; - Desc.SampleDesc.Count = 1; - Desc.Usage = D3D11_USAGE_DEFAULT; - Desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; - if (need_rt) - Desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - return HW.pDevice->CreateTexture2D(&Desc, nullptr, out); - }; - - R_CHK(CreateTexture(DXGI_FORMAT_R32_FLOAT, true, &dilatedDepth)); - R_CHK(CreateTexture(DXGI_FORMAT_R16G16_FLOAT, true, &dilatedMotionVectors)); - R_CHK(CreateTexture(DXGI_FORMAT_R32_UINT, false, &reconstructedPrevNearestDepth)); - fsr_created = true; + resetHistory = true; + + FfxFsr3UpscalerSharedResourceDescriptions sharedDescriptions{}; + errorCode = ffxFsr3UpscalerGetSharedResourceDescriptions(&m_UpscalerContext, &sharedDescriptions); + if (errorCode != FFX_OK) + { + Msg("!!Failed ffxFsr3UpscalerGetSharedResourceDescriptions! Error: [%d]", errorCode); + Destroy(); + return false; + } + + const HRESULT dilatedDepthResult = CreateFsrSharedTexture(sharedDescriptions.dilatedDepth, &dilatedDepth); + const HRESULT dilatedMotionResult = CreateFsrSharedTexture(sharedDescriptions.dilatedMotionVectors, &dilatedMotionVectors); + const HRESULT reconstructedDepthResult = + CreateFsrSharedTexture(sharedDescriptions.reconstructedPrevNearestDepth, &reconstructedPrevNearestDepth); + + if (FAILED(dilatedDepthResult) || FAILED(dilatedMotionResult) || FAILED(reconstructedDepthResult)) + { + Msg("!!Failed to create FSR3 shared resources: [0x%08x, 0x%08x, 0x%08x]", dilatedDepthResult, dilatedMotionResult, reconstructedDepthResult); + Destroy(); + return false; + } + return true; } @@ -518,6 +642,7 @@ static class Fsr3Wrapper _RELEASE(dilatedDepth); _RELEASE(dilatedMotionVectors); _RELEASE(reconstructedPrevNearestDepth); + resetHistory = true; } bool Draw() @@ -568,6 +693,7 @@ static class Fsr3Wrapper dispatchParameters.cameraFovAngleVertical = deg2rad(Device.fFOV); dispatchParameters.viewSpaceToMetersFactor = 1.0f; + dispatchParameters.reset = resetHistory; const FfxErrorCode errorCode = ffxFsr3UpscalerContextDispatch(&m_UpscalerContext, &dispatchParameters); @@ -577,9 +703,12 @@ static class Fsr3Wrapper return false; } + resetHistory = false; return true; } + void RequestHistoryReset() { resetHistory = true; } + ~Fsr3Wrapper() { Destroy(); } } Fsr3Wrapper , Fsr3WrapperScope; @@ -591,7 +720,8 @@ void CRenderTarget::InitFSR() const FfxDimensions2D renderSize{GetRenderWidth(), GetRenderHeight()}; const FfxDimensions2D displaySize{GetDisplayWidth(), GetDisplayHeight()}; - if (!Fsr3Wrapper.Create(renderSize, displaySize, rt_Generic_combine)) + const u32 quality = static_cast(GetRequestedFsr3Quality()); + if (!Fsr3Wrapper.Create(renderSize, displaySize, rt_Generic_combine, quality)) { if (ps_r_pp_aa_mode == FSR3) ps_r_pp_aa_mode = TAA; @@ -601,7 +731,7 @@ void CRenderTarget::InitFSR() reset_3dss_rendertarget(); const FfxDimensions2D ScopeSize{rt_Generic_combine_scope->dwWidth, rt_Generic_combine_scope->dwHeight}; - R_ASSERT(Fsr3WrapperScope.Create(displaySize, ScopeSize, rt_Generic_combine_scope)); + R_ASSERT(Fsr3WrapperScope.Create(renderSize, ScopeSize, rt_Generic_combine_scope, FSR3_QUALITY_NATIVE_AA)); } } @@ -611,10 +741,28 @@ void CRenderTarget::DestroyFSR() Fsr3WrapperScope.Destroy(); } -bool CRenderTarget::ProcessFSR() const +void CRenderTarget::ResetTemporalHistory() +{ + m_resetTemporalHistory = true; + NGXWrapper.RequestHistoryReset(); + Fsr3Wrapper.RequestHistoryReset(); + Fsr3WrapperScope.RequestHistoryReset(); +} + +bool CRenderTarget::ProcessFSR() { PIX_EVENT(FSR); + if (ps_r_pp_aa_mode == FSR3 && ps_r_fsr3_quality != Fsr3Wrapper.requestedQuality) + { + static u32 lastReportedQuality = u32(-1); + if (lastReportedQuality != ps_r_fsr3_quality) + { + Msg("--[FSR3] quality changes resize physical render targets; apply video settings or run vid_restart"); + lastReportedQuality = ps_r_fsr3_quality; + } + } + if (!Fsr3Wrapper.Draw()) { Msg("!![%s] FAILED FSR DRAW!", __FUNCTION__); @@ -647,7 +795,21 @@ void CRenderTarget::PhaseAA(CBackend& cmd_list) { if (ps_pnv_mode > 1) // skip AA for heatvision { - const bool temporalOutput = ProcessFSR(); + bool temporalOutput = false; + if (ps_r_pp_aa_mode == DLSS) + { + temporalOutput = ProcessDLSS(); + if (!temporalOutput) + { + ps_r_pp_aa_mode = FSR3; + temporalOutput = ProcessFSR(); + } + } + else if (ps_r_pp_aa_mode == FSR3) + { + temporalOutput = ProcessFSR(); + } + EndTemporalUpscaleInput(); RImplementation.rmNormal(cmd_list); BeginPostprocess(cmd_list, temporalOutput); diff --git a/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp b/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp index e8a50f6275..455a496078 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetRenderScreenQuad.cpp @@ -2,7 +2,8 @@ void CRenderTarget::RenderScreenTriangle(CBackend& cmd_list, const ref_rt& rt, ref_selement& sh, const std::function& lambda) { - u_setrt(cmd_list, GetActiveWidth(), GetActiveHeight(), rt->pRT, nullptr, nullptr, nullptr); + u_setrt(cmd_list, rt->dwWidth, rt->dwHeight, rt->pRT, nullptr, nullptr, nullptr); + cmd_list.SetViewport({0.f, 0.f, static_cast(rt->dwWidth), static_cast(rt->dwHeight), 0.f, 1.f}); cmd_list.set_CullMode(CULL_NONE); cmd_list.set_Stencil(FALSE); @@ -23,6 +24,7 @@ void CRenderTarget::RenderScreenQuad(CBackend& cmd_list, const u32 w, const u32 constexpr u32 C = color_rgba(0, 0, 0, 255); u_setrt(cmd_list, w, h, rt->pRT, nullptr, nullptr, nullptr); + cmd_list.SetViewport({0.f, 0.f, static_cast(w), static_cast(h), 0.f, 1.f}); cmd_list.set_CullMode(CULL_NONE); cmd_list.set_Stencil(FALSE); diff --git a/ogsr_engine/Layers/xrRender/xrRender_console.cpp b/ogsr_engine/Layers/xrRender/xrRender_console.cpp index 9c344ee4c9..48a356014a 100644 --- a/ogsr_engine/Layers/xrRender/xrRender_console.cpp +++ b/ogsr_engine/Layers/xrRender/xrRender_console.cpp @@ -44,7 +44,7 @@ constexpr xr_token pp_aa_mode_token[] = { {nullptr, 0}, }; -u32 ps_r_dlss_preset = NVSDK_NGX_DLSS_Hint_Render_Preset_Default; +u32 ps_r_dlss_preset = NVSDK_NGX_DLSS_Hint_Render_Preset_F; constexpr xr_token dlss_mode_token[]{ {"st_opt_dlss_default", NVSDK_NGX_DLSS_Hint_Render_Preset_Default}, // default behavior, may or may not change after OTA {"st_opt_dlss_f", NVSDK_NGX_DLSS_Hint_Render_Preset_F}, @@ -63,6 +63,16 @@ constexpr xr_token dlss_quality_token[]{ {}, }; +u32 ps_r_fsr3_quality = FSR3_QUALITY_NATIVE_AA; +constexpr xr_token fsr3_quality_token[]{ + {"st_opt_fsr3_native_aa", FSR3_QUALITY_NATIVE_AA}, + {"st_opt_fsr3_quality", FSR3_QUALITY_QUALITY}, + {"st_opt_fsr3_balanced", FSR3_QUALITY_BALANCED}, + {"st_opt_fsr3_performance", FSR3_QUALITY_PERFORMANCE}, + {"st_opt_fsr3_ultra_performance", FSR3_QUALITY_ULTRA_PERFORMANCE}, + {}, +}; + float ps_r_dlss_3dss_scale_factor{1.0f}; u32 ps_r_sunshafts_mode = SS_SS_OGSE; @@ -832,6 +842,7 @@ void xrRender_initconsole() CMD3(CCC_Token, "r_aa_mode", &ps_r_pp_aa_mode, pp_aa_mode_token); CMD3(CCC_Token, "r_aa_dlss_quality", &ps_r_dlss_quality, dlss_quality_token); + CMD3(CCC_Token, "r_aa_fsr3_quality", &ps_r_fsr3_quality, fsr3_quality_token); //CMD3(CCC_Token, "r_aa_dlss_preset", &ps_r_dlss_preset, dlss_mode_token); CMD4(CCC_Float, "r_3dss_scale_factor", &ps_r_dlss_3dss_scale_factor, 1.f, 2.5f); diff --git a/ogsr_engine/Layers/xrRender/xrRender_console.h b/ogsr_engine/Layers/xrRender/xrRender_console.h index 4a1ef2c7db..3e16fe766a 100644 --- a/ogsr_engine/Layers/xrRender/xrRender_console.h +++ b/ogsr_engine/Layers/xrRender/xrRender_console.h @@ -6,6 +6,7 @@ extern ECORE_API u32 r2_SmapCascade0Size, /*r2_SmapCascade1Size,*/ r2_SmapCascad extern ECORE_API u32 ps_r_pp_aa_mode; extern ECORE_API u32 ps_r_dlss_preset; extern ECORE_API u32 ps_r_dlss_quality; +extern ECORE_API u32 ps_r_fsr3_quality; extern float ps_r_dlss_3dss_scale_factor; enum : u32 @@ -17,6 +18,15 @@ enum : u32 DLSS_QUALITY_ULTRA_PERFORMANCE, }; +enum : u32 +{ + FSR3_QUALITY_NATIVE_AA, + FSR3_QUALITY_QUALITY, + FSR3_QUALITY_BALANCED, + FSR3_QUALITY_PERFORMANCE, + FSR3_QUALITY_ULTRA_PERFORMANCE, +}; + extern ECORE_API u32 ps_r_sun_shafts; extern ECORE_API u32 ps_r_sunshafts_mode; diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp index bd523ae2ec..a334a9ac33 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp @@ -958,7 +958,13 @@ void CRender::Begin() } // state main state parms on frame start only - SSManager.SetParams(ps_r__tf_Anisotropic, ps_r__tf_Mipbias); + float mipBias = ps_r__tf_Mipbias; + if (Target && Target->GetRenderWidth() < Target->GetDisplayWidth()) + { + const float renderScale = static_cast(Target->GetRenderWidth()) / static_cast(Target->GetDisplayWidth()); + mipBias += std::log2(renderScale); + } + SSManager.SetParams(ps_r__tf_Anisotropic, mipBias); Vertex.Flush(); Index.Flush(); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp index 2837bb379a..56d00b0191 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp @@ -277,6 +277,7 @@ void CRender::Render() VERIFY(0 == mapDistort.size()); Target->BeginTemporalUpscaleInput(); + Target->u_setrt(cmd_list, Target->GetRenderWidth(), Target->GetRenderHeight(), nullptr, nullptr, nullptr, nullptr); rmNormal(cmd_list); if (ShouldSkipRender()) diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp index 3e00bf8696..c55e34dbcd 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp @@ -122,6 +122,7 @@ void CRenderTarget::u_setrt(CBackend& cmd_list, u32 W, u32 H, ID3DRenderTargetVi cmd_list.set_RT(_1, 0); cmd_list.set_RT(_2, 1); cmd_list.set_RT(_3, 2); + cmd_list.set_RT(nullptr, 3); cmd_list.set_ZB(zb); } @@ -186,7 +187,7 @@ CRenderTarget::CRenderTarget() const auto& options = RImplementation.o; SetTemporalRenderSize(Device.dwWidth, Device.dwHeight, Device.dwWidth, Device.dwHeight); - ConfigureDLSSRenderSize(); + ConfigureTemporalRenderSize(); param_blur = 0.f; param_gray = 0.f; @@ -334,6 +335,7 @@ CRenderTarget::CRenderTarget() s_taa.create("temporal_antialiasing"); s_cas.create("contrast_adaptive_sharpening"); + s_temporal_resolve.create("temporal_resolve"); for (u32 idx{}; const auto& size : options.sun_cascades_smapsize) { @@ -421,7 +423,7 @@ CRenderTarget::CRenderTarget() rt_LUM_pool[it].create(name, 1, 1, DXGI_FORMAT_R32_FLOAT); RCache.ClearRT(rt_LUM_pool[it]->pRT, 0x7f7f7f7f); } - u_setrt(RCache, Device.dwWidth, Device.dwHeight, get_base_rt(), nullptr, nullptr, get_base_zb()); + u_setrt(RCache, Device.dwWidth, Device.dwHeight, get_base_rt(), nullptr, nullptr, nullptr); } // COMBINE diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h index f96db03c96..ab610b963d 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h @@ -16,6 +16,7 @@ class CRenderTarget : public IRender_Target u32 m_displayWidth{}; u32 m_displayHeight{}; bool m_temporalUpscaleInput{}; + bool m_resetTemporalHistory{true}; u32 dwAccumulatorClearMark; u32 dwFlareClearMark; @@ -174,6 +175,7 @@ class CRenderTarget : public IRender_Target ref_shader s_lut; ref_shader s_taa; ref_shader s_cas; + ref_shader s_temporal_resolve; ref_shader s_rain_drops; ref_shader s_gasmask_dudv; @@ -303,28 +305,17 @@ class CRenderTarget : public IRender_Target u32 GetDisplayHeight() const { return m_displayHeight; } u32 GetActiveWidth() const { return m_temporalUpscaleInput ? m_renderWidth : m_displayWidth; } u32 GetActiveHeight() const { return m_temporalUpscaleInput ? m_renderHeight : m_displayHeight; } - u32 GetViewportWidth(CBackend& cmd_list) const - { - if (m_temporalUpscaleInput && dwWidth[cmd_list.context_id] == m_displayWidth && dwHeight[cmd_list.context_id] == m_displayHeight) - return m_renderWidth; - - return dwWidth[cmd_list.context_id]; - } - u32 GetViewportHeight(CBackend& cmd_list) const - { - if (m_temporalUpscaleInput && dwWidth[cmd_list.context_id] == m_displayWidth && dwHeight[cmd_list.context_id] == m_displayHeight) - return m_renderHeight; - - return dwHeight[cmd_list.context_id]; - } + u32 GetViewportWidth(CBackend& cmd_list) const { return dwWidth[cmd_list.context_id]; } + u32 GetViewportHeight(CBackend& cmd_list) const { return dwHeight[cmd_list.context_id]; } float GetRenderSubrectScaleX() const { return static_cast(m_renderWidth) / static_cast(m_displayWidth); } float GetRenderSubrectScaleY() const { return static_cast(m_renderHeight) / static_cast(m_displayHeight); } bool IsTemporalUpscaleInput() const { return m_temporalUpscaleInput; } void SetTemporalRenderSize(u32 renderWidth, u32 renderHeight, u32 displayWidth, u32 displayHeight); - void ConfigureDLSSRenderSize(); + void ConfigureTemporalRenderSize(); void BeginTemporalUpscaleInput() { m_temporalUpscaleInput = true; } void EndTemporalUpscaleInput() { m_temporalUpscaleInput = false; } + void ResetTemporalHistory(); virtual void set_cm_imfluence(float f) { param_color_map_influence = f; } virtual void set_cm_interpolate(float f) { param_color_map_interpolate = f; } @@ -369,7 +360,7 @@ class CRenderTarget : public IRender_Target void DestroyDLSS(); void InitFSR(); - bool ProcessFSR() const; + bool ProcessFSR(); bool ProcessFSR_3DSS(const bool need_reset); void DestroyFSR(); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_PP.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_PP.cpp index fcbb736184..b103534544 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_PP.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_PP.cpp @@ -84,6 +84,7 @@ void CRenderTarget::phase_pp(CBackend& cmd_list) { // combination/postprocess u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, get_base_rt(), nullptr, nullptr, nullptr); + RImplementation.rmNormal(cmd_list); const bool bCMap = u_need_CM(); cmd_list.set_Element(s_postprocess->E[bCMap ? 4 : 0]); @@ -121,4 +122,4 @@ void CRenderTarget::phase_pp(CBackend& cmd_list) cmd_list.set_c("c_colormap", param_color_map_influence, param_color_map_interpolate, 0, 0); cmd_list.set_Geometry(g_postprocess); cmd_list.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); -} \ No newline at end of file +} diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp index f082905879..ac66ffb28d 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp @@ -212,7 +212,10 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) { PIX_EVENT(phase_3DSSReticle); - u_setrt(cmd_list, rt_Postprocess_0, nullptr, nullptr, nullptr, get_base_zb()); + // The reticle is composited after temporal upscaling. Scene depth is + // render-sized and cannot be bound with this display-sized color RT. + u_setrt(cmd_list, rt_Postprocess_0, nullptr, nullptr, nullptr, nullptr); + RImplementation.rmNormal(cmd_list); cmd_list.set_CullMode(CULL_CCW); cmd_list.set_Stencil(FALSE); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_occq.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_occq.cpp index e880770d8a..336f214de3 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_occq.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_occq.cpp @@ -2,7 +2,10 @@ void CRenderTarget::phase_occq(CBackend& cmd_list) { - u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, get_base_rt(), nullptr, nullptr, rt_Base_Depth->pZRT[cmd_list.context_id]); + // Occlusion queries only need scene depth. Binding the display-sized base + // color target beside the render-sized depth view is invalid in D3D11. + u_setrt(cmd_list, nullptr, nullptr, nullptr, nullptr, rt_Base_Depth->pZRT[cmd_list.context_id]); + RImplementation.rmNormal(cmd_list); cmd_list.set_Shader(s_occq); cmd_list.set_CullMode(CULL_CCW); From 2e243384a6dd1834f63b664ada1e8a6e57dd967e Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:36:39 -0300 Subject: [PATCH 04/12] Fix temporal upscale edge cases --- .../gamedata/shaders/r3/3dss_reticle.ps | Bin 21014 -> 21014 bytes .../gamedata/shaders/r3/thermal_utils.h | 4 ++-- .../Layers/xrRender/RenderTargetPhaseAA.cpp | 8 +++++++- .../Layers/xrRenderPC_R4/r4_R_render.cpp | 9 +++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/3dss_reticle.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/3dss_reticle.ps index 1648ed6cd9c12dd481391bda0e046c8383bafbb8..81196821465f7fba10179d7b0102876eff978ac7 100644 GIT binary patch delta 21 dcmbQXgmKyu#tlwRY(=SgDXB%9J)F+*0{~p92ulC} delta 21 dcmbQXgmKyu#tlwRY{kh%si}FJJ)F+*0{~pK2ulC} diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/thermal_utils.h b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/thermal_utils.h index 8468faf255..9b4647778a 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/thermal_utils.h +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/thermal_utils.h @@ -57,7 +57,7 @@ float3 infrared(float3 N, float depth, float2 HPos, float2 Tex0) { int BW = 1; - float3 hotness = s_heat.Load(int3(Tex0 * screen_res.xy, 0), 0); + float3 hotness = s_heat.Load(int3(Tex0 * render_res.xy, 0), 0); float3 mixed; if (hotness.r > 0.0) @@ -133,4 +133,4 @@ float3 infrared(float3 N, float depth, float2 HPos, float2 Tex0) mixed = greyscale(mixed); return mixed; -} \ No newline at end of file +} diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp index b60565e020..c9f38906e8 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp @@ -666,7 +666,7 @@ static class Fsr3Wrapper dispatchParameters.reactive = ffxGetResourceDX11(nullptr, {}, L"FSR3_InputReactiveMap"); dispatchParameters.transparencyAndComposition = ffxGetResourceDX11(nullptr, {}, L"FSR3_TransparencyAndCompositionMap"); - dispatchParameters.dilatedDepth = ffxGetResourceDX11(dilatedDepth, GetFfxResourceDescriptionDX11(dilatedDepth), L"FSR3_dilatedDepth", FFX_RESOURCE_STATE_UNORDERED_ACCESS); + dispatchParameters.dilatedDepth = ffxGetResourceDX11(dilatedDepth, GetFfxResourceDescriptionDX11(dilatedDepth), L"FSR3_dilatedDepth", FFX_RESOURCE_STATE_UNORDERED_ACCESS); dispatchParameters.dilatedMotionVectors = ffxGetResourceDX11(dilatedMotionVectors, GetFfxResourceDescriptionDX11(dilatedMotionVectors), L"FSR3_DilatedMotion", FFX_RESOURCE_STATE_UNORDERED_ACCESS); dispatchParameters.reconstructedPrevNearestDepth = ffxGetResourceDX11(reconstructedPrevNearestDepth, GetFfxResourceDescriptionDX11(reconstructedPrevNearestDepth), @@ -803,11 +803,15 @@ void CRenderTarget::PhaseAA(CBackend& cmd_list) { ps_r_pp_aa_mode = FSR3; temporalOutput = ProcessFSR(); + if (!temporalOutput) + ps_r_pp_aa_mode = TAA; } } else if (ps_r_pp_aa_mode == FSR3) { temporalOutput = ProcessFSR(); + if (!temporalOutput) + ps_r_pp_aa_mode = TAA; } EndTemporalUpscaleInput(); @@ -826,6 +830,8 @@ void CRenderTarget::PhaseAA(CBackend& cmd_list) { ps_r_pp_aa_mode = FSR3; temporalOutput = ProcessFSR(); + if (!temporalOutput) + ps_r_pp_aa_mode = TAA; } break; } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp index 56d00b0191..4067605549 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp @@ -282,6 +282,7 @@ void CRender::Render() if (ShouldSkipRender()) { + Target->ResetTemporalHistory(); Target->EndTemporalUpscaleInput(); Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, nullptr); rmNormal(cmd_list); @@ -297,6 +298,14 @@ void CRender::Render() return; } + constexpr float temporalCameraCutDistance = 5.f; + constexpr float temporalCameraCutDirectionDot = 0.25f; + if (Device.vCameraPosition.distance_to_sqr(Device.vCameraPositionSaved) > _sqr(temporalCameraCutDistance) || + Device.vCameraDirection.dotproduct(Device.vCameraDirectionSaved) < temporalCameraCutDirectionDot) + { + Target->ResetTemporalHistory(); + } + if (ps_pnv_mode < 2 && (ps_r_pp_aa_mode == DLSS || ps_r_pp_aa_mode == FSR3 || ps_r_pp_aa_mode == TAA || ps_r2_ls_flags.test(R2FLAG_DBG_TAA_JITTER_ENABLE))) { const u32 renderWidth = Target->GetRenderWidth(); From 6b698ea0a38cfda49c4d0b674b5f34988b6e6cb0 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:44:32 -0300 Subject: [PATCH 05/12] Fix upscale lens flare artifact --- ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp | 2 +- .../xrRenderPC_R4/r4_rendertarget_phase_combine.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp index c55e34dbcd..86b317f4f2 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp @@ -276,7 +276,7 @@ CRenderTarget::CRenderTarget() rt_ssr1.create(r2_RT_ssr1, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // Generic RT rt_ssr2.create(r2_RT_ssr2, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); // Temp RT 8B - rt_flares.create(r2_RT_flares, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); + rt_flares.create(r2_RT_flares, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); rt_Velocity.create(r2_RT_velocity, w, h, DXGI_FORMAT_R16G16_FLOAT); rt_zbuffer.create(r2_RT_zbuffer, w, h, DXGI_FORMAT_R24G8_TYPELESS); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp index ac66ffb28d..5538aa8af1 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp @@ -399,7 +399,11 @@ void CRenderTarget::phase_flares(CBackend& cmd_list) return; // clear - u_setrt(cmd_list, rt_flares, nullptr, nullptr, nullptr, rt_Base_Depth->pZRT[cmd_list.context_id]); + // Flares are generated after temporal upscaling and consumed by the + // display-sized combine pass. Keep their target and viewport in the + // display domain; the flare shader performs its own depth lookup. + u_setrt(cmd_list, rt_flares, nullptr, nullptr, nullptr, nullptr); + RImplementation.rmNormal(cmd_list); // Targets if (dwFlareClearMark != Device.dwFrame) @@ -533,4 +537,4 @@ void CRenderTarget::render_flare(CBackend& cmd_list, light* L) cmd_list.Render(D3DPT_TRIANGLELIST, VS_Offset, 0, 4, 0, 2); -} \ No newline at end of file +} From 3a37ced959d50cfe800ae58e7850594bc7035b24 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 22:15:01 -0300 Subject: [PATCH 06/12] Fix blur-pass clip space from UVs --- Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.vs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.vs b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.vs index 0bea79b491..85cf6a7ec6 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.vs +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_blur.vs @@ -6,9 +6,10 @@ p_screen main(v2p_screen I) { p_screen O; - // Transform to screen space (in d3d9 it was done automatically) - O.hpos.x = (I.HPos.x * screen_res.z * 2 - 1); - O.hpos.y = -(I.HPos.y * screen_res.w * 2 - 1); + // Fill the current viewport from UVs. Pixel positions * screen_res only + // cover a corner when the viewport is the (smaller) destination RT. + O.hpos.x = I.tc0.x * 2.0f - 1.0f; + O.hpos.y = -(I.tc0.y * 2.0f - 1.0f); O.hpos.zw = I.HPos.zw; O.tc0 = I.tc0; From f53bd23019cd18b44ec6d779733cf9dc9940aeb7 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 2 Sep 2026 23:43:05 -0300 Subject: [PATCH 07/12] Size sunshaft targets to display domain --- .../Layers/xrRenderPC_R4/r4_rendertarget.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp index 86b317f4f2..c7006cde0d 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp @@ -455,18 +455,18 @@ CRenderTarget::CRenderTarget() s_pp_antialiasing.create("effects_pp_antialiasing"); } - // Mrmnwar SunShaft Screen Space + // Screen-space sunshafts run after temporal upscale, so they match the + // display-sized postprocess targets rather than the scene render size. { - rt_SunShaftsMask.create(r2_RT_SunShaftsMask, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - rt_SunShaftsMaskSmoothed.create(r2_RT_SunShaftsMaskSmoothed, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - rt_SunShaftsPass0.create(r2_RT_SunShaftsPass0, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); + const u32 displayW = GetDisplayWidth(), displayH = GetDisplayHeight(); + + rt_SunShaftsMask.create(r2_RT_SunShaftsMask, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); + rt_SunShaftsMaskSmoothed.create(r2_RT_SunShaftsMaskSmoothed, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); + rt_SunShaftsPass0.create(r2_RT_SunShaftsPass0, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); s_ssss_mrmnwar.create("effects\\ss_sunshafts_mrmnwar"); - } - // RT - KD Screen space sunshafts - { - rt_sunshafts_0.create(r2_RT_sunshafts0, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); - rt_sunshafts_1.create(r2_RT_sunshafts1, w, h, DXGI_FORMAT_R8G8B8A8_UNORM); + rt_sunshafts_0.create(r2_RT_sunshafts0, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); + rt_sunshafts_1.create(r2_RT_sunshafts1, displayW, displayH, DXGI_FORMAT_R8G8B8A8_UNORM); s_ssss_ogse.create("effects\\ss_sunshafts_ogse"); } From 615918e3295d79447d68970e722d85c93dac9b4a Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Thu, 3 Sep 2026 20:49:17 -0300 Subject: [PATCH 08/12] Fix loading screen freeze with DLSS/FSR quality modes --- ogsr_engine/Layers/xrRenderPC_R4/r4.cpp | 16 +++++++++++++++- ogsr_engine/Layers/xrRenderPC_R4/r4.h | 1 + ogsr_engine/xr_3da/Render.h | 1 + ogsr_engine/xr_3da/x_ray.cpp | 3 +++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp index a334a9ac33..d5aef74031 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4.cpp @@ -236,7 +236,21 @@ void CRender::OnFrame() // ПоÑ�ле рендера мира и поÑ�Ñ‚-Ñ�ффектов --#SM+#-- +SecondVP+ void CRender::AfterWorldRender() { Target->u_setrt(get_imm_context().cmd_list, Device.dwWidth, Device.dwHeight, Target->rt_second_vp->pRT, nullptr, nullptr, nullptr); } -void CRender::AfterUIRender() { Target->u_setrt(get_imm_context().cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, nullptr); } +void CRender::AfterUIRender() { SetupDisplayBackbuffer(); } + +void CRender::SetupDisplayBackbuffer() +{ + if (!Target) + return; + + // Loading / 2D UI can run without CRender::Render(), so do not inherit the + // scene-resolution viewport or bind render-sized depth onto the swapchain. + Target->EndTemporalUpscaleInput(); + + auto& cmd_list = get_imm_context().cmd_list; + Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, nullptr); + rmNormal(cmd_list); +} // Implementation IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return xr_new(); } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4.h b/ogsr_engine/Layers/xrRenderPC_R4/r4.h index ec9fac31c2..5cea033cd8 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4.h +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4.h @@ -325,6 +325,7 @@ class CRender : public IRender_interface, public pureFrame void AfterWorldRender() override; //ВызываетÑ�Ñ� поÑ�ле рендера мира и перед UI ПДÐ� void AfterUIRender() override; //ПоÑ�ле рендеринга UI. Вызывать только еÑ�ли нам нужно отрендерить кадр длÑ� пда. + void SetupDisplayBackbuffer() override; // Render mode virtual void rmNear(CBackend& cmd_list); diff --git a/ogsr_engine/xr_3da/Render.h b/ogsr_engine/xr_3da/Render.h index 42c5aff250..26775f1484 100644 --- a/ogsr_engine/xr_3da/Render.h +++ b/ogsr_engine/xr_3da/Render.h @@ -226,6 +226,7 @@ class ENGINE_API IRender_interface virtual void Render() = 0; virtual void AfterWorldRender() = 0; //ПоÑ�ле рендеринга мира (перед UI ПДÐ�) virtual void AfterUIRender() = 0; //ПоÑ�ле рендеринга UI. Вызывать только еÑ�ли нам нужно отрендерить кадр длÑ� пда. + virtual void SetupDisplayBackbuffer() = 0; virtual void Screenshot(ScreenshotMode mode = SM_NORMAL, LPCSTR name = nullptr) = 0; diff --git a/ogsr_engine/xr_3da/x_ray.cpp b/ogsr_engine/xr_3da/x_ray.cpp index 197b988b82..ea3ac3b5bc 100644 --- a/ogsr_engine/xr_3da/x_ray.cpp +++ b/ogsr_engine/xr_3da/x_ray.cpp @@ -788,6 +788,9 @@ extern void render_reshade_effects(); void CApplication::load_draw_internal() const { + if (::Render) + ::Render->SetupDisplayBackbuffer(); + if (use_reshade) render_reshade_effects(); From 280ccff3f2360b59731620b8829b03910c6d58d9 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Fri, 4 Sep 2026 21:54:14 -0300 Subject: [PATCH 09/12] Pass NVG/thermal effects after upscaling --- .../gamedata/shaders/r3/infrared.h | 34 +++++++++--------- .../gamedata/shaders/r3/ogsr_heatvision.ps | Bin 2442 -> 265 bytes .../gamedata/shaders/r3/ogsr_heatvision.s | 14 +++++++- .../gamedata/shaders/r3/ogsr_heatvision_pp.ps | Bin 0 -> 1835 bytes .../Layers/xrRender/RenderTargetPhaseAA.cpp | 27 -------------- .../rendertarget_phase_thermalvision.cpp | 8 +++++ .../Layers/xrRenderPC_R4/r4_R_render.cpp | 2 +- .../Layers/xrRenderPC_R4/r4_rendertarget.h | 1 + .../r4_rendertarget_phase_combine.cpp | 9 +++-- 9 files changed, 47 insertions(+), 48 deletions(-) create mode 100644 Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision_pp.ps diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/infrared.h b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/infrared.h index 0a98b455c7..76cd582e96 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/infrared.h +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/infrared.h @@ -38,15 +38,19 @@ uniform float4 heat_fade_distance; #define color_gradient_warm COLOR_YELLOW #define color_gradient_hot COLOR_RED -float3 normal_blur(float2 pos2d, int samples) +float3 normal_blur(float2 uv, int samples) { - float3 accum = (0.0, 0.0, 0.0); + const int2 maxPos = int2(render_res.xy) - 1; + const int2 center = clamp(int2(uv * render_res.xy), int2(0, 0), maxPos); + + float3 accum = float3(0.0, 0.0, 0.0); for (int i = -samples; i < samples; i++) { for (int j = -samples; j < samples; j++) { - accum += gbuf_unpack_normal(s_position.Load(int3(pos2d + float2(i, j), 0), 0).xy); + const int2 pos = clamp(center + int2(i, j), int2(0, 0), maxPos); + accum += gbuf_unpack_normal(s_position.Load(int3(pos, 0), 0).xy); } } @@ -60,7 +64,7 @@ float3 greyscale(float3 img) return float3(Y, Y, Y); } -float3 infrared(float3 N, float3 original, float depth, float2 HPos, float2 Tex0) +float3 infrared(float3 N, float3 original, float depth, float2 Tex0) { // r_pnv_mode = 0 - disable // r_pnv_mode = 1 - normal pnv @@ -69,7 +73,8 @@ float3 infrared(float3 N, float3 original, float depth, float2 HPos, float2 Tex0 float heat_mode = pnv_param_1.z - 2.f; - float3 hotness = s_heat.Load(int3(Tex0 * screen_res.xy, 0), 0); + const int2 renderPos = clamp(int2(Tex0 * render_res.xy), int2(0, 0), int2(render_res.xy) - 1); + float3 hotness = s_heat.Load(int3(renderPos, 0), 0); float3 mixed; if (hotness.y > 0.0) @@ -101,7 +106,7 @@ float3 infrared(float3 N, float3 original, float depth, float2 HPos, float2 Tex0 { int samples = lerp(heat_vision_blurring.x, heat_vision_blurring.y, smoothstep(0.0, heat_vision_blurring.z, depth)); - mixed = normal_blur(HPos, samples); + mixed = normal_blur(Tex0, samples); mixed = normalize(mixed); float projection = dot(mixed, float3(0.0, 0.0, -1.0)); @@ -165,19 +170,16 @@ float3 infrared(float3 N, float3 original, float depth, float2 HPos, float2 Tex0 } } - float4 jitter = float4(frac(sin(dot(Tex0, float2(12.0, 78.0) + (timers.x))) * 12345.0), frac(sin(dot(Tex0, float2(12.0, 78.0) + (timers.x))) * 67890.0), - frac(sin(dot(Tex0, float2(12.0, 78.0) + (timers.x))) * 78372.0), frac(sin(dot(Tex0, float2(12.0, 78.0) + (timers.x))) * 37857.0)); - if (heat_mode == 1.0) - { - mixed += jitter.y * (0.12); mixed = greyscale(mixed); - } - else - { - mixed += jitter.y * (0.15); - } return mixed; } + +float thermal_sensor_grain(float2 Tex0) +{ + const float heat_mode = pnv_param_1.z - 2.f; + const float n = frac(sin(dot(Tex0, float2(12.0, 78.0) + timers.x)) * 67890.0); + return n * (heat_mode == 1.0 ? 0.12 : 0.15); +} #endif \ No newline at end of file diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision.ps index 5da673fab557254330b245d36191e5b1d1ca7834..66c5c948cc3af8d484fa794e5c80ffb582f0121d 100644 GIT binary patch delta 36 scmeAY?qr&vHPKsp;zJwO%-qEE)XBXpK5Qk)2AbAflaI5@Gu3hd0O(E&lmGw# literal 2442 zcmd5-O>f&c5WV|X4BEp=t*SV70tXwoK#)4A0IyTnN`O5Pv_#pgB~l=%#7>d_zC%j# zN9q7e<;qp!A?RJifOi{(s!&$k|iY%xus9uqs zStrXSHD^#zF1(WHL@_2H^5IXIJ&>5H1v8y*9l$3FP11!S(6Y=okzmSj`iVVyZr;D_ zxJ}Mo4-%;qOAJeiVQW+2SW1;@YpqLMAc`6;5r^Bxr8wfH54@lYhBlhGQ8=STnKMrp zB~d2lf>9OJu>5endA{5s=);oc8Bt7=d0r{!!wyLAr%u#jzMlu=6(uEAv>@VfK}1y$ zQ_Y!8qZE(L%2~L+gp(6E4WJjmSpcUY4yD3(ZwKg=s|6l6Nh-`BFdQQO%(sbY#sJ+uu|E_Jgyu** zvt(f1BX9J|1+F<_dD1ZID@U~U;^En2)jPK2hZ?= zDIKnT--mZ_+UuX4<4WMd*Z@Cxz7GH&AS-10Dq7zL!#_+8YQ9^ZAc6c}1Jvsc`WEW{ z2GHQ5Kfn|G9YDX9aer`eKEMENliLE+9f=Kt6>b&BTgC`}kFD_P)OS#f8w|%JWihxwnCsa); ztQ_gO2M-`m?xNXfi?%s6ct3=?Kf(=C+}lU8b`$c+I~1RN#R#Aqo?~~kkX<_p$u%~n zbRRCx5j3;wXc9-`@l_n%O^zKU%0~n289p8Yd&YM1z&j1QANKJ++a~=9ShPYDloI#b zp2W$?x0XZ5AiLudUXCDsh;ApNINlwhlM`s=5N#8hC#3y;1!ODPP0{xiuQh2E71?bo zXP=f)Nsc#8Ln%CS)C~ms-M)9jEu2HrPDkX>UNinVt6}> zRwHZj?ge>qkWPN@X>8%{KAuINMlgA}h3jZ~Js!>A?xv|emM6*_XXsqZ9PbTCxi(ZJ z3^FB)Mj|1>n+i$KHDpww{5SkhxJq({*Llh-Y+YOs_NK^lP?d0QrQ58RG)0@bscZ}7 i^66ja#&XS^lilUhR?e}c@41?_e|v>P)%Y)p^YRZ8hQJvB diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision.s b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision.s index ab94f862ce..c44819301c 100644 --- a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision.s +++ b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision.s @@ -15,4 +15,16 @@ function element_0(shader, t_base, t_second, t_detail) shader:dx10sampler("smp_base") shader:dx10sampler("smp_nofilter") shader:dx10sampler("smp_rtlinear") -end \ No newline at end of file +end + +function element_1(shader, t_base, t_second, t_detail) + shader:begin("stub_screen_space", "ogsr_heatvision_pp") + :fog(false) + :zb(false, false) + shader:dx10texture("s_image", "$user$postprocess0") + shader:dx10texture("s_blur_2", "$user$blur_2") + + shader:dx10sampler("smp_base") + shader:dx10sampler("smp_nofilter") + shader:dx10sampler("smp_rtlinear") +end diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision_pp.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/ogsr_heatvision_pp.ps new file mode 100644 index 0000000000000000000000000000000000000000..49f1c58ce0ee3d0ea671ea9a2c24720923d5745f GIT binary patch literal 1835 zcmd5--*1~R5Ps*cIIS5`vGR!?%&aKQ znHodJ5@8p#3?=6R0tddr{3l&78FOVlTYyhMR5*kgu%bvef#6al>^ooCX5X1w=8|#e zL6}R)L&cX=@wKXOo#%2{YU{GV11gzHa>QY-CAoORiw{Z0VvaT?H7hb_S&?$P%nB-1 znh4IMTf=h5db6D#5cu%O(uhi4(ucH?#)n=|??Wdte(2@_X~k&4B+IB+#Z*)oRn-I6 zX%u3$KN*wt6b1trx!}1lc40(tnM?fj4uD>`im}`@tT20_dfq&;>7>!IS|zdIO7VBB zFnJR!iNMD078Tx1xhSdbH}1UI4!7gKm!Jc)8RCx|{YzZ@7qO=V31IHApElRQ z;JL0V(JIt8rm(9AfJSU&3C+a78zDVlmPPy5Pt(>g#i6|K yE7lJ6hj3oqJD#<0I+c|i{~AOyMQUzz%y%XjPfKnVhcVQ*GeHkuhwwXVXZ;0*OcV?N literal 0 HcmV?d00001 diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp index c9f38906e8..46ad920de8 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp @@ -793,33 +793,6 @@ bool CRenderTarget::ProcessFSR_3DSS(const bool need_reset) void CRenderTarget::PhaseAA(CBackend& cmd_list) { - if (ps_pnv_mode > 1) // skip AA for heatvision - { - bool temporalOutput = false; - if (ps_r_pp_aa_mode == DLSS) - { - temporalOutput = ProcessDLSS(); - if (!temporalOutput) - { - ps_r_pp_aa_mode = FSR3; - temporalOutput = ProcessFSR(); - if (!temporalOutput) - ps_r_pp_aa_mode = TAA; - } - } - else if (ps_r_pp_aa_mode == FSR3) - { - temporalOutput = ProcessFSR(); - if (!temporalOutput) - ps_r_pp_aa_mode = TAA; - } - - EndTemporalUpscaleInput(); - RImplementation.rmNormal(cmd_list); - BeginPostprocess(cmd_list, temporalOutput); - return; - } - bool temporalOutput = false; switch (ps_r_pp_aa_mode) diff --git a/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp b/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp index ea68409375..7280253493 100644 --- a/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp +++ b/ogsr_engine/Layers/xrRender/rendertarget_phase_thermalvision.cpp @@ -7,3 +7,11 @@ void CRenderTarget::phase_heatvision(CBackend& cmd_list) RenderScreenTriangle(cmd_list, rt_Generic_scene_scratch, s_heatvision->E[0]); HW.get_context(cmd_list.context_id)->CopyResource(rt_Generic_0->pSurface, rt_Generic_scene_scratch->pSurface); } + +void CRenderTarget::phase_heatvision_overlay(CBackend& cmd_list) +{ + PIX_EVENT(phase_heatvision_overlay); + + RenderScreenTriangle(cmd_list, rt_Generic_combine, s_heatvision->E[1]); + HW.get_context(cmd_list.context_id)->CopyResource(rt_Postprocess_0->pSurface, rt_Generic_combine->pSurface); +} diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp index 4067605549..6442f755e3 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp @@ -306,7 +306,7 @@ void CRender::Render() Target->ResetTemporalHistory(); } - if (ps_pnv_mode < 2 && (ps_r_pp_aa_mode == DLSS || ps_r_pp_aa_mode == FSR3 || ps_r_pp_aa_mode == TAA || ps_r2_ls_flags.test(R2FLAG_DBG_TAA_JITTER_ENABLE))) + if (ps_r_pp_aa_mode == DLSS || ps_r_pp_aa_mode == FSR3 || ps_r_pp_aa_mode == TAA || ps_r2_ls_flags.test(R2FLAG_DBG_TAA_JITTER_ENABLE)) { const u32 renderWidth = Target->GetRenderWidth(); const u32 renderHeight = Target->GetRenderHeight(); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h index ab610b963d..e7637efbc4 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h @@ -259,6 +259,7 @@ class CRenderTarget : public IRender_Target void phase_gasmask_dudv(CBackend& cmd_list); void phase_nightvision(CBackend& cmd_list); void phase_heatvision(CBackend& cmd_list); //--DSR-- HeatVision + void phase_heatvision_overlay(CBackend& cmd_list); void draw_rain(CBackend& cmd_list, light& RainSetup); diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp index 5538aa8af1..321bfef136 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp @@ -183,10 +183,9 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) const bool need_heatvision = (ps_pnv_mode == 2 || ps_pnv_mode == 3); const bool need_3dss = !dsgraph.mapScopeHUDSorted.empty(); - if (need_heatvision) // должен быть до 3DSS - { + // Stable false-color at render resolution so DLSS/FSR can reconstruct heat shapes. + if (need_heatvision) phase_heatvision(cmd_list); - } const bool upscaled_3dss = (!need_heatvision && need_3dss && Phase3DSSUpscale(cmd_list)); @@ -201,6 +200,10 @@ void CRenderTarget::phase_combine(CBackend& cmd_list) BeginPostprocess(cmd_list, false); } + // Sensor noise / lens after temporal upscaling. Before 3DSS so the reticle is not thermal-tinted. + if (need_heatvision) + phase_heatvision_overlay(cmd_list); + if (!need_heatvision) // должны быть до 3DSS { // Screen space sunshafts #pragma todo("Simp: Ощущение что еÑ�ть микроподергиваниÑ� лучей (из-за TAA jitter?)") From e91e8a25e6bbc6ced8f8e08b69a64fbd9b84971f Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Fri, 4 Sep 2026 22:00:31 -0300 Subject: [PATCH 10/12] Fix volumetric smoke UVs when rendering below native resolution --- .../Layers/xrRenderDX10/3DFluid/dx103DFluidRenderer.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ogsr_engine/Layers/xrRenderDX10/3DFluid/dx103DFluidRenderer.cpp b/ogsr_engine/Layers/xrRenderDX10/3DFluid/dx103DFluidRenderer.cpp index c98d1560b5..d73b58ef62 100644 --- a/ogsr_engine/Layers/xrRenderDX10/3DFluid/dx103DFluidRenderer.cpp +++ b/ogsr_engine/Layers/xrRenderDX10/3DFluid/dx103DFluidRenderer.cpp @@ -369,7 +369,7 @@ void dx103DFluidRenderer::Draw(CBackend& cmd_list, const dx103DFluidData& FluidD RImplementation.rmNormal(cmd_list); - PrepareCBuffer(cmd_list, FluidData, Device.dwWidth, Device.dwHeight); + PrepareCBuffer(cmd_list, FluidData, pTarget->GetRenderWidth(), pTarget->GetRenderHeight()); cmd_list.set_c(strDiffuseLight, LightData.m_vLightIntencity.x, LightData.m_vLightIntencity.y, LightData.m_vLightIntencity.z, 1.0f); @@ -383,10 +383,11 @@ void dx103DFluidRenderer::ComputeRayData(CBackend& cmd_list, const dx103DFluidDa CRenderTarget* pTarget = RImplementation.Target; pTarget->u_setrt(cmd_list, RT[RRT_RayDataTex], nullptr, nullptr, nullptr); // LDR RT + RImplementation.rmNormal(cmd_list); cmd_list.set_Element(m_RendererTechnique[RS_CompRayData_Back]); - PrepareCBuffer(cmd_list, FluidData, Device.dwWidth, Device.dwHeight); + PrepareCBuffer(cmd_list, FluidData, pTarget->GetRenderWidth(), pTarget->GetRenderHeight()); // Render volume back faces // We output xyz=(0,-1,0) and w=min(sceneDepth, boxDepth) @@ -397,7 +398,7 @@ void dx103DFluidRenderer::ComputeRayData(CBackend& cmd_list, const dx103DFluidDa // unless the pixel is occluded by the scene, in which case we output xyzw=(1,0,0,0) pTarget->u_setrt(cmd_list, RT[RRT_RayDataTex], nullptr, nullptr, nullptr); // LDR RT cmd_list.set_Element(m_RendererTechnique[RS_CompRayData_Front]); - PrepareCBuffer(cmd_list, FluidData, Device.dwWidth, Device.dwHeight); + PrepareCBuffer(cmd_list, FluidData, pTarget->GetRenderWidth(), pTarget->GetRenderHeight()); DrawBox(cmd_list); } @@ -405,6 +406,7 @@ void dx103DFluidRenderer::ComputeEdgeTexture(CBackend& cmd_list, const dx103DFlu { CRenderTarget* pTarget = RImplementation.Target; pTarget->u_setrt(cmd_list, RT[RRT_RayDataTexSmall], nullptr, nullptr, nullptr); // LDR RT + RImplementation.rmNormal(cmd_list); cmd_list.set_Element(m_RendererTechnique[RS_QuadDownSampleRayDataTexture]); // First setup viewport to match the size of the destination low-res texture @@ -415,6 +417,7 @@ void dx103DFluidRenderer::ComputeEdgeTexture(CBackend& cmd_list, const dx103DFlu // Create an edge texture, performing edge detection on 'rayDataTexSmall' pTarget->u_setrt(cmd_list, RT[RRT_EdgeTex], nullptr, nullptr, nullptr); // LDR RT + RImplementation.rmNormal(cmd_list); cmd_list.set_Element(m_RendererTechnique[RS_QuadEdgeDetect]); PrepareCBuffer(cmd_list, FluidData, m_iRenderTextureWidth, m_iRenderTextureHeight); DrawScreenQuad(cmd_list); From 6de31d2097587dac10d0e3ce0f625cbcf2c5bbf9 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Tue, 8 Sep 2026 23:20:20 -0300 Subject: [PATCH 11/12] Add DLSS preset options --- .../gamedata/config/text/eng/ui_st_mm.xml | 30 ++++ .../gamedata/config/text/rus/ui_st_mm.xml | 30 ++++ .../gamedata/config/ui/ui_mm_opt.xml | 13 ++ .../scripts/ui_mm_opt_video_adv.script | 42 ++++- .../Layers/xrRender/RenderTargetPhaseAA.cpp | 158 ++++++++++++++++-- .../Layers/xrRender/xrRender_console.cpp | 62 ++++++- .../Layers/xrRender/xrRender_console.h | 4 + ogsr_engine/xrGame/ui/UIComboBox.cpp | 15 +- ogsr_engine/xrGame/ui/UIComboBox_script.cpp | 1 + ogsr_engine/xrGame/ui/UIListBoxItem.cpp | 3 + ogsr_engine/xrGame/ui/UIOptionsItem.cpp | 7 + ogsr_engine/xrGame/ui/UIOptionsItem.h | 1 + ogsr_engine/xr_3da/xr_ioc_cmd.h | 1 + 13 files changed, 349 insertions(+), 18 deletions(-) diff --git a/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml b/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml index c9ff78ed8f..232dfbaed8 100644 --- a/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml +++ b/Game/Resources_SoC_1.0006/gamedata/config/text/eng/ui_st_mm.xml @@ -297,12 +297,33 @@ DLSS quality + + + DLSS preset FSR3 quality DLAA + + + Default + + + F (CNN) + + + J (Transformer) + + + K (Transformer) + + + L (Transformer) + + + M (Transformer) Quality @@ -927,6 +948,9 @@ FSR3 quality - r_aa_fsr3_quality + + + DLSS preset - r_aa_dlss_preset @@ -1127,6 +1151,12 @@ Sets the AMD FSR3 internal render scale. Native AA renders at native resolution for maximum image quality. Quality, Balanced, Performance and Ultra Performance render at progressively lower internal resolutions to gain FPS. Apply video settings or run vid_restart after changing this option. + + + Selects the NVIDIA DLSS model. Presets not supported by the loaded DLSS library are grayed out. +%c[yellow] \nCNN:\nF - legacy CNN model (deprecated). +%c[green] \nTransformer:\nJ - less ghosting, more flicker (NVIDIA recommends K).\nK - 1st-gen transformer, default for DLAA / Quality / Balanced.\nL - 2nd-gen transformer, sharper and slower, default for Ultra Performance (RTX 40+).\nM - 2nd-gen transformer, similar to L but faster, default for Performance (RTX 40+). +Default follows NVIDIA / driver OTA. diff --git a/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml b/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml index d42e9719e4..de840e1972 100644 --- a/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml +++ b/Game/Resources_SoC_1.0006/gamedata/config/text/rus/ui_st_mm.xml @@ -292,12 +292,33 @@ Êà÷åñòâî DLSS + + Ïðåñåò DLSS + Êà÷åñòâî FSR 3 DLAA + + Default + + + F (CNN) + + + J (Transformer) + + + K (Transformer) + + + L (Transformer) + + + M (Transformer) + Êà÷åñòâî @@ -903,6 +924,9 @@ Êà÷åñòâî FSR 3 - r_aa_fsr3_quality + + Ïðåñåò DLSS - r_aa_dlss_preset + Motion blur - ðàçìûòèå èçîáðàæåíèÿ ïðè ïîâîðîòå êàìåðû, âîñïðîèçâåäåíèè ñöåí äâèæåíèÿ èëè áûñòðî äâèæóùèõñÿ îáúåêòîâ. @@ -1094,5 +1118,11 @@ Çàäà¸ò âíóòðåííåå ðàçðåøåíèå AMD FSR 3. Íàòèâíîå ñãëàæèâàíèå ðåíäåðèò â íàòèâíîì ðàçðåøåíèè äëÿ ìàêñèìàëüíîãî êà÷åñòâà. Quality, Balanced, Performance è Ultra Performance ïîñòåïåííî ñíèæàþò âíóòðåííåå ðàçðåøåíèå ðàäè FPS. Ïîñëå èçìåíåíèÿ ïðèìåíèòå âèäåî íàñòðîéêè (vid_restart). + + Âûáîð ìîäåëè NVIDIA DLSS. Ïðåñåòû, êîòîðûå íå ïîääåðæèâàåò çàãðóæåííàÿ áèáëèîòåêà DLSS, îòîáðàæàþòñÿ ñåðûì. +%c[yellow] \nCNN:\nF — óñòàðåâøàÿ CNN-ìîäåëü (deprecated). +%c[green] \nTransformer:\nJ — ìåíüøå øëåéôîâ, áîëüøå ìåðöàíèÿ (NVIDIA ðåêîìåíäóåò K).\nK — òðàíñôîðìåð 1-ãî ïîêîëåíèÿ, ïî óìîë÷àíèþ äëÿ DLAA / Quality / Balanced.\nL — òðàíñôîðìåð 2-ãî ïîêîëåíèÿ, ÷åò÷å è ìåäëåííåå, ïî óìîë÷àíèþ äëÿ Ultra Performance (RTX 40+).\nM — òðàíñôîðìåð 2-ãî ïîêîëåíèÿ, êà÷åñòâî êàê ó L, íî áûñòðåå, ïî óìîë÷àíèþ äëÿ Performance (RTX 40+). +Default ñëåäóåò çà NVIDIA / OTA äðàéâåðà. + diff --git a/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml b/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml index 95ed018ac4..4ece7ed89b 100644 --- a/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml +++ b/Game/Resources_SoC_1.0006/gamedata/config/ui/ui_mm_opt.xml @@ -377,6 +377,19 @@ + + ui_mm_dlss_preset + + + + + + + + + + + ui_mm_fsr3_quality diff --git a/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script b/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script index e214684cb9..63d4abef5e 100644 --- a/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script +++ b/Game/Resources_SoC_1.0006/gamedata/scripts/ui_mm_opt_video_adv.script @@ -13,6 +13,7 @@ local adv_vid_opt_params = { -- { "aa", "list", 0, hint_colors.green , "video_settings_name_19", "video_settings_desc_19" }, { "dlss_quality", "list", 0, hint_colors.green , "video_settings_name_70", "video_settings_desc_70" }, + { "dlss_preset", "list", 0, hint_colors.green , "video_settings_name_72", "video_settings_desc_72" }, { "fsr3_quality", "list", 0, hint_colors.green , "video_settings_name_71", "video_settings_desc_71" }, { "cas", "track", 0, hint_colors.green , "video_settings_name_20", "video_settings_desc_20" }, -- { "3dss_scale_factor", "track", 0, hint_colors.yellow, "video_settings_name_69", "video_settings_desc_69" }, @@ -107,7 +108,14 @@ function opt_video_adv:InitControls(x, y, xml, handler) ui_events.STATIC_FOCUS_RECEIVED, function() handler.hint_name:SetText(hint_caption and game.translate_string(hint_caption) or "") - handler.hint_caption:SetText(hint_string and game.translate_string(hint_string) or "") + local desc = hint_string and game.translate_string(hint_string) or "" + if opt == "dlss_preset" then + local ver = get_console():get_string("r_aa_dlss_version") or "" + if ver ~= "" then + desc = desc .. "\nDLL: " .. ver + end + end + handler.hint_caption:SetText(desc) end ) @@ -125,7 +133,14 @@ function opt_video_adv:InitControls(x, y, xml, handler) if opt == "aa" then self.aa_list = ctl - elseif opt == "dlss_quality" or opt == "fsr3_quality" then + elseif opt == "dlss_quality" then + self.upscaler_rows[opt] = _st + self.dlss_quality_list = ctl + elseif opt == "dlss_preset" then + self.upscaler_rows[opt] = _st + self.dlss_preset_list = ctl + self.dlss_preset_cap = _st2 + elseif opt == "fsr3_quality" then self.upscaler_rows[opt] = _st end end @@ -136,6 +151,14 @@ function opt_video_adv:InitControls(x, y, xml, handler) self:UpdateUpscalerQualityRows() end) end + if self.dlss_quality_list then + handler:Register(self.dlss_quality_list, "video_adv:list_dlss_quality") + handler:AddCallback("video_adv:list_dlss_quality", ui_events.LIST_ITEM_SELECT, function() + if self.dlss_preset_list then + self.dlss_preset_list:SetCurrentValue() + end + end) + end self:UpdateUpscalerQualityRows() local btn = xml:Init3tButton("video_adv:btn_to_simply", self) @@ -147,6 +170,21 @@ function opt_video_adv:UpdateUpscalerQualityRows() if self.upscaler_rows.dlss_quality then self.upscaler_rows.dlss_quality:Show(mode == "st_opt_dlss") end + if self.upscaler_rows.dlss_preset then + self.upscaler_rows.dlss_preset:Show(mode == "st_opt_dlss") + end + if mode == "st_opt_dlss" and self.dlss_preset_list then + self.dlss_preset_list:SetCurrentValue() + end + if self.dlss_preset_cap then + local name = game.translate_string("ui_mm_dlss_preset") + local ver = get_console():get_string("r_aa_dlss_version") or "" + if mode == "st_opt_dlss" and ver ~= "" then + self.dlss_preset_cap:SetText(name .. " " .. ver) + else + self.dlss_preset_cap:SetText(name) + end + end if self.upscaler_rows.fsr3_quality then self.upscaler_rows.fsr3_quality:Show(mode == "st_opt_fsr3") end diff --git a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp index 46ad920de8..01c43fa548 100644 --- a/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp +++ b/ogsr_engine/Layers/xrRender/RenderTargetPhaseAA.cpp @@ -32,6 +32,7 @@ void CRenderTarget::ProcessTAA(CBackend& cmd_list) //***************************************************************************************************** #include <..\NVIDIA_DLSS\DLSS\include\nvsdk_ngx.h> #include <..\NVIDIA_DLSS\DLSS\include\nvsdk_ngx_helpers.h> +#include #ifdef _DEBUG #if _ITERATOR_DEBUG_LEVEL == 0 @@ -47,6 +48,78 @@ void CRenderTarget::ProcessTAA(CBackend& cmd_list) #endif #endif +#pragma comment(lib, "version.lib") + +char ps_r_dlss_dll_version[64]{}; + +struct DlssDllFileVersion +{ + u32 major{}; + u32 minor{}; + u32 patch{}; + u32 revision{}; + bool valid{}; +}; + +static DlssDllFileVersion g_dlss_dll_file_version{}; + +static bool DlssDllVersionAtLeast(const u32 major, const u32 minor, const u32 patch) +{ + if (!g_dlss_dll_file_version.valid) + return false; + if (g_dlss_dll_file_version.major != major) + return g_dlss_dll_file_version.major > major; + if (g_dlss_dll_file_version.minor != minor) + return g_dlss_dll_file_version.minor > minor; + return g_dlss_dll_file_version.patch >= patch; +} + +static void QueryLoadedDlssDllVersion() +{ + if (g_dlss_dll_file_version.valid) + return; + + const HMODULE mod = GetModuleHandleW(L"nvngx_dlss.dll"); + if (!mod) + return; + + wchar_t path[MAX_PATH]{}; + if (!GetModuleFileNameW(mod, path, MAX_PATH)) + return; + + DWORD dummy{}; + const DWORD size = GetFileVersionInfoSizeW(path, &dummy); + if (!size) + return; + + xr_vector data(size); + if (!GetFileVersionInfoW(path, 0, size, data.data())) + return; + + VS_FIXEDFILEINFO* info{}; + UINT info_size{}; + if (!VerQueryValueW(data.data(), L"\\", reinterpret_cast(&info), &info_size) || !info) + return; + + g_dlss_dll_file_version.major = HIWORD(info->dwFileVersionMS); + g_dlss_dll_file_version.minor = LOWORD(info->dwFileVersionMS); + g_dlss_dll_file_version.patch = HIWORD(info->dwFileVersionLS); + g_dlss_dll_file_version.revision = LOWORD(info->dwFileVersionLS); + g_dlss_dll_file_version.valid = true; + + if (g_dlss_dll_file_version.revision == 0) + { + xr_sprintf(ps_r_dlss_dll_version, "%u.%u.%u", g_dlss_dll_file_version.major, g_dlss_dll_file_version.minor, g_dlss_dll_file_version.patch); + } + else + { + xr_sprintf(ps_r_dlss_dll_version, "%u.%u.%u.%u", g_dlss_dll_file_version.major, g_dlss_dll_file_version.minor, g_dlss_dll_file_version.patch, + g_dlss_dll_file_version.revision); + } + + Msg("--[DLSS] loaded DLL version: [%s]", ps_r_dlss_dll_version); +} + struct DlssResolutionInfo { u32 renderWidth{}, renderHeight{}; @@ -67,6 +140,20 @@ static NVSDK_NGX_PerfQuality_Value GetRequestedDlssQuality() } } +static const char* GetDlssPresetParameterName(const NVSDK_NGX_PerfQuality_Value quality) +{ + switch (quality) + { + case NVSDK_NGX_PerfQuality_Value_MaxPerf: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Performance; + case NVSDK_NGX_PerfQuality_Value_Balanced: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Balanced; + case NVSDK_NGX_PerfQuality_Value_MaxQuality: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Quality; + case NVSDK_NGX_PerfQuality_Value_UltraPerformance: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_UltraPerformance; + case NVSDK_NGX_PerfQuality_Value_UltraQuality: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_UltraQuality; + case NVSDK_NGX_PerfQuality_Value_DLAA: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_DLAA; + default: return NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_DLAA; + } +} + static class NGXWrapper { NVSDK_NGX_Parameter* NgxParameters{}; @@ -75,13 +162,18 @@ static class NGXWrapper ID3D11Resource* OutputRT{}; NVSDK_NGX_Dimensions saved_renderSize{}; bool resetHistory{true}; + bool availablePresetsResolved{}; public: u32 saved_w{}, saved_h{}; uint32_t dlssPreset{}, dlssQuality{}, requestedQuality{}; + u32 availablePresetMask{~0u}; bool Initialize(const u64 appid) { + if (!HW.pDevice) + return false; + if (HW.FeatureLevel < D3D_FEATURE_LEVEL_11_1) Msg("!![%s] Low FeatureLevel: [%d]", __FUNCTION__, HW.FeatureLevel); @@ -122,9 +214,57 @@ static class NGXWrapper } } + QueryLoadedDlssDllVersion(); return true; } + bool IsPresetAvailable(const u32 preset) const + { + if (preset > 31) + return false; + if (availablePresetMask == ~0u) + return true; + return (availablePresetMask & (1u << preset)) != 0; + } + + void RefreshAvailablePresets() + { + if (!HW.pDevice) + return; + + if (!Initialize(20082024151405ull) || !NgxParameters) + return; + + QueryLoadedDlssDllVersion(); + if (availablePresetsResolved) + return; + + // NGX parameter Set/Get does not report whether a preset exists in the + // loaded DLL; it just stores the hint. NVIDIA added L/M in SDK 310.5.0. + u32 mask = 1u << NVSDK_NGX_DLSS_Hint_Render_Preset_Default; + mask |= 1u << NVSDK_NGX_DLSS_Hint_Render_Preset_F; + mask |= 1u << NVSDK_NGX_DLSS_Hint_Render_Preset_J; + mask |= 1u << NVSDK_NGX_DLSS_Hint_Render_Preset_K; + if (DlssDllVersionAtLeast(310, 5, 0)) + { + mask |= 1u << NVSDK_NGX_DLSS_Hint_Render_Preset_L; + mask |= 1u << NVSDK_NGX_DLSS_Hint_Render_Preset_M; + } + + availablePresetMask = mask; + if (g_dlss_dll_file_version.valid) + availablePresetsResolved = true; + + Msg("--[DLSS] available presets for DLL [%s]: Default/F/J/K%s", ps_r_dlss_dll_version[0] ? ps_r_dlss_dll_version : "unknown", + DlssDllVersionAtLeast(310, 5, 0) ? "/L/M" : ""); + + if (!IsPresetAvailable(ps_r_dlss_preset)) + { + Msg("!![%s] DLSS preset [%u] is unavailable, falling back to Default", __FUNCTION__, ps_r_dlss_preset); + ps_r_dlss_preset = NVSDK_NGX_DLSS_Hint_Render_Preset_Default; + } + } + bool QueryOptimalSettings(const u32 displayWidth, const u32 displayHeight, const NVSDK_NGX_PerfQuality_Value quality, DlssResolutionInfo& out) const { if (!NgxParameters) @@ -158,16 +298,7 @@ static class NGXWrapper NVSDK_NGX_Result result{}; requestedQuality = requested_quality; - const char* preset_name{}; - switch (quality) - { - case NVSDK_NGX_PerfQuality_Value_MaxPerf: preset_name = NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Performance; break; - case NVSDK_NGX_PerfQuality_Value_Balanced: preset_name = NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Balanced; break; - case NVSDK_NGX_PerfQuality_Value_MaxQuality: preset_name = NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_Quality; break; - case NVSDK_NGX_PerfQuality_Value_UltraPerformance: preset_name = NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_UltraPerformance; break; - case NVSDK_NGX_PerfQuality_Value_UltraQuality: preset_name = NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_UltraQuality; break; - case NVSDK_NGX_PerfQuality_Value_DLAA: preset_name = NVSDK_NGX_Parameter_DLSS_Hint_Render_Preset_DLAA; break; - } + const char* preset_name = GetDlssPresetParameterName(static_cast(quality)); NVSDK_NGX_Parameter_SetUI(NgxParameters, preset_name, preset); @@ -225,6 +356,8 @@ static class NGXWrapper DLSSCreated = true; resetHistory = true; + QueryLoadedDlssDllVersion(); + RefreshAvailablePresets(); return true; } @@ -302,6 +435,10 @@ static class NGXWrapper ~NGXWrapper() { Destroy(); } } NGXWrapper; +bool R_dlss_is_preset_available(const u32 preset) { return NGXWrapper.IsPresetAvailable(preset); } + +void R_dlss_refresh_available_presets() { NGXWrapper.RefreshAvailablePresets(); } + static FfxFsr3UpscalerQualityMode GetRequestedFsr3Quality() { return static_cast( @@ -321,6 +458,7 @@ void CRenderTarget::ConfigureTemporalRenderSize() } else { + NGXWrapper.RefreshAvailablePresets(); DlssResolutionInfo resolutionInfo{}; if (NGXWrapper.QueryOptimalSettings(Device.dwWidth, Device.dwHeight, quality, resolutionInfo)) { diff --git a/ogsr_engine/Layers/xrRender/xrRender_console.cpp b/ogsr_engine/Layers/xrRender/xrRender_console.cpp index 48a356014a..f212d8c302 100644 --- a/ogsr_engine/Layers/xrRender/xrRender_console.cpp +++ b/ogsr_engine/Layers/xrRender/xrRender_console.cpp @@ -47,9 +47,11 @@ constexpr xr_token pp_aa_mode_token[] = { u32 ps_r_dlss_preset = NVSDK_NGX_DLSS_Hint_Render_Preset_F; constexpr xr_token dlss_mode_token[]{ {"st_opt_dlss_default", NVSDK_NGX_DLSS_Hint_Render_Preset_Default}, // default behavior, may or may not change after OTA - {"st_opt_dlss_f", NVSDK_NGX_DLSS_Hint_Render_Preset_F}, - {"st_opt_dlss_j", NVSDK_NGX_DLSS_Hint_Render_Preset_J}, - {"st_opt_dlss_k", NVSDK_NGX_DLSS_Hint_Render_Preset_K}, + {"st_opt_dlss_f", NVSDK_NGX_DLSS_Hint_Render_Preset_F}, // CNN + {"st_opt_dlss_j", NVSDK_NGX_DLSS_Hint_Render_Preset_J}, // Transformer + {"st_opt_dlss_k", NVSDK_NGX_DLSS_Hint_Render_Preset_K}, // Transformer + {"st_opt_dlss_l", NVSDK_NGX_DLSS_Hint_Render_Preset_L}, // Transformer + {"st_opt_dlss_m", NVSDK_NGX_DLSS_Hint_Render_Preset_M}, // Transformer {}, }; @@ -411,6 +413,55 @@ class CCC_ModelPoolStat : public IConsole_Command virtual void Execute(LPCSTR args) { RImplementation.Models->dump(); } }; +class CCC_DlssDllVersion : public IConsole_Command +{ +public: + CCC_DlssDllVersion(LPCSTR N) : IConsole_Command(N) + { + bEmptyArgsHandled = TRUE; + bCanSave = FALSE; + } + + void Execute(LPCSTR) override {} + + void Status(TStatus& S) override { xr_strcpy(S, ps_r_dlss_dll_version); } +}; + +class CCC_DlssQuality : public CCC_Token +{ +public: + CCC_DlssQuality(LPCSTR N, u32* V, const xr_token* T) : CCC_Token(N, V, T) {} + + void Execute(LPCSTR args) override + { + CCC_Token::Execute(args); + R_dlss_refresh_available_presets(); + } +}; + +class CCC_DlssRenderPreset : public CCC_Token +{ +public: + CCC_DlssRenderPreset(LPCSTR N, u32* V, const xr_token* T) : CCC_Token(N, V, T) {} + + bool TokenEnabled(int id) override + { + R_dlss_refresh_available_presets(); + return R_dlss_is_preset_available(static_cast(id)); + } + + void Execute(LPCSTR args) override + { + CCC_Token::Execute(args); + R_dlss_refresh_available_presets(); + if (!R_dlss_is_preset_available(*value)) + { + Msg("! DLSS preset is not available, falling back to Default"); + *value = NVSDK_NGX_DLSS_Hint_Render_Preset_Default; + } + } +}; + class CCC_Preset : public CCC_Token { public: @@ -841,9 +892,10 @@ void xrRender_initconsole() CMD4(CCC_Float, "r2_visor_refl_radius", &ps_r2_visor_refl_radius, 0.3f, 0.6f); CMD3(CCC_Token, "r_aa_mode", &ps_r_pp_aa_mode, pp_aa_mode_token); - CMD3(CCC_Token, "r_aa_dlss_quality", &ps_r_dlss_quality, dlss_quality_token); + CMD3(CCC_DlssQuality, "r_aa_dlss_quality", &ps_r_dlss_quality, dlss_quality_token); CMD3(CCC_Token, "r_aa_fsr3_quality", &ps_r_fsr3_quality, fsr3_quality_token); - //CMD3(CCC_Token, "r_aa_dlss_preset", &ps_r_dlss_preset, dlss_mode_token); + CMD3(CCC_DlssRenderPreset, "r_aa_dlss_preset", &ps_r_dlss_preset, dlss_mode_token); + CMD1(CCC_DlssDllVersion, "r_aa_dlss_version"); CMD4(CCC_Float, "r_3dss_scale_factor", &ps_r_dlss_3dss_scale_factor, 1.f, 2.5f); diff --git a/ogsr_engine/Layers/xrRender/xrRender_console.h b/ogsr_engine/Layers/xrRender/xrRender_console.h index 3e16fe766a..e3f0c527f4 100644 --- a/ogsr_engine/Layers/xrRender/xrRender_console.h +++ b/ogsr_engine/Layers/xrRender/xrRender_console.h @@ -6,6 +6,10 @@ extern ECORE_API u32 r2_SmapCascade0Size, /*r2_SmapCascade1Size,*/ r2_SmapCascad extern ECORE_API u32 ps_r_pp_aa_mode; extern ECORE_API u32 ps_r_dlss_preset; extern ECORE_API u32 ps_r_dlss_quality; + +bool R_dlss_is_preset_available(u32 preset); +void R_dlss_refresh_available_presets(); +extern char ps_r_dlss_dll_version[64]; extern ECORE_API u32 ps_r_fsr3_quality; extern float ps_r_dlss_3dss_scale_factor; diff --git a/ogsr_engine/xrGame/ui/UIComboBox.cpp b/ogsr_engine/xrGame/ui/UIComboBox.cpp index 8e42005ed1..77c2261d67 100644 --- a/ogsr_engine/xrGame/ui/UIComboBox.cpp +++ b/ogsr_engine/xrGame/ui/UIComboBox.cpp @@ -106,6 +106,14 @@ void CUIComboBox::OnListItemSelect() if (bk_itoken_id != m_itoken_id) { + CUIListBoxItem* selected = m_list.GetSelectedItem(); + if (selected && !selected->IsEnabled()) + { + m_itoken_id = bk_itoken_id; + SetItem(m_itoken_id); + ShowList(false); + return; + } SaveValue(); GetMessageTarget()->SendMessage(this, LIST_ITEM_SELECT, NULL); } @@ -119,7 +127,9 @@ void CUIComboBox::SetCurrentValue() while (tok->name) { - AddItem_(tok->name, tok->id); + CUIListBoxItem* itm = AddItem_(tok->name, tok->id); + if (itm && !IsOptTokenEnabled(tok->id)) + itm->Enable(false); tok++; } @@ -163,6 +173,9 @@ void CUIComboBox::OnBtnClicked() { ShowList(!m_list.IsShown()); } void CUIComboBox::ShowList(bool bShow) { + if (bShow && m_entry == "r_aa_dlss_preset") + SetCurrentValue(); + if (bShow) { SetHeight(m_text.GetHeight() + m_list.GetHeight()); diff --git a/ogsr_engine/xrGame/ui/UIComboBox_script.cpp b/ogsr_engine/xrGame/ui/UIComboBox_script.cpp index f0da52c0ab..af0fea66d1 100644 --- a/ogsr_engine/xrGame/ui/UIComboBox_script.cpp +++ b/ogsr_engine/xrGame/ui/UIComboBox_script.cpp @@ -23,6 +23,7 @@ void CUIComboBox::script_register(lua_State* L) .def("SetListLength", &CUIComboBox::SetListLength) .def("CurrentID", &CUIComboBox::CurrentID) .def("SetCurrentID", &CUIComboBox::SetItem) + .def("SetCurrentValue", &CUIComboBox::SetCurrentValue) // .def("AddItem", (void (CUIComboBox::*)(LPCSTR, bool)) CUIComboBox::AddItem) .def("AddItem", (CUIListBoxItem * (CUIComboBox::*)(LPCSTR)) & CUIComboBox::AddItem_) diff --git a/ogsr_engine/xrGame/ui/UIListBoxItem.cpp b/ogsr_engine/xrGame/ui/UIListBoxItem.cpp index aae948d82d..739d3623f8 100644 --- a/ogsr_engine/xrGame/ui/UIListBoxItem.cpp +++ b/ogsr_engine/xrGame/ui/UIListBoxItem.cpp @@ -47,6 +47,9 @@ bool CUIListBoxItem::OnDbClick() bool CUIListBoxItem::OnMouseDown(int mouse_btn) { + if (!IsEnabled()) + return true; + if (mouse_btn == MOUSE_1) { smart_cast(GetParent()->GetParent())->SetSelected(this); diff --git a/ogsr_engine/xrGame/ui/UIOptionsItem.cpp b/ogsr_engine/xrGame/ui/UIOptionsItem.cpp index a60e32a475..90df4f4b6a 100644 --- a/ogsr_engine/xrGame/ui/UIOptionsItem.cpp +++ b/ogsr_engine/xrGame/ui/UIOptionsItem.cpp @@ -2,6 +2,7 @@ #include "UIOptionsItem.h" #include "UIOptionsManager.h" #include "..\..\xr_3da\xr_ioconsole.h" +#include "..\..\xr_3da\xr_ioc_cmd.h" CUIOptionsManager CUIOptionsItem::m_optionsManager; @@ -71,6 +72,12 @@ const xr_token* CUIOptionsItem::GetOptToken() return token; } +bool CUIOptionsItem::IsOptTokenEnabled(int id) +{ + CCC_Token* cf = smart_cast(Console->GetCommand(m_entry.c_str())); + return !cf || cf->TokenEnabled(id); +} + void CUIOptionsItem::SaveOptTokenValue(const char* val) { SaveOptStringValue(val); } #pragma todo("KRodin: желательно убрать Ñ�тот хардкод, как в ЗП, конечно, но пока менÑ� уÑ�траивает. ПеретаÑ�кивать полноÑ�тью движковые клаÑ�Ñ�Ñ‹ опций оттуда Ñ� точно не буду.") diff --git a/ogsr_engine/xrGame/ui/UIOptionsItem.h b/ogsr_engine/xrGame/ui/UIOptionsItem.h index 9e645c2383..2dfa4fde74 100644 --- a/ogsr_engine/xrGame/ui/UIOptionsItem.h +++ b/ogsr_engine/xrGame/ui/UIOptionsItem.h @@ -49,6 +49,7 @@ class CUIOptionsItem // token LPCSTR GetOptTokenValue(); const xr_token* GetOptToken(); + bool IsOptTokenEnabled(int id); void SaveOptTokenValue(const char* val); xr_string m_entry; diff --git a/ogsr_engine/xr_3da/xr_ioc_cmd.h b/ogsr_engine/xr_3da/xr_ioc_cmd.h index de3c3589fc..64aa439e30 100644 --- a/ogsr_engine/xr_3da/xr_ioc_cmd.h +++ b/ogsr_engine/xr_3da/xr_ioc_cmd.h @@ -293,6 +293,7 @@ class ENGINE_API CCC_Token : public IConsole_Command } } virtual const xr_token* GetToken() { return tokens; } + virtual bool TokenEnabled(int /*id*/) { return true; } virtual void fill_tips(vecTips& tips, u32 mode) { From d174db028e4484105bc4c6d9f8e8e123dd125822 Mon Sep 17 00:00:00 2001 From: brodrigz <57366583+brodrigz@users.noreply.github.com> Date: Wed, 9 Sep 2026 19:57:51 -0300 Subject: [PATCH 12/12] Occlude bullet tracers against G-buffer depth after upscale --- .../shaders/r3/effects_bullet_tracer.ps | Bin 0 -> 645 bytes .../shaders/r3/effects_bullet_tracer.s | 13 ++++----- .../shaders/r3/effects_bullet_tracer.vs | 27 ++++++++++++++++++ Game/ShadersSln/ShadersSln.vcxproj | 2 ++ Game/ShadersSln/ShadersSln.vcxproj.filters | 2 ++ 5 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_bullet_tracer.ps create mode 100644 Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_bullet_tracer.vs diff --git a/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_bullet_tracer.ps b/Game/Resources_SoC_1.0006/gamedata/shaders/r3/effects_bullet_tracer.ps new file mode 100644 index 0000000000000000000000000000000000000000..ec7390f80c9a4c11c49685d4547ee449a4201415 GIT binary patch literal 645 zcmcIi!EVAZ487+oEV#7OC@tc&juRja39S{NX}7Ah4rFVSDs@NMw0~b(h88|xKE-){ zj{RPSLS{viBMdTCmP&fZ0b@1kCL^d4(rJd8eK9b>3zgCYcG&vx0K4VuJc>38Kl}ry zKpA0sKxq{ORsnnnJSCqNIO)zq)f>!U*46u5;I@V&`6DzP$&De cMsJ&zRe?@jR(*bN=-vNu;m(|Tw~fo}2MiCn!T + + diff --git a/Game/ShadersSln/ShadersSln.vcxproj.filters b/Game/ShadersSln/ShadersSln.vcxproj.filters index 06d39aff69..0e00ea62a7 100644 --- a/Game/ShadersSln/ShadersSln.vcxproj.filters +++ b/Game/ShadersSln/ShadersSln.vcxproj.filters @@ -563,6 +563,8 @@ + +