Releases: tanrax/emacs-gpu
v0.4.2
emacs-gpu 0.4.2
Stability release for the GNU/Linux OpenGL backend: the buffer-switch
flicker is gone and all continuous animation now runs off a single,
bounded pump.
Fixed
- One-frame flashes of old content when switching buffers. The
flashed frame turned out not to come from the GL swapchain at all:
it was the frame's XDBE back buffer, which keeps the last core-X
render (the half-painted startup frame) forever once the GPU path
takes over, and which an Expose event could swap on screen for one
vblank. The backend now drops the back buffer when it owns the frame.
Verified against the actual monitor scanout (kmsgrab at 60fps, 152
buffer switches with cross-fades): zero anomalous frames, where the
same soak previously detected dozens.
Changed
- Single animation pump. Cursor effects, buffer cross-fades and
inline video used to run on separate timers, each presenting on its
own; together they could push presents well above the refresh rate,
starving the Lisp timers and provoking driver-level stale-buffer
glitches. One pump now advances everything and presents at most once
per tick (60Hz while a fade runs, 30Hz otherwise, idle when nothing
animates). Inline video plays at its native frame rate again (tick
median 33.0ms; it used to slip to ~49ms under load). - The old per-subsystem primitives (
gpu-anim-tick,
gpu-transition-tick,gpu-video-tick) keep working;gpu-video-tick
now only presents when there is a fresh frame or the rectangle moved.
The Metal (macOS) driver shares the pump consolidation; the XDBE fix is
X11-specific.
Downloads
emacs-gpu-0.4.2-macos-arm64.zip: macOS 13+ (Apple Silicon), signed
and notarized, with native compilation (AOT) and tree-sitter. Unzip
and drag to Applications, orbrew install --cask tanrax/tap/emacs-gpu.emacs-gpu_0.4.2_amd64.ubuntu24.04.deb: Ubuntu 24.04+ / Mint 22+.emacs-gpu_0.4.2_amd64.debian12.deb: Debian 12 (bookworm).
Both include tree-sitter, native compilation (AOT) and the GStreamer
video path; they install as /usr/bin/emacs and conflict with the
distro emacs packages. EMACS_GPU_DISABLE=1 starts with the stock CPU
renderer.
Compared to the v0.4.0 macOS app, this build also picks up the image
texture-cache validation fix (cached textures are revalidated by image
spec, not pointer identity).
v0.4.1
emacs-gpu 0.4.1
Bugfix release for the GNU/Linux OpenGL backend.
Fixed
- Black flicker with stale text during window resizes. The 0.4.0
partial present cached the EGL surface size; when the window manager
resized the window before Emacs processed the ConfigureNotify, the
present blitted at the stale size into a freshly reallocated buffer,
leaving an undefined (usually black) band beside the previous frame's
content for a frame. The surface size is now re-validated whenever
the buffer age cannot vouch for it, and a failed swap no longer
desynchronizes the damage-tracking ring.
Reproduced and verified in a composited X session driven end to end
(typing, held arrows, wheel scrolling, mouse drags, buffer cross-fades,
window splits, isearch, text-scale, WM resizes, occlusion): one black
flash during resizes before the fix, zero dark or duplicated-content
frames after it.
Downloads
emacs-gpu_0.4.1_amd64.ubuntu24.04.deb: Ubuntu 24.04+ / Mint 22+.emacs-gpu_0.4.1_amd64.debian12.deb: Debian 12 (bookworm).
Both include tree-sitter, native compilation (AOT) and the GStreamer
video path; they install as /usr/bin/emacs and conflict with the
distro emacs packages. EMACS_GPU_DISABLE=1 starts with the stock CPU
renderer.
The macOS app is unchanged from v0.4.0 (this bug is specific to the
OpenGL present path).
v0.4.0
emacs-gpu 0.4.0
The GNU/Linux backend arrives, and both backends get a much faster draw path.
GNU/Linux (OpenGL ES / EGL) — new
- Full OpenGL backend behind the same neutral driver layer as Metal:
text (CJK/BiDi/compositions/emoji), faces and decorations, fringes,
images (PNG/JPEG/SVG/GIF), mode/tab lines, the four cursor types —
pixel-accurate against the stock GTK/cairo renderer across a
22-scenario parity suite. - Inline video via GStreamer (
gpu-video-insert,gpu-video-mode). - Buffer-switch cross-fade and all the animated cursor effects
(sonicboom, torpedo, spring, ripple, pixiedust, hollow, beam). - Build from source on any X11 distro:
./configure --with-gpu
(Debian/Ubuntu package list in the README).
Performance (both backends)
- Glyphs and solid fills now share one batched draw call, clipped on
the CPU: full-frame redraws on Linux are now faster than the cairo
backend (1.19x) on the integrated-GPU test machine; page scroll is
at parity. At 4K the GPU leads every motion workload (1.8x-11.5x). - The OpenGL present blits only the damaged region, driven by
EGL_EXT_buffer_age + eglSwapBuffersWithDamage (on by default,
correct under any compositor). - Metal gets the same batched draw path (byte-identical output) plus a
fringe-bitmap texture cache that also fixes a small memory leak.
Downloads
emacs-gpu-0.4.0-macos-arm64.zip: macOS app (arm64, macOS 13+),
signed and notarized. Unzip and double-click, or
brew install tanrax/tap/emacs-gpu.emacs-gpu_0.4.0_amd64.ubuntu24.04.deb: Ubuntu 24.04+ / Mint 22+
(and derivatives).sudo apt install ./emacs-gpu_0.4.0_amd64.ubuntu24.04.debemacs-gpu_0.4.0_amd64.debian12.deb: Debian 12 (bookworm).
Same command. (Two .debs because Debian and Ubuntu ship incompatible
libjpeg sonames.)
Both .debs are built --with-gpu --with-tree-sitter --with-native-compilation=aot, install as /usr/bin/emacs (they
conflict with the distro emacs packages) and include the GStreamer
video path; the GPU backend enables itself on X11, with
EMACS_GPU_DISABLE=1 as the opt-out.
macOS app
Universal feature set as 0.3.x (native-comp AOT + tree-sitter +
video player), rebuilt from the 0.4.0 tree. arm64, macOS 13+.
Unzip and double-click; or brew install tanrax/tap/emacs-gpu.
v0.3.2
What's fixed
Hovering the mouse over text drawn in a non-default font (for example shr / variable-pitch links in an elfeed entry) garbled the highlighted glyphs. The GPU drawing policy now resolves glyphs through the glyph string's own font instead of the highlight face's font, matching the native NS and X backends.
Build
Same as 0.3.1: arm64, signed and notarized, native-compilation (AOT) + tree-sitter, deployment target macOS 13 (Ventura) and newer.
emacs-gpu 0.3.1
emacs-gpu 0.3.1
New
- Video file player: visiting a video file (
mp4,mov,m4v,3gp) opens it ingpu-video-mode, a dedicated buffer that autoplays and loops, fit to the window, with a play/pause button and a clickable, draggable timeline. From Dired just pressRET. Animated GIFs keep using the built-inimage-mode.
Changed
- Rebased on the stable Emacs 31.0.90 tag (previous releases tracked the development branch).
- Build ships with native compilation (AOT) and tree-sitter enabled.
- README: example for enabling the sonicboom cursor effect; updated build instructions.
Install
brew install --cask tanrax/tap/emacs-gpuOr download the zip below, unzip and move Emacs.app to Applications.
emacs-gpu 0.3.0
emacs-gpu 0.3.0
New
- Video file player: visiting a video file (
mp4,mov,m4v,3gp) opens it in a dedicated buffer (gpu-video-mode) that autoplays and loops, fit to the window, with a play/pause button and a clickable, draggable timeline. From Dired just pressRET. Animated GIFs keep using the built-inimage-mode. - New commands/functions:
gpu-video-seek,gpu-video-duration,gpu-video-position,gpu-video-playing-p,gpu-video-size.
Build
- The release now ships with native compilation (AOT) and tree-sitter enabled.
- Self-contained, signed and notarized
Emacs.app(Apple Silicon, macOS 13 Ventura or newer).
Install
brew install --cask tanrax/tap/emacs-gpuOr download the zip below, unzip and move Emacs.app to Applications.
v0.2.0
emacs-gpu 0.2.0
Highlights
- Starts on the GPU automatically. When built
--with-mtland Metal is
available, the backend is loaded and enabled on the initial frame at
startup, for both the app bundle and source builds. Start with the stock
Cocoa backend by settingEMACS_GPU_DISABLEto any non-empty value. - Commands available out of the box.
gpu-enable,gpu-status,
gpu-set-cursor,gpu-toggle-animationsandgpu-set-scrollare now
autoloaded, soM-xfinds them without requiringgpufirst. - Cursor effects no longer fire while typing. The motion effects
(sonicboom, ripple, pixiedust and the torpedo trail) trigger only on
cursor movement and jumps, not on inserting or deleting text. Configure
withgpu-cursor-effects-while-typingandgpu-cursor-typing-commands.
Compatibility
- Apple Silicon, macOS 13 Ventura or newer. The macOS 13/14 support is still
experimental (see notes in 0.1.2); testers on Ventura/Sonoma/Sequoia are
welcome.
Install
brew upgrade --cask emacs-gpuOr unzip the attached Emacs.app (signed and notarized) and double-click it.
emacs-gpu 0.1.2
GNU Emacs with a native Apple Metal rendering backend (macOS, Apple Silicon).
What's new in 0.1.2
- Lower minimum macOS to 13 (Ventura). The Emacs binary is now built
with a 13.0 deployment target and the macOS 14+CADisplayLinkpath is
guarded (continuous animation runs on a timer anyway). The bundled
libraries' minimum-OS field is set to 13.0.- Experimental: this build is developed and runtime-tested on macOS
26 only. The bundled third-party libraries are built against a newer
SDK with their minimum-OS lowered, not recompiled from source. It
should install and run on macOS 13/14/15, but that has not yet been
verified on real hardware. Reports from Ventura/Sonoma/Sequoia users
are very welcome.
- Experimental: this build is developed and runtime-tested on macOS
Install
brew install --cask tanrax/tap/emacs-gpuOr unzip the attached Emacs.app and double-click it.
Signed with a Developer ID, notarized and stapled by Apple. Self-contained
(all non-system libraries bundled). Apple Silicon only.
emacs-gpu 0.1.1
GNU Emacs with a native Apple Metal rendering backend (macOS, Apple Silicon).
What's new in 0.1.1
- Fix:
gpu-set-cursornow applies immediately. Changing the cursor
effect at runtime updated only the Lisp variable and never reached the
live Metal driver. It now propagates on the fly. - The default cursor has no effect.
gpu-cursor-animationnow defaults
toblock(a static cursor, pixel-identical to the stock backend). The
ring/trail/particle effects are opt-in viaM-x gpu-set-cursor. Buffer
cross-fades stay on by default.
Install
brew install --cask tanrax/tap/emacs-gpuOr unzip the attached Emacs.app and double-click it.
Signed with a Developer ID, notarized and stapled by Apple. Self-contained
(all non-system libraries bundled). Requires Apple Silicon and macOS 26+.
emacs-gpu 0.1.0
First public release of emacs-gpu: GNU Emacs (development master) with a GPU-accelerated display backend, rendering with native Apple Metal on macOS.
Highlights
- Pixel-accurate output against the stock Cocoa (CoreGraphics) backend
- Performance on par with the stock backend, with an optional vsync mode that cuts CPU ~35% under sustained scrolling (see the README benchmarks)
- Text through a GPU glyph atlas: CJK, BiDi, ligatures, combining accents, color emoji, variable-pitch
- Images as textures (PNG/JPEG/SVG/WebP/TIFF, scaling, rotation, slices) and animated GIFs
- Inline video (
gpu-video-insert): AVFoundation decoded straight into Metal textures, follows scrolling - Experimental GPU cursor effects (
gpu-animations) - Platform-neutral drawing core: OpenGL for GNU/Linux and Windows is planned (
src/gfxdrv.his the driver interface,src/glterm.cthe skeleton)
Binary
emacs-gpu-0.1.0-macos-arm64.zip contains a fully self-contained Emacs.app, signed and notarized by Apple: unzip and double-click. All libraries (gnutls, image codecs, SVG) are bundled; Homebrew is NOT required.
The GPU backend, cursor effects and buffer cross-fades are enabled by default in the bundled app. Set the environment variable EMACS_GPU_DISABLE=1 to start with the stock Cocoa backend instead (handy for side-by-side comparison).
Requirements: Apple Silicon and macOS 26+. Intel Macs and older macOS: build from source (see the README).
SHA-256: b2e4e3bc057604c0784045c487e0cd79db2418977138d116b3081ee553561b7d
Experimental software. Issues are open as a public record but are not being answered for now.