160 lines
5.6 KiB
Markdown
160 lines
5.6 KiB
Markdown
![Dawn's logo: a sun rising behind a stylized mountain inspired by the WebGPU logo. The text "Dawn" is written below it.](docs/imgs/dawn_logo.png "Dawn's logo")
|
|
|
|
# Dawn, a WebGPU implementation
|
|
|
|
Dawn is an open-source and cross-platform implementation of the work-in-progress [WebGPU](https://webgpu.dev) standard.
|
|
More precisely it implements [`webgpu.h`](https://github.com/webgpu-native/webgpu-headers/blob/master/webgpu.h) that is a one-to-one mapping with the WebGPU IDL.
|
|
Dawn is meant to be integrated as part of a larger system and is the underlying implementation of WebGPU in Chromium.
|
|
|
|
Dawn provides several WebGPU building blocks:
|
|
- **WebGPU C/C++ headers** that applications and other building blocks use.
|
|
- The `webgpu.h` version that Dawn implements.
|
|
- A C++ wrapper for the `webgpu.h`.
|
|
- **A "native" implementation of WebGPU** using platforms' GPU APIs:
|
|
- **D3D12** on Windows 10
|
|
- **Metal** on macOS and iOS
|
|
- **Vulkan** on Windows, Linux, ChromeOS, Android and Fuchsia
|
|
- OpenGL as best effort where available
|
|
- **A client-server implementation of WebGPU** for applications that are in a sandbox without access to native drivers
|
|
|
|
Helpful links:
|
|
|
|
- [Dawn's bug tracker](https://bugs.chromium.org/p/dawn/issues/entry) if you find issues with Dawn.
|
|
- [Dawn's mailing list](https://groups.google.com/forum/#!members/dawn-graphics) for other discussions related to Dawn.
|
|
- [Dawn's source code](https://dawn.googlesource.com/dawn)
|
|
- [Dawn's Matrix chatroom](https://matrix.to/#/#webgpu-dawn:matrix.org) for live discussion around contributing or using Dawn.
|
|
- [WebGPU's Matrix chatroom](https://matrix.to/#/#WebGPU:matrix.org)
|
|
|
|
## Documentation table of content
|
|
|
|
Developer documentation:
|
|
|
|
- [Dawn overview](docs/dawn/overview.md)
|
|
- [Building Dawn](docs/dawn/building.md)
|
|
- [Contributing to Dawn](docs/dawn/contributing.md)
|
|
- [Testing Dawn](docs/dawn/testing.md)
|
|
- [Debugging Dawn](docs/dawn/debugging.md)
|
|
- [Dawn's infrastructure](docs/dawn/infra.md)
|
|
- [Dawn errors](docs/dawn/errors.md)
|
|
|
|
User documentation: (TODO, figure out what overlaps with the webgpu.h docs)
|
|
|
|
## Status
|
|
|
|
(TODO)
|
|
|
|
## License
|
|
|
|
Apache 2.0 Public License, please see [LICENSE](/LICENSE).
|
|
|
|
## Disclaimer
|
|
|
|
This is not an officially supported Google product.
|
|
|
|
# Tint
|
|
|
|
Tint is a compiler for the WebGPU Shader Language (WGSL).
|
|
|
|
This is not an officially supported Google product.
|
|
|
|
## Requirements
|
|
* Git
|
|
* CMake (3.10.2 or later)
|
|
* Ninja (or other build tool)
|
|
* Python, for fetching dependencies
|
|
* [depot_tools] in your path
|
|
|
|
## Build options
|
|
* `TINT_BUILD_SPV_READER` : enable the SPIR-V input reader (off by default)
|
|
* `TINT_BUILD_WGSL_READER` : enable the WGSL input reader (on by default)
|
|
* `TINT_BUILD_SPV_WRITER` : enable the SPIR-V output writer (on by default)
|
|
* `TINT_BUILD_WGSL_WRITER` : enable the WGSL output writer (on by default)
|
|
* `TINT_BUILD_FUZZERS` : enable building fuzzzers (off by default)
|
|
|
|
## Building
|
|
Tint uses Chromium dependency management so you need to install [depot_tools]
|
|
and add it to your PATH.
|
|
|
|
[depot_tools]: http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up
|
|
|
|
### Getting source & dependencies
|
|
|
|
```sh
|
|
# Clone the repo as "tint"
|
|
git clone https://dawn.googlesource.com/tint tint
|
|
cd tint
|
|
|
|
# Bootstrap the gclient configuration
|
|
cp standalone.gclient .gclient
|
|
|
|
# Fetch external dependencies and toolchains with gclient
|
|
gclient sync
|
|
```
|
|
|
|
### Compiling using CMake + Ninja
|
|
```sh
|
|
mkdir -p out/Debug
|
|
cd out/Debug
|
|
cmake -GNinja ../..
|
|
ninja # or autoninja
|
|
```
|
|
|
|
### Compiling using CMake + make
|
|
```sh
|
|
mkdir -p out/Debug
|
|
cd out/Debug
|
|
cmake ../..
|
|
make # -j N for N-way parallel build
|
|
```
|
|
|
|
### Compiling using gn + ninja
|
|
```sh
|
|
mkdir -p out/Debug
|
|
gn gen out/Debug
|
|
autoninja -C out/Debug
|
|
```
|
|
|
|
### Fuzzers on MacOS
|
|
If you are attempting fuzz, using `TINT_BUILD_FUZZERS=ON`, the version of llvm
|
|
in the XCode SDK does not have the needed libfuzzer functionality included.
|
|
|
|
The build error that you will see from using the XCode SDK will look something
|
|
like this:
|
|
```
|
|
ld: file not found:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.fuzzer_osx.a
|
|
```
|
|
|
|
The solution to this problem is to use a full version llvm, like what you would
|
|
get via homebrew, `brew install llvm`, and use something like `CC=<path to full
|
|
clang> cmake ..` to setup a build using that toolchain.
|
|
|
|
### Checking [chromium-style] issues in CMake builds
|
|
The gn based work flow uses the Chromium toolchain for building in anticipation
|
|
of integration of Tint into Chromium based projects. This toolchain has
|
|
additional plugins for checking for style issues, which are marked with
|
|
[chromium-style] in log messages. This means that this toolchain is more strict
|
|
then the default clang toolchain.
|
|
|
|
In the future we will have a CQ that will build this work flow and flag issues
|
|
automatically. Until that is in place, to avoid causing breakages you can run
|
|
the [chromium-style] checks using the CMake based work flows. This requires
|
|
setting `CC` to the version of clang checked out by `gclient sync` and setting
|
|
the `TINT_CHECK_CHROMIUM_STYLE` to `ON`.
|
|
|
|
```sh
|
|
mkdir -p out/style
|
|
cd out/style
|
|
cmake ../..
|
|
CC=../../third_party/llvm-build/Release+Asserts/bin/clang cmake -DTINT_CHECK_CHROMIUM_STYLE=ON ../../ # add -GNinja for ninja builds
|
|
```
|
|
|
|
## Issues
|
|
Please file any issues or feature requests at
|
|
https://bugs.chromium.org/p/tint/issues/entry
|
|
|
|
## Contributing
|
|
Please see the CONTRIBUTING and CODE_OF_CONDUCT files on how to contribute to
|
|
Tint.
|
|
|
|
Tint has a process for supporting [experimental extensions](docs/tint/experimental_extensions.md).
|