背景
- WSL 経由の Linux プログラムで, GUI を imgui など OpenGL 系で描画したい.
- 機械学習などで, 3D 形状データを可視化したい.
- レイトレーシングなど, CPU intensive な計算をする(then 結果画像を GUI で表示)ので, CPU リソースを無駄に使いたくないので GUI の描画を GPU で行いたい.
NVIDIA GPU で OpenGL 2 は動きました. OpenGL 3.x はだめでしたが, データ可視化などでは GL 3 の機能を使う必要もなさそうな気がしますから, GL 2 でよさそうです.
手順
WSL+ubuntu18.04+VcXsrv+OpenAI Gym 動くまでのメモ(修正)
https://qiita.com/antimon2/items/b1611dca09edcf93db03
あたりを参考にします.
Windows 側には, GPU ベンダー(NVIDIA, AMD, Intel)のドライバが入っているものとします.
VcXsrv 起動時に, Native opengl
にチェックを入れておきます.
WSL 側で, DISPLAY
環境変数(通常は DISPLAY=:0.0
でいける)と, LIBGL_ALWAYS_INDIRECT=1
を設定しておきます.
LIBGL_ALWAYS_INDIRECT=1
で, WSL(Linux)側アプリの OpenGL コマンドを, Windows(VcXsrv)側に転送し, VcXsrv が Windows 側の OpenGL(GPU)を使って HW 描画する仕組みのようです.
imgui glfw3 + OpenGL 2 + WSL Ubuntu 18.04 + VcXsrv with LIBGL_ALWAYS_INDIRECT=1 gives linux app with HW accelerated OpenGL rendering on Windows for the win 🎉🎉✌️✌️✌️✌️✌️💯💯💯🥳🥳(unfortunately OpenGL 3 context cannot be created 😢 but GL2 should be enough for most GUI app☺️) pic.twitter.com/AUbKlqymcd
— Syoyo Fujita 🌸 レイトラ 🐯 2 周年 🎉 (@syoyo) May 9, 2020
imgui glfw3 + opengl2 サンプルが, 60 fps + CPU リソース使わずに描画できているのを確認しました
問題点
こちらの環境だと, glxgears はアニメーションせずに止まったままでした. vsync 周りの問題でしょうか.
OpenGL 3.x コンテキストは生成できませんでした
macOS の場合は昨今(10.6 くらいから?), OpenGL のコンテキストは最低 3.3 が生成されるようになりましたので, Linux/macOS で共通して動かしたい場合は 2.0, 3.x 両方を考慮して OpenGL コードを書く必要があります.
このあたりは X server の出来次第かと思いますので, Xming で $10 払うバージョンだともしかしたら OpenGL 3.x 使えるかもしれません.
CPU 描画
XvcSrv で Native opengl
off, もしくは WSL で LIBGL_ALWAYS_INDIRECT
を定義しなければ, llvmpile での描画が行われます.
i9 9900K だと, 40% ほど描画に CPU リソースを取られました(GPU も 20% くらい負荷が発生していたので, 一部 GPU 処理されているのかもしれません)
CPU 描画だと, 処理が重くなければ GUI のレスポンスは良いので(i9 9900K で imgui sample で 200 fps くらい), 開発中などは CPU 描画する手もありそうです. llvmpipe の GL version は 3.3 でしたので, imgui OpenGL3 サンプルも動きました.
今後
WSL で GPU 対応(GPU 仮想化(?)がアナウンスされました.
Windows 10、WSL 2でGUIアプリケーションとGPUベース機械学習に対応
https://news.mynavi.jp/article/20200520-1039322/
来年あたりには, 特になにも考えずに, WSL 経由で GPU(OpenGL) で GUI 描画できるかもですね.