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 コンポジタ | デスクトップ・本番 |
v1.0.10 iter7 以降、3 モードすべてで GTK
ウィンドウに Blink の
レンダリング結果が基本的に表示されます。
--headless が browser
プロセスに強制付与され白画面になっていたただし、以下の既知事項は iter9 時点で追跡中です:
gtk_scale=2)wl_subsurface のサイズが親 widget allocation
に完全には追従しないblink_web_view_load_uri() を繰返し呼ぶとリソース累積リーク
(iter9 で 2 層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をお使いください。
目指しているもの:
現状の制約:
現在の位置付け:
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.0.2 以降):
GtkWidget* view = blink_web_view_new_with_gpu_mode(BLINK_GPU_MODE_EGL);注意: この関数は BLINKGTK_GPU_MODE
をプロセス全体に対して設定します。
同一プロセス内で複数の WebView
を異なるモードで作っても、最初に作られた
WebView のモードが全体に適用されます。WebView
単位の分離は将来の課題です
(公開ヘッダ blink_web_view_new_with_gpu_mode
の注記どおり)。
確実に意図したモードで動かすには、blink_gtk_init(&argc, &argv)
を呼ぶ前に
環境変数を設定してください。
切り替えには二つの軸があり、できることが違います。
| 軸 | 例 | 実行中の切替 |
|---|---|---|
| GPU モード (本ページの software / swiftshader / egl) | software → egl | 不可 — プロセス再起動が必要 |
| 配送経路 (software モード内部の画面転送経路) | P1 (直接) ↔︎ P2 (mojo 共有メモリ) | 可 (v1.2.0-build9 以降) —
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())が使えます。表示スケールを含めて正準単位で
引き継ぐため、再起動後に「描画が小さい」が起きません。
software モードの内部には画面転送の経路が複数あり
(P1 = 直接配送 / P2 = mojo
共有メモリ配送)、これは再起動なしに
切り替えられます。
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() が
正規の口です。画面転送の費用だけを省き、組版と描画(先読み)は止めません。
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 以前を使っている場合は更新してください。
症状: BLINK_LOAD_FINISHED に到達、FPS
も 60 前後、しかし GTK ウィンドウは
真っ黒または背景色のまま
原因: Issue #54 の CopyFromSurface ガードが SwiftShader
にも過剰適用されている
可能性 ([Issue #54 follow-up])
対処: v1.0.10 iter10 以降の修正を待つ。当面は
software または egl に
切替。
症状: gtk_scale=2 環境で EGL
モード、親ウィジェットは 1536×785 logical px
あるのに Web コンテンツが約 400×360 physical px
の左上領域のみに表示
原因: size_allocate 経由で Chromium
側のビュー (RenderWidgetHostView) は正しく更新されるが、
wl_subsurface / wp_viewport の destination
サイズが追従していない
(Issue #58)
対処: iter10 以降の修正を待つ。暫定的には window を
800×600 以下にして全体
表示を確保。
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)