×ばつ1049 timeline squashed into ×ばつ432. What is in it 8dcd8e6e Price the existing resize step, and add tools/gpu-image-fixture — the only vehicle that can reach the texture ceiling, because every showcase app on Windows draws zero bitmaps. ab77da31 Create the D3D11/D2D1.1 device stack. 38984652 Present through a DXGI flip-model swap chain. A regression on its own — 3.23 → 3.66 ms — and the setup for the next commit. 54799796 Keep the texture cache across a resize. Upload 1.51 → 0.00 ms. 1bee7997 Copy and present only the damaged region. 4018a3d8 Rebuild the whole stack on device loss. 6e90ea39 Pin the flip-model invariants, retire the GDI ones. 9de236e0 Identify surfaces in the profile log. c1501246 Allocate swap buffers on a 128 px grid and let SCALING_NONE crop them, so a drag stops calling ResizeBuffers every step. 7c4aef36, 69137cec, 948d39a8 Profiler arguments; link d3d11/dxgi where the renderer now needs them. 90f4b76e Stamp every profile line with the monotonic clock. Per-event durations cannot express how far apart a surface's consecutive frames land, which is the question a resize actually poses. 5cf804e4 Anchor a resized surface's retained image instead of stretching it. The last two are new since the previous revision. readColorAt had to move with the target: it read pixels through ID2D1GdiInteropRenderTarget::GetDC, which requires the backing surface to be GDI_COMPATIBLE, and that flag lives on the CreateCompatibleRenderTarget call this deletes. Results Fixture at the 16 MiB texture ceiling, three runs each way, per resize step: before after image upload 1.51 ms 0.00 ms blit 1.79 ms 0.42 ms blit p90 1.30 ms 0.31 ms Present 0.41 ms 0.14 ms buffer allocations over the sweep 82 13 The anchoring commit is free: an interleaved 6-round A/B against the same build without it measured a median of 267 Hz against 259 Hz, and narrowed the spread (255–279 against 210–299). Treat any single sweep as noise — the same binary measured six times in one sitting ranged 210–299 Hz. Three things worth a reviewer's attention The swap chain alone is a regression, and structurally so. Reading 38984652's numbers in isolation reads as a failed migration; it is the setup for 54799796, which is where the win is. SetSourceSize is deliberately absent. DXGI documents it as "an effective resize without calling the more-expensive ResizeBuffers", which is exactly this job — but paired with DXGI_SCALING_NONE it renders a surface whose buffer is much taller than its window (a 38 px header rounded up to a 128 px buffer) as a fragment at the top-left on a field of background colour. It also measured as worth nothing: 0.428 ms against 0.426 ms per step. A test pins the call absent, not the type name, so the comment explaining why cannot satisfy its own pin. Anchoring keeps a sub-pixel escape hatch, per axis. The backing surface is sized from the packet (ceil(logical * scale)) and the swap chain from GetClientRect, so at fractional DPI the two differ by a pixel indefinitely — 44% of paints in the measured sweep. Anchoring that would leave a permanent hairline of cleared pixels down two edges, so a disagreement within one device pixel still scales and only a larger one anchors. Validation Full suite on Windows, against pristine main at the same commit as the control: steps tests failed main b25cefe 478/481 3277/3333 4 this branch 478/481 3280/3336 4 — identical set Net +3 passing tests, no new failures. The four are pre-existing on main on a Windows host; two of them are macOS DMG packaging tests that cannot pass there at all. 🤖 Generated with Claude Code">
You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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
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
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
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
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
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
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
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
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
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
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
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
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.