# 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)

## 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
```

## 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.
