「macOS 15.8.2」でOpenGL描画が突如破綻:ドライバ不変のままウィンドウが真っ白になる不具合

「macOS 15.8.2」でOpenGL描画が突如破綻:ドライバ不変のままウィンドウが真っ白になる不具合

macOSOpenGLMetalグラフィックスレンダリング開発ツール

データソース:HN + web research

2026年10月9日、AppleはmacOS 15.8.2のテストビルド24H219を配布した。この定期システムメンテナンスパッチのリリース直後、日常的に使用されている複数のデスクトップツールが起動と同時に真っ白な画面に陥った。クラッシュダイアログすら表示されず、Godotゲームエンジンや複数のターミナルエミュレータが起動時に一斉にグラフィックス描画を失った。

最小再現コードを実行すると、hasDrawable=0 および GL_FRAMEBUFFER_UNDEFINED が出力され、低レイヤーの物理的なパイプライン切断が浮き彫りになった。このインシデントは従来の非推奨移行ペースを揺るがし、8年におよぶ猶予期間が、定期メンテナンスアップデートの中で事実上のインターフェース遮断へと発展した形となった。

ウィンドウが一瞬で真っ白に、生産性ツールが一斉に機能停止

2026年10月9日、開発者のtobycroft氏がGitHub上でGodotエンジンに対するIssue 124311を報告した。macOS 15.8.2(24H219)へアップデートした後、安定版・開発版を問わず、Godotプロジェクトマネージャが起動直後に真っ白な画面のまま停止した。Application Supportのキャッシュディレクトリを削除しても、バイナリを再ダウンロードしても、ウィンドウは完全に白いままだった。

一方、エンジンのバックエンドは対照的な挙動を見せていた。ターミナルからGodotを起動すると、初期化ログはすべて正常に完了する。エディタの設定やテーマは問題なく読み込まれ、MetalバックエンドもM1 Proチップを正確に認識していた。フロントエンドのウィンドウレンダリングが完全に停止している一方で、バックエンドのロジック実行やハードウェアとのハンドシェイクは何一つ損なわれていなかった。

Godot プロジェクトマネージャの白画面再現スクリーンショット 図:macOS 15.8.2上でGodotプロジェクトマネージャが白画面になる再現画像。出典:godotengine/godot issue 124311

これは単一エンジンの偶発的なバグにとどまらなかった。その後の数日間で、同種の問題が複数の中核ツールのリポジトリで相次いで報告された。GPUアクセラレーション対応ターミナルのkittyではコンテンツエリアが灰白色になり、Alacritty 0.17のウィンドウも完全に空白となった。3DプリントスライサーのBambu Studio 2.8.2.61では、M4 Mac mini環境で操作パネルやツールバーが表示不能になった。商用アプリケーションも例外ではなく、ソニーのImaging Edge Desktop ViewerやDJI Studioでもメインウィンドウやプレビュープラグインが黒画面に陥った。影響を受けたデバイスはM1から最新のM4、M4 Pro、M4 Maxまで多岐にわたる。

ドライバは一切変更なし、カーネル側の呼び出しチェーンが断絶

一般的な認識では、広範なウィンドウ描画不全はグラフィックススタックの大幅な改修に伴って発生する。しかし、macOS 15.8.2のアップデートパッケージにおいて、中核となるグラフィックスコンポーネントのバージョンは一切変更されていなかった。IOGPUFamilyは104.6.6、AGXG13Xドライバは329.2、IOSurfaceも372.5.4のまま維持されていた。2026年10月14日にリリースされた24H225(RC 2)ビルドでも、これらのバージョンは変わっていない。システム内で変更されたのは、カーネルのビルド番号のみだった。

コンポーネントのバージョンが同一であるにもかかわらず、システムがアプリケーションへ提供するハードウェアインターフェースの状態は正反対だった。正常なmacOS 15.8.1環境で最小再現コードを実行すると、コンテキストクエリは hasDrawable=1 status=0x8cd5 glError=0x0 を返していた。ところが、24H219および24H225環境下では、全く同じバイナリが hasDrawable=0 status=0x8219 glError=0x506 という異常値を返した。

このステータスコードは、パイプラインの断絶箇所を明確に示している。status=0x8219 はOpenGL仕様における GL_FRAMEBUFFER_UNDEFINED に該当し、デフォルトフレームバッファが存在しないことを意味する。glError=0x506 は GL_INVALID_FRAMEBUFFER_OPERATION であり、そのバッファにピクセルを書き込もうとする操作がGPUドライバによって即座に拒否されることを示している。

システムの詳細ログをトレースすると、低レベルのハンドシェイクが崩壊する過程が確認できた。上位の CGSBindSurface 呼び出しは成功するものの、その後のIOGPUクライアントインターフェースが kIOReturnBadArgument を返していた。カーネルログの IOGPUGLDrawableUserClient::set_surface には Invalid surface ID が出力され、結果として CGLSetSurface が失敗して kCGLBadDrawable(エラーコード10005)が返されていた。GPUドライバの描画能力自体に問題はない。断絶は、WindowServerがカーネルへサーフェスハンドルを渡す検証フェーズで発生していた。

オフスクリーン描画は正常稼働、ウィンドウサーフェスのみがバッファを喪失

このトラブルの最大の特徴は、不具合の出方が極めて局所的かつ選択的であった点にある。描画ターゲットをオフスクリーンのFBO(フレームバッファオブジェクト)へ切り替えるか、CAOpenGLLayer レイヤーを使用した場合、GPUは通常通りテクスチャを出力できた。パイプラインの破損範囲は、ネイティブウィンドウにアタッチされる単一のパスに限定されていた。

NSOpenGLView 経由であれ、明示的な -[NSOpenGLContext setView:] 呼び出しであれ、システムがウィンドウにハードウェアサーフェスを割り当てる段階で失敗していた。テストによれば、この不具合はアーキテクチャを超えて発生する。Apple Siliconネイティブのarm64バイナリでも、Rosetta経由のx86_64バイナリでも挙動は同一だった。レイヤーバッキングの有無や、メインスレッド・ワーカースレッドの別を問わず、テスト結果は一貫して kCGLCPHasDrawable が0となった。

kitty ターミナルの空白画面再現スクリーンショット 図:macOS 15.8.2上でkittyターミナルの内容エリアが空白になる再現画像。出典:kovidgoyal/kitty issue 10645

デフォルトフレームバッファが欠落しているため、ターミナルが発行する画面クリア命令はドライバ層で拒絶された。ターミナル内部のイベントループはキー入力を受け取り、文字バッファも定常通り更新されていた。しかし、最終的に画面へフレームを送信する段階で利用可能なサーフェスが存在しないため、すべてのピクセルがドライバの入口で破棄された。画面が白いのはアプリがフリーズしたためではない。描画コマンドが画面へ届く最後のステップで直接遮断されていたのである。

検査項目と呼び出しパス正常なシステム(15.8.1 / 27.0.1)異常なシステム(15.8.2 24H219/225)エンジニアリング診断と影響
ウィンドウコンテキストのバッファフラグkCGLCPHasDrawable は1kCGLCPHasDrawable は0ウィンドウが利用可能なデフォルトフレームバッファを取得できない
フレームバッファ状態クエリ0x8CD5(正常完了)0x8219(未定義状態)ウィンドウにバインドされたデフォルトFBOが未定義状態
画面クリア操作 glClearエラーなし(0x0)0x506(無効な操作)を送出描画呼び出しがすべて失敗し、ウィンドウが真っ白のまま維持される
オフスクリーン描画とFBO正常にラスタライズされテクスチャ出力正常にラスタライズされテクスチャ出力ハードウェア描画は正常であり、ドライバ層のレンダリング故障ではない
CAOpenGLLayer レイヤーパス正常にレンダリング・合成正常にレンダリング・合成CoreAnimationレイヤー合成パイプラインは影響を受けていない
ウィンドウバインド呼び出しチェーンCGSBindSurface は正常に完了set_surface が無効なハンドルを報告カーネルがウィンドウサーフェスハンドルを検証する際に引数拒否が発生

8年の非推奨期間が宙に浮き、パッチのテストカバレッジの盲点が露呈

この不具合は、技術コミュニティにおいてプラットフォームの保守責任を巡る議論を巻き起こした。Appleは2018年のmacOS 10.14 MojaveですでにOpenGLを正式に非推奨とし、公式ドキュメントでMetalへの移行を一貫して推奨してきた。OSベンダーの視点に立てば、OpenGL互換レイヤーの維持には継続的なコストがかかり、8年という移行期間はエコシステムに対して十分な猶予を提供してきたと言える。

しかし、ダウンストリームのアプリケーション開発者が直面する現実は異なる。クロスプラットフォームプロジェクトにとって、単一OSのためにレンダリングバックエンドを全面的に書き直すには莫大な開発リソースを要する。多くの開発者は、マイナーな保守パッチであれば既存インターフェースの安定性が維持されると想定している。突発的なインターフェースの断絶は、ソフトウェアの既定のメンテナンス計画を混乱させた。

Godotエンジンの設計も、クロスプラットフォームソフトウェアの移行におけるジレンマを映し出している。Godotはゲームランタイム自体のデフォルトレンダラを早い段階でMetalへ移行していた。だが、開発者向けのエディタおよびプロジェクトマネージャ画面は、軽量かつ迅速に起動できるようOpenGLをデフォルトで維持していた。コントリビュータのbruvzg氏は、プロジェクトマネージャも本来もっと早くMetalへ移行すべきだったと述べつつ、これまでは初回起動時のシェーダーコンパイル待ち時間を避けるためにOpenGLを残していたと説明している。

この出来事は、OSのメンテナンス体制におけるテストカバレッジの盲点を浮き彫りにした。macOS 15.8.2は通常の保守パッチに過ぎない。にもかかわらず、長年使われてきたグラフィックスパイプラインの基本呼び出しで致命的なリグレッションが発生した。たとえ8年前に非推奨とされたAPIであっても、SDK内に残存している限り、テストの死角はエコシステム全体に高い代償を払わせることになる。

回避策による一時凌ぎと、グラフィックススタック世代交代の最終局面

突発的な白画面のブロッキングに対し、オープンソースコミュニティは迅速に応急処置を提示した。Godotのコントリビュータは議論の中で一時的な起動パラメータを共有した。--rendering-driver metal や --rendering-driver opengl3_angle を引数として渡すことで、破損したネイティブウィンドウパスをバイパスできる。Alacrittyのユーザーも、ANGLE変換レイヤーを組み込んだ派生ビルドを採用することで復旧を果たした。

自社でソースコードを保守しているチームにとっては、描画ターゲットをウィンドウサーフェスから分離することが標準的な恒久対策となる。オフスクリーンバッファにラスタライズしてからテクスチャを CALayer に渡すか、CAOpenGLLayer を直接利用することで、シェーダーパイプラインを書き換えることなく破損した呼び出しを回避できる。

仮想マシン環境での検証データも問題の局所性を示している。VM環境のmacOS 15.8.1ではこの問題は再現されず、次世代のmacOS 27.0.1プレビュー環境でもウィンドウレベルのコードは正常に動作していた。この不具合が特定のパッチビルドのみに孤立して存在している事実は、意図的な廃止ではなくコードマージ時のリグレッションであることを示唆している。

起動オプションによるワークアラウンドは一時的な救済にはなるが、プラットフォームの世代交代という大潮流を止めることはできない。定期パッチによってレガシーインターフェースが突如断ち切られるリスクは常に存在する。macOS上でOpenGLを維持する猶予はすでに限界を迎えており、生産性ツールにとってモダンなAPIへの移行を完遂することは、エコシステムで生き残るための不可避な選択となっている。

参考文献・リンク:

  • braindetox 技術解析
  • Godot issue 124311
  • Apple デベロッパーフォーラム報告スレッド
  • SiTech 報道