Update spirv-tools (#1127)

* Update to spirv-tools 0.10.0

* Use pre-built binaries from spirv-tools-rs

* Oops

* Target != host for android

* Use non-ancient ubuntu

* Oh right

* Update expected output

* Address feedback

* Oops

* Cancel actions when new commits are pushed

* Update CHANGELOG

* Fixup
This commit is contained in:
Jake Shadle 2024-02-07 08:46:23 +01:00 committed by GitHub
parent 3bd121ef25
commit e96418f9fa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 153 additions and 54 deletions

14
.github/install-spirv-tools/Cargo.toml vendored Normal file
View File

@ -0,0 +1,14 @@
# We make this tool its own workspace as it doesn't share dependencies with the
# rest of the workspace, and it shouldn't be built normally, only as a helper
# for CI so it would just slow down local development for no reason
[workspace]
[package]
name = "install-spirv-tools"
edition = "2021"
version = "0.1.0"
publish = false
[dependencies]
tar = "0.4"
zstd = "0.13"

109
.github/install-spirv-tools/src/main.rs vendored Normal file
View File

@ -0,0 +1,109 @@
use std::{env, fs, io::Write as _, process::Command};
struct Group(bool);
impl Group {
fn new(group: &str) -> Self {
let is_gh = env::var_os("CI").is_some();
if is_gh {
println!("::group::{group}");
} else {
println!("{group}");
}
Self(is_gh)
}
}
impl Drop for Group {
fn drop(&mut self) {
if self.0 {
println!("::endgroup::");
}
}
}
fn main() {
let (triple, release, td) = {
let mut args = env::args().skip(1);
let triple = args.next().expect("expected target triple");
let release = args.next().expect("expected release tag name");
let td = args.next().expect("expected output directory");
(triple, release, td)
};
let compressed = {
let _s = Group::new(&format!("downloading {triple} tarball"));
let mut cmd = Command::new("curl");
cmd.args(["-f", "-L"])
.arg(format!("https://github.com/EmbarkStudios/spirv-tools-rs/releases/download/{release}/{triple}.tar.zst"))
.stdout(std::process::Stdio::piped());
let output = cmd
.spawn()
.expect("curl is not installed")
.wait_with_output()
.expect("failed to wait for curl");
if !output.status.success() {
panic!("failed to download tarball via curl");
}
output.stdout
};
let decoded = {
let _s = Group::new(&format!("decompressing {triple} tarball"));
// All archives are <8MiB decompressed
let uncompressed = Vec::with_capacity(8 * 1024 * 1024);
let mut decoder =
zstd::stream::write::Decoder::new(uncompressed).expect("failed to create decoder");
decoder
.write_all(&compressed)
.expect("failed to decompress");
decoder.flush().expect("failed to flush decompress stream");
decoder.into_inner()
};
{
let _s = Group::new(&format!("untarring {triple} tarball"));
{
let mut tar = tar::Archive::new(std::io::Cursor::new(&decoded));
if tar
.entries()
.expect("failed to retrieve entries")
.filter(|ent| ent.is_ok())
.count()
== 0
{
panic!("no valid entries found in tarball");
}
}
let mut tar = tar::Archive::new(std::io::Cursor::new(decoded));
tar.unpack(&td).expect("failed to untar files");
}
if let Some(gh_path) = env::var_os("GITHUB_PATH") {
let _s = Group::new(&format!("adding '{td}' to $GITHUB_PATH ({gh_path:?})"));
// emulate >> for both empty and non-empty files
let has_contents = fs::metadata(&gh_path).map_or(false, |md| md.len() > 0);
let mut file = fs::OpenOptions::new()
.append(true)
.open(gh_path)
.expect("failed to open $GITHUB_PATH");
let td = if has_contents {
format!("\n{td}\n")
} else {
td
};
file.write_all(td.as_bytes())
.expect("failed to write to $GITHUB_PATH");
}
}

View File

@ -6,6 +6,11 @@ on:
name: CI
# Cancel PR actions on new commits
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
test:
name: Test
@ -20,52 +25,22 @@ jobs:
target: x86_64-apple-darwin
- os: ubuntu-20.04-16core
target: aarch64-linux-android
host: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.os }}
env:
# Get platform-specific download links from https://github.com/KhronosGroup/SPIRV-Tools/blob/master/docs/downloads.md
# which will point to the `spirv-tools` Google Cloud Storage Bucket - if
# you need to manually look around, you can search for `spirv_tools_version`
# (which should be in the `YYYYMMDD` format and appear in paths) in these
# listings (NB: they're limited to 1000 results and may need adjustment):
# https://storage.googleapis.com/spirv-tools/?list-type=2&start-after=artifacts/prod/graphics_shader_compiler/spirv-tools/linux-clang-release/continuous/1800
# https://storage.googleapis.com/spirv-tools/?list-type=2&start-after=artifacts/prod/graphics_shader_compiler/spirv-tools/macos-clang-release/continuous/1800
# https://storage.googleapis.com/spirv-tools/?list-type=2&start-after=artifacts/prod/graphics_shader_compiler/spirv-tools/windows-msvc-2017-release/continuous/1800
spirv_tools_version: "20221024"
# NOTE(eddyb) do not forget to update both the above date and below links!
# FIXME(eddyb) automate this somewhat by taking advantage of the bucket APIs,
# and look for the first build with the date in `spirv_tools_version`.
spirv_tools_linux_url: "https://storage.googleapis.com/spirv-tools/artifacts/prod/graphics_shader_compiler/spirv-tools/linux-clang-release/continuous/1863/20221024-094528/install.tgz"
spirv_tools_macos_url: "https://storage.googleapis.com/spirv-tools/artifacts/prod/graphics_shader_compiler/spirv-tools/macos-clang-release/continuous/1875/20221024-094531/install.tgz"
spirv_tools_windows_url: "https://storage.googleapis.com/spirv-tools/artifacts/prod/graphics_shader_compiler/spirv-tools/windows-msvc-2017-release/continuous/1851/20221024-094908/install.zip"
RUSTUP_UNPACK_RAM: "26214400"
RUSTUP_IO_THREADS: "1"
steps:
- uses: actions/checkout@v2
- if: ${{ runner.os == 'Linux' }}
name: Linux - Install native dependencies and spirv-tools
run: |
sudo apt install libwayland-cursor0 libxkbcommon-dev libwayland-dev
mkdir "${HOME}/spirv-tools"
curl -fL "$spirv_tools_linux_url" | tar -xz -C "${HOME}/spirv-tools"
echo "${HOME}/spirv-tools/install/bin" >> $GITHUB_PATH
- if: ${{ runner.os == 'macOS' }}
name: Mac - Install spirv-tools
# FIXME(eddyb) deduplicate with Linux (and maybe even Windows?).
run: |
mkdir "${HOME}/spirv-tools"
curl -fL "$spirv_tools_macos_url" | tar -xz -C "${HOME}/spirv-tools"
echo "${HOME}/spirv-tools/install/bin" >> $GITHUB_PATH
- if: ${{ runner.os == 'Windows' }}
name: Windows - Install spirv-tools
- uses: actions/checkout@v4
# Install the spirv-tools binaries from tarballs hosted on each release
# of spirv-tools. This downloads the tarball, decompresses it, unpacks
# the binaries to the specified path, and adds them to PATH
- name: Install spirv-tools binaries
shell: bash
run: |
tmparch=$(mktemp)
mkdir "${HOME}/spirv-tools"
curl -fL -o "$tmparch" "$spirv_tools_windows_url"
unzip "$tmparch" -d "${HOME}/spirv-tools"
- if: ${{ runner.os == 'Windows' }}
# Runs separately to add spir-v tools to Powershell's Path.
run: echo "$HOME/spirv-tools/install/bin" >> $env:GITHUB_PATH
run: cargo run --manifest-path .github/install-spirv-tools/Cargo.toml -- ${{matrix.host || matrix.target}} 0.10.0 "${{github.workspace}}/bin"
- if: ${{ runner.os == 'Linux' }}
name: Linux - Install native dependencies
run: sudo apt install libwayland-cursor0 libxkbcommon-dev libwayland-dev
# cargo version is a random command that forces the installation of rust-toolchain
- name: install rust-toolchain
run: cargo version
@ -142,16 +117,13 @@ jobs:
# Note that we are explicitly NOT checking out submodules, to validate
# that we haven't accidentally enabled spirv-tools native compilation
# and regressed CI times
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: "false"
- name: Install native dependencies
run: sudo apt install libwayland-cursor0 libxkbcommon-dev libwayland-dev
- name: Install spirv-tools
run: |
mkdir "${HOME}/spirv-tools"
curl -fL https://storage.googleapis.com/spirv-tools/artifacts/prod/graphics_shader_compiler/spirv-tools/linux-clang-release/continuous/1409/20210313-175801/install.tgz | tar -xz -C "${HOME}/spirv-tools"
echo "${HOME}/spirv-tools/install/bin" >> $GITHUB_PATH
run: cargo run --manifest-path .github/install-spirv-tools/Cargo.toml -- x86_64-unknown-linux-gnu 0.10.0 "${{github.workspace}}/bin"
- name: Install rustup components
run: rustup component add rustfmt clippy
# cargo version is a random command that forces the installation of rust-toolchain
@ -173,7 +145,7 @@ jobs:
run: .github/workflows/lint.sh
cargo-deny:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- uses: EmbarkStudios/cargo-deny-action@v1

1
.gitignore vendored
View File

@ -2,3 +2,4 @@ target/
.vscode/
.vim/
tests/Cargo.lock
.github/install-spirv-tools/Cargo.lock

View File

@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Changed 🛠
- [PR#1127](https://github.com/EmbarkStudios/rust-gpu/pull/1127) updated `spirv-tools` to `0.10.0`, which follows `vulkan-sdk-1.3.275`.
- [PR#1101](https://github.com/EmbarkStudios/rust-gpu/pull/1101) Add `ignore` and `no_run` to documentation to make `cargo test` pass.
- [PR#1112](https://github.com/EmbarkStudios/rust-gpu/pull/1112) updated wgpu and winit in example runners
- [PR#1100](https://github.com/EmbarkStudios/rust-gpu/pull/1100) updated toolchain to `nightly-2023-09-30`

8
Cargo.lock generated
View File

@ -2491,9 +2491,9 @@ version = "0.9.0"
[[package]]
name = "spirv-tools"
version = "0.9.0"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc7c8ca2077515286505bd3ccd396e55ac5706e80322e1d6d22a82e1cad4f7c3"
checksum = "bcb3b0832881834994b7ec82b709ec5491043ceb4bf8101e27da6b5234b24261"
dependencies = [
"memchr",
"spirv-tools-sys",
@ -2502,9 +2502,9 @@ dependencies = [
[[package]]
name = "spirv-tools-sys"
version = "0.7.0"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4b32d9d6469cd6b50dcd6bd841204b5946b4fb7b70a97872717cdc417659c9a"
checksum = "48e68b55a97aa6856e010a6f2477425875a97873e147bb0232160e73c45bdae7"
dependencies = [
"cc",
]

View File

@ -31,10 +31,11 @@ license = "MIT OR Apache-2.0"
repository = "https://github.com/EmbarkStudios/rust-gpu"
[workspace.dependencies]
spirv-builder = { path = "./crates/spirv-builder", version = "=0.9.0", default-features = false }
spirv-std = { path = "./crates/spirv-std", version = "=0.9.0" }
spirv-std-types = { path = "./crates/spirv-std/shared", version = "=0.9.0" }
spirv-std-macros = { path = "./crates/spirv-std/macros", version = "=0.9.0" }
spirv-builder = { path = "./crates/spirv-builder", version = "=0.9.0", default-features = false }
spirv-tools = { version = "0.10", default-features = false }
rustc_codegen_spirv = { path = "./crates/rustc_codegen_spirv", version = "=0.9.0", default-features = false }
rustc_codegen_spirv-types = { path = "./crates/rustc_codegen_spirv-types", version = "=0.9.0" }

View File

@ -51,14 +51,14 @@ ar = "0.9.0"
either = "1.8.0"
indexmap = "1.6.0"
rspirv = "0.11"
rustc_codegen_spirv-types.workspace = true
rustc-demangle = "0.1.21"
sanitize-filename = "0.4"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
smallvec = { version = "1.6.1", features = ["union"] }
spirv-tools = { version = "0.9", default-features = false }
rustc_codegen_spirv-types.workspace = true
spirt = "0.3.0"
spirv-tools.workspace = true
lazy_static = "1.4.0"
itertools = "0.10.5"

View File

@ -3,6 +3,7 @@ warning: `#[inline(never)]` function `member_ref_arg_broken::h` needs to be inli
warning: `#[inline(never)]` function `member_ref_arg_broken::h_newtyped` needs to be inlined because it has illegal argument or return types
error: error:0:0 - OpLoad Pointer <id> '$ID[%$ID]' is not a logical pointer.
%39 = OpLoad %uint %38
|
= note: spirv-val failed
= note: module `$TEST_BUILD_DIR/lang/core/ref/member_ref_arg-broken.default`