BlinkGTK は 3 つの GPU モードで動作します。環境変数
BLINKGTK_GPU_MODE で選択します。
記述時点について(2026-08-16 更新)
第 6 章 (トラブルシューティング) の一部は過去の版で観測した症状の記録で、
現行の版では解消済みのものを含みます。切り替えの仕組み (第 5 章) は
現行の版に合わせて更新済みです。環境変数の正リストは
環境変数リファレンス を
ご確認ください。
| モード | BLINKGTK_GPU_MODE |
レンダリング | コンポジション | 用途 |
|---|---|---|---|---|
| ソフトウェア | software(既定) |
CPU | ソフトウェアコンポジタ | ヘッドレス・CI・サーバ・低スペック |
| SwiftShader | swiftshader |
ソフトウェア GL(ANGLE→Vulkan→SwiftShader) | ソフトウェアコンポジタ | 仮想マシン・安定優先 |
| EGL ネイティブ | egl |
ハードウェア GPU(Wayland EGL) | GPU コンポジタ | デスクトップ・本番 |
現行 (BlinkGTK 1.2.3 / Chromium 154) では、software と EGL の
2 モードで
GTK ウィンドウに Blink のレンダリング結果が表示されます。
swiftshader モードは
1.2.3-build1 まで画面に何も出ませんでした (issue
#151。撮影 API もフレームが
来ずに失敗します)。1.2.3-build2 から直っており、software・EGL
と同じくページが表示され、
WebGL の描画も写ります。1.2.3-build1 以前では software か EGL
を使ってください。
GPU が使えない機械では、EGL を指定しても自動で software
へ退避します
(v1.2.1-build2 以降)。描画データが 5
秒間届かなければ切り替わり、理由を標準
エラー出力に記します。GPU が使える機械では切り替わりません。
無効化するには BLINKGTK_EGL_AUTO_FALLBACK=0
を指定します
(白いままになる可能性があります)。
| 版 | 内容 |
|---|---|
| v0.9 系 | --headless が browser
プロセスに強制付与され白画面になっていた |
| v1.0.1 | Issue #47 — EGL モード修正 |
| v1.0.10 iter2-iter7 | Issue #53 — SwiftShader モード修正 |
| v1.0.10 iter5 | Issue #54 — EGL モード viz Skia readback 修正 |
| v1.0.10 iter7 | Issue #55 — EGL モード Context Lost 修正 |
| v1.0.x (2026-04-20 解決) | Issue #58 — HiDPI で親コンテナのサイズに追従しない
(size_allocate vfunc の実装で解決) |
| v1.1.x (2026-06-21 解決) | Issue #59 — blink_web_view_load_uri()
の繰返しでリソースが累積する |
| v1.2.0-build3 から | GPU 描画が環境変数の指定だけで使えるようになった |
| v1.2.1-build2 から | GPU の無い機械での自動退避 |
software)挙動:
viz::SoftwareOutputDevice
がビットマップをフレームバッファに書き込みCopyFromSurface で BlinkGTK
が取得し、GtkPicture / GtkGLArea
経由で表示--disable-gpu-compositing が付与される長所:
短所:
THREE.WebGLRenderer: Error creating WebGL context や
Failed to create WebGPU Context Provider といったswiftshader または egl
モードを選んでください。推奨用途:
swiftshader)挙動:
--use-gl=angle --use-angle=swiftshader
が設定される長所:
短所:
vk_swiftshader_icd.json) と
libvk_swiftshader.so、libvulkan.so.1) が必要。v1.0.10 iter7
以降のlib/chromium/
に同梱されている--disable-vulkan
相当の緩和策が入っている推奨用途:
egl)挙動:
--use-gl=angle --use-angle=gl --ignore-gpu-blocklist
が設定される--headless は付与されない(Issue #47 で修正済み)v1.2.0-build2 以前では白画面になります。
動作に必要な設定 (GTK4 統合・手動 viewport・device scale・受け手ウィジェット)
が利用者側に委ねられており、指定しないと表示されませんでした。
次の版からはエンジンが行うので、BLINKGTK_GPU_MODE=eglだけで動きます。
それ以前の版ではsoftwareをお使いください。
GPU が使えない機械では自動で退避します:
ドライバが無い、仮想環境で GPU が見えないなど、egl
を指定してもその機械で
GPU
経路が使えないことがあります。以前はこの場合に画面が白いまま何も起きず、
原因を知る手立てがありませんでした。
現在は、EGL 経路に描画データが 5 秒間 1
枚も届かなければ、自動的にソフトウェア
経路へ切り替えて描画を続け、その理由を標準エラー出力に記します。
GPU が使える機械では退避しません。無効化は
BLINKGTK_EGL_AUTO_FALLBACK=0
(その場合、画面は白いままになります)。詳しくは
環境変数
を参照してください。
目指しているもの:
現状の制約:
現在の位置付け:
BLINKGTK_GPU_MODE=egl だけで動作 (次の版以降)アプリの実行環境は?
├─ GPU あり・デスクトップ・Wayland → egl
├─ GPU なし・WebGL 必要 → swiftshader
├─ GPU なし・WebGL 不要 → software(既定)
└─ ヘッドレス・CI → software または swiftshader
# ソフトウェアモード(既定)
./myapp --no-sandbox --no-zygote
# SwiftShader モード
BLINKGTK_GPU_MODE=swiftshader ./myapp --no-sandbox --no-zygote
# EGL ネイティブモード
BLINKGTK_GPU_MODE=egl ./myapp --no-sandbox --no-zygoteコード内から指定する場合 (v1.2.2-build5 以降):
blink_gtk_set_gpu_mode(BLINK_GPU_MODE_EGL); /* blink_gtk_init より前 */
blink_gtk_init(&argc, &argv);注意: blink_web_view_new_with_gpu_mode()
では経路を選べません。
描画経路は blink_gtk_init() の時点で決まり、GPU
プロセスへ渡す起動フラグも
そこで確定します。WebView
を作る時点ではもう変えられないので、この関数に
モードを渡しても反映されず、警告だけが出ます (2026-09-14
に外部利用者の報告で判明。
それまで「EGL のつもりで software を測る」ことが起きていました)。
経路はプロセス全体に 1 つです。同一プロセス内で WebView
ごとに変えることは
できません。
反映されたかどうかは blink_web_view_get_gpu_mode()
で確かめられます。
起動完了のログにも「描画経路=
環境変数 BLINKGTK_GPU_MODE
を起動前に設定する方法も従来どおり使えます。
切り替えには二つの軸があり、できることが違います。
| 軸 | 例 | 実行中の切替 |
|---|---|---|
| GPU モード (本ページの software / swiftshader / egl) | software → egl | 不可 — プロセス再起動が必要 |
| 配送経路 (画面転送の経路) | P1 (直接) ↔︎ P2 (mojo 共有メモリ) ↔︎ P3 (EGL dmabuf) | 可 (P1↔︎P2 は v1.2.0-build9 以降、P3 は
v1.2.1-build3 以降) —
blink_web_view_switch_render_path() |
ユーザーが GPU モードを選択できる
UI(メニュー項目など)を提供する場合、
モード切替にはプロセス再起動が必要です。
// ユーザーが別モードを選んだら
g_setenv("BLINKGTK_GPU_MODE", "egl", TRUE);
execv(argv[0], argv); // プロセス再起動再起動をまたぐ状態(URL・スクロール位置・表示スケール)の引き継ぎには
handoff meta API(blink_web_view_export_handoff_meta()
/
import_handoff_meta())が使えます。表示スケールを含めて正準単位で
引き継ぐため、再起動後に「描画が小さい」が起きません。
画面転送の経路は複数あり(P1 = 直接配送 / P2 = mojo 共有メモリ配送
/
P3 = EGL dmabuf
配送)、これは再起動なしに切り替えられます。
BLINKGTK_GPU_MODE=egl
で起動した場合だけです。ソフトウェア描画でint seq = blink_web_view_switch_render_path(view, "P2");
/* 完了は "render-path-changed" シグナル。切替後の描画が確認できなければ
* 自動で元の経路に戻ります (result="rollback"、画面は壊れません) */切替はテスト環境の実測で数百ミリ秒です。詳細(seq
による前後対応付け・
result の意味)は シグナル
API リファレンス
の render-path-changed の節を参照してください。
適用範囲に注意: この API が切り替えるのは software
系の配送経路
("P1" / "P2")だけです。GPU モードそのもの(software ↔︎
egl)の実行時切替は
できません(5.1 の再起動手順を使ってください)。
「経路を変える」のではなく「今は画面に出す必要がない」場合(音声だけを聞く
場面など)は、提示ポリシー
blink_web_view_set_presentation_policy() が
正規の口です。画面転送の費用だけを省き、組版と描画(先読み)は止めません。
止めている間も、撮影
(blink_web_view_capture_screenshot_async() など)
を求められたときは
1 枚だけ出して撮り、その後はまた止めます (1.2.3-build2 以降)。
FATAL: gl_factory_ozone NOTREACHED原因: Wayland EGL ドライバが見つからない、または X11
Display に
フォールバックしている
対処: v1.0.10 iter7 以降を使用
(Issue #47 で v1.0.1 修正済、
Issue #53 で v1.0.10 iter7
さらに強化)。
VK_ERROR_INITIALIZATION_FAILED原因: ANGLE の Vulkan backend 初期化が環境の Vulkan
ドライバ設定で失敗する
対処: v1.0.10 iter7 以降を使用。iter7 で SwiftShader
経路は
ANGLE Vulkan を明示的に回避するよう修正済 (Issue #53)。
iter6 以前を使っている場合は更新してください。
この症状は 1.2.3-build2 から解消しています (Issue
#54 で 2026-04-19 に一度
直し、その後の版で再発していました。issue #151)。
BLINK_LOAD_FINISHED に到達し FPS
も 60 前後なのに、この症状は解消済みです (Issue #58、2026-04-20)。
gtk_scale=2
の環境で、親ウィジェットは 1536×785 logical pxsize_allocate で正しくwl_subsurface / wp_viewport の
destination サイズがsize_allocate の vfunc
を実装して解消していますgtk_scale を添えてご報告ください。v1.0.10 iter7 以降でも条件によっては発生することがあります。確認手順:
pkg-config --modversion blinkgtk-0.1 が 1.0.10
以上blink_web_view_new() 直接利用の場合 (推奨): 親は任意の
GtkContainer で可gtk_window_set_child(window, view) が最もシンプル)blink_web_view_new_container() 利用の場合: 内部で
GtkOverlay +blink_web_view_new()
+data:text/html,<body style='background:red'>TEST</body>DidFinishNavigation() と
BLINK_LOAD_FINISHED が出ているか詳細は トラブルシューティング を参照。
triple_gpu_compare サンプル
(examples/triple_gpu_compare.c) で 3 モードを同一
アプリ内で並列比較できます。
Chromium ビルドツリーから実行する場合:
cd $CHROMIUM_SRC/out/Release_Component
LD_LIBRARY_PATH=$PWD ./triple_gpu_comparetarball / RPM でインストールした場合:
# 実行ファイルは $prefix/bin、ランタイム .so は $prefix/lib/chromium
cd /usr/local/lib/chromium # もしくは prefix に応じて
/usr/local/bin/triple_gpu_compare3 つの WebView が並列表示され、FPS とレンダリング品質を比較できます。
new_with_gpu_mode)