| # Dawn Emscripten Fork |
| |
| Dawn temporarily maintains a fork of the Emscripten WebGPU bindings |
| (`library_webgpu.js` and friends). The forked files live in |
| [`//third_party/emdawnwebgpu`](../third_party/emdawnwebgpu/) |
| and the build targets in this directory produce the other files needed to build |
| an Emscripten-based project using these bindings. |
| |
| This allows the the webgpu.h interface to be kept roughly in sync\* between the |
| two implementations in a single place (the Dawn repository) instead of two, |
| while also avoiding constantly breaking the version of webgpu.h that is |
| currently in Emscripten. (\* Note we don't guarantee it will always be in sync, |
| though - we don't have any automated testing for this, so we'll periodically fix |
| it up as needed for import into other projects that use these bindings.) |
| |
| Changes to this code in the Dawn repository will be synced back out to the |
| upstream Emscripten repository after webgpu.h becomes stable, in what should |
| theoretically be one big final breaking update. Between then and now, projects |
| can use Dawn's fork of the bindings. |
| |
| ## Setting up Emscripten |
| |
| - Get an emsdk toolchain: |
| [instructions](https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended). |
| |
| - Get a separate source checkout of [Emscripten](https://github.com/emscripten-core/emscripten) |
| and set it up to point at the toolchain from emsdk by creating a file at `emscripten/.emscripten`: |
| |
| ``` |
| LLVM_ROOT = '/path/to/emsdk/upstream/bin' |
| BINARYEN_ROOT = '/path/to/emsdk/upstream' |
| NODE_JS = '/path/to/emsdk/node/18.20.3_64bit/bin/node' |
| ``` |
| |
| Note this must be a source checkout of Emscripten, |
| not emsdk's `upstream/emscripten` release, which excludes necessary tools. |
| |
| ## Building Dawn Emscripten bindings with GN |
| |
| - Set up a Dawn GN build, with `dawn_emscripten_dir` in the GN args set to point to |
| your Emscripten source checkout. |
| |
| - Build the `emdawnwebgpu` GN build target. |
| |
| - Configure the Emscripten build with all of the linker flags listed in `emdawnwebgpu_config` |
| (and without `-sUSE_WEBGPU`, because we don't want the built-in bindings). |
| |
| ## Building Dawn Emscripten bindings and samples with CMake |
| |
| Set up the build directory using emcmake |
| |
| ``` |
| mkdir out/cmake-wasm |
| cd out/cmake-wasm |
| |
| # Make sure the path is to the source checkout of Emscripten, not emsdk's release. |
| emcmake cmake -GNinja -DDAWN_EMSCRIPTEN_TOOLCHAIN="path/to/emscripten" ../.. |
| |
| ninja |
| |
| # The resulting html files can then be served and viewed in a compatible Browser. |
| |
| ``` |