mach/gpu-dawn
Isaac Freund 02e357ab44
build: never use pkg-config to link system libraries (#217)
Every library we want to link against is either provided by the Zig
toolchain or part of our SDK. Therefore, using pkg-config to link
against libraries on the host system is never what we intend.

To fix this, use linkSystemLibraryName() everywhere instead of
linkSystemLibrary() as the latter integrates with pkg-config while the
former just passes -lfoo to the zig compiler.

In combination with Zig commit 38d6e1d8a8 fixing an std.build bug,
this change fixes the linking of the necessary X11 libraries on my
x86_64 glibc based Void Linux system.
2022-04-12 12:08:30 -07:00
..
.github gpu-dawn: update to Zig 0.10.0-dev.1600+af844931b 2022-03-26 13:31:34 -07:00
dev gpu-dawn: use versioned python command when bundling releases 2022-03-26 14:09:17 -07:00
libs gpu-dawn: update to latest Dawn + windows patches 2022-03-04 19:54:06 -07:00
src gpu-dawn: expose dawn::native::Adapter->Get as C shim 2022-03-31 16:50:09 +00:00
.gitattributes gpu-dawn: initialize subrepository 2022-02-12 15:21:16 -07:00
.gitignore gpu-dawn: initialize subrepository 2022-02-12 15:21:16 -07:00
.gitmodules gpu-dawn: fix formatting of .gitmodules 2022-04-08 11:03:00 -07:00
build.zig build: never use pkg-config to link system libraries (#217) 2022-04-12 12:08:30 -07:00
LICENSE gpu-dawn: initialize subrepository 2022-02-12 15:21:16 -07:00
LICENSE-APACHE gpu-dawn: initialize subrepository 2022-02-12 15:21:16 -07:00
LICENSE-MIT gpu-dawn: initialize subrepository 2022-02-12 15:21:16 -07:00
README.md gpu-dawn: mention Dawn license is permissive 2022-03-19 13:51:50 -07:00

mach/gpu-dawn, WebGPU/Dawn built with Zig Hexops logo

mach/gpu-dawn builds Dawn, Google Chrome's WebGPU implementation, requiring nothing more than zig and git to build and cross-compile a static Dawn library for every OS:

  • No cmake
  • No ninja
  • No gn
  • No system dependencies (xcode, etc.)
  • Automagic cross compilation out of the box with nothing more than zig and git!
  • Builds a single static libdawn.a with everything you need.

This repository is a separate copy of the same library in the main Mach repository, and is automatically kept in sync, so that anyone can use this library in their own project / engine if they like!

Building from source

Building Dawn from source using this method is as simple as:

git clone https://github.com/hexops/mach-gpu-dawn
cd mach-gpu-dawn
zig build -Ddawn-from-source=true

This will take ~10 minutes to finish (see the 'binary releases' section below.) You can add the following options:

Option Description
-Drelease-fast=true Build a release binary instead of a debug binary (default)
-Dtarget=x86_64-macos.12 Cross compile to macOS (Intel chipsets)
-Dtarget=aarch64-macos.12 Cross compile to macOS (Apple Silicon)
-Dtarget=x86_64-linux-gnu Cross compile to x86_64 Linux (glibc)
-Dtarget=x86_64-linux-musl Cross compile to x86_64 Linux (musl libc)
-Dtarget=x86_64-windows-gnu Cross compile to x86_64 Windows

The following platforms are not yet supported, but we hope to support soon:

  • iOS (Dawn does not officially support it yet)
  • Android (Dawn does not officially support it yet)
  • ARM Linux (aarch64)
  • Windows msvc target (Zig targets MinGW libc on Windows currently, msvc support should not be hard to add.)

Binary releases

Dawn (specifically all the shader compilers, and the DirectXShaderCompiler) is a large C++ codebase and takes 5-10 minutes to build on a modern laptop, you just need to specify -Ddawn-from-source=true and wait. Since waiting is no fun, we also have binary releases produced by our GitHub actions:

View binary releases

Here's how to read the downloads provided:

  • _debug.tar.gz and _release-fast.tar.gz are tarballs of the static library + headers for each OS and debug/release mode, respectively.
  • headers.json.gz is a JSON archive of all the Dawn/WebGPU headers.
  • Files ending in .a.gz and .lib.gz are the individual static libdawn.a and dawn.lib (Windows) gzippped and distributed. These are provided as individual downloads so there is no need to extract a tarball.

A warning about API stability

You should be aware:

  • WebGPU's API is not formalized yet.
  • Dawn's API is still changing.
  • The webgpu.h API is still changing
  • Dawn and gfx-rs/wgpu, although both try to implement webgpu.h, do not exactly implement the same interface. There are subtle differences in device discovery & creation for example.

Some of Dawn's API is not available as a C API today. For example, OpenGL device discovery. You may find the following C shims we build for Mach engine useful for interfacing with Dawn from other languages (copy these into your own project, they are not built into the static dawn library):

Generated code

Dawn itself relies on a fairly large amount of dependencies, generated code, etc. To avoid having any dependency on Google build tools, code generation, etc. we maintain a minor fork of Dawn which has generated code and third-party dependencies comitted in "generated" branches. We are usually up-to-date with the upstream within a few weeks on average.

It also provides a few small patches to enable building Dawn with the Zig compiler which we plan to upstream soon, as well as some patches to build the DirectXShaderCompiler with Zig.

Join the community

Join the Mach engine community on Matrix chat to discuss this project, ask questions, get help, etc.

Issues

Issues are tracked in the main Mach repository.

License

All Mach code (this repository) is under the Apache and MIT license at your choosing described in the LICENSE file. Dawn itself is similarly permissively licensed.