Skip to content

deps: pick up go-widgets/window v0.77.0, so DamageRects finally does something - #293

Merged
tannevaled merged 1 commit into
mainfrom
damage-present-that-pays
Sep 12, 2026
Merged

tannevaled merged 1 commit into
mainfrom
damage-present-that-pays

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

Why

app/damage.go has reported which rectangles changed since it was written, and
on macOS it bought nothing — not because of anything here, but because the
Cocoa backend converted the whole framebuffer to a CGImage on every present
whatever the invalid region said. The report narrowed the blit and left the
cost where it was.

Measured on another consumer of the same backend: 26.2% of a core without
damage reporting, 26.8% with it.

go-widgets/window
v0.77.0 converts only the
changed rows, so the report now reaches something that acts on it. Measured
there, three alternating pairs on a window repainting a small region every
frame at 60 Hz:

without with
1 32.2% 14.1%
2 39.5% 15.3%
3 42.4% 24.3%

Every pair the same way round.

The gate in DamageRects — diff only on an animation-only frame — is untouched
and remains right: on a content frame most of the surface changed anyway, and
scanning to discover that is overhead over a single full present.

What this moves

Wider than the one module asked for, so it is listed rather than left to the
lockfile:

module
go-widgets/toolkit v0.305.0 v0.316.0
go-widgets/window v0.64.0 v0.77.0
go-macos/appkit v0.1.0 v0.5.0
go-macos/objc v0.9.1 v0.10.2
go-gtk/gtk4 v0.3.0 v0.6.0
ebitengine/purego v0.10.2 v0.11.0

Verified, and not

Verified: build, vet and the whole suite (27 packages) on darwin, and
nr-build produces a signed bundle.

Not verified: the runtime behaviour of the AppKit binding jump. CI runs on
ubuntu and the test lists exclude internal/window, so no lane executes that
path — and this change was not run on a device. The two macOS binding bumps are
the ones to watch if something misbehaves.

🤖 Generated with Claude Code

…something

app/damage.go has reported which rectangles changed since it was written, and
on macOS it bought nothing — not because of anything here, but because the
Cocoa backend converted the WHOLE framebuffer to a CGImage on every present
whatever the invalid region said. The report narrowed the blit and left the
cost where it was. Measured on another consumer of the same backend: 26.2% of
a core without damage reporting, 26.8% with it.

go-widgets/window v0.77.0 converts only the changed rows, so the report now
reaches something that acts on it. Measured there, three alternating pairs on
a window repainting a small region every frame at 60 Hz: 32.2/39.5/42.4% of a
core without, 14.1/15.3/24.3% with. Every pair the same way round.

The gate in DamageRects — diff only on an animation-only frame — is untouched
and remains right: on a content frame most of the surface changed anyway, and
scanning to discover that is overhead over a single full present.

WHAT THIS MOVES, since it is wider than the one module asked for:

    go-widgets/toolkit   v0.305.0 -> v0.316.0
    go-widgets/window    v0.64.0  -> v0.77.0
    go-macos/appkit      v0.1.0   -> v0.5.0
    go-macos/objc        v0.9.1   -> v0.10.2
    go-gtk/gtk4          v0.3.0   -> v0.6.0
    ebitengine/purego    v0.10.2  -> v0.11.0

WHAT IS VERIFIED: build, vet and the whole suite (27 packages) on darwin, and
nr-build produces a signed bundle.

WHAT IS NOT: the runtime behaviour of the AppKit binding jump. CI runs on
ubuntu and the test lists exclude internal/window, so no lane executes that
path — and this change was not run on a device. The two macOS binding bumps
are the ones to watch if something misbehaves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@tannevaled
tannevaled merged commit 83c383a into main Sep 12, 2026
13 checks passed
@tannevaled
tannevaled deleted the damage-present-that-pays branch September 12, 2026 08:19
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.

1 participant