Skip to content

feat(upscaling): generalize VR perf-mode rendering#42

Merged
alandtse merged 2 commits into
devfrom
claude/dlss-fsr-upscaling-13bAX
May 26, 2026
Merged

feat(upscaling): generalize VR perf-mode rendering#42
alandtse merged 2 commits into
devfrom
claude/dlss-fsr-upscaling-13bAX

Conversation

@alandtse
Copy link
Copy Markdown
Owner

@alandtse alandtse commented May 25, 2026

Two-commit PR. Originally DLSSperf was a VR-only opt-in that shrinks the engine's render targets to upscaled-render resolution and redirects the upscaler output into a private displayRes texture, but the mechanism only worked for DLSS. This generalizes it to FSR too, then renames the public surface since "DLSSperf" no longer reflects what it does.

Commits

1. feat(upscaling): extend DLSSperf VR mode to FSR (now PerfMode)

The render-target shrink + testTexture redirection is fundamentally upscaler-agnostic — the IS shader hooks (Tonemap / Refraction / ISCopy) and the CreateRT thunks only depend on testTexture being populated by some upscaler. Phase 1 opens four gates and routes FSR output:

  • Install gate (Hooks.cpp) — accept FSR as a separate-output upscaler.
  • Post-wrap gate (Main_PostProcessing) — HandlePostProcessing fires for FSR too.
  • Jitter / projection-scale gate (ConfigureUpscaling) — renderRes branch handles FSR.
  • UI gate — checkbox enabled for both methods.
  • FidelityFX::Upscale gains an optional a_colorOut parameter. The dispatch site in Upscaling::Upscale passes testTexture when the hook is live (mirrors Streamline's existing DLSS routing).
  • CreateFSRResources bridges state->screenSize via dlssPerf.GetDisplayScreenSize() so the FSR3 context is created with the real HMD display extent rather than the polluted renderRes value.
  • FinalizePerEyeOutputs now drives copy dims from vrIntermediateColorOut[0]->desc so it works when the intermediates were allocated at displayRes via EnsureVRIntermediateTextures' existing size bridge.

2. refactor(upscaling): rename DLSSperf to PerfMode

Nothing has shipped, so no JSON migration shim:

class DLSSperf            → PerfMode
Upscaling::dlssPerf       → Upscaling::perfMode
Settings::enableDLSSperf  → Settings::renderAtUpscaleRes
src/Features/Upscaling/DLSSperf.{cpp,h}  →  PerfMode.{cpp,h}
features/.../Shaders/Upscaling/DLSSperf/  →  PerfMode/
log tag [DLSSperf]        → [PerfMode]
restart-field label       → "Render at Upscaled Resolution"

UI checkbox loses the "(DLSSperf)" parenthetical; the active-state and "requires DLSS or FSR" copy is reworded to use "Render-at-upscaled-resolution" as the noun rather than the bare internal name.

Test plan

Cannot build / verify here (no Windows SDK / MSVC in the harness). Real validation needs:

  • VR session with DLSS + render-at-upscaled-resolution = on at boot — should match pre-PR DLSSperf behavior (no regression).
  • VR session with FSR + render-at-upscaled-resolution = on at boot — should produce a coherent reconstructed image at HMD-native resolution while the engine pipeline runs at renderRes.
  • Toggle the setting off → game restart → confirm engine runs at full displayRes (legacy in-place FSR output path) without artifacts.
  • Main-menu / pause / loading-screen BG renders correctly under both upscalers (depends on the unchanged MaybeBlitMenuBG / ISCopyRender_Hook paths).
  • Refraction effects (water surface, ice) look correct — the IS shader replay paths haven't been exercised under FSR before.
  • RenderDoc capture inspection — confirm testTexture is at displayRes and engine RTs (kMAIN, depth, kMOTION_VECTOR, kTEMPORAL_AA_MASK) are at renderRes when the toggle is on.

If first-run regression occurs under FSR, the most likely suspect is RefractionRender_Hook (it relies on sticky D3D state from the engine's prior pass — DLSS and FSR pre-state should be equivalent but worth checking RenderDoc).

https://claude.ai/code/session_01ApDQfcwz8X8LR8EYXmbz1W

Summary by CodeRabbit

  • New Features

    • FSR upscaling now supports the "Render at Upscaled Resolution" mode (previously DLSS-only).
  • Refactor

    • Generalized perf mode system to support both DLSS and FSR upscalers.
    • Renamed performance mode setting to "Render at Upscaled Resolution" for clarity.
    • Enhanced VR intermediate texture sizing and output routing.

Review Change Stack

Phase 1 of generalizing DLSSperf — the BSOpenVR render-target-size
hook plus testTexture redirection is fundamentally upscaler-agnostic
once the output target is routed correctly. Opens the install gate,
the post-process wrap, the jitter/projection-scale path, and the UI
checkbox to FSR alongside DLSS.

FidelityFX::Upscale gains an optional colorOut argument so the
dispatch site can route FSR's displayRes output to dlssPerf.test
Texture instead of the shrunk kMAIN — mirroring Streamline's
existing routing for DLSS. CreateFSRResources bridges state->screen
Size via dlssPerf.GetDisplayScreenSize() so the FSR3 context is
created with the real HMD display extent rather than the polluted
renderRes value. FinalizePerEyeOutputs now drives copy dims from
the intermediate texture desc so it works correctly when the
intermediates were allocated at displayRes through EnsureVR
IntermediateTextures' existing size bridge.

testTexture, refraTempTex, fakeDS and the IS shader hooks
(Tonemap/Refraction/ISCopy) are unchanged — they only depend on
testTexture being populated by some upscaler, not on which one.

https://claude.ai/code/session_01ApDQfcwz8X8LR8EYXmbz1W
Copilot AI review requested due to automatic review settings May 25, 2026 18:52
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 25, 2026

📝 Walkthrough

Walkthrough

This PR generalizes the VR "render engine at upscaled resolution" mode from DLSS-only (via DLSSperf) to support both DLSS and FSR (via unified PerfMode). Changes span shader assets, public types, settings schema, hook infrastructure, render-target initialization, and runtime upscaling integration.

Changes

PerfMode Integration

Layer / File(s) Summary
Struct rename and public API updates
src/Features/Upscaling/PerfMode.h, features/Upscaling/Shaders/Upscaling/PerfMode/*.hlsl, src/Features/Upscaling/FidelityFX.h
Public struct renamed from DLSSperf to PerfMode; shader asset comments updated to match; FidelityFX::Upscale() signature extended with optional a_colorOut parameter for flexible output routing.
Settings schema and UI integration
src/Features/Upscaling.h, src/Features/Upscaling.cpp (serialization, UI drawing)
VR setting refactored from enableDLSSperf to renderAtUpscaleRes; restart-table entry updated; UI checkbox gating changed from DLSS-only to enable/disable based on whether selected method is DLSS or FSR; UI drawing and serialization wired to new setting.
FSR output routing to PerfMode test texture
src/Features/Upscaling/FidelityFX.cpp, src/Features/Upscaling.cpp (FSR dispatch)
FidelityFX::Upscale() treats a_colorOut as optional, defaulting to in-place output; FSR rendering in Upscaling::Upscale() now routes to PerfMode's test texture when hook is active instead of always targeting kMAIN.
Hook installation and render-target initialization
src/Hooks.cpp, src/Globals.cpp
Render-target initialization hook gating generalized from enableDLSSperf && method==DLSS to renderAtUpscaleRes && (method==DLSS || method==FSR) and VR; PerfMode RT enlargement and resource setup are conditionally wired; fade-overlay hook installation switched to PerfMode.
PerfMode implementation and render hooks
src/Features/Upscaling/PerfMode.cpp
Complete port from DLSSperf to PerfMode: OpenVR recommended RT size capture, FSR3 quality-mode clamping and upscale-ratio derivation, test texture and fake depth/stencil resource setup, tonemap/refraction/UI/viewport render hooks, post-processing orchestration with BeginPostIntercept()/EndPostIntercept() sequencing.
Runtime upscaling logic and subsystem integration
src/Features/Upscaling.cpp (method locking, VR intermediate sizing, jitter/projection, post-processing), src/Features/Upscaling/Streamline.cpp
GetUpscaleMethod() locks to boot snapshot when perfMode.IsHookActive(); VR intermediate OUTPUT textures sized from PerfMode display snapshot; jitter/projection setup extended to both DLSS and FSR when PerfMode is active; hybrid post-processing wrapping updated to use perfMode.ShouldHandlePost() and route through PerfMode when either upscaler writes to test texture; Streamline DLSS bridge reads display sizing from perfMode snapshot.

Sequence Diagram

This PR does not generate a sequence diagram because the changes are primarily a refactoring that generalizes existing hook infrastructure and adds optional output routing to an existing upscaling dispatch, rather than introducing new functional flows or multi-component interactions not already present in the codebase.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • alandtse/open-shaders#24: The main PR directly replaces the previous DLSSperf VR "render engine at upscaled resolution" pipeline with the new generalized PerfMode implementation, updating hooks, settings, and test-texture routing across the same subsystems.

  • alandtse/open-shaders#34: Both PRs modify src/Features/Upscaling.cpp's Main_PostProcessing flow; this PR updates the hybrid post-processing wrapping for PerfMode test-texture upscalers, while PR #34 adjusts the VR dispatch for underwater mask repair, so the changes are coupled in the same function.

Poem

🐰 A rabbit's tale of modes refined:

DLSSperf fades, PerfMode takes the crown,

FSR joins DLSS in render-land uptown,

Hooks enlarge the textures, test tubes gleam,

Jitter, depth, and post—one upscale dream!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.66% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The PR title 'feat(upscaling): generalize VR perf-mode rendering' accurately describes the primary objective of generalizing the DLSSperf VR implementation to support FSR while renaming it to PerfMode.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/dlss-fsr-upscaling-13bAX

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

No actionable suggestions for changed features.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Generalizes the existing VR “DLSSperf” render-target-size hook and post-processing redirection so it can be used with FSR as well as DLSS, by ensuring FSR can upscale into the same private DisplayRes target (dlssPerf.testTexture) and by correcting sizing assumptions when the engine’s kMAIN is intentionally allocated at render resolution.

Changes:

  • Expands the DLSSperf install/UI gating to allow the feature when the resolved upscaler is DLSS or FSR (VR only).
  • Adds an optional a_colorOut destination to FidelityFX::Upscale() so FSR can write its display-resolution output into dlssPerf.testTexture when the engine RTs are shrunk.
  • Fixes VR output merge/copy sizing by deriving copy dimensions from the intermediate output texture description rather than state->screenSize (which is intentionally “polluted” under the size hook).

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
src/Hooks.cpp Allows DLSSperf render-target-size hook installation when the resolved method is DLSS or FSR.
src/Features/Upscaling/FidelityFX.h Extends FidelityFX::Upscale API with optional output target for DisplayRes routing.
src/Features/Upscaling/FidelityFX.cpp Bridges FSR context creation to true DisplayRes under DLSSperf; routes VR/non-VR dispatch output to a_colorOut.
src/Features/Upscaling.cpp Enables DLSSperf UI for DLSS/FSR; routes FSR output to dlssPerf.testTexture under hook; fixes VR finalize copy dimensions; broadens post-processing interception gate to DLSS/FSR.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 25, 2026

✅ A pre-release build is available for this PR:
Download

Phase 2 of the upscaler-perf-mode generalization. With FSR now also
routing through this code path (#42 phase 1), the DLSS-flavored name
is misleading. Nothing has shipped under the old name, so this is a
clean rename without a JSON migration shim.

Renames:
  class DLSSperf            -> PerfMode
  Upscaling::dlssPerf       -> Upscaling::perfMode
  Settings::enableDLSSperf  -> Settings::renderAtUpscaleRes
  src/Features/Upscaling/DLSSperf.{cpp,h}
                            -> src/Features/Upscaling/PerfMode.{cpp,h}
  Shaders/Upscaling/DLSSperf/
                            -> Shaders/Upscaling/PerfMode/
  log tag [DLSSperf]        -> [PerfMode]
  restart-field label       -> "Render at Upscaled Resolution"

The UI checkbox loses its "(DLSSperf)" parenthetical — the label
"Render engine at upscaled resolution" is self-describing. The "is
active" / "requires DLSS or FSR" banner copy is reworded to use
"Render-at-upscaled-resolution" as the noun rather than "PerfMode",
so users never see the bare internal name.

No behavior change. JSON config files written by older dev builds
(none shipped) won't carry the toggle forward — anyone testing the
phase-1 branch needs to re-tick the checkbox after this lands.

https://claude.ai/code/session_01ApDQfcwz8X8LR8EYXmbz1W
@alandtse alandtse changed the title feat(upscaling): extend DLSSperf VR mode to FSR feat(upscaling): generalize VR perf-mode rendering to FSR May 25, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Features/Upscaling.cpp (1)

706-713: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use the correct boot-locked method field when DLSS is unavailable.

When PerfMode is active, this always locks to bootSnapshot.upscaleMethod. On setups without DLSS, the live selector is upscaleMethodNoDLSS, so this can force the wrong path (DLSS) during runtime.

Suggested fix
 if (globals::features::upscaling.perfMode.IsHookActive())
-	return static_cast<UpscaleMethod>(bootSnapshot.Boot(&Settings::upscaleMethod));
+	return streamline.featureDLSS
+		? static_cast<UpscaleMethod>(bootSnapshot.Boot(&Settings::upscaleMethod))
+		: static_cast<UpscaleMethod>(bootSnapshot.Boot(&Settings::upscaleMethodNoDLSS));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Features/Upscaling.cpp` around lines 706 - 713, PerfMode currently always
returns bootSnapshot.Boot(&Settings::upscaleMethod) which can lock in the DLSS
path even when DLSS is unavailable; change the PerfMode branch to choose between
bootSnapshot.Boot(&Settings::upscaleMethod) and
bootSnapshot.Boot(&Settings::upscaleMethodNoDLSS) based on the runtime DLSS
flag. Specifically, inside the
globals::features::upscaling.perfMode.IsHookActive() branch, check
streamline.featureDLSS and return bootSnapshot.Boot(&Settings::upscaleMethod) if
true, otherwise return bootSnapshot.Boot(&Settings::upscaleMethodNoDLSS) so the
boot-locked method matches the appropriate live selector (settings.upscaleMethod
vs settings.upscaleMethodNoDLSS).
🧹 Nitpick comments (1)
src/Globals.cpp (1)

408-417: ⚡ Quick win

Gate fade-overlay hook on resolved method support too.

Line 416 currently installs this vtable hook whenever renderAtUpscaleRes is true, even if resolved mode is TAA/NONE or DLSS is unsupported at runtime. Matching the DLSS/FSR capability gate used in BSShaderRenderTargets_Create::thunk will avoid unnecessary foreign-hook interop surface.

♻️ Proposed fix
-		if (globals::game::isVR && globals::features::upscaling.settings.renderAtUpscaleRes)
-			globals::features::upscaling.perfMode.InstallFadeOverlayHook(a_context);
+		const auto resolvedUpscaleMethod = globals::features::upscaling.GetUpscaleMethod();
+		const bool methodSupportsPerfMode =
+			resolvedUpscaleMethod == Upscaling::UpscaleMethod::kDLSS ||
+			resolvedUpscaleMethod == Upscaling::UpscaleMethod::kFSR;
+		if (globals::game::isVR &&
+			globals::features::upscaling.settings.renderAtUpscaleRes &&
+			methodSupportsPerfMode) {
+			globals::features::upscaling.perfMode.InstallFadeOverlayHook(a_context);
+		}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Globals.cpp` around lines 408 - 417, The hook installation currently only
checks globals::game::isVR and
globals::features::upscaling.settings.renderAtUpscaleRes; update the condition
before calling
globals::features::upscaling.perfMode.InstallFadeOverlayHook(a_context) to also
verify the resolved upscaling method and runtime support (the same DLSS/FSR
capability checks used by BSShaderRenderTargets_Create::thunk). In practice, add
the additional predicate that the chosen resolved method is one that requires
native upscaling support and that the corresponding runtime capability check
(DLSS/FSR availability) passes, so the vtable hook is only installed when
renderAtUpscaleRes is true AND the resolved method is supported at runtime.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/Features/Upscaling.cpp`:
- Around line 706-713: PerfMode currently always returns
bootSnapshot.Boot(&Settings::upscaleMethod) which can lock in the DLSS path even
when DLSS is unavailable; change the PerfMode branch to choose between
bootSnapshot.Boot(&Settings::upscaleMethod) and
bootSnapshot.Boot(&Settings::upscaleMethodNoDLSS) based on the runtime DLSS
flag. Specifically, inside the
globals::features::upscaling.perfMode.IsHookActive() branch, check
streamline.featureDLSS and return bootSnapshot.Boot(&Settings::upscaleMethod) if
true, otherwise return bootSnapshot.Boot(&Settings::upscaleMethodNoDLSS) so the
boot-locked method matches the appropriate live selector (settings.upscaleMethod
vs settings.upscaleMethodNoDLSS).

---

Nitpick comments:
In `@src/Globals.cpp`:
- Around line 408-417: The hook installation currently only checks
globals::game::isVR and
globals::features::upscaling.settings.renderAtUpscaleRes; update the condition
before calling
globals::features::upscaling.perfMode.InstallFadeOverlayHook(a_context) to also
verify the resolved upscaling method and runtime support (the same DLSS/FSR
capability checks used by BSShaderRenderTargets_Create::thunk). In practice, add
the additional predicate that the chosen resolved method is one that requires
native upscaling support and that the corresponding runtime capability check
(DLSS/FSR availability) passes, so the vtable hook is only installed when
renderAtUpscaleRes is true AND the resolved method is supported at runtime.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b7a34190-83d6-4ea2-aae6-30a001180919

📥 Commits

Reviewing files that changed from the base of the PR and between 0f307d2 and a43e440.

📒 Files selected for processing (11)
  • features/Upscaling/Shaders/Upscaling/PerfMode/BoxDownscalePS.hlsl
  • features/Upscaling/Shaders/Upscaling/PerfMode/MenuBGBlitPS.hlsl
  • src/Features/Upscaling.cpp
  • src/Features/Upscaling.h
  • src/Features/Upscaling/FidelityFX.cpp
  • src/Features/Upscaling/FidelityFX.h
  • src/Features/Upscaling/PerfMode.cpp
  • src/Features/Upscaling/PerfMode.h
  • src/Features/Upscaling/Streamline.cpp
  • src/Globals.cpp
  • src/Hooks.cpp

@alandtse alandtse changed the title feat(upscaling): generalize VR perf-mode rendering to FSR feat(upscaling): generalize VR perf-mode rendering May 26, 2026
@alandtse alandtse merged commit c97626c into dev May 26, 2026
23 checks passed
@alandtse alandtse deleted the claude/dlss-fsr-upscaling-13bAX branch May 26, 2026 02:55
@alandtse alandtse mentioned this pull request May 26, 2026
6 tasks
alandtse added a commit that referenced this pull request May 26, 2026
Foveated rendering (high-quality visual-center subrect + stretched
periphery) is an upscaler-agnostic technique — NVIDIA's VRS, Meta's
Quest eye-tracking foveation, Vive Pro 2's FFR all express the same
idea. The DLSS-tied naming was historical, not algorithmic. Following
PR #42's PerfMode generalization precedent, this PR ships the generic
naming with DLSS as the first concrete backend.

Mechanical rename:
- struct DlssEnhancer -> FoveatedRender
- namespace DlssEnhancerImpl -> FoveatedRenderImpl
- Member Upscaling::dlssEnhancer -> foveatedRender
- src/Features/Upscaling/DlssEnhancer{,.{cpp,h}} -> .../FoveatedRender{,.{cpp,h}}
- features/Upscaling/Shaders/Upscaling/DlssEnhancer/ -> .../FoveatedRender/
- Log tag [DLSSENHANCER] -> [FOVEATED]
- Tracy zone + JSON settings key

The DLSS-specific implementation in Modes.cpp / Preprocess.cpp stays
scoped to DLSS this PR. Follow-up PR-3c will:
- Replace Core::ExecuteVRDlssCore(Streamline&, ...) with a backend
  abstraction.
- Implement FSR concrete backend (~150-300 LOC, mostly Modes.cpp).
- Drop the Preprocess non-DLSS early-return; wire FSR's depth-output
  UAV variant of EncodeTexturesCS (already exists in Upscaling.cpp).
- Hoist the Upscaling.cpp route-active gate to fire for kDLSS or kFSR.

No persisted user settings to preserve — PR-3 hasn't shipped.

Co-Authored-By: YtzyFvra <59631290+YtzyFvra@users.noreply.github.com>
alandtse added a commit that referenced this pull request May 26, 2026
Merge origin/dev which landed PR #43 (contact shadows) and PR #42
(DLSSperf → PerfMode rename + perf-mode generalization).

Conflicts resolved:
- src/Features/LightLimitFix.h: merged PerFrame layout to include both
  ContactShadow* tuning (from #43) and ShadowMapSlots (from this PR).
  Final layout: 10 uint/float fields (EnableContactShadows, 6
  ContactShadow*, 2 visualisation, ShadowMapSlots) + uint pad[2] +
  uint ClusterSize[4] = 64 bytes (sizeof asserted).
- package/Shaders/Common/SharedData.hlsli: mirrored same layout.
- src/Features/LightLimitFix.cpp:
  * NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT now persists both
    ContactShadow tuning fields (from #43) and ShadowSettings /
    ShowShadowOverlay (from this PR); EnableLightsVisualisation /
    LightsVisualisationMode remain intentionally non-persistent debug
    toggles.
  * GetCommonBufferData() populates contact-shadow params + the new
    ShadowMapSlots field.
  * LoadSettings/SaveSettings keep the ShadowCasterManager INI hooks
    from this PR (dev did not touch these helpers).
  * Dropped the dev-side redundant `static constexpr CLUSTER_MAX_LIGHTS
    / MAX_LIGHTS` globals -- the class statics in LightLimitFix.h are
    the canonical definitions and all callers already use them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
alandtse added a commit that referenced this pull request May 26, 2026
Foveated rendering (high-quality visual-center subrect + stretched
periphery) is an upscaler-agnostic technique — NVIDIA's VRS, Meta's
Quest eye-tracking foveation, Vive Pro 2's FFR all express the same
idea. The DLSS-tied naming was historical, not algorithmic. Following
PR #42's PerfMode generalization precedent, this PR ships the generic
naming with DLSS as the first concrete backend.

Mechanical rename:
- struct DlssEnhancer -> FoveatedRender
- namespace DlssEnhancerImpl -> FoveatedRenderImpl
- Member Upscaling::dlssEnhancer -> foveatedRender
- src/Features/Upscaling/DlssEnhancer{,.{cpp,h}} -> .../FoveatedRender{,.{cpp,h}}
- features/Upscaling/Shaders/Upscaling/DlssEnhancer/ -> .../FoveatedRender/
- Log tag [DLSSENHANCER] -> [FOVEATED]
- Tracy zone + JSON settings key

The DLSS-specific implementation in Modes.cpp / Preprocess.cpp stays
scoped to DLSS this PR. Follow-up PR-3c will:
- Replace Core::ExecuteVRDlssCore(Streamline&, ...) with a backend
  abstraction.
- Implement FSR concrete backend (~150-300 LOC, mostly Modes.cpp).
- Drop the Preprocess non-DLSS early-return; wire FSR's depth-output
  UAV variant of EncodeTexturesCS (already exists in Upscaling.cpp).
- Hoist the Upscaling.cpp route-active gate to fire for kDLSS or kFSR.

No persisted user settings to preserve — PR-3 hasn't shipped.

Co-Authored-By: YtzyFvra <59631290+YtzyFvra@users.noreply.github.com>
alandtse added a commit that referenced this pull request May 27, 2026
Foveated rendering (high-quality visual-center subrect + stretched
periphery) is an upscaler-agnostic technique — NVIDIA's VRS, Meta's
Quest eye-tracking foveation, Vive Pro 2's FFR all express the same
idea. The DLSS-tied naming was historical, not algorithmic. Following
PR #42's PerfMode generalization precedent, this PR ships the generic
naming with DLSS as the first concrete backend.

Mechanical rename:
- struct DlssEnhancer -> FoveatedRender
- namespace DlssEnhancerImpl -> FoveatedRenderImpl
- Member Upscaling::dlssEnhancer -> foveatedRender
- src/Features/Upscaling/DlssEnhancer{,.{cpp,h}} -> .../FoveatedRender{,.{cpp,h}}
- features/Upscaling/Shaders/Upscaling/DlssEnhancer/ -> .../FoveatedRender/
- Log tag [DLSSENHANCER] -> [FOVEATED]
- Tracy zone + JSON settings key

The DLSS-specific implementation in Modes.cpp / Preprocess.cpp stays
scoped to DLSS this PR. Follow-up PR-3c will:
- Replace Core::ExecuteVRDlssCore(Streamline&, ...) with a backend
  abstraction.
- Implement FSR concrete backend (~150-300 LOC, mostly Modes.cpp).
- Drop the Preprocess non-DLSS early-return; wire FSR's depth-output
  UAV variant of EncodeTexturesCS (already exists in Upscaling.cpp).
- Hoist the Upscaling.cpp route-active gate to fire for kDLSS or kFSR.

No persisted user settings to preserve — PR-3 hasn't shipped.

Co-Authored-By: YtzyFvra <59631290+YtzyFvra@users.noreply.github.com>
alandtse added a commit that referenced this pull request May 27, 2026
Foveated rendering (high-quality visual-center subrect + stretched
periphery) is an upscaler-agnostic technique — NVIDIA's VRS, Meta's
Quest eye-tracking foveation, Vive Pro 2's FFR all express the same
idea. The DLSS-tied naming was historical, not algorithmic. Following
PR #42's PerfMode generalization precedent, this PR ships the generic
naming with DLSS as the first concrete backend.

Mechanical rename:
- struct DlssEnhancer -> FoveatedRender
- namespace DlssEnhancerImpl -> FoveatedRenderImpl
- Member Upscaling::dlssEnhancer -> foveatedRender
- src/Features/Upscaling/DlssEnhancer{,.{cpp,h}} -> .../FoveatedRender{,.{cpp,h}}
- features/Upscaling/Shaders/Upscaling/DlssEnhancer/ -> .../FoveatedRender/
- Log tag [DLSSENHANCER] -> [FOVEATED]
- Tracy zone + JSON settings key

The DLSS-specific implementation in Modes.cpp / Preprocess.cpp stays
scoped to DLSS this PR. Follow-up PR-3c will:
- Replace Core::ExecuteVRDlssCore(Streamline&, ...) with a backend
  abstraction.
- Implement FSR concrete backend (~150-300 LOC, mostly Modes.cpp).
- Drop the Preprocess non-DLSS early-return; wire FSR's depth-output
  UAV variant of EncodeTexturesCS (already exists in Upscaling.cpp).
- Hoist the Upscaling.cpp route-active gate to fire for kDLSS or kFSR.

No persisted user settings to preserve — PR-3 hasn't shipped.

Co-Authored-By: YtzyFvra <59631290+YtzyFvra@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants