🌋

Github ActionsでVulkanの夢

に公開

GitHub ActionsとVulkanの組み合わせ

Vulkanを用いたプログラムを作っているとき、ビルドの確認や動作の確認など自動でやりたいことがあります。いわゆるCI(継続的インテグレーション/Continuous Integration)ですね。
GitHub Actions はこういったことが得意なので、組み合わせてみたいと思います。

プログラムをビルドするために

Vulkanのプログラムは Vulkan SDKを必要とします。
GitHub Actionsのランナーに、Vulkan SDKのインストールから必要です。
この手順は、以下の記事にも詳しく記載があります。

https://zenn.dev/nishiki/articles/github-actions-vulkan

これを参考に、私も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版のビルドが以下より入手できました。

https://github.com/pal1000/mesa-dist-win

ダウンロードしたファイルを展開すると、以下のようなファイル群があります。
今回使用するのは、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を構成しました。

https://zenn.dev/mikana0918/articles/e2a2d332b8b9a6
https://zenn.dev/matken/articles/chromatic-preview-comment

余談

Lavapipe ではソフトウェア実装ですが、Vulkan RaytracingやMesh Shaderの機能を使っていても動作します。動作は今のところ遅いですが、それでもソフトウェアのみで動作するのには感動しました。

Discussion