wgpu の v25.0.0 がリリース

[wgpu](https://github.com/gfx-r/wgpu)はRustで書かれたクロスプラットフォームなグラフィックスAPIです。VulkanやMetal、Direct3D12、OpenGLといったネイティブAPIの上で動作し、WebAssembly上ではWebGPUやWebGL2もサポートしています。WebGPU標準に基づいており、Firefox、Servo、DenoといったプロジェクトでのWebGPU実装の中核として利用されています。

本日 (2025-04-11)、wgpu v25.0.0がリリースされました。wgpuメンテナーのSirflankalotさんがRedditでAMA（Ask Me Anything）として質問に答えていましたので紹介します。

## リリースの主な変更点

まずは、v25.0.0での主な変更点を簡単に紹介します。

### 1. HashMapがAPIから削除

`PipelineCompilationOptions::constants`と`ShaderSource::Glsl::defines`が、HashMapの代わりにキーと値のペアのスライスを受け取るようになりました。これは`no_std`サポートを準備し、どのhashmap hasherを使うかなどを実装の詳細として保持できるようにするため、とのことです。

```rust
let fragment = wgpu::FragmentState {
    compilation_options: wgpu::PipelineCompilationOptions {
        constants: &[("some_factor".to_owned(), 0.1234)].into(),
        ..Default::default()
    },
    // ...
};
```

### 2. すべてのバックエンドが機能フラグ化

`vulkan`と`gles`のバックエンドが無効化可能になりました。`default-features = false`を使用している場合は、明示的に必要なバックエンドを指定する必要があります：

```toml
# 変更後
wgpu = { version = "25", default-features = false, features = ["metal", "wgsl", "webgl", "vulkan", "gles"] }
```

### 3. `device.poll` APIの改良

`poll` APIが改良され、ポーリングが内部タイムアウト制限に達したときにエラーを返せるようになりました。`Maintain`が`PollType`に名前変更され、より詳細な情報が提供されるそうです。

```rust
// 変更後
device.poll(wgpu::PollType::Poll).unwrap();
```

### 4. デュアルソースブレンディング機能の改良

WebGPU仕様の拡張機能として追加されたデュアルソースブレンディングに対応し、シェーダー構文が更新されました：

```wgsl
struct FragmentOutput{
    @location(0) @blend_src(0) source0: vec4<f32>,
    @location(0) @blend_src(1) source1: vec4<f32>,
}
```

### 5. Noopバックエンドの追加

GPUが利用できない環境でも、ダミーの`wgpu`デバイスを作成できるようになりました。これはグラフィックスリソースを管理するコードのテストに役立ちます。

### チェンジログに載っていない隠れた変更

「今回のリリースで最もクールな機能は何か」との質問に、メンテナーのSirflankalotさんは次のように回答しています：

> 実はチェンジログに書き忘れてしまったのですが、nagaでの`f16`型（wgsl、spirv、glslシェーダー）のサポートです🤦

### 今後の展望

次の1年で期待される機能について、Sirflankalotさんは以下のように述べています：

> 舞台裏では多くの素晴らしい作業が進行中です。自分自身はbindlessサポートの改善に取り組んでいますし、VecVecさんはレイトレーシングサポートを向上させ、SupaMaggieさんはメッシュシェーダーのフレームワークを構築しています。やるべきことはたくさんありますが、wgpuの未来は明るいです。

### GPUプログラミングの学習リソース

初心者がwgpuを使ってグラフィックスプログラミングを学ぶべきかという質問に対して、以下のリソースが推奨されました：

1. [webgpufundamentals.org](https://webgpufundamentals.org/) - JavaScriptでWebGPU APIを学ぶサイト
2. [learn-wgpu](https://github.com/sotrh/learn-wgpu/) - wgpuを直接学ぶためのリソース
3. [learnopengl.com](https://learnopengl.com/) - グラフィックス理論を学ぶのに役立つサイト

JavaScriptのチュートリアルを読んでから、Rustに適用することが推奨されています。

:::note
私も学び直そうと思います
:::

### 非ゲーム用途でのGPU活用

大規模な行列演算にGPUを利用できるかという質問に対して、[Burn](https://github.com/burn-rs/burn)というクレートが推奨されました。Burnはニューラルネットワーク機能に限らず、テンソルライブラリとしても使用でき、wgpu、CUDA、ROCm、さらにはndarrayでも動作します。

### no_stdサポートと組み込み応用

wgpuが組み込みアプリケーションで使用可能になるかという質問に対して、Sirflankalotさんは以下のように回答しました：

> いくつか大きな注意点はありますが、可能になります。最初はglesバックエンドのみ、その後おそらくvulkanバックエンドがno_stdサポートされる予定です。それには、それらのグラフィックスAPIが存在するプラットフォームが必要です。現在のno_stdサポート推進の主な理由は、`wasm32-unknown-unknown`とは異なり、no_stdである`wasm32v1-none`ターゲットをサポートすることです。

## テスト機能の紹介

AMAsの中で、Sirflankalotさん自身が誇りに思っているwgpuのテスト機能についての言及もありました：

> 私たちのプロセスで興味深いのはテストスイートです。通常のテストに加えて、カスタムテストハーネスを使用するGPUテストフレームワークがあり、各`wgpu`ベースのテストをシステム内の各GPUで自動的に実行します。これにより、複数のベンダーからのGPUを持つマシンでも、すべてのGPUで動作することを簡単に確認できます。これは私自身が書いたもので、誇りに思っています。

## まとめ

wgpu v25.0.0では、APIの簡素化、バックエンドの柔軟化、パフォーマンスの改善、バグ修正など多岐にわたる変更が行われました。さらなる改善が進行中であり、bindlessサポート、レイトレーシング、メッシュシェーダーなどで今後の発展が期待されます。

ゲーム開発だけでなく、大規模な行列演算や機械学習などの分野でも活用の可能性があり、今後のno_stdサポートにより組み込み環境での応用も期待されています。

## 参考リンク

- [wgpu公式リポジトリ](https://github.com/gfx-rs/wgpu)
- [v25.0.0リリースノート](https://github.com/gfx-rs/wgpu/releases/tag/v25.0.0)
- [RedditでのAMAスレッド](https://www.reddit.com/r/rust/comments/1jwa4te/wgpu_v2500_released/)
- [webgpufundamentals.org](https://webgpufundamentals.org/)
- [learn-wgpu](https://github.com/sotrh/learn-wgpu/)
- [Burn](https://github.com/burn-rs/burn) - wgpuを活用できるテンソルライブラリ