juj/wasm_webgpu
System headers for interfacing WebGPU from C programs compiled via Emscripten to WebAssembly
概要
wasm_webgpu は、Emscripten で WebAssembly にコンパイルされた C/C++ プログラムが、ブラウザの WebGPU グラフィックス API と通信できるようにする、小規模なオープンソースライブラリです。ブラウザ側の WebGPU JavaScript API を薄く 1 対 1 でマッピングするため、開発者はネイティブの C/C++ で GPU アクセラレーションによるレンダリングコードを記述し、それをブラウザで実行できます(実験的には、ブラウザ外で Dawn を介して実行することもできます)。
機能
| 機能 | それが意味すること |
|---|---|
ヘッダー + 実装ファイル (lib_webgpu.*) |
これらを任意の Emscripten プロジェクトに配置し、lib_webgpu.h をインクルードすると、wgpu_adapter_request_device_sync() のような、基盤となる WebGPU JS 関数を呼び出す C スタイルのラッパーを利用できます。 |
| 正確な API マッピング | GPUAdapter などの型は WGpuAdapter になり、関数は同じ形を維持します (wgpu_canvas_context_configure)。これにより、C コードを記述する際に仕様が信頼できる参照情報となります。 |
| パフォーマンス重視 | バインディングレイヤーは意図的に低レベルで、余分な JavaScript オブジェクトを避けています。Closure Compiler と連携して積極的な minification を行い、ランタイムオーバーヘッドと生成コードサイズを最小限に抑えます。 |
| カスタムヘルパー | マップされたバッファの読み書きや URL からの画像読み込みを行う関数は、JS と Wasm の間で受け渡しが難しい一般的な WebGPU タスクを簡素化します。 |
| JSPI (同期 API) サポート | オプションのフラグ (-sJSPI) により、通常は非同期の WebGPU 呼び出しの同期バージョンを公開します。プロトタイプやテストハーネスに便利です。 |
| OffscreenCanvas とワーカー | WebWorker または pthread から OffscreenCanvas を作成および制御する API を提供し、バックグラウンドスレッドでのレンダリングを可能にします。 |
| メモリモデルの柔軟性 | Emscripten の 2 GB、4 GB、Wasm64 メモリ構成で動作するため、必要に応じて大規模なデータセットをターゲットにできます。 |
| Dawn バックエンド (実験的) | 別のソースファイル (lib_webgpu_dawn.cpp) により、ブラウザ外で WebGPU の Dawn 実装に対してコンパイルできます。ただし、これは主な焦点ではありません。 |
誰が使うべきか
- ゲームまたはグラフィックスエンジン開発者: コアレンダリングコードを C/C++ に保ち、JavaScript や WebGL に書き直さずに Web に展開したい方。
- 研究コードベース: ネイティブ C++ で GPU コンピュートを既に使用しており、デモや再現性のためにブラウザで実行する簡単なパスを必要としている方。
- ツール作成者: 同期 API と最小限のコードサイズの恩恵を受ける、WebGPU ベースのビジュアライザー、エディター、またはテストスイートを構築する方。
はじめに (簡単な要約)
- Emscripten をインストールします。
- リポジトリをクローンし、
lib/ファイルをプロジェクトにコピーして、Emscripten のリンクステップにライブラリを追加します (--js-library …)。 samples/にある提供の CMakeLists をテンプレートとして使用します。emcmake cmake … && ninjaでビルドし、生成された HTML をemrun .で提供します。
制限事項 / 注意点
- このライブラリは現在の WebGPU 仕様を正確に反映しています。仕様が進化すると破壊的な変更が発生する可能性があり、ABI 安定性の保証はありません。
- Dawn バックエンドは古く、積極的にメンテナンスされていません。
- これはバインディングレイヤーのみです。実際のレンダリングロジックは自分で記述する必要があります。提供されるサンプルは意図的にシンプルで、派手ではありません。
- JSPI を使用すると、予期しないイベントループの相互作用が発生する可能性があるため、本番コードではプロファイリングをお勧めします。
結論
wasm_webgpu は、WebAssembly にコンパイルされた C/C++ から WebGPU にアクセスできるようにする、本格的な低レベルブリッジです。ハイレベルなグラフィックスエンジンを探している開発者ではなく、パフォーマンス、コードサイズ、公式 WebGPU 仕様に忠実であることを重視する開発者を対象としています。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト