Developer tooling

macOS 15.8.2 breaks OpenGL: why NSOpenGLView windows go blank, and the workarounds that work

Why macOS 15.8.2 leaves OpenGL windows blank, which apps and builds are hit, how to confirm it, and the workarounds that work.

Kemo
9 min read
An empty silver picture frame on a grey wall in dim light, with nothing inside it and a dark shadow across one corner.
On this page
  1. What does macOS 15.8.2 break in OpenGL?
  2. Which macOS builds are affected?
  3. Why CAOpenGLLayer still works when NSOpenGLView does not
  4. Which apps are affected by the macOS 15.8.2 OpenGL bug?
  5. How to check whether your Mac is affected
  6. Workarounds for users: hold the update or switch renderer
  7. Workaround for developers: draw through CAOpenGLLayer
  8. Questions people ask about macOS 15.8.2 and OpenGL
  9. Sources and further reading

Since the first macOS Sequoia 15.8.2 release candidate, build 24H219, OpenGL apps on Apple silicon Macs have been opening blank windows. Terminals such as kitty and Alacritty, the Godot project manager, 3D slicers like OrcaSlicer and Bambu Studio, and FreeCAD all draw nothing where their content should be. A developer who reduced it to a minimal Objective-C reproducer traced it to one path: an OpenGL context attached to a window through NSOpenGLView or -[NSOpenGLContext setView:] gets no drawable at all (Apple Developer Forums).

This article explains exactly what fails, which builds and apps are affected, how to confirm it on your own Mac in a minute, and the workarounds that reporters have confirmed — for people who use these apps and for developers who ship them. The second release candidate did not fix it, so if you own a Mac app with an OpenGL view, now is the time to test.

What is known
Builds affectedmacOS Sequoia 15.8.2 RC 1 (24H219) and RC 2 (24H225) (Apple Developer Forums)
Last good build15.8.1 (Alacritty #9067, OrcaSlicer #16382)
What failsOpenGL contexts attached to a window get no default framebuffer; the window stays blank
What still worksCAOpenGLLayer, NSOpenGLLayer and offscreen framebuffers in the same process
Apple's responseFeedback FB25133383 acknowledged; no comment on a fix (Apple Developer Forums)
The macOS 15.8.2 OpenGL regression at a glance, as reported up to 19 October 2026

What does macOS 15.8.2 break in OpenGL?

It breaks window-backed OpenGL drawing: the context never receives a surface, so every frame is drawn into nothing. The original report on the Apple Developer Forums, filed as FB25133383, lists the symptoms on an M1 Pro after updating from 15.8 to 15.8.2 RC:

  • CGLGetParameter(..., kCGLCPHasDrawable, ...) returns 0.
  • glCheckFramebufferStatus(GL_FRAMEBUFFER) returns GL_FRAMEBUFFER_UNDEFINED (0x8219).
  • glClear raises GL_INVALID_FRAMEBUFFER_OPERATION (0x506) — the same error kitty logs before exiting (kitty #10645).
  • CGLSetSurface returns kCGLBadDrawable, and the kernel logs IOGPUGLDrawableUserClient::set_surface(...): Invalid surface ID = N on every attach.

The reporter stepped through CGLSetSurface: the window-server bind succeeds, then the call into the GPU driver's user client fails with kIOReturnBadArgument. In other words the window and the context are fine; the hand-off of the window's surface to the GPU driver is what is refused. It fails the same way for arm64 and x86_64 binaries under Rosetta, with or without layer backing, on the main thread or a background one.

repro.m — the probe inside drawRect: (excerpt from FB25133383)Text
NSOpenGLContext *ctx = [self openGLContext];[ctx makeCurrentContext];GLint hasDrawable = -1;CGLGetParameter(ctx.CGLContextObj, kCGLCPHasDrawable, &hasDrawable);GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);glClearColor(0, 1, 0, 1);glClear(GL_COLOR_BUFFER_BIT);GLenum err = glGetError();printf("hasDrawable=%d status=0x%x glError=0x%x\n", hasDrawable, status, err);[ctx flushBuffer];
From the reproducer posted with FB25133383. On a working build it draws a green square.
Output on 15.8.2 RC (24H219), as posted with FB25133383Shell
$ clang -fobjc-arc -Wno-deprecated-declarations -framework Cocoa -framework OpenGL repro.m -o repro && ./reprohasDrawable=0 status=0x8219 glError=0x506

On a healthy build the same line reads hasDrawable=1 status=0x8cd5 glError=0x0 and the window turns green.

Which macOS builds are affected?

Both 15.8.2 release candidates are affected; 15.8.1 is not. Apple published RC 1 (24H219) on 7 October and RC 2 (24H225) on 13 October, to developers and public beta testers, describing both only as "important security fixes" (9to5Mac, 9to5Mac). The forum reporter retested on 24H225 and got identical output; the GPU driver components (IOGPUFamily 104.6.6, AGXG13X 329.2, IOSurface 372.5.4) were unchanged between the two builds, and only the kernel build moved (Apple Developer Forums).

BuildReleasedWindow OpenGLSource
15.8.1—WorksAlacritty #9067
15.8.2 RC 1 (24H219)7 Oct 2026BlankFB25133383 thread
15.8.2 RC 2 (24H225)13 Oct 2026BlankFB25133383 thread
Tahoe 26.7.2 RC (25G320, 25G325)7 and 13 Oct 2026Not reported9to5Mac
27.0.1—Godot not reproducibleGodot #124311
macOS builds and whether window-backed OpenGL works, from public reports up to 19 October 2026

Why CAOpenGLLayer still works when NSOpenGLView does not

Because the two paths hand pixels to the screen differently. NSOpenGLView and setView: bind the context directly to the window's surface through CGLSetSurface — the step that now fails. CAOpenGLLayer gives the context a layer-owned target that Core Animation composites, so it never asks the GPU driver to accept a window surface ID.

OpenGL context (CGL)NSOpenGLView / setView:CGLSetSurface → IOGPU user clientNo drawableblank windowCAOpenGLLayer / NSOpenGLLayerCore Animation compositorPixels on screenwindow pathInvalid surfaceID on 15.8.2layer path
  • OpenGL context (CGL) → NSOpenGLView / setView:: window path
  • NSOpenGLView / setView: → CGLSetSurface → IOGPU user client
  • CGLSetSurface → IOGPU user client → No drawable: Invalid surface ID on 15.8.2
  • OpenGL context (CGL) → CAOpenGLLayer / NSOpenGLLayer: layer path
  • CAOpenGLLayer / NSOpenGLLayer → Core Animation compositor
  • Core Animation compositor → Pixels on screen
On 15.8.2 RC the window path is refused at the GPU driver; the layer path does not use it and still draws.

That also explains the odd pattern of who is hit. Apps that draw OpenGL straight into a window — terminals, Qt 6 apps such as DJI Studio, slicers and engines with an OpenGL renderer — go blank. Apps that render with Metal, or put OpenGL inside a Core Animation layer, carry on. Apple deprecated OpenGL in macOS 10.14 and points developers to Metal (Apple, AppleInsider), but deprecated is not the same as removed, and Apple has not said this change is intended.

The window and the context are fine; it is the hand-off of the window's surface to the GPU driver that is refused.

Which apps are affected by the macOS 15.8.2 OpenGL bug?

Any app that attaches an OpenGL context to a window. The public reports so far, with what each project has said:

AppSymptomMaintainers' responseWorkaround
kittyBlank grey window, exits on glClear error (#10645)"definitely a regression in the macOS update, probably in the GPU drivers"Roll back macOS
Alacritty / WezTermEmpty window (#9067)Points to macOS; suggests trying other GPU backendsNone confirmed
Godot 4.7.2 / 4.8 devBlank project manager (#124311)Likely a 15.8.2 bug; not reproducible on 15.8.1 or 27.0.1--rendering-driver metal or opengl3_angle
OrcaSlicer 2.4.2Blank Prepare and Preview views (#16382)"a regression in macOS 15.8.2 (build 24H219), not an OrcaSlicer bug"Roll back to 15.8.1
Bambu Studio 2.8.2Missing workspace panels and toolbar (#12530)Logs requested; no cause confirmedNone listed
FreeCAD, PrusaSlicer, Ableton Live 12 plug-in GUIs, DJI Studio, Sony Imaging EdgeBlank 3D or plug-in views (forum thread)——
Apps reported broken on macOS 15.8.2 RC, with the maintainers' response and any workaround, up to 19 October 2026

How to check whether your Mac is affected

Check the build number, then look for the kernel message the regression leaves behind. If you see it while an app shows a blank window, you have this bug and not a problem with the app.

check-opengl-regression.shShell
# Which build are you on? 24H219 and 24H225 are the affected RCssw_vers # Open the blank app, then look for the driver refusing the surfacelog show --last 10m --predicate 'eventMessage CONTAINS "Invalid surface ID"'

Workarounds for users: hold the update or switch renderer

If you depend on an OpenGL app, do not install 15.8.2 until a build is confirmed fixed. If you already have it, the only workaround offered by the kitty and OrcaSlicer maintainers is to go back to 15.8.1 (kitty #10645, OrcaSlicer #16382). If you manage a fleet, hold this update for machines that run OpenGL tools.

Some apps can avoid the broken path themselves. Godot's maintainer confirmed that launching with a different rendering driver works, because only the project manager defaults to OpenGL; the reporter confirmed both flags (Godot #124311). The cost of Metal, in the maintainer's words, is "a bit longer first-time startup time".

Launch Godot without native OpenGLShell
# Use Metal instead of native OpenGL/Applications/Godot.app/Contents/MacOS/Godot --rendering-driver metal # Or keep the Compatibility renderer, but through ANGLE/Applications/Godot.app/Contents/MacOS/Godot --rendering-driver opengl3_angle

For Alacritty, the maintainer suggested trying the other GPU backends; on the reporter's M4 Max only the Glsl3 backend launched, and the page does not say whether it drew correctly (Alacritty #9067).

Workaround for developers: draw through CAOpenGLLayer

Move your OpenGL drawing into a CAOpenGLLayer subclass. Two reporters on the Apple Developer Forums confirmed that a CAOpenGLLayer in the same process draws correctly on both release candidates while every NSOpenGLView variant stays blank. The change is mostly mechanical: your render code moves from drawRect: into the layer's draw callback, and the layer, not you, owns the context's target.

layer.mText
#import <Cocoa/Cocoa.h>#import <QuartzCore/QuartzCore.h>#import <OpenGL/gl.h> @interface GreenLayer : CAOpenGLLayer@end @implementation GreenLayer- (void)drawInCGLContext:(CGLContextObj)ctx             pixelFormat:(CGLPixelFormatObj)pf            forLayerTime:(CFTimeInterval)t             displayTime:(const CVTimeStamp *)ts {  CGLSetCurrentContext(ctx);  glClearColor(0, 1, 0, 1);  glClear(GL_COLOR_BUFFER_BIT);  printf("glError=0x%x\n", glGetError());  [super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts];}@end int main(void) {  @autoreleasepool {    [NSApplication sharedApplication];    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];    NSWindow *w = [[NSWindow alloc]        initWithContentRect:NSMakeRect(0, 0, 320, 240)                  styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable                    backing:NSBackingStoreBuffered                      defer:NO];    NSView *v = w.contentView;    v.wantsLayer = YES;    GreenLayer *layer = [GreenLayer layer];    layer.frame = v.bounds;    layer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;    [v.layer addSublayer:layer];    [layer setNeedsDisplay];    [w center];    [w makeKeyAndOrderFront:nil];    [NSApp activateIgnoringOtherApps:YES];    [NSApp run];  }  return 0;}
Build with: clang -fobjc-arc -Wno-deprecated-declarations -framework Cocoa -framework OpenGL -framework QuartzCore layer.m -o layer

Three things to know before you ship it. CAOpenGLLayer calls you when Core Animation wants a frame, so a render loop that used to call flushBuffer on its own timer needs asynchronous = YES on the layer or an explicit setNeedsDisplay. If a toolkit creates the window and context for you — DJI Studio's Qt 6 build is among the affected apps — the fix belongs to the toolkit's maintainers, not to your code. And the forum reporter's other suggestion — render into an IOSurface-backed framebuffer and present it in a CALayer — has not been confirmed by anyone else (Apple Developer Forums).

The longer-term answer is the one Apple has given since 2018: move rendering to Metal, or to a translation layer such as ANGLE, as Godot's opengl3_angle driver does (Apple).

Questions people ask about macOS 15.8.2 and OpenGL

Does macOS 15.8.2 break OpenGL?

The release candidates do: OpenGL contexts attached to a window get no drawable, so the window stays blank (Apple Developer Forums). OpenGL rendered through CAOpenGLLayer or offscreen still works.

Why is my terminal window blank after updating macOS?

If you use kitty, Alacritty or WezTerm on 15.8.2 RC, it is this regression; kitty's maintainer called it "a regression in the macOS update" (kitty #10645). Going back to 15.8.1 is the only confirmed fix.

Is macOS 15.8.2 released?

Release candidates 24H219 and 24H225 shipped on 7 and 13 October 2026 to developers and public beta testers (9to5Mac). Check Apple's release notes for the final build before installing.

Does the bug affect Intel Macs?

The reports so far are all on Apple silicon (M1 to M4 Max). x86_64 apps under Rosetta are affected; native Intel Macs have not been reported either way.

Is Apple removing OpenGL from macOS?

Apple has not said so. OpenGL has been deprecated since macOS 10.14 (Apple), and Apple declined to comment on this bug beyond asking for Feedback reports (Apple Developer Forums).

How do I fix Godot's blank project manager on macOS?

Launch it with --rendering-driver metal or --rendering-driver opengl3_angle; both were confirmed to work (Godot #124311).

Is macOS Tahoe 26.7.2 affected?

Unknown. Apple asked for results from the 26.7.2 RC, and none had been posted in the public thread by 19 October 2026.

Sources and further reading

Discussion

Join the discussion

Sign in with Google, Apple or an email code to comment and reply.

One practical article a week

Follow k13 in any RSS reader. No account needed.