🧊

WSLgでOpenGL4.xを使いたい

2022/07/31に公開

WSLgではOpenGL4.xはサポートされていない?

WSLgでOpenGLの描画プログラムを試していたら、OpenGL4.xが使えなかったので色々調べていました。

Windows11ではWSLgというGUIアプリを面倒な設定なしで実行できる環境があるのですが、
こちらのページにある手順を実行するだけだとOpenGL4.xは使えませんでした。

色々調べて使えるようになったので、記事にまとめました。

あくまでOpenGL4.xを使用できる状態にすることが目的なので、OpenGLプログラムやその準備等については触れません。ご容赦ください。

GLFWでCore Profile 4.1を指定して実行したい

GLFWでOpenGL4.1を使いたかったのですが、現状では対応していないので失敗します。

// Core Profile 4.1 を指定
::glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
::glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
::glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
::glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

// 対応しないバージョンが指定されていると、nullptrが返ってくる
::GLFWwindow* window = ::glfwCreateWindow(0, 0, "sample", nullptr, nullptr);

glxinfoを使えるようにする

/bin/bash
$ sudo apt install mesa-utils

変更前のOpenGLのバージョンを確認

結果はこうでした。

Name OpenGL Version Shader Language Version
Core Profile 3.3 3.30
Compatibility Profile 3.1 1.40
ES profile ES 3.0 GLSL ES 3.00

バージョンのみを表示

/bin/bash
$ glxinfo -B | grep "version string"
OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.2.6
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.1 Mesa 21.2.6
OpenGL shading language version string: 1.40
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.2.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00

詳細な出力はこんな感じです。
Accelerated: yesとなっています。

/bin/bash
$ 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 2080 SUPER) (0xffffffff)
    Version: 21.2.6
    Accelerated: yes
    Video memory: 40743MB
    Unified memory: no
    Preferred profile: core (0x1)
    Max core profile version: 3.3
    Max compat profile version: 3.1
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.0
OpenGL vendor string: Microsoft Corporation
OpenGL renderer string: D3D12 (NVIDIA GeForce RTX 2080 SUPER)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.2.6
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile

OpenGL version string: 3.1 Mesa 21.2.6
OpenGL shading language version string: 1.40
OpenGL context flags: (none)

OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.2.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00

Mesaの最新版をインストールする

使用できるOpenGLのバージョンを上げるために、Mesaをアップグレードします。
このIssueが参考になりました。
https://github.com/microsoft/WSL/discussions/6154

https://launchpad.net/~oibaf/+archive/ubuntu/graphics-drivers/ からインストールすると良いよと書いてありますが、実行するコマンドとしては以下になります。

/bin/bash
$ sudo add-apt-repository ppa:oibaf/graphics-drivers -y
$ sudo apt update
$ sudo apt upgrade -y

DISPLAY環境変数の設定は必要なし

WSLgが使用できる環境であれば、DISPLAY環境変数の設定は必要ありませんでした。

Mesa3D のレンダラーの切り替え

すらりんさんのブログが参考になりました。
https://blog.techlab-xe.net/post-5166/

LIBGL_ALWAYS_SOFTWARE環境変数を定義して、Mesa3Dのレンダラーをllvmpipeへ変更します。

~/.bashrc
export LIBGL_ALWAYS_SOFTWARE=1

コマンドプロンプトかPowershellでWSLを再起動します。

cmd.exe
> wsl --shutdown

WSLでOpenGLのバージョンを確認します。

Name OpenGL Version Shader Language Version
Core Profile 4.5 4.50
Compatibility Profile 4.5 4.50
ES profile ES 3.2 GLSL ES 3.20
/bin/bash
$ glxinfo -B | grep "version string"
OpenGL core profile version string: 4.5 (Core Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL core profile shading language version string: 4.50
OpenGL version string: 4.5 (Compatibility Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL shading language version string: 4.50
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

詳細は以下の通りで、Accelerated: noとなっています。

/bin/bash
$ glxinfo -B
name of display: :0
display: :0  screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
    Vendor: Mesa/X.org (0xffffffff)
    Device: llvmpipe (LLVM 14.0.5, 256 bits) (0xffffffff)
    Version: 22.2.0
    Accelerated: no
    Video memory: 32064MB
    Unified memory: no
    Preferred profile: core (0x1)
    Max core profile version: 4.5
    Max compat profile version: 4.5
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.2
OpenGL vendor string: Mesa/X.org
OpenGL renderer string: llvmpipe (LLVM 14.0.5, 256 bits)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile

OpenGL version string: 4.5 (Compatibility Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL shading language version string: 4.50
OpenGL context flags: (none)
OpenGL profile mask: compatibility profile

OpenGL ES profile version string: OpenGL ES 3.2 Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

実際に動いているか確認する

glxgearsでOpenGLのバージョンを確認してみると、4.5が使用されていることがわかります。

/bin/bash
$ glxgears -info
GL_RENDERER   = llvmpipe (LLVM 14.0.5, 256 bits)
GL_VERSION    = 4.5 (Compatibility Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
GL_VENDOR     = Mesa/X.org

冒頭で書いたプログラムも動作することを確認できました。
以上です。ありがとうございました。

参考

https://launchpad.net/~oibaf/+archive/ubuntu/graphics-drivers/
https://blog.techlab-xe.net/post-5166/
https://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20120908

Discussion