Repository navigation
ghostty-next: pin 12ec155e1 (fork PRs #77, #79): an off-main present commits only a frame it shows - #36036
Conversation
…commits a Core Animation transaction only for a frame it shows FRAME OWNER REFACTOR S4 (cmux-ad m6). Profile 4b41c42c (held keys-stress, motion.frameOwner.terminals on): the largest single cost was 405 ms of CA::Context::commit_transaction on the GPU completion thread per round. The fork's setSurfaceOffMain began and committed a transaction before its checks, so each new-size frame that went through main committed an empty one. Fork #79 (independent review SHIP at 7f2dcbf36; red run 41953548703, green 41953551466) makes the checks first and begins a transaction only for a frame it shows. #77 adds a test and one shared drop rule. GhosttyNextKit xcframework-12ec155e1e67f8f33a1cee5fd2e129f59277465c-apple-v6 (run 41955494921), zip sha256 5defd8f8...30aa7 (SHA256SUMS, the GitHub asset digest and the manifest's commit agree). The switch stays off by default; with it off nothing a person sees changes (a superseded off-main frame no longer commits).
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Shipped in:
|
|
Review (independent subagent): SHIP at a1cf441 I read the code and data myself. I did not build or run Swift or Rust. 1. Pin and gitlink
2. Fork diff from 6cc749a8a to 12ec155e1 (5 commits: dc95e1538, merge ae7c1f741 (#77), 694f7ffb7, 7f2dcbf36, merge 12ec155e1 (#79))
3. Notices and docs
4. Fleet steps at this head
5. PR body
6. CI on the head
Non-blocking
This SHIP is for the pin only. It does not depend on the gate A/B. The A/B decides whether Review (independent subagent): SHIP at a1cf441 |
|
Review (independent subagent): SHIP at 0ba3948 This review replaces my receipt at The new commit (
Fleet steps (both were run at
CI at this head: no check has failed. 64 pass and 22 are pending, including the compile checks. This SHIP is for the pin only. It does not depend on the gate A/B. The A/B decides whether Review (independent subagent): SHIP at 0ba3948 |
This branch still carried the older 6cc749a8a5 gitlink, while Package.swift downloads the xcframework built at 12ec155e1e; the prepush ghostty-pin guardrail refused the push. The branch now matches origin/feat-cmux-next for both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
FRAME OWNER REFACTOR S4 (cmux-ad m6), the next step before the default flip of
motion.frameOwner.terminals. GhosttyNextKit and the ghostty-next gitlink move together from6cc749a8ato12ec155e1onrelease/cmux-9ce9b7d0-e2:setSurfaceOffMainbegan and committed a transaction before its checks. So each frame that went through main (with the switch on, every frame of a new size) committed an empty transaction on the GPU completion thread, against main's own commit. Profile4b41c42c(held keys-stress, switch on) measured 405 ms ofCA::Context::commit_transactionthere in one round; the new IOSurface per size cost only about +100 ms. Reviews: independent subagent SHIP at7f2dcbf36(comment 6647855551).With the switch off (the default), nothing a person sees changes: the only off-path change is that a frame a newer frame superseded no longer commits an empty transaction.
The release:
xcframework-12ec155e1e67f8f33a1cee5fd2e129f59277465c-apple-v6(run 41955494921), zip sha2565defd8f8b83a4fc8a7f74d805be380d5c566702cf35a19c2b92c0adda1730aa7. It agrees with the release's SHA256SUMS, the GitHub asset digest and the manifest's commit. The changed fork files (src/renderer/metal/IOSurfaceLayer.zig,src/renderer/Metal.zig) are not in the libghostty-vt link graph, sovt-link-graph.jsonchanges only its commit.package-notices.jsonnames the new paths (no license file or dependency change).check_ghostty_vt_notices.py --check-link-graphandpackage_notices.py check-datapass at this head.Coordination: the same two commits are merged on the sync line as manaflow-ai/ghostty-next#80 (
706c6963a). cmux #35478 must pin706c6963aor later.Testing
694f7ffb7(run 41953548703: only the new test fails,IOSurfaceLayer.zig:862, expected 0 commits, found 1); green at7f2dcbf36(run 41953551466: 111/111, lib-vt 97/97).6cc749a8aagainst this pin, both from feat4c35e528520with the same bench file (scratch branchesscratch/frame-owner-s4-gate-{old,new}-nomerge), on cmux24-perf, interleaved, 6 rounds, switch OFF and ON in each launch, background CPU per round (a round over 1 s is dropped and named): single pressesb18904f4(new) /6d9dd1c4(old); held keys9acc4c56(new) /efdb32f3(old); profile at this pinf34e6860. Results replace this line.Observed / Not run
prepush-gate.pypasses.a1cf441095c(step50f6ed920256d3914d8f0d46): all 42 suites ran, 224 tests pass, 0 fail. Independent review: SHIP ata1cf441095c(comment 6648707100). Its one finding (the fork doc's conflict note named the old order) is fixed in0ba3948e9e4, a docs-only commit.a1cf441095c(step8a1efc6f628c9a44e6e2d4bc): TerminalKeyResizeFrameTests, TerminalFrameOwnerMainThreadTests and TerminalSurfaceCommitSizeTests pass. Gate A/B: single presses at this pin (b18904f4) pass 4 of 4 rows; the old pin's single run (6d9dd1c4, same day) failed keys and keys-stress. Held keys at this pin (9acc4c56): keys, light and STRESS drag pass; keys-stress still fails (OFF 20 / ON 42 over 4 valid pairs), so the flip stays off. The old pin's held run (efdb32f3) failed keys, STRESS drag and keys-stress. Profile at this pin:f34e6860.0ba3948e9e45against its base4c35e528520(old pin): single-3k, rk-3t and lowprompt-reverse equal within 1 frame in every film, so no new red. held-2 at this head (requeued alone as ab-fixah2, after the first try did not record): terminal frame fails 2/2/0/0 against the base's 2/2/0/0, page frame fails 127/130/79/80 against 124/128/84/81. No new red in any film (STATUS 13726).Frames: terminal: with the switch off (the default), what the person sees in each frame does not change from the old pin
6cc749a8a. With the switch on (not shipped), the frames shown are the same; a frame that goes through main no longer costs an empty transaction on the GPU completion thread.No capture: the change is behind a Debug switch that is off by default, and with it off no frame changes.
Changelog
none