Github ActionsでVulkanの夢
GitHub ActionsとVulkanの組み合わせ
Vulkanを用いたプログラムを作っているとき、ビルドの確認や動作の確認など自動でやりたいことがあります。いわゆるCI(継続的インテグレーション/Continuous Integration)ですね。
GitHub Actions はこういったことが得意なので、組み合わせてみたいと思います。
プログラムをビルドするために
Vulkanのプログラムは Vulkan SDKを必要とします。
GitHub Actionsのランナーに、Vulkan SDKのインストールから必要です。
この手順は、以下の記事にも詳しく記載があります。
これを参考に、私もVulkan SDKをLunarGのサイトから取得してインストールする方法を使いました。記事と少し違うのは、2025年8月の状態に合わせたURLになっている点と、Vulkan SDKと一緒にGLMもインストールしている点です。
これらのアクションを処理するためのYAMLファイルは以下のようになっています。
まだ改良の余地はあって、バージョンを手動で設定するとか、自動的に最新を取得してくるようにするとか、でしょうか。
windows-build-test:
runs-on: windows-latest
name: windows-build-test
env:
VULKAN_SDK_URL: https://sdk.lunarg.com/sdk/download/1.4.321.1/windows/vulkansdk-windows-X64-1.4.321.1.exe
VULKAN_SDK: C:\VulkanSDK\
steps:
- name: Install Vulkan SDK
run: |
Invoke-WebRequest -Uri $env:VULKAN_SDK_URL -OutFile VulkanSDK.exe
.\VulkanSDK.exe --root $env:VULKAN_SDK --accept-licenses --default-answer --confirm-command install com.lunarg.vulkan.glm
アプリを実行するためには
先の手順でビルドはできるようになりました。しかし実行を考えるとなかなか難しいです。
しかたないので、セルフホステッド ランナー(self-hosted runner)を使うことを考えます。
実際に物理的なPC環境を用いて、デスクトップ画面を持つような状況であれば、そのまま素直にセルフホステッドランナーに登録して完了です。
しかし、仮想環境(WindowsのVM)なら用意できるということもあると思います。この場合、デスクトップ画面を持てても、物理的なGPUが見えないのでVulkanアプリケーションとして使用できないことが多いです。
lavapipe の導入
そこで仮想環境でもVulkanアプリケーションを起動できるように、エミュレーション環境を作ります。Mesa Lavapipe driverというものがあり、これはCPUによるソフトウェアドライバとなっています。
Vulkanのアプリケーションからは仮想GPUとしてみえるので、実行が出来るようになります。GPUなしで、CPUによるエミュレーション&ソフトウェアラスタライザで動作します。当然ながら、速度の面では厳しいものがあるので、単なるチェックが関の山でしょう。
それでも、 動作するのとしないのとでは、大きく違うので、これを使います!
ダウンロード&セットアップ
非公式ビルドではありますが、Windows版のビルドが以下より入手できました。
ダウンロードしたファイルを展開すると、以下のようなファイル群があります。
今回使用するのは、x64フォルダ内のものです。
x64フォルダ内にある lvp_icd.x86_64.json
ファイルのフルパスを記録します。
そして、このファイルを以下のように編集します。 元のファイルでは ''がエスケープされていないので、不正な状態なので補正をします。
{
"ICD": {
"api_version": "1.4.318",
"library_arch": "64",
"library_path": ".\\vulkan_lvp.dll"
},
"file_format_version": "1.0.1"
}
次に、レジストリエディタを開き、HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\Drivers
を開きます。Vulkan SDKをインストール後でも、このキーがない場合にはDrivers
を作成しましょう。
そして、この場所に以下のDWORDタイプのキーを作成します。
種別 | レジストリ内容 |
---|---|
タイプ | DWORD |
値 | 0 |
名前 | 先程のlvp_icd.x86_64.json のフルパスを記述 |
動作確認
この状態で vulkaninfo --summary
を実行すると、以下のように出力(抜粋)され、仮想的なGPUを認識していることが確認できます。
Devices:
========
GPU0:
apiVersion = 1.4.318
driverVersion = 25.2.0
vendorID = 0x10005
deviceID = 0x0000
deviceType = PHYSICAL_DEVICE_TYPE_CPU
deviceName = llvmpipe (LLVM 20.1.8, 256 bits)
driverID = DRIVER_ID_MESA_LLVMPIPE
driverName = llvmpipe
driverInfo = Mesa 25.2.0 (git-890b484889) (LLVM 20.1.8)
conformanceVersion = 1.3.1.1
deviceUUID = 6d657361-3235-2e32-2e30-000000000000
driverUUID = 6c6c766d-7069-7065-5555-494400000000
組み合わせ事例
これで仮想マシン上のWindowsでも一応は画面がでるようになりました。これとGithub Actionsを組み合わせて、CIの結果でスクショ撮影し、Issueコメントに投稿するようなものを作成してみました。その様子を以下に示します。
なお、画像の投稿やコメントへの追加などは、以下の記事を参考にして YAMLを構成しました。
余談
Lavapipe ではソフトウェア実装ですが、Vulkan RaytracingやMesh Shaderの機能を使っていても動作します。動作は今のところ遅いですが、それでもソフトウェアのみで動作するのには感動しました。
Discussion