Repository navigation
feat(core): motion blur preview draws fewer filter copies at lower preview quality - #7547
Merged
Merged
Conversation
…eview quality The filter tier's preview draws 16 copies at preview quality 1/2 and 8 at 1/4 and below; renders keep 32. Preview facts now list those levels in lighterAt once the filter tier has movers, so a host that steps quality down on choppy playback can do so for a film whose only load is blur. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Contributor
There was a problem hiding this comment.
Verdict: APPROVE · 0 blocker · 0 important · 0 nits · head 961dfb6
Preview taps follow the level, renders stay at 32 (engineMode), and planFilter's step-sized softening scales with the wider gaps between copies on its own. CI is green on this head.
Scope
- Read all 5 files end to end, plus
filterPlan.ts,frames.ts/tapsFromReads,mediaProxy.setPreviewQuality, and the Desktop step-down consumer (QualityToast.tsxonChoppy→lighterBelow). - Rebuilding the layer in place (
layerOfremoves the old<filter>and builds a new one under the same id): I checked this in Chromium headless-shell 1237. An element styledfilter: url(#hf-mb-0)picks up the replacement filter on the next frame without its style being touched. lighterAt: Desktop only asks for facts when playback turns choppy. By then a paint has run discovery, so themovers > 0gate is satisfied. At 1/4 only videos can list 1/8, which matches 8 copies at both levels.- One thing to watch after the pin bump: the step-down still falls back to
busywhen long main-thread frames reach 50% or more. On a film with many movers, the filter tier's per-frame pose reads count toward that share, so check Desktop'sstepDownDeclined()on a blur-heavy film.
— Genesis
This was referenced Nov 11, 2026
Merged
Merged
4 of 6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Motion blur's filter tier now follows the host's preview quality. In preview it draws 32 offset copies per mover at Full, 16 at 1/2, and 8 at 1/4 and 1/8. Renders (
engineMode) always draw 32. The level arrives through the existingset-preview-qualitybridge message, which already drives the lighter video copies.The runtime's preview facts also change.
lighterAtused to list only levels where a heavy video gets a lighter copy. It now also lists 1/2 and 1/4 once the filter tier is on and has movers. Hosts such as HyperFrames Desktop step quality down on choppy playback only to a level listed inlighterAt. Without this, a film whose only load is blur was never stepped down (no_lighter).Why
On GPU Chrome, preview lag with blur on comes from the GPU process rasterizing each mover's SVG filter: 32
feOffsetand 31 arithmeticfeComposite. Cost grows with the number of movers moving at once. On a 60 Hz headless Chrome 157 (M4 Pro), 3 interleaved reps, fps with blur off, then 32 / 16 / 8 copies:The machine was loaded (load average 45 to 92), so only the order of the arms is quotable, not the absolute fps.
Picture quality was scored against a sub-frame reference: the blur-off film averaged over 32 instants across the shutter. The measure is the engine oracle's worst 16 px tile;
thresholds.tsputs the smallest real symptom at 14.47.feGaussianBlurwas also tested and rejected: worse on every kind of motion, and it still costs GPU time for each mover.Preview and render
At 1/2 and below, preview and render differ by the numbers above. The motion blur guide now says so. The capture tier is unchanged.
Tests
captureMotionBlur/index.test.ts: 16 copies at 1/2, 8 at 1/8, 32 for an engine frame, andlighterAtlevels only once movers are found. It fails if the preview tap count is reverted.captureMotionBlurtests pass.typecheck,oxlintandoxfmtpass.Rollout
Desktop picks this up after the next OSS release and a pin bump. No Desktop code change is needed: the quality row and the auto step-down already send the level.
🤖 Generated with Claude Code