name: wai-quantum WebGPU member # The fabric's WebGPU member: one WGSL gate kernel, compiled for every adapter a # runner has, certified against the CPU reference's pinned corpus digests. # # Each member job declares the adapters its runner must have in # WAI_QUANTUM_WEBGPU_EXPECT. The device test fails if the adapters found differ, # and scripts/wai-quantum-webgpu-member.sh fails unless all tests ran, every # declared adapter earned one bit-exact certificate per pinned digest, and every # declared adapter killed every shader mutant. # # The GPU jobs then run the quantum conformance corpus through each member # (`wai_quantum_vectors verify --webgpu`). wai-rs is built there with # --no-default-features: its default feature, `codecs`, links system codec # libraries that neither GPU host has, and the corpus needs none of them. # # There is no windows job while the windows runner is offline: a job queued on an # offline runner never settles. Add it back from the comment at the end when the # runner has survived a reboot. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: [main] paths: - 'wai/wai-quantum/**' - 'wai/quantum-conformance/**' - 'wai/tools/quantum-wgsl-check/**' - 'wai/wai-rs/src/bin/wai_quantum_vectors.rs' # The GPU jobs build wai-rs with the forwarded feature, --locked. - 'wai/wai-rs/Cargo.toml' - 'wai/wai-rs/Cargo.lock' - 'wai/wai-rs/src/lib.rs' - 'rust-toolchain.toml' - 'wai/wai-web/src/quantum_webgpu.rs' - 'wai/wai-web/demo/quantum_webgpu*' - 'scripts/wai-quantum-webgpu-member.sh' - '.github/workflows/wai-quantum-webgpu.yml' pull_request: paths: - 'wai/wai-quantum/**' - 'wai/quantum-conformance/**' - 'wai/tools/quantum-wgsl-check/**' - 'wai/wai-rs/src/bin/wai_quantum_vectors.rs' # The GPU jobs build wai-rs with the forwarded feature, --locked. - 'wai/wai-rs/Cargo.toml' - 'wai/wai-rs/Cargo.lock' - 'wai/wai-rs/src/lib.rs' - 'rust-toolchain.toml' - 'wai/wai-web/src/quantum_webgpu.rs' - 'wai/wai-web/demo/quantum_webgpu*' - 'scripts/wai-quantum-webgpu-member.sh' - '.github/workflows/wai-quantum-webgpu.yml' jobs: checks: name: shader checks · browser build · wasip2 inertness · MSRV runs-on: linux timeout-minutes: 60 steps: - uses: actions/checkout@v5 - name: Install Rust 1.98.0 (wasm32 targets) and 1.97.0 shell: bash run: | export PATH="$HOME/.cargo/bin:$PATH" command -v rustup >/dev/null 2>&1 || \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0 rustup toolchain install 1.98.0 --profile minimal rustup toolchain install 1.97.0 --profile minimal rustup default 1.98.0 rustup target add --toolchain 1.98.0 wasm32-unknown-unknown wasm32-wasip2 echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: SPIR-V validator shell: bash run: | set -euo pipefail SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo" $SUDO apt-get update -qq $SUDO apt-get install -y -qq --no-install-recommends spirv-tools - name: The shader under naga 30.0.1 shell: bash working-directory: wai/tools/quantum-wgsl-check run: | set -euo pipefail cargo run --locked --release -- "$RUNNER_TEMP" 2>&1 | tee "$RUNNER_TEMP/wgsl-check.log" grep -qx "quantum-wgsl-check: ok" "$RUNNER_TEMP/wgsl-check.log" spirv-val --target-env vulkan1.1 "$RUNNER_TEMP/lanes32.spv" - name: The member builds for a browser working-directory: wai/wai-quantum run: cargo build --locked --lib --target wasm32-unknown-unknown --no-default-features --features quantum_fabric_webgpu - name: On wasm32-wasip2 the feature is inert shell: bash working-directory: wai/wai-quantum run: | set -euo pipefail cargo check --locked --lib --target wasm32-wasip2 --features full,quantum_fabric_webgpu w="$RUNNER_TEMP/tree-wasip2.txt"; n="$RUNNER_TEMP/tree-native.txt" cargo tree --locked --target wasm32-wasip2 --features full,quantum_fabric_webgpu -e normal --prefix none > "$w" cargo tree --locked --target x86_64-unknown-linux-gnu --features quantum_fabric_webgpu -e normal --prefix none > "$n" grep -q '^wai-quantum ' "$w" || { echo "::error::cargo tree printed no wasip2 tree"; exit 1; } grep -q '^wgpu ' "$n" || { echo "::error::the native tree has no wgpu, so this check cannot see it"; exit 1; } if grep -q '^wgpu' "$w"; then echo "::error::wgpu is in the wasm32-wasip2 tree"; exit 1; fi - name: The package carries the shader shell: bash working-directory: wai/wai-quantum run: | set -euo pipefail cargo package --locked --list --allow-dirty > "$RUNNER_TEMP/package.txt" grep -qx 'src/quantum_fabric/lanes32.wgsl' "$RUNNER_TEMP/package.txt" - name: MSRV 1.97.0 working-directory: wai/wai-quantum run: cargo +1.97.0 check --locked --lib --features quantum_fabric_webgpu # The member's unit tests need no GPU (a failed native wait is fed to the # guard as a panicking closure), and only the feature build compiles them. - name: The member's unit tests, without a device shell: bash working-directory: wai/wai-quantum run: | set -euo pipefail cargo test --locked --lib --features quantum_fabric_webgpu -- quantum_fabric_webgpu:: 2>&1 \ | tee "$RUNNER_TEMP/member-unit.log" grep -q '^test quantum_fabric_webgpu::tests::a_failed_native_wait_is_a_typed_loss \.\.\. ok$' \ "$RUNNER_TEMP/member-unit.log" \ || { echo "::error::the member's unit test did not run"; exit 1; } member-software: name: member · software Vulkan (linux) runs-on: linux timeout-minutes: 120 env: WAI_QUANTUM_WEBGPU_EXPECT: swgpu-vulkan-10005 steps: - uses: actions/checkout@v5 - name: Install Rust 1.98.0 shell: bash run: | export PATH="$HOME/.cargo/bin:$PATH" command -v rustup >/dev/null 2>&1 || \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0 rustup toolchain install 1.98.0 --profile minimal rustup default 1.98.0 echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: The Vulkan loader and a software Vulkan driver shell: bash run: | set -euo pipefail SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo" $SUDO apt-get update -qq $SUDO apt-get install -y -qq --no-install-recommends libvulkan1 mesa-vulkan-drivers - name: The member's tests shell: bash run: scripts/wai-quantum-webgpu-member.sh member-metal: name: member · Metal (macos) runs-on: macos timeout-minutes: 90 env: WAI_QUANTUM_WEBGPU_EXPECT: gpu-metal-0 steps: - uses: actions/checkout@v5 # launchd's PATH omits cargo on the macOS host runner. - name: Put cargo on PATH shell: bash run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: The member's tests shell: bash run: nice -n 10 scripts/wai-quantum-webgpu-member.sh - name: The conformance corpus through the member shell: bash working-directory: wai/wai-rs run: nice -n 10 cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu member-hw: name: member · discrete GPU, Vulkan (jetson-hub) runs-on: linux-hw timeout-minutes: 150 env: # Set from the key list the first run prints; add any other ICD the host # exposes (an integrated GPU, a software driver) as it reports them. # The discrete GPU, and the software Vulkan driver the host also has. The wide # sizes run on the GPU only. WAI_QUANTUM_WEBGPU_EXPECT: gpu-vulkan-10de,swgpu-vulkan-10005 WAI_QUANTUM_WEBGPU_WIDE: '1' CARGO_PROFILE_DEV_DEBUG: '0' CARGO_BUILD_JOBS: '8' steps: - name: Fetch the source shell: bash run: | set -euo pipefail want="${{ github.event.pull_request.head.sha || github.sha }}" rm -rf src && mkdir src && cd src git init -q # Fetch the commit itself, not the ref: a later commit on the ref that this # workflow's paths do not match would otherwise be fetched instead. git fetch -q --depth 1 http://100.64.224.0:3400/Transaction-Science/open-standards.git "$want" git checkout -q FETCH_HEAD got="$(git rev-parse HEAD)" [ "$got" = "$want" ] || { echo "::error::fetched $got, not $want"; exit 1; } - name: The member's tests shell: bash working-directory: src run: CARGO_TARGET_DIR="$HOME/hw-target/wai-quantum" nice -n 10 scripts/wai-quantum-webgpu-member.sh - name: The conformance corpus through the member shell: bash working-directory: src/wai/wai-rs run: CARGO_TARGET_DIR="$HOME/hw-target/wai-rs" nice -n 10 cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu # Windows, when its runner is back (DX12, translator naga+dxbc, and Vulkan, as separate members): # member-windows: # runs-on: windows # env: { WAI_QUANTUM_WEBGPU_EXPECT: "" } # steps: checkout; Set-ExecutionPolicy Bypass; run the script with `shell: bash` # (Git Bash on PATH). Not a required status.