👏

OpenGL 4.xはWSL上で使えるか (WSLg)

2023/10/22に公開

WSL(WSLg)でOpenGLはどのバージョンが使えるのか

OpenGL 4.xの世代がWSLの中から使用ができるのか気になって調べてみました。
調べてみると同じように気になっている方がいらっしゃるようで、基本的にはそれと同じようなことを本記事でもやってみています。

https://zenn.dev/suudai/articles/a25e3ed0a944c7

準備

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