OpenGL 4.xはWSL上で使えるか (WSLg)
WSL(WSLg)でOpenGLはどのバージョンが使えるのか
OpenGL 4.xの世代がWSLの中から使用ができるのか気になって調べてみました。
調べてみると同じように気になっている方がいらっしゃるようで、基本的にはそれと同じようなことを本記事でもやってみています。
準備
WSLからGPUを使って画面描画をするために WSLg という環境が用意されています。
これは、直接Windowsのデスクトップ画面にLinuxアプリの画面を描画するための仕組みです。
場合よってはWSLの環境が古く、このWSLgの環境がないことがあるので、以下のコマンドを実行して新しいものをインストールします。
wsl --shutdown
wsl --update
WSLgが使える環境かを確認するには、以下のコマンドで/mnt/wslg
が存在していることをチェックします。
$ ls -l /mnt
drwxrwxrwt 2 root root 60 Oct 21 18:42 wsl
drwxrwxrwt 7 root root 300 Oct 21 18:42 wslg
動作チェック
まずは定番のglxgearsを試してみます。
他のツールのこともあり、以下のコマンドでインストールしておきます。
$ sudo apt install mesa-utils
この状態で、以下のコマンドを実行し、 歯車が回っているウィンドウが表示されればOKです。
$ glxgears
バージョンをチェック
それでは、動作しているバージョンの確認などしてみます。
以下のコマンドを実行して、出力を抜粋したものを記載しました。
$ glxgears -info
GL_RENDERER = D3D12 (NVIDIA GeForce RTX 3060)
GL_VERSION = 4.2 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~22.04.1
GL_VENDOR = Microsoft Corporation
GL_EXTENSIONS = GL_ARB_multisample GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color
GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_copy_texture GL_EXT_subtexture
GL_EXT_texture_object GL_EXT_vertex_array GL_EXT_compiled_vertex_array GL_EXT_texture
GL_EXT_texture3D GL_IBM_rasterpos_clip GL_ARB_point_parameters GL_EXT_draw_range_elements
GL_EXT_packed_pixels GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_separate_specular_color
...
これをみると、確かにWSL上でGPUを用いた動きになっているようにみえます。
私の場合、RTX 3060を使用しているので、それもこの環境の中から認識できているようです。
そしてOpenGLのバージョンは "4.2" と表示されています。
続いて、glxinfo
コマンドを実行して調べてみたものが以下の通りです。
ここでも、OpenGL 4.2、OpenGLES 3.1あたりが使用可能となっているように見られます。
$ glxinfo -B
name of display: :0
display: :0 screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
Vendor: Microsoft Corporation (0xffffffff)
Device: D3D12 (NVIDIA GeForce RTX 3060) (0xffffffff)
Version: 23.0.4
Accelerated: yes
Video memory: 44768MB
Unified memory: no
Preferred profile: core (0x1)
Max core profile version: 4.2
Max compat profile version: 4.2
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.1
OpenGL vendor string: Microsoft Corporation
OpenGL renderer string: D3D12 (NVIDIA GeForce RTX 3060)
OpenGL core profile version string: 4.2 (Core Profile) Mesa 23.0.4-0ubuntu1~22.04.1
OpenGL core profile shading language version string: 4.20
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 4.2 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~22.04.1
OpenGL shading language version string: 4.20
OpenGL context flags: (none)
OpenGL profile mask: compatibility profile
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 23.0.4-0ubuntu1~22.04.1
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
サンプルの動作は失敗
OpenGL 4ならではのサンプルを動かしたく、g-truncのogl-samplesを使おうとしましたが、これは失敗しました。下記の場所でNULLアクセスになるので、入力操作部分を別の実装すれば動く可能性ありです。
244 XkbDescPtr descr = XkbGetKeyboard(_glfw.x11.display,
245 XkbAllComponentsMask,
246 XkbUseCoreKbd);
247
248 // Find the X11 key code -> GLFW key code mapping
249 for (scancode = descr->min_key_code; scancode <= descr->max_key_code; scancode++)
250 {
251 memcpy(name, descr->names->keys[scancode].name, XkbKeyNameLength);
252 name[XkbKeyNameLength] = 0;
ただしこの箇所は glfwInit
から呼ばれているため、少々手間かもしれません。
現時点では、GLFWを使用せずウィンドウの処理コードを自前で書いたOpenGLアプリケーションでならば、OpenGL 4.xを試せるのではないかと考えています。
まとめ
WSL上でOpenGLも動くようでとても期待が高まります。ただし、OpenGL 4.2というところでコンピュートシェーダーの対応が惜しくも含まれていない状態でした。気になるのはOpenGLESは 3.1として対応を返してきたところです。OpenGLES 3.1ならば、コンピュートシェーダーの対応が入っているバージョンです。どちらかといえばES3.1対応と返してきたのが不具合で実質3.0というところなのかもしれません。
これまでの確認をした環境の詳細情報は以下の通りです。
> wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.2428
Discussion