Files
patterm/Makefile
Harry Bayliss 2f109a84fa Stress-test ASCII video at 30/60/120 fps; fix libghostty-vt Debug build
Added a full ASCII-video benchmark suite that hammers the renderer
with 30 KiB / 70 KiB full-screen frames at 30, 60, and 120 fps
targets — both renderer-only and full-pipeline (em.Write + renderer
+ stdout). Each stream benchmark reports µs/frame, fps_ceiling, and
percent of the per-frame budget consumed.

The pipeline benchmarks revealed we were missing 120 fps by a wide
margin (190%-350% of budget at 120fps, 60-90 fps ceiling). Isolating
em.Write confirmed libghostty-vt is the bottleneck — 16-29 ms per
truecolor frame, library file at 33 MiB.

Root cause: the Makefile invoked `zig build` with no
-Doptimize, and Zig's standardOptimizeOption defaults to Debug. So
the shipped libghostty-vt was unoptimised. Fixed by pinning
ReleaseFast in the Makefile (override via GHOSTTY_VT_OPTIMIZE for
debug builds of the upstream lib).

Existing checkouts need `make clean-deps && make deps` to pick up
the rebuild.
2026-05-15 13:43:31 +01:00

56 lines
2.1 KiB
Makefile

SHELL := /bin/bash
ROOT := $(abspath .)
VENDOR := $(ROOT)/third_party/libghostty-vt
SOURCE := $(VENDOR)/source
INSTALL := $(VENDOR)/install
COMMIT := $(shell cat $(VENDOR)/COMMIT)
.PHONY: deps deps-fetch deps-build clean-deps spike patterm test
# `make deps` fetches and builds libghostty-vt at the pinned commit.
# Re-runs are idempotent on success; touch $(VENDOR)/COMMIT to force a rebuild.
deps: $(INSTALL)/lib/libghostty-vt.a
$(SOURCE)/.git/HEAD:
@echo ">> cloning ghostty-org/ghostty @ $(COMMIT)"
@rm -rf $(SOURCE)
@git clone --filter=blob:none https://github.com/ghostty-org/ghostty.git $(SOURCE)
@cd $(SOURCE) && git checkout --detach $(COMMIT)
deps-fetch: $(SOURCE)/.git/HEAD
# Zig's `standardOptimizeOption` defaults to .Debug when no
# -Doptimize is passed, which makes libghostty-vt's CSI/SGR parser
# an order of magnitude slower — truecolor full-screen frames spend
# ~16-29 ms each in em.Write under Debug (see
# internal/app/bench_test.go BenchmarkEmulator_Write_*), which caps
# the full PTY-to-host pipeline at ~60 fps. ReleaseFast is the
# right default for the shipped artefact. Override with
# `make deps GHOSTTY_VT_OPTIMIZE=Debug` when you actually want a
# debug build of the upstream lib.
GHOSTTY_VT_OPTIMIZE ?= ReleaseFast
$(INSTALL)/lib/libghostty-vt.a: $(SOURCE)/.git/HEAD
@command -v zig >/dev/null || { echo "ERROR: zig not on PATH (need >=0.15.2 to build libghostty-vt)"; exit 1; }
@echo ">> building libghostty-vt with zig (optimize=$(GHOSTTY_VT_OPTIMIZE))"
@cd $(SOURCE) && zig build -Demit-lib-vt -Doptimize=$(GHOSTTY_VT_OPTIMIZE) --prefix $(INSTALL)
@test -f $(INSTALL)/lib/libghostty-vt.a || { echo "ERROR: expected static lib at $(INSTALL)/lib/libghostty-vt.a"; exit 1; }
@echo ">> libghostty-vt installed under $(INSTALL)"
deps-build: $(INSTALL)/lib/libghostty-vt.a
clean-deps:
rm -rf $(SOURCE) $(INSTALL)
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
spike: deps
go build -o ./bin/spike ./cmd/spike
patterm: deps
go build -ldflags "-X main.version=$(VERSION)" -o ./bin/patterm ./cmd/patterm
test: deps
go test ./...