blob: 8de7ccf89b714a4f0b569930f7442768dbaf1580 [file] [log] [blame] [view]
# 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.
```