Skip to content

perf: reduce copy operations#2193

Merged
alandtse merged 1 commit into
community-shaders:devfrom
alandtse:perf/vr-reduce-copies
Apr 24, 2026
Merged

perf: reduce copy operations#2193
alandtse merged 1 commit into
community-shaders:devfrom
alandtse:perf/vr-reduce-copies

Conversation

@alandtse
Copy link
Copy Markdown
Collaborator

@alandtse alandtse commented Apr 23, 2026

Summary

Three independent copy eliminations profiled via Tracy, targeting overhead (tested in VR):

  • Zero-copy RCAS sharpening (~214µs saved): Redirect DLSS output to sharpenerTexture so RCAS writes directly to kMAIN.UAV, eliminating a CopyResource round-trip
  • Terrain blending inline CS write (~393µs saved): DepthBlend.hlsl CS writes mainDepth to a UAV (u2, R32_FLOAT) inline, eliminating a separate CopyResource(terrainDepth←mainDepth) before the terrain blending composite pass
  • Depth upscale menu gate (~200µs saved in gameplay): The engine already copies kMAIN→kMAIN_COPY during 3D scene rendering; our extra copy is only needed in non-3D menu contexts (map menu, main menu, loading screen, pause). Gate the copy to only run then

Test plan

  • Build ALL preset
  • Test RCAS sharpening in VR — visually identical output
  • Test terrain blending — no regression in depth-based landscape blending
  • Test in map menu / loading screen — no depth artifact regression

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Refactor
    • Improved terrain depth blending for more accurate surface-depth transitions and reduced artifacts.
    • Streamlined upscaling and sharpening to avoid unnecessary copies, lowering latency and improving frame stability.
    • Adjusted upscaling/DLSS output flow to better support sharpening and VR paths, improving visual consistency and performance.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 23, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 27990d55-ff93-46b7-8743-ec7f795d9464

📥 Commits

Reviewing files that changed from the base of the PR and between 5119906 and 4a6e7da.

📒 Files selected for processing (5)
  • features/Terrain Blending/Shaders/TerrainBlending/DepthBlend.hlsl
  • src/Features/TerrainBlending.cpp
  • src/Features/TerrainBlending.h
  • src/Features/Upscaling.cpp
  • src/Features/Upscaling/Streamline.cpp
🚧 Files skipped from review as they are similar to previous changes (1)
  • features/Terrain Blending/Shaders/TerrainBlending/DepthBlend.hlsl

📝 Walkthrough

Walkthrough

Terrain blending now writes a main-depth snapshot inline from the compute shader to a new UAV; upscaling sharpening and DLSS output paths were refactored to avoid intermediate CopyResource operations and to conditionally skip depth copies in certain UI/paused contexts.

Changes

Cohort / File(s) Summary
Terrain blending shader + runtime
features/Terrain Blending/Shaders/TerrainBlending/DepthBlend.hlsl, src/Features/TerrainBlending.h, src/Features/TerrainBlending.cpp
Added MainDepthCopy UAV (u2) and mainDepthCopy Texture2D member; compute shader now writes an R32_FLOAT main-depth snapshot inline and dispatch binds three UAVs. Removed CPU CopyResource depth copy and updated PS binding to read the snapshot.
Upscaling — sharpening & depth copy control
src/Features/Upscaling.cpp, src/Features/Upscaling/Streamline.cpp
Made main-depth copy conditional (menu/pause contexts only). Changed sharpening to write directly into main UAV (zero-copy) and route DLSS output to sharpener texture when RCAS sharpening enabled; adjusted DLSS output selection and flow for VR/non-VR paths.

Sequence Diagram(s)

sequenceDiagram
    participant CS as Compute Shader (DepthBlend)
    participant MainSRV as Main Depth (SRV)
    participant TerrainSRV as Terrain Depth (SRV)
    participant MainCopyUAV as MainDepthCopy (UAV u2)
    participant BlendUAV as Blended Depth (UAV)

    CS->>MainSRV: Sample mainDepth
    CS->>TerrainSRV: Sample terrainDepth
    CS->>MainCopyUAV: Write mainDepth snapshot
    CS->>BlendUAV: Write mixedDepth (min(main, terrain))
Loading
sequenceDiagram
    participant App as Application
    participant DLSS as DLSS Upscaler
    participant Sharp as Sharpening Pipeline
    participant MainUAV as Main Texture (UAV)
    participant SharpTex as Sharpener Texture

    App->>DLSS: Upscale frame
    alt RCAS sharpening && sharpenerTexture available
        DLSS->>SharpTex: Write DLSS output (sharpener)
        Sharp->>MainUAV: Sharpen into main (direct UAV write)
    else
        DLSS->>MainUAV: Write DLSS output directly into main
    end
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly Related PRs

Suggested Reviewers

  • doodlum

Poem

🐰
I hop where shaders softly write,
Depth snapshots captured in the night,
No CPU copying slows the run,
Sharpening leaps—zero-copy fun,
Tiny paws, big GPU delight. 🥕✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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.
Title check ✅ Passed The title 'perf: reduce copy operations' is a concise, accurate summary of the main objective: eliminating three redundant copy operations to improve performance.
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.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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
Contributor

@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.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/Features/Upscaling.cpp (1)

1980-2007: Zero-copy RCAS path looks correct; please confirm sharpenerTexture lifetime matches the DLSS UAV write in Streamline::Upscale.

The early-out on !main.UAV (Line 1998) is a nice safety net, and the direction of data flow (DLSS → sharpenerTexture SRV → RCAS → main.UAV) aligns with the companion change in Streamline::Upscale. A couple of things worth confirming:

  • sharpenerTexture is created only in the DLSS branch of CreateUpscalingTextureResources (Line 696-714) and destroyed in the non-DLSS branch of DestroyUpscalingTextureResources (Line 754-761). ApplySharpening is only invoked when upscaleMethod == kDLSS (Line 2042-2043), so the null-check on sharpenerTexture at Line 1988 should never fire in steady state — good.
  • Per the PR summary (~214 µs saved), the critical invariant is that DLSS actually wrote into sharpenerTexture this frame. In Streamline::Upscale the selector is sharpnessDLSS > 0.0f && upscaling.sharpenerTexture, while here the selector is settings.sharpnessDLSS <= 0.0f → return. If sharpenerTexture exists but is null-checked differently across the two files (e.g., sharpnessDLSS == 0.0f vs <= 0.0f vs FP edge cases like NaN/negative), the two paths can diverge: DLSS would write to a_upscalingTexture (= main.texture) while RCAS would read from a stale sharpenerTexture. Consider centralizing the "should sharpen" predicate so both call sites cannot drift.
  • Barrier/hazard: DLSS writes sharpenerTexture via Streamline (likely leaves it bound as UAV or in an indeterminate state). Then RCAS reads sharpenerTexture->srv and writes main.UAV. D3D11 will auto-unbind conflicting views, but please verify with Tracy/PIX that there isn't a residual UAV binding on main.UAV left over from DLSS's internal pipeline that would force an implicit state transition and negate the win.
♻️ Optional: extract a single "sharpen active" predicate so both files share it
+// In Upscaling.h
+bool IsDLSSSharpeningActive() const { return settings.sharpnessDLSS > 0.0f && sharpenerTexture != nullptr; }

Then use upscaling.IsDLSSSharpeningActive() in both Streamline::Upscale and Upscaling::ApplySharpening.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Features/Upscaling.cpp` around lines 1980 - 2007, The DLSS-sharpening
predicate can drift between Streamline::Upscale and Upscaling::ApplySharpening
causing stale reads; create a single predicate method (e.g.,
Upscaling::IsDLSSSharpeningActive()) that checks
std::isfinite(settings.sharpnessDLSS) && settings.sharpnessDLSS > 0.0f &&
sharpenerTexture != nullptr (and any "was written this frame" flag if you have
one), then replace the separate checks in ApplySharpening and
Streamline::Upscale with calls to IsDLSSSharpeningActive(); also audit
CreateUpscalingTextureResources and DestroyUpscalingTextureResources to ensure
sharpenerTexture lifetime matches that predicate.
src/Features/Upscaling/Streamline.cpp (1)

615-654: VR SBS extent alignment is correct; update non-VR comment to reflect conditional colorOut redirection.

  1. VR FinalizePerEyeOutputs extents: The per-eye output copies land in the correct SBS regions. sharpenerTexture inherits full SBS dimensions from main.texture, and FinalizePerEyeOutputs copies each eye to the correct offset (offsetXOut = 0 for left, eyeWidthOut for right). RCAS then processes the full SBS width (line 50: screenWidth = state->screenSize.x), so the layout is sound.

  2. Predicate gates are consistent: The sharpnessDLSS > 0.0f && sharpenerTexture selector in Streamline (line 619) and the return guards in ApplySharpening (lines 1985–1989) are logically symmetric—both activate together and deactivate together. No drift risk.

  3. Non-VR comment (line 646) is misleading as written. It should note that colorOut is conditionally redirected for RCAS zero-copy:

Suggested comment update
-		// Non-VR: Simple full-texture upscale.
+		// Non-VR: Full-texture upscale with conditional colorOut redirection for RCAS sharpening.

The optional refactor (shared IsDLSSSharpeningActive() helper) remains defensible as a best practice, though the current dual guards are not immediately problematic.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Features/Upscaling/Streamline.cpp` around lines 615 - 654, The non-VR
branch comment is misleading about output behavior—update the comment above the
non-VR path in Streamline.cpp to state that colorOut may be conditionally
redirected to upscaling.sharpenerTexture when upscaling.settings.sharpnessDLSS >
0.0f and upscaling.sharpenerTexture exists (see the colorOut selector where it
chooses between upscaling.sharpenerTexture->resource.get() and
a_upscalingTexture) so that RCAS can perform zero-copy sharpening; reference
EvaluateDLSS(...) and the colorOut variable and mention the symmetry with
ApplySharpening guards (upscaling.settings.sharpnessDLSS and
upscaling.sharpenerTexture) or replace the comment with a brief note that non-VR
uses a full-texture upscale but output may be redirected for DLSS sharpening.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/Features/Upscaling.cpp`:
- Around line 1917-1926: The menu-gated copy may let depthCopy be stale across
transitions; add a stale-frame detection and force a copy when needed: introduce
a frame-tracking variable (e.g., lastDepthCopyFrame) updated wherever
kMAIN→kMAIN_COPY is explicitly copied (including the VR path code path that
currently copies after upscaling), then in UpscaleDepth (or where depthCopy is
sampled) compare against the current frame counter and call
copyIfNonAliased(depthCopy.texture, depth.texture) when lastDepthCopyFrame !=
currentFrame; also ensure any existing unconditional copies (VR branch) update
lastDepthCopyFrame so all copy paths are tracked.

---

Nitpick comments:
In `@src/Features/Upscaling.cpp`:
- Around line 1980-2007: The DLSS-sharpening predicate can drift between
Streamline::Upscale and Upscaling::ApplySharpening causing stale reads; create a
single predicate method (e.g., Upscaling::IsDLSSSharpeningActive()) that checks
std::isfinite(settings.sharpnessDLSS) && settings.sharpnessDLSS > 0.0f &&
sharpenerTexture != nullptr (and any "was written this frame" flag if you have
one), then replace the separate checks in ApplySharpening and
Streamline::Upscale with calls to IsDLSSSharpeningActive(); also audit
CreateUpscalingTextureResources and DestroyUpscalingTextureResources to ensure
sharpenerTexture lifetime matches that predicate.

In `@src/Features/Upscaling/Streamline.cpp`:
- Around line 615-654: The non-VR branch comment is misleading about output
behavior—update the comment above the non-VR path in Streamline.cpp to state
that colorOut may be conditionally redirected to upscaling.sharpenerTexture when
upscaling.settings.sharpnessDLSS > 0.0f and upscaling.sharpenerTexture exists
(see the colorOut selector where it chooses between
upscaling.sharpenerTexture->resource.get() and a_upscalingTexture) so that RCAS
can perform zero-copy sharpening; reference EvaluateDLSS(...) and the colorOut
variable and mention the symmetry with ApplySharpening guards
(upscaling.settings.sharpnessDLSS and upscaling.sharpenerTexture) or replace the
comment with a brief note that non-VR uses a full-texture upscale but output may
be redirected for DLSS sharpening.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: abbd9064-e708-4521-b159-a6978bc10958

📥 Commits

Reviewing files that changed from the base of the PR and between 6d5be8f and 5119906.

📒 Files selected for processing (5)
  • features/Terrain Blending/Shaders/TerrainBlending/DepthBlend.hlsl
  • src/Features/TerrainBlending.cpp
  • src/Features/TerrainBlending.h
  • src/Features/Upscaling.cpp
  • src/Features/Upscaling/Streamline.cpp

Comment thread src/Features/Upscaling.cpp
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 23, 2026

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

@alandtse
Copy link
Copy Markdown
Collaborator Author

@coderabbitai does this impact nonVR at all?

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check Streamline.cpp for VR guards around the changed sharpening logic
rg -n "REL::Module|IsVR|VR|sharpener|sharpness|colorOut|FinalizePerEye" src/Features/Upscaling/Streamline.cpp -C2

echo "---UPSCALING_CPP---"
# Check Upscaling.cpp for VR guards around UpscaleDepth and ApplySharpening
rg -n "REL::Module|IsVR|VR|kMAIN_COPY|UpscaleDepth|ApplySharpening|sharpenerTexture|CopyResource" src/Features/Upscaling.cpp -C3

echo "---TERRAINBLENDING_CPP---"
# Check TerrainBlending.cpp for VR guards
rg -n "REL::Module|IsVR|VR|mainDepthCopy|CopyResource|BlendPrepass|UAV|u2" src/Features/TerrainBlending.cpp -C3

echo "---TERRAINBLENDING_FEATURE---"
# Check if TerrainBlending is flagged as VR-only
rg -n "VR|IsVR|REL::Module" src/Features/TerrainBlending.h -C2
rg -n "VR|IsVR|REL::Module" src/Features/TerrainBlending.cpp -C2 | head -60

Length of output: 438


🏁 Script executed:

#!/bin/bash
fd -i "Streamline.cpp" --type f
fd -i "TerrainBlending.cpp" --type f
fd -i "Upscaling.cpp" --type f
fd -i "TerrainBlending.h" --type f

Length of output: 0


🏁 Script executed:

#!/bin/bash
gh pr diff 2193 --repo doodlum/skyrim-community-shaders

Length of output: 9097


@alandtse Yes, all three changes affect non-VR as well — none of them are gated on globals::game::isVR:

  1. RCAS sharpening (Streamline.cpp + Upscaling.cpp): The colorOut redirect is computed unconditionally, and the non-VR EvaluateDLSS branch also receives colorOut as the output destination when sharpening is active. ApplySharpening() has no VR guard either — SE/AE also benefits from the zero-copy path.

  2. Terrain blending inline CS write (TerrainBlending.cpp + shader): No isVR guard anywhere in the diff. SE/AE also gets the inline mainDepthCopy UAV write and loses the CopyResource(terrainDepth ← mainDepth) call — a perf win for all platforms.

  3. Depth upscale menu gate (Upscaling.cpp UpscaleDepth): The gate checks isMapMenuOpen, isMainMenuOpen, isLoadingMenuOpen, and GameIsPaused() — none are VR-specific. SE/AE also skips the unnecessary kMAIN → kMAIN_COPY copy during non-3D menu contexts.

In short, all three are cross-platform perf improvements; VR just sees a proportionally larger gain because of the stereo buffer overhead being doubled there (D24S8 copy at full SBS resolution, etc.).


🧠 Learnings used
Learnt from: vrnord
Repo: doodlum/skyrim-community-shaders PR: 1982
File: package/Shaders/Lighting.hlsl:3089-3095
Timestamp: 2026-03-16T13:13:11.490Z
Learning: In `package/Shaders/Lighting.hlsl` (doodlum/skyrim-community-shaders), the `TREE_ANIM` alpha test path intentionally uses a hardcoded `0.1` floor check (`if (alpha < 0.1) discard;`) and `AlphaTestRefRS` rather than `SharedData::VRAlphaTestThreshold`. `VRAlphaTestThreshold` is wired into `DistantTree.hlsl` and `RunGrass.hlsl` only. The threshold wiring for `Lighting.hlsl`'s `TREE_ANIM` path is deferred to a separate VR foliage PR.

Learnt from: alandtse
Repo: doodlum/skyrim-community-shaders PR: 2084
File: src/ShaderCache.cpp:1646-1649
Timestamp: 2026-04-10T07:34:27.849Z
Learning: In `src/ShaderCache.cpp` (doodlum/skyrim-community-shaders PR `#2084`), `GetImagespaceShaderDescriptor` intentionally returns `false` for VR when a shader is not reverse-engineered. Returning `false` causes `ResolveImageSpaceDescriptor` to return `false`, which makes all callers (GetVertexShader, GetPixelShader, GetComputeShader, CompileShader) skip custom shader handling and defer to the vanilla shader. This is the correct pattern for un-RE'd imagespace shaders on VR — do not flag it as "skipping all custom VR handling" or suggest gating on HDR feature state.

Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-25T04:43:36.075Z
Learning: Applies to src/Features/**/*.{h,hpp,cpp,hlsl} : Consider GPU workload and performance impact when implementing graphics features, with special attention to shader compilation and runtime performance

Learnt from: vrnord
Repo: doodlum/skyrim-community-shaders PR: 1982
File: src/Features/VR/StereoBlend.cpp:98-109
Timestamp: 2026-03-16T13:13:31.383Z
Learning: In `src/Features/VR/StereoBlend.cpp` (doodlum/skyrim-community-shaders), debug modes 4/5 ("Overwrite", "Overwrite Eye1") in the `StereoBlendDebugMode` selector are NOT separate shader variants. They use the same `stereoBlendOverwriteCS` shader with different cbuffer parameters. When `vrStereoOptActive` is true, `stereoBlendOverwriteCS` is always selected unconditionally and `StereoBlendDebugMode` values 4/5 do not map to any distinct code path.

Learnt from: vrnord
Repo: doodlum/skyrim-community-shaders PR: 2003
File: features/Upscaling/Shaders/Upscaling/DepthUpscalePS.hlsl:55-61
Timestamp: 2026-03-24T04:30:32.809Z
Learning: In `features/Upscaling/Shaders/Upscaling/DepthUpscalePS.hlsl` (doodlum/skyrim-community-shaders PR `#2003`), the shader is dispatched per-eye using per-eye dimensions (DstWidth/DstHeight). The UV (`input.TexCoord`) is derived from `dispatchID / DstDim`, which is already eye-local — not full SBS/packed stereo coordinates. The per-eye UV clamping logic (isRight, halfScale) operates entirely in eye-local space, and there is no stereo seam issue. Do not flag SBS seam concerns for this shader.

Learnt from: Dlizzio
Repo: doodlum/skyrim-community-shaders PR: 2000
File: src/WeatherEditor/EditorWindow.cpp:1271-1274
Timestamp: 2026-03-22T18:40:49.633Z
Learning: Repo: doodlum/skyrim-community-shaders — Maintainer preference (PR `#2000` on 2026-03-22): In src/WeatherEditor/EditorWindow.cpp within EditorWindow::RenderUI, keep `resetLayout = false;` at the end of the frame (after PaletteWindow::Draw). The reset is intentionally one-shot for windows rendered that frame; closed windows are allowed to reopen with their previous geometry. Do not move the clear later or broadcast resets to closed windows.

Learnt from: SkrubbySkrubInAShrub
Repo: doodlum/skyrim-community-shaders PR: 2143
File: src/WeatherEditor/WeatherUtils.cpp:35-41
Timestamp: 2026-04-18T12:20:45.316Z
Learning: In doodlum/skyrim-community-shaders (PR `#2143`), `WeatherUtils::TexturePath::BuildResourcePath` in `src/WeatherEditor/WeatherUtils.cpp` is intentionally designed for relative texture paths only (no leading `textures\\` prefix). Callers always supply prefix-free paths, so the `"Textures\\"` prepend never produces duplicate segments.

Learnt from: vrnord
Repo: doodlum/skyrim-community-shaders PR: 2002
File: package/Shaders/VRStereoOptimizations/StencilCS.hlsl:97-143
Timestamp: 2026-03-24T05:34:21.730Z
Learning: In `package/Shaders/VRStereoOptimizations/StencilCS.hlsl` (doodlum/skyrim-community-shaders PR `#2002`), `EdgeWidth` has been fully removed as a setting. The edge detection search width is hardcoded to `kInnerWidth = 2` with `maxWidth = kInnerWidth`. Do not flag EdgeWidth as a dead/unused parameter — it no longer exists in `VRStereoOptParams` or `cbuffers.hlsli` in this PR.

Learnt from: Dlizzio
Repo: doodlum/skyrim-community-shaders PR: 1950
File: package/Shaders/Lighting.hlsl:2008-2012
Timestamp: 2026-03-07T00:53:21.267Z
Learning: In doodlum/skyrim-community-shaders PR `#1950`, the maintainer (Dlizzio) confirmed that per-axis normal reorientation for triplanar-projected normals/detail in package/Shaders/Lighting.hlsl is not required for their use case; the current approach intentionally mixes samples without axis-specific swizzle/sign correction.

Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-25T04:43:36.075Z
Learning: Applies to src/**/*.{h,hpp,cpp} : Ensure code changes work across SE/AE/VR Skyrim variants using runtime detection and `REL::RelocateMember()` patterns for compatibility

- Zero-copy RCAS: redirect DLSS output to sharpenerTexture so RCAS
  writes directly to kMAIN.UAV, eliminating a ~214µs CopyResource
- Terrain blending: DepthBlend CS writes mainDepth inline to u2
  (R32_FLOAT UAV), eliminating a CopyResource(terrainDepth←mainDepth)
  of ~393µs
- Depth upscale: gate kMAIN→kMAIN_COPY copy to non-3D menu contexts
  only; the engine already does this copy during gameplay (~200µs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@alandtse alandtse changed the title perf(VR): reduce copy operations perf: reduce copy operations Apr 24, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{}

@alandtse alandtse force-pushed the perf/vr-reduce-copies branch from 5119906 to 4a6e7da Compare April 24, 2026 08:21
@alandtse alandtse merged commit d4fef8b into community-shaders:dev Apr 24, 2026
15 checks passed
@alandtse alandtse deleted the perf/vr-reduce-copies branch April 24, 2026 08:55
ParticleTroned added a commit to ParticleTroned/skyrim-community-shaders that referenced this pull request May 2, 2026
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.

2 participants