├── .gitignore ├── rust-toolchain.toml ├── examples ├── shared-alloc │ ├── Cargo.toml │ └── src │ │ └── lib.rs ├── broken-slice │ ├── Cargo.toml │ └── src │ │ └── lib.rs ├── working │ ├── Cargo.toml │ └── src │ │ └── lib.rs └── broken-vec │ ├── Cargo.toml │ └── src │ └── lib.rs ├── Cargo.toml ├── default.nix ├── README.md ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | **/target 2 | *.spv 3 | *.spirt 4 | *.spirt.html 5 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly-2023-09-30" 3 | components = ["rust-src", "rustc-dev", "llvm-tools"] 4 | -------------------------------------------------------------------------------- /examples/shared-alloc/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "shared-alloc" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | spirv-std = "=0.9.0" 8 | -------------------------------------------------------------------------------- /examples/broken-slice/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "broken-slice" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["lib", "dylib"] 8 | 9 | [dependencies] 10 | spirv-std = "=0.9.0" 11 | -------------------------------------------------------------------------------- /examples/working/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "working" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["lib", "dylib"] 8 | 9 | [dependencies] 10 | spirv-std = "=0.9.0" 11 | shared-alloc = { path = "../shared-alloc" } 12 | -------------------------------------------------------------------------------- /examples/broken-vec/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "broken-vec" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["lib", "dylib"] 8 | 9 | [dependencies] 10 | spirv-std = "=0.9.0" 11 | shared-alloc = { path = "../shared-alloc" } 12 | -------------------------------------------------------------------------------- /examples/broken-slice/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr(target_arch = "spirv", no_std)] 2 | 3 | use spirv_std::spirv; 4 | 5 | #[spirv(fragment)] 6 | pub fn slice_iter( 7 | #[spirv(uniform, descriptor_set = 0, binding = 0)] data: &[u32], 8 | output: &mut u32, 9 | ) { 10 | *output = data.iter().sum(); 11 | } 12 | -------------------------------------------------------------------------------- /examples/broken-vec/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr(target_arch = "spirv", no_std)] 2 | 3 | #[cfg_attr(target_arch = "spirv", global_allocator)] 4 | static _ALLOCATOR: shared_alloc::BumpAllocViaBufs = 5 | shared_alloc::BumpAllocViaBufs; 6 | 7 | #[macro_use] 8 | extern crate alloc; 9 | 10 | use spirv_std::glam::UVec3; 11 | use spirv_std::spirv; 12 | 13 | #[spirv(compute(threads(128)))] 14 | pub fn vec_loop_push_u32(#[spirv(global_invocation_id)] id: UVec3) { 15 | if id.x % 4 == 0 { 16 | let mut v = vec![]; 17 | while v.len() < 10 { 18 | v.push(id.x); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = [ 4 | "examples/working", 5 | "examples/broken-vec", 6 | "examples/broken-slice", 7 | ] 8 | 9 | [package] 10 | name = "rust-gpu-lodestar-runner" 11 | version = "0.1.0" 12 | edition = "2021" 13 | 14 | [dependencies] 15 | futures = { version = "0.3", default-features = false, features = ["std", "executor"] } 16 | wgpu = { version = "0.20.1", features = ["spirv"] } 17 | spirv-builder = "=0.9.0" 18 | 19 | [patch.crates-io] 20 | spirv-builder = { git = "https://github.com/LykenSol/rust-gpu", branch = "ephemera/polaris" } 21 | spirv-std = { git = "https://github.com/LykenSol/rust-gpu", branch = "ephemera/polaris" } 22 | -------------------------------------------------------------------------------- /default.nix: -------------------------------------------------------------------------------- 1 | let 2 | pkgs = import {}; 3 | in with pkgs; stdenv.mkDerivation rec { 4 | name = "rust-gpu-lodestar"; 5 | 6 | # Workaround for https://github.com/NixOS/nixpkgs/issues/60919. 7 | # NOTE(eddyb) needed only in debug mode (warnings about needing optimizations 8 | # turn into errors due to `-Werror`, for at least `spirv-tools-sys`). 9 | hardeningDisable = [ "fortify" ]; 10 | 11 | # Allow cargo to download crates (even inside `nix-shell --pure`). 12 | SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; 13 | 14 | nativeBuildInputs = [ rustup ]; 15 | 16 | # Runtime dependencies (for e.g. `wgpu`). 17 | LD_LIBRARY_PATH = lib.makeLibraryPath [ vulkan-loader ]; 18 | } 19 | -------------------------------------------------------------------------------- /examples/working/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr(target_arch = "spirv", no_std)] 2 | 3 | #[cfg_attr(target_arch = "spirv", global_allocator)] 4 | static _ALLOCATOR: shared_alloc::BumpAllocViaBufs = 5 | shared_alloc::BumpAllocViaBufs; 6 | 7 | #[macro_use] 8 | extern crate alloc; 9 | 10 | use alloc::boxed::Box; 11 | use alloc::rc::Rc; 12 | 13 | use spirv_std::glam::UVec3; 14 | use spirv_std::spirv; 15 | 16 | #[spirv(compute(threads(128)))] 17 | pub fn box_or_vec_1_u32(#[spirv(global_invocation_id)] id: UVec3) { 18 | match id.x % 8 { 19 | 0 => { 20 | let _ = Box::new(id.x); 21 | } 22 | 1 => { 23 | let _ = vec![id.x]; 24 | } 25 | _ => {} 26 | } 27 | } 28 | 29 | #[spirv(compute(threads(128)))] 30 | pub fn box_new_u32(#[spirv(global_invocation_id)] id: UVec3) { 31 | if id.x % 4 == 0 { 32 | let _ = Box::new(id.x); 33 | } 34 | } 35 | 36 | // FIXME(eddyb) incorporate into the big example, and `README`. 37 | #[spirv(compute(threads(128)))] 38 | pub fn rc_new_u32(#[spirv(global_invocation_id)] id: UVec3) { 39 | if id.x % 4 == 0 { 40 | let _ = Rc::new(id.x); 41 | } 42 | } 43 | 44 | #[spirv(compute(threads(128)))] 45 | pub fn vec_1_u32(#[spirv(global_invocation_id)] id: UVec3) { 46 | if id.x % 4 == 0 { 47 | let _ = vec![id.x]; 48 | } 49 | } 50 | 51 | // FIXME(eddyb) incorporate into the big example, and `README`. 52 | #[spirv(compute(threads(128)))] 53 | pub fn vec_2_u32(#[spirv(global_invocation_id)] id: UVec3) { 54 | if id.x % 4 == 0 { 55 | let mut v = vec![id.x, id.x]; 56 | v[(id.x / 4) as usize % 2] |= 0xabcd_0000; 57 | } 58 | } 59 | 60 | #[spirv(compute(threads(128)))] 61 | pub fn vec_new_push_u32(#[spirv(global_invocation_id)] id: UVec3) { 62 | if id.x % 4 == 0 { 63 | let mut v = vec![]; 64 | v.push(id.x); 65 | } 66 | } 67 | 68 | // NOTE(eddyb) this forces `realloc` to trigger with 1 `push` call and 0 loops. 69 | #[spirv(compute(threads(128)))] 70 | pub fn vec_cap1_push_u32(#[spirv(global_invocation_id)] id: UVec3) { 71 | if id.x % 16 == 0 { 72 | let mut v = vec![id.x]; 73 | v.push(id.x | 0x1111_0000); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /examples/shared-alloc/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr(target_arch = "spirv", no_std)] 2 | #![cfg_attr(target_arch = "spirv", feature(asm_const, asm_experimental_arch))] 3 | 4 | use core::alloc::{GlobalAlloc, Layout}; 5 | use core::cell::UnsafeCell; 6 | use core::sync::atomic::{AtomicUsize, Ordering::Relaxed}; 7 | use core::{mem, ptr}; 8 | use spirv_std::{RuntimeArray, TypedBuffer}; 9 | 10 | // HACK(eddyb) normally this would be `u8`, but there is a trade-off where 11 | // using `u8` would require emulating e.g. `u32` accesses with 4 `u8` ones. 12 | // FIXME(eddyb) at least for `StorageBuffer` (and `Workgroup` with an extension), 13 | // SPIR-V allows multiple declarations with the same `DescriptorSet`/`Binding` 14 | // decorations, to perform type punning, the main caveats being: 15 | // - `Aliased` decorations are required on all such declarations to not be UB 16 | // (but are not fine-grained enough to express disjointness between buffers 17 | // coming from different bindings - OTOH Vulkan also allows those to overlap, 18 | // so perhaps `Alias` should be the default in Rust-GPU and require opt-out?) 19 | // - SPIR-T would likely need to stop using "global variables" to model resources, 20 | // and instead have special constant forms for "pointer to resource binding" 21 | // (though constants aren't the right idea for *resources*, so maybe each 22 | // entry-point should have its own argument, or at least special global var, 23 | // that acts as e.g. a `Handles` address space base pointer, which arguably 24 | // is similar to Metal "argument buffers" or Vulkan "descriptor buffers") 25 | type HeapUnit = u32; 26 | const HEAP_UNIT_SIZE: usize = mem::size_of::(); 27 | 28 | pub struct BumpAllocViaBufs; 29 | 30 | // HACK(eddyb) to avoid having to progate dataflow through mutable globals, 31 | // accessing the buffers used for the "heap" is hardcoded via `asm!`, and 32 | // using `TypedBuffer` to get (indirect) access to "interface block" types. 33 | impl BumpAllocViaBufs { 34 | #[spirv_std::macros::gpu_only] 35 | unsafe fn storage_buffer() -> &'static TypedBuffer { 36 | // FIXME(eddyb) it would be useful if this "slot" wasn't needed. 37 | let mut result_slot = mem::MaybeUninit::uninit(); 38 | core::arch::asm!( 39 | "OpDecorate %var DescriptorSet {descriptor_set}", 40 | "OpDecorate %var Binding {binding}", 41 | "%var = OpVariable typeof*{result_slot} StorageBuffer", 42 | "OpStore {result_slot} %var", 43 | descriptor_set = const DESCRIPTOR_SET, 44 | binding = const BINDING, 45 | result_slot = in(reg) result_slot.as_mut_ptr(), 46 | ); 47 | result_slot.assume_init() 48 | } 49 | unsafe fn heap_buffer() -> &'static UnsafeCell> { 50 | Self::storage_buffer::<0, UnsafeCell<_>>() 51 | } 52 | unsafe fn remaining_atomic_buffer() -> &'static AtomicUsize { 53 | Self::storage_buffer::<1, AtomicUsize>() 54 | } 55 | } 56 | 57 | // FIXME(eddyb) kind of nonsensical, but specifically for logical buffers, 58 | // alignment isn't actually relevant, as legalization has to find some way 59 | // of representing all interactions with the buffers as plain arrays anyway. 60 | const MAX_SUPPORTED_ALIGN: usize = 1 << 31; 61 | 62 | unsafe impl GlobalAlloc for BumpAllocViaBufs { 63 | unsafe fn alloc(&self, layout: Layout) -> *mut u8 { 64 | if layout.align() > MAX_SUPPORTED_ALIGN { 65 | return ptr::null_mut(); 66 | } 67 | 68 | let size = (layout.size() + (HEAP_UNIT_SIZE - 1)) / HEAP_UNIT_SIZE; 69 | let align = (layout.align() + (HEAP_UNIT_SIZE - 1)) / HEAP_UNIT_SIZE; 70 | 71 | // `Layout` contract forbids making a `Layout` with align=0, or align not power of 2. 72 | // So we can safely use a mask to ensure alignment without worrying about UB. 73 | let align_mask_to_round_down = !(align - 1); 74 | 75 | let mut allocated = 0; 76 | if Self::remaining_atomic_buffer() 77 | .fetch_update(Relaxed, Relaxed, |mut remaining| { 78 | if size > remaining { 79 | return None; 80 | } 81 | remaining -= size; 82 | remaining &= align_mask_to_round_down; 83 | allocated = remaining; 84 | Some(remaining) 85 | }) 86 | .is_err() 87 | { 88 | return ptr::null_mut(); 89 | } 90 | Self::heap_buffer() 91 | .get() 92 | .cast::() 93 | .add(allocated) 94 | .cast::() 95 | } 96 | unsafe fn dealloc(&self, _ptr: *mut u8, _layout: Layout) {} 97 | 98 | // HACK(eddyb) explicitly implemented to rely on `HeapUnit` and avoid `memcpy`. 99 | unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { 100 | let new_layout = unsafe { Layout::from_size_align_unchecked(new_size, layout.align()) }; 101 | let new_ptr = unsafe { self.alloc(new_layout) }; 102 | if !new_ptr.is_null() { 103 | unsafe { 104 | // HACK(eddyb) copying one `HeapUnit` at a time and not keeping 105 | // pointers as "loop state" simplifies analysis/legalization. 106 | // NOTE(eddyb) for reference, the `realloc` method defaults to: 107 | // ptr::copy_nonoverlapping(ptr, new_ptr, cmp::min(layout.size(), new_size)); 108 | let copy_size_in_heap_units = (core::cmp::min(layout.size(), new_size) 109 | + (HEAP_UNIT_SIZE - 1)) 110 | / HEAP_UNIT_SIZE; 111 | for i in 0..copy_size_in_heap_units { 112 | let dst = new_ptr.cast::().add(i); 113 | let src = ptr.cast::().add(i); 114 | // HACK(eddyb) `dst.copy_from_nonoverlapping(src, 1)` is the 115 | // normal way to do this, but even that doesn't work for some 116 | // reason (and even if it did, it would do exactly the same 117 | // load+store pair, as sadly there are no "raw bytes" types). 118 | *dst = *src; 119 | } 120 | self.dealloc(ptr, layout); 121 | } 122 | } 123 | new_ptr 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pointers in GPU shaders: _are we `alloc` yet?_
_(showcasing a Rust-GPU experimental branch)_ 2 | 3 | ## What? 4 | 5 | Excerpt from [`examples/working/src/lib.rs`](examples/working/src/lib.rs): 6 | ```rust 7 | #[global_allocator] // (see also examples/shared-alloc/lib.rs) 8 | static ALLOCATOR: ... = ...; 9 | 10 | #[spirv(compute(threads(128)))] 11 | pub fn box_or_vec_1_u32(#[spirv(global_invocation_id)] id: UVec3) { 12 | match id.x % 8 { 13 | 0 => { 14 | let _ = Box::new(id.x); 15 | } 16 | 1 => { 17 | let _ = vec![id.x]; 18 | } 19 | _ => {} 20 | } 21 | } 22 | 23 | #[spirv(compute(threads(128)))] 24 | pub fn vec_cap1_push_u32(#[spirv(global_invocation_id)] id: UVec3) { 25 | if id.x % 16 == 0 { 26 | let mut v = vec![id.x]; 27 | v.push(id.x | 0x1111_0000); 28 | } 29 | } 30 | 31 | // (see examples/working/src/lib.rs for more examples) 32 | ``` 33 | ```console 34 | $ cargo run --release examples/working 35 | ... 36 | box_or_vec_1_u32: allocated 128 bytes in 22.666µs, leaving this heap behind: 37 | 00000039 00000029 00000019 00000009 00000031 00000079 00000069 00000059 38 | 00000049 00000071 00000061 00000051 00000041 00000021 00000078 00000068 39 | 00000058 00000048 00000070 00000060 00000050 00000011 00000001 00000040 40 | 00000038 00000028 00000018 00000008 00000030 00000020 00000010 00000000 41 | vec_cap1_push_u32: allocated 160 bytes in 196.74µs, leaving this heap behind: 42 | 00000030 11110030 00000000 00000000 00000020 11110020 00000000 00000000 43 | 00000010 11110010 00000000 00000000 00000000 11110000 00000000 00000000 44 | 00000070 11110070 00000000 00000000 00000060 11110060 00000000 00000000 45 | 00000050 11110050 00000000 00000000 00000040 11110040 00000000 00000000 46 | 00000070 00000060 00000050 00000040 00000030 00000020 00000010 00000000 47 | ``` 48 | A few details of note in the above output (i.e. the "heap dump"): 49 | - it appears reversed because the example `#[global_allocator]` grows downwards 50 | - all 32 invocations of `box_or_vec_1_u32` which were chosen to allocate 51 | (4 bytes each, via `Box::new`/`vec![...]`), did so successfully 52 | - (`vec_cap1_push_u32` is similar, but has 8 invocations which each allocate 4 bytes for `vec![...]`, then `realloc` to grow the `Vec` to 16 bytes for `.push(...)`) 53 | - having 128 invocations in total is used to reveal some interleaving, 54 | as invocations from different subgroups are (atomically) competing 55 | (the exact pattern will likely vary between GPUs/drivers/etc.) 56 | 57 | _(**TODO**: include more of the working examples involving `Rc`, `Vec`, etc., 58 | even if the resulting heap dump is not as easy to read, 59 | but also an upward growth bump allocator might help)_ 60 | 61 | ### Is it safe? 62 | 63 | OOM detection/reporting (via Rust-GPU's `panic!` emulation) should work, 64 | i.e. running out of the CPU-provided storage buffer for the heap will safely abort, 65 | instead of causing any memory corruption (or generally undefined behavior). 66 | 67 | _(**TODO**: demo that by enabling verbose `debugPrintf` for panics)_ 68 | 69 | ### Is that it? 70 | 71 | These Rust-GPU/SPIR-T changes are actively being worked on, having started with 72 | a minimal `Box::new(123)` (plus gnarlier underlying `alloc` abstractions) being 73 | the first example to successfully compile, and continuing towards increasingly 74 | more difficult ones (also see `examples/broken-*`, as likely to be tackled next). 75 | 76 | As support expands, the examples and README in this repository will be updated 77 | to reflect that progress (ideally culminating in some future Rust-GPU release). 78 | 79 | ## Why? 80 | 81 | The outlines of the overall design (see `qptr` below) have been around for a while, 82 | but sadly lacking any direct attempts at "`alloc`/`#[global_allocator]` in a shader". 83 | 84 | This experiment serves as both a challenge and a demonstration, of what is possible 85 | in the short-to-medium term, within the confines of existing standards (SPIR-V) and 86 | leveraging the existing Rust-GPU/SPIR-T infrastructure. 87 | 88 | ## How? 89 | 90 | A combination of Rust-GPU/SPIR-T enhancements in various stages of development: 91 | - some landed upstream, but still opt-in (e.g. `--no-infer-storage-classes`, `--spirt-passes=qptr`) 92 | - others largely complete, but landing stalled on minor blockers (e.g. SPIR-T PRs [#50](https://github.com/EmbarkStudios/spirt/pull/50), [#52](https://github.com/EmbarkStudios/spirt/pull/52), [#29](https://github.com/EmbarkStudios/spirt/pull/29), [#42](https://github.com/EmbarkStudios/spirt/pull/42)) 93 | - the rest are brand new (from `alloc`-specific support, to general improvements 94 | in pointer flexibility, control-flow simplification, and their intersection etc.) 95 | 96 | SPIR-T's `qptr` (as described [in its original PR](https://github.com/EmbarkStudios/spirt/pull/24) 97 | and also [the Rust-GPU 0.7 release notes](https://github.com/EmbarkStudios/rust-gpu/releases/tag/v0.7.0)) 98 | plays an essential role, allowing low-level compiler transformations to be done 99 | on untyped pointers, and only attempting to recover SPIR-V's much stricter 100 | "typed logical pointers" _after_ legalizing away as much as possible. 101 | 102 | As seen in `src/main.rs`, `RUSTGPU_CODEGEN_ARGS` is still required to opt into: 103 | - `--no-early-report-zombies` to hide overzealous errors that can be legalized away 104 | - `--no-infer-storage-classes` to skip the overcomplicated whole-program typed 105 | inference engine for SPIR-V address spaces ("storage classes"), in favor of 106 | `qptr`'s straight-forward post-legalization deductions 107 | - `--no-legacy-mem2reg` to skip the less efficient "local variables -> SSA" 108 | transformation done on SPIR-V (in favor of its `qptr` replacement) 109 | - `--spirt-passes=qptr,reduce,fuse_selects` to enable the `qptr` transformations 110 | (from/to typed pointers, plus the `mem2reg` replacement), while `reduce`+`fuse_selects` 111 | help clean up the implementation details of "zero-cost abstractions" 112 | 113 | You can see some of those transformations in action in the `.spirt.html` file(s) 114 | produced when e.g. `RUSTGPU_CODEGEN_ARGS="--dump-spirt-passes=$PWD"` is set. 115 | 116 | The end result is `Box::new(123)` boiling down to: 117 | - reserve an unique `idx` (e.g. by updating an `AtomicUsize` in a separate 118 | storage buffer, like the example `#[global_allocator]` does) 119 | - `heap_storage_buffer[idx] = 123` 120 | 121 | While more realistic examples would be noisier, it should always be possible to: 122 | - express everything in terms of arrays and integers, if need be 123 | - some prior art in Mesa's `rusticl`+Zink, `clvk`+`clspv`, Vcc+Shady etc. 124 | - e.g. necessary for cross-compilation to GLSL/HLSL/WGSL 125 | (**TODO**: demo WGSL once Naga supports atomics in its SPIR-V front-end) 126 | - choose a more direct representation of pointers, whenever one is available 127 | - e.g. `PhysicalStorageBuffer64` when targeting current Vulkan 128 | 129 | ## Where? 130 | 131 | The exact `git` URLs and commit hashes for the Rust-GPU crates are tracked by 132 | `Cargo.lock`, and _in theory_ `Cargo.toml`+`src/main.rs` could be repurposed 133 | to get access to the same capabilities from some 3rd-party project. 134 | 135 | _However_, specific commits are highly unlikely to be kept indefinitely 136 | (especially the temporary merge commits), and the functionality itself may not 137 | be suited for production use, only further experimentation production. 138 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // FIXME(eddyb) this was meant to be `-Z script` but that's unergonomic. 2 | // #!/usr/bin/env -S cargo run -Zscript --release --manifest-path 3 | 4 | fn main() { 5 | std::env::set_var( 6 | "RUSTGPU_CODEGEN_ARGS", 7 | [ 8 | "--no-early-report-zombies --no-infer-storage-classes --no-legacy-mem2reg \ 9 | --spirt-passes=qptr,reduce,fuse_selects", 10 | &std::env::var("RUSTGPU_CODEGEN_ARGS").unwrap_or_default(), 11 | ] 12 | .join(" "), 13 | ); 14 | let args = std::env::args_os(); 15 | if args.len() == 1 { 16 | eprintln!("Usage: cargo run --release [SHADER DIR]"); 17 | eprintln!(" (e.g: `cargo run --release examples/working`)"); 18 | std::process::exit(1); 19 | } 20 | let mut any_errors = false; 21 | for path in args.skip(1) { 22 | let result = spirv_builder::SpirvBuilder::new(path, "spirv-unknown-vulkan1.2") 23 | .capability(spirv_builder::Capability::Int8) 24 | .capability(spirv_builder::Capability::VulkanMemoryModelDeviceScopeKHR) 25 | .print_metadata(spirv_builder::MetadataPrintout::None) 26 | .build(); 27 | 28 | if let Ok(result) = result { 29 | let spv_bytes = std::fs::read(result.module.unwrap_single()).unwrap(); 30 | let spv_words = wgpu::util::make_spirv_raw(&spv_bytes); 31 | 32 | for entry_point in &result.entry_points { 33 | futures::executor::block_on(run_async(&spv_words, entry_point)); 34 | } 35 | } else { 36 | any_errors = true; 37 | } 38 | } 39 | if any_errors { 40 | std::process::exit(1); 41 | } 42 | } 43 | 44 | async fn run_async(spv_words: &[u32], entry_point: &str) { 45 | use wgpu::util::DeviceExt as _; 46 | 47 | // FIXME(eddyb) get rid of this when `naga` supports atomics. 48 | let force_spirv_passthru = true; 49 | 50 | let backends = wgpu::util::backend_bits_from_env().unwrap_or(wgpu::Backends::PRIMARY); 51 | let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { 52 | backends, 53 | dx12_shader_compiler: wgpu::util::dx12_shader_compiler_from_env().unwrap_or_default(), 54 | ..Default::default() 55 | }); 56 | let adapter = wgpu::util::initialize_adapter_from_env_or_default(&instance, None) 57 | .await 58 | .expect("Failed to find an appropriate adapter"); 59 | 60 | let mut required_features = 61 | wgpu::Features::TIMESTAMP_QUERY | wgpu::Features::TIMESTAMP_QUERY_INSIDE_PASSES; 62 | if force_spirv_passthru { 63 | required_features |= wgpu::Features::SPIRV_SHADER_PASSTHROUGH; 64 | } 65 | 66 | let (device, queue) = adapter 67 | .request_device( 68 | &wgpu::DeviceDescriptor { 69 | label: None, 70 | required_features, 71 | required_limits: wgpu::Limits::default(), 72 | }, 73 | None, 74 | ) 75 | .await 76 | .expect("Failed to create device"); 77 | drop(instance); 78 | drop(adapter); 79 | 80 | let timestamp_period = queue.get_timestamp_period(); 81 | 82 | // FIXME(eddyb) automate this decision by default. 83 | let module = if force_spirv_passthru { 84 | unsafe { 85 | device.create_shader_module_spirv(&wgpu::ShaderModuleDescriptorSpirV { 86 | label: None, 87 | source: spv_words.into(), 88 | }) 89 | } 90 | } else { 91 | device.create_shader_module(wgpu::ShaderModuleDescriptor { 92 | label: None, 93 | source: wgpu::ShaderSource::SpirV(spv_words.into()), 94 | }) 95 | }; 96 | 97 | let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 98 | label: None, 99 | entries: &[ 100 | wgpu::BindGroupLayoutEntry { 101 | binding: 0, 102 | count: None, 103 | visibility: wgpu::ShaderStages::COMPUTE, 104 | ty: wgpu::BindingType::Buffer { 105 | has_dynamic_offset: false, 106 | min_binding_size: None, 107 | ty: wgpu::BufferBindingType::Storage { read_only: false }, 108 | }, 109 | }, 110 | wgpu::BindGroupLayoutEntry { 111 | binding: 1, 112 | count: None, 113 | visibility: wgpu::ShaderStages::COMPUTE, 114 | ty: wgpu::BindingType::Buffer { 115 | has_dynamic_offset: false, 116 | min_binding_size: None, 117 | ty: wgpu::BufferBindingType::Storage { read_only: false }, 118 | }, 119 | }, 120 | ], 121 | }); 122 | 123 | let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { 124 | label: None, 125 | bind_group_layouts: &[&bind_group_layout], 126 | push_constant_ranges: &[], 127 | }); 128 | 129 | let compute_pipeline = device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { 130 | label: None, 131 | layout: Some(&pipeline_layout), 132 | module: &module, 133 | entry_point, 134 | compilation_options: Default::default(), 135 | }); 136 | 137 | let heap_size = 32 * 1024; 138 | let heap_unit_size = 4; 139 | 140 | let readback_buffer_heap = device.create_buffer(&wgpu::BufferDescriptor { 141 | label: None, 142 | size: heap_size as wgpu::BufferAddress, 143 | // Can be read to the CPU, and can be copied from the shader's storage buffer 144 | usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, 145 | mapped_at_creation: false, 146 | }); 147 | let readback_buffer_remaining_atomic = device.create_buffer(&wgpu::BufferDescriptor { 148 | label: None, 149 | size: 4, 150 | // Can be read to the CPU, and can be copied from the shader's storage buffer 151 | usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, 152 | mapped_at_creation: false, 153 | }); 154 | 155 | let storage_buffer_heap = device.create_buffer(&wgpu::BufferDescriptor { 156 | label: Some("Heap memory area"), 157 | size: heap_size as wgpu::BufferAddress, 158 | usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC, 159 | mapped_at_creation: false, 160 | }); 161 | let storage_buffer_remaining_atomic = 162 | device.create_buffer_init(&wgpu::util::BufferInitDescriptor { 163 | label: Some("Remaining atomic for heap"), 164 | contents: &u32::to_ne_bytes(heap_size / heap_unit_size), 165 | usage: wgpu::BufferUsages::STORAGE 166 | | wgpu::BufferUsages::COPY_DST 167 | | wgpu::BufferUsages::COPY_SRC, 168 | }); 169 | 170 | let timestamp_buffer = device.create_buffer(&wgpu::BufferDescriptor { 171 | label: Some("Timestamps buffer"), 172 | size: 16, 173 | usage: wgpu::BufferUsages::QUERY_RESOLVE | wgpu::BufferUsages::COPY_SRC, 174 | mapped_at_creation: false, 175 | }); 176 | 177 | let timestamp_readback_buffer = device.create_buffer(&wgpu::BufferDescriptor { 178 | label: None, 179 | size: 16, 180 | usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, 181 | mapped_at_creation: true, 182 | }); 183 | timestamp_readback_buffer.unmap(); 184 | 185 | let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { 186 | label: None, 187 | layout: &bind_group_layout, 188 | entries: &[ 189 | wgpu::BindGroupEntry { 190 | binding: 0, 191 | resource: storage_buffer_heap.as_entire_binding(), 192 | }, 193 | wgpu::BindGroupEntry { 194 | binding: 1, 195 | resource: storage_buffer_remaining_atomic.as_entire_binding(), 196 | }, 197 | ], 198 | }); 199 | 200 | let queries = device.create_query_set(&wgpu::QuerySetDescriptor { 201 | label: None, 202 | count: 2, 203 | ty: wgpu::QueryType::Timestamp, 204 | }); 205 | 206 | let mut encoder = 207 | device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); 208 | 209 | { 210 | let mut cpass = encoder.begin_compute_pass(&Default::default()); 211 | cpass.set_bind_group(0, &bind_group, &[]); 212 | cpass.set_pipeline(&compute_pipeline); 213 | cpass.write_timestamp(&queries, 0); 214 | cpass.dispatch_workgroups(1, 1, 1); 215 | cpass.write_timestamp(&queries, 1); 216 | } 217 | 218 | encoder.copy_buffer_to_buffer( 219 | &storage_buffer_heap, 220 | 0, 221 | &readback_buffer_heap, 222 | 0, 223 | heap_size as wgpu::BufferAddress, 224 | ); 225 | encoder.copy_buffer_to_buffer( 226 | &storage_buffer_remaining_atomic, 227 | 0, 228 | &readback_buffer_remaining_atomic, 229 | 0, 230 | 4, 231 | ); 232 | encoder.resolve_query_set(&queries, 0..2, ×tamp_buffer, 0); 233 | encoder.copy_buffer_to_buffer( 234 | ×tamp_buffer, 235 | 0, 236 | ×tamp_readback_buffer, 237 | 0, 238 | timestamp_buffer.size(), 239 | ); 240 | 241 | queue.submit(Some(encoder.finish())); 242 | let buffer_heap_slice = readback_buffer_heap.slice(..); 243 | let buffer_remaining_atomic_slice = readback_buffer_remaining_atomic.slice(..); 244 | let timestamp_slice = timestamp_readback_buffer.slice(..); 245 | timestamp_slice.map_async(wgpu::MapMode::Read, |r| r.unwrap()); 246 | buffer_heap_slice.map_async(wgpu::MapMode::Read, |r| r.unwrap()); 247 | buffer_remaining_atomic_slice.map_async(wgpu::MapMode::Read, |r| r.unwrap()); 248 | // NOTE(eddyb) `poll` should return only after the above callbacks fire 249 | // (see also https://github.com/gfx-rs/wgpu/pull/2698 for more details). 250 | device.poll(wgpu::Maintain::Wait); 251 | 252 | let heap_data = buffer_heap_slice.get_mapped_range(); 253 | let remaining_atomic_data = buffer_remaining_atomic_slice.get_mapped_range(); 254 | let timing_data = timestamp_slice.get_mapped_range(); 255 | let remaining_atomic_contents = 256 | u32::from_ne_bytes((&remaining_atomic_data[..]).try_into().unwrap()); 257 | let heap_contents = heap_data 258 | .chunks_exact(heap_unit_size as usize) 259 | .skip(remaining_atomic_contents as usize) 260 | .map(|b| u32::from_ne_bytes(b.try_into().unwrap())) 261 | .collect::>(); 262 | let timings = timing_data 263 | .chunks_exact(8) 264 | .map(|b| u64::from_ne_bytes(b.try_into().unwrap())) 265 | .collect::>(); 266 | drop(heap_data); 267 | readback_buffer_heap.unmap(); 268 | drop(remaining_atomic_data); 269 | readback_buffer_remaining_atomic.unmap(); 270 | drop(timing_data); 271 | timestamp_readback_buffer.unmap(); 272 | 273 | println!( 274 | "{entry_point}: allocated {} bytes in {:?}, leaving this heap behind:", 275 | heap_size - remaining_atomic_contents * heap_unit_size, 276 | std::time::Duration::from_nanos( 277 | ((timings[1] - timings[0]) as f64 * f64::from(timestamp_period)) as u64 278 | ) 279 | ); 280 | for chunk in heap_contents.chunks(8) { 281 | print!(" "); 282 | for &word in chunk { 283 | print!(" {word:08x}"); 284 | } 285 | println!(); 286 | } 287 | } 288 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.7.8" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" 10 | dependencies = [ 11 | "getrandom", 12 | "once_cell", 13 | "version_check", 14 | ] 15 | 16 | [[package]] 17 | name = "ahash" 18 | version = "0.8.11" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 21 | dependencies = [ 22 | "cfg-if", 23 | "once_cell", 24 | "version_check", 25 | "zerocopy", 26 | ] 27 | 28 | [[package]] 29 | name = "aho-corasick" 30 | version = "1.1.3" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 33 | dependencies = [ 34 | "memchr", 35 | ] 36 | 37 | [[package]] 38 | name = "allocator-api2" 39 | version = "0.2.18" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 42 | 43 | [[package]] 44 | name = "android_system_properties" 45 | version = "0.1.5" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 48 | dependencies = [ 49 | "libc", 50 | ] 51 | 52 | [[package]] 53 | name = "ar" 54 | version = "0.9.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69" 57 | 58 | [[package]] 59 | name = "arrayvec" 60 | version = "0.7.4" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 63 | 64 | [[package]] 65 | name = "ash" 66 | version = "0.37.3+1.3.251" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" 69 | dependencies = [ 70 | "libloading 0.7.4", 71 | ] 72 | 73 | [[package]] 74 | name = "autocfg" 75 | version = "1.3.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 78 | 79 | [[package]] 80 | name = "bit-set" 81 | version = "0.5.3" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 84 | dependencies = [ 85 | "bit-vec", 86 | ] 87 | 88 | [[package]] 89 | name = "bit-vec" 90 | version = "0.6.3" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 93 | 94 | [[package]] 95 | name = "bitflags" 96 | version = "1.3.2" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 99 | 100 | [[package]] 101 | name = "bitflags" 102 | version = "2.6.0" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 105 | 106 | [[package]] 107 | name = "block" 108 | version = "0.1.6" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 111 | 112 | [[package]] 113 | name = "broken-slice" 114 | version = "0.1.0" 115 | dependencies = [ 116 | "spirv-std", 117 | ] 118 | 119 | [[package]] 120 | name = "broken-vec" 121 | version = "0.1.0" 122 | dependencies = [ 123 | "shared-alloc", 124 | "spirv-std", 125 | ] 126 | 127 | [[package]] 128 | name = "bumpalo" 129 | version = "3.16.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 132 | 133 | [[package]] 134 | name = "bytemuck" 135 | version = "1.16.1" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" 138 | 139 | [[package]] 140 | name = "byteorder" 141 | version = "1.5.0" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 144 | 145 | [[package]] 146 | name = "cc" 147 | version = "1.0.101" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" 150 | dependencies = [ 151 | "jobserver", 152 | "libc", 153 | "once_cell", 154 | ] 155 | 156 | [[package]] 157 | name = "cfg-if" 158 | version = "1.0.0" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 161 | 162 | [[package]] 163 | name = "cfg_aliases" 164 | version = "0.1.1" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 167 | 168 | [[package]] 169 | name = "codespan-reporting" 170 | version = "0.11.1" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 173 | dependencies = [ 174 | "termcolor", 175 | "unicode-width", 176 | ] 177 | 178 | [[package]] 179 | name = "com" 180 | version = "0.6.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" 183 | dependencies = [ 184 | "com_macros", 185 | ] 186 | 187 | [[package]] 188 | name = "com_macros" 189 | version = "0.6.0" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" 192 | dependencies = [ 193 | "com_macros_support", 194 | "proc-macro2", 195 | "syn 1.0.109", 196 | ] 197 | 198 | [[package]] 199 | name = "com_macros_support" 200 | version = "0.6.0" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" 203 | dependencies = [ 204 | "proc-macro2", 205 | "quote", 206 | "syn 1.0.109", 207 | ] 208 | 209 | [[package]] 210 | name = "convert_case" 211 | version = "0.4.0" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 214 | 215 | [[package]] 216 | name = "core-foundation" 217 | version = "0.9.4" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 220 | dependencies = [ 221 | "core-foundation-sys", 222 | "libc", 223 | ] 224 | 225 | [[package]] 226 | name = "core-foundation-sys" 227 | version = "0.8.6" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 230 | 231 | [[package]] 232 | name = "core-graphics-types" 233 | version = "0.1.3" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 236 | dependencies = [ 237 | "bitflags 1.3.2", 238 | "core-foundation", 239 | "libc", 240 | ] 241 | 242 | [[package]] 243 | name = "d3d12" 244 | version = "0.20.0" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "b28bfe653d79bd16c77f659305b195b82bb5ce0c0eb2a4846b82ddbd77586813" 247 | dependencies = [ 248 | "bitflags 2.6.0", 249 | "libloading 0.8.4", 250 | "winapi", 251 | ] 252 | 253 | [[package]] 254 | name = "derive_more" 255 | version = "0.99.18" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 258 | dependencies = [ 259 | "convert_case", 260 | "proc-macro2", 261 | "quote", 262 | "rustc_version", 263 | "syn 2.0.68", 264 | ] 265 | 266 | [[package]] 267 | name = "document-features" 268 | version = "0.2.8" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" 271 | dependencies = [ 272 | "litrs", 273 | ] 274 | 275 | [[package]] 276 | name = "either" 277 | version = "1.13.0" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 280 | 281 | [[package]] 282 | name = "elsa" 283 | version = "1.10.0" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "d98e71ae4df57d214182a2e5cb90230c0192c6ddfcaa05c36453d46a54713e10" 286 | dependencies = [ 287 | "indexmap 2.2.6", 288 | "stable_deref_trait", 289 | ] 290 | 291 | [[package]] 292 | name = "equivalent" 293 | version = "1.0.1" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 296 | 297 | [[package]] 298 | name = "fixedbitset" 299 | version = "0.4.2" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 302 | 303 | [[package]] 304 | name = "foreign-types" 305 | version = "0.5.0" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 308 | dependencies = [ 309 | "foreign-types-macros", 310 | "foreign-types-shared", 311 | ] 312 | 313 | [[package]] 314 | name = "foreign-types-macros" 315 | version = "0.2.3" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 318 | dependencies = [ 319 | "proc-macro2", 320 | "quote", 321 | "syn 2.0.68", 322 | ] 323 | 324 | [[package]] 325 | name = "foreign-types-shared" 326 | version = "0.3.1" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 329 | 330 | [[package]] 331 | name = "futures" 332 | version = "0.3.30" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 335 | dependencies = [ 336 | "futures-channel", 337 | "futures-core", 338 | "futures-executor", 339 | "futures-io", 340 | "futures-sink", 341 | "futures-task", 342 | "futures-util", 343 | ] 344 | 345 | [[package]] 346 | name = "futures-channel" 347 | version = "0.3.30" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 350 | dependencies = [ 351 | "futures-core", 352 | "futures-sink", 353 | ] 354 | 355 | [[package]] 356 | name = "futures-core" 357 | version = "0.3.30" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 360 | 361 | [[package]] 362 | name = "futures-executor" 363 | version = "0.3.30" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 366 | dependencies = [ 367 | "futures-core", 368 | "futures-task", 369 | "futures-util", 370 | ] 371 | 372 | [[package]] 373 | name = "futures-io" 374 | version = "0.3.30" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 377 | 378 | [[package]] 379 | name = "futures-sink" 380 | version = "0.3.30" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 383 | 384 | [[package]] 385 | name = "futures-task" 386 | version = "0.3.30" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 389 | 390 | [[package]] 391 | name = "futures-util" 392 | version = "0.3.30" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 395 | dependencies = [ 396 | "futures-channel", 397 | "futures-core", 398 | "futures-io", 399 | "futures-sink", 400 | "futures-task", 401 | "memchr", 402 | "pin-project-lite", 403 | "pin-utils", 404 | "slab", 405 | ] 406 | 407 | [[package]] 408 | name = "fxhash" 409 | version = "0.2.1" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 412 | dependencies = [ 413 | "byteorder", 414 | ] 415 | 416 | [[package]] 417 | name = "getrandom" 418 | version = "0.2.15" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 421 | dependencies = [ 422 | "cfg-if", 423 | "libc", 424 | "wasi", 425 | ] 426 | 427 | [[package]] 428 | name = "gl_generator" 429 | version = "0.14.0" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 432 | dependencies = [ 433 | "khronos_api", 434 | "log", 435 | "xml-rs", 436 | ] 437 | 438 | [[package]] 439 | name = "glam" 440 | version = "0.24.2" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" 443 | dependencies = [ 444 | "libm", 445 | ] 446 | 447 | [[package]] 448 | name = "glow" 449 | version = "0.13.1" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" 452 | dependencies = [ 453 | "js-sys", 454 | "slotmap", 455 | "wasm-bindgen", 456 | "web-sys", 457 | ] 458 | 459 | [[package]] 460 | name = "glutin_wgl_sys" 461 | version = "0.5.0" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" 464 | dependencies = [ 465 | "gl_generator", 466 | ] 467 | 468 | [[package]] 469 | name = "gpu-alloc" 470 | version = "0.6.0" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 473 | dependencies = [ 474 | "bitflags 2.6.0", 475 | "gpu-alloc-types", 476 | ] 477 | 478 | [[package]] 479 | name = "gpu-alloc-types" 480 | version = "0.3.0" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 483 | dependencies = [ 484 | "bitflags 2.6.0", 485 | ] 486 | 487 | [[package]] 488 | name = "gpu-allocator" 489 | version = "0.25.0" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" 492 | dependencies = [ 493 | "log", 494 | "presser", 495 | "thiserror", 496 | "winapi", 497 | "windows", 498 | ] 499 | 500 | [[package]] 501 | name = "gpu-descriptor" 502 | version = "0.3.0" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" 505 | dependencies = [ 506 | "bitflags 2.6.0", 507 | "gpu-descriptor-types", 508 | "hashbrown 0.14.5", 509 | ] 510 | 511 | [[package]] 512 | name = "gpu-descriptor-types" 513 | version = "0.2.0" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 516 | dependencies = [ 517 | "bitflags 2.6.0", 518 | ] 519 | 520 | [[package]] 521 | name = "hashbrown" 522 | version = "0.11.2" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 525 | dependencies = [ 526 | "ahash 0.7.8", 527 | ] 528 | 529 | [[package]] 530 | name = "hashbrown" 531 | version = "0.12.3" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 534 | 535 | [[package]] 536 | name = "hashbrown" 537 | version = "0.14.5" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 540 | dependencies = [ 541 | "ahash 0.8.11", 542 | "allocator-api2", 543 | ] 544 | 545 | [[package]] 546 | name = "hassle-rs" 547 | version = "0.11.0" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" 550 | dependencies = [ 551 | "bitflags 2.6.0", 552 | "com", 553 | "libc", 554 | "libloading 0.8.4", 555 | "thiserror", 556 | "widestring", 557 | "winapi", 558 | ] 559 | 560 | [[package]] 561 | name = "hexf-parse" 562 | version = "0.2.1" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 565 | 566 | [[package]] 567 | name = "indexmap" 568 | version = "1.9.3" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 571 | dependencies = [ 572 | "autocfg", 573 | "hashbrown 0.12.3", 574 | ] 575 | 576 | [[package]] 577 | name = "indexmap" 578 | version = "2.2.6" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 581 | dependencies = [ 582 | "equivalent", 583 | "hashbrown 0.14.5", 584 | ] 585 | 586 | [[package]] 587 | name = "internal-iterator" 588 | version = "0.2.3" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "969ee3fc68ec2e88eb21434ce4d9b7e1600d1ce92ff974560a6c4a304f5124b9" 591 | 592 | [[package]] 593 | name = "itertools" 594 | version = "0.10.5" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 597 | dependencies = [ 598 | "either", 599 | ] 600 | 601 | [[package]] 602 | name = "itoa" 603 | version = "1.0.11" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 606 | 607 | [[package]] 608 | name = "jni-sys" 609 | version = "0.3.0" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 612 | 613 | [[package]] 614 | name = "jobserver" 615 | version = "0.1.31" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" 618 | dependencies = [ 619 | "libc", 620 | ] 621 | 622 | [[package]] 623 | name = "js-sys" 624 | version = "0.3.69" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 627 | dependencies = [ 628 | "wasm-bindgen", 629 | ] 630 | 631 | [[package]] 632 | name = "khronos-egl" 633 | version = "6.0.0" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 636 | dependencies = [ 637 | "libc", 638 | "libloading 0.8.4", 639 | "pkg-config", 640 | ] 641 | 642 | [[package]] 643 | name = "khronos_api" 644 | version = "3.1.0" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 647 | 648 | [[package]] 649 | name = "lazy_static" 650 | version = "1.5.0" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 653 | 654 | [[package]] 655 | name = "libc" 656 | version = "0.2.155" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 659 | 660 | [[package]] 661 | name = "libloading" 662 | version = "0.7.4" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" 665 | dependencies = [ 666 | "cfg-if", 667 | "winapi", 668 | ] 669 | 670 | [[package]] 671 | name = "libloading" 672 | version = "0.8.4" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" 675 | dependencies = [ 676 | "cfg-if", 677 | "windows-targets", 678 | ] 679 | 680 | [[package]] 681 | name = "libm" 682 | version = "0.2.8" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 685 | 686 | [[package]] 687 | name = "litrs" 688 | version = "0.4.1" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 691 | 692 | [[package]] 693 | name = "lock_api" 694 | version = "0.4.12" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 697 | dependencies = [ 698 | "autocfg", 699 | "scopeguard", 700 | ] 701 | 702 | [[package]] 703 | name = "log" 704 | version = "0.4.21" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 707 | 708 | [[package]] 709 | name = "longest-increasing-subsequence" 710 | version = "0.1.0" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" 713 | 714 | [[package]] 715 | name = "malloc_buf" 716 | version = "0.0.6" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 719 | dependencies = [ 720 | "libc", 721 | ] 722 | 723 | [[package]] 724 | name = "memchr" 725 | version = "2.7.4" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 728 | 729 | [[package]] 730 | name = "metal" 731 | version = "0.28.0" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "5637e166ea14be6063a3f8ba5ccb9a4159df7d8f6d61c02fc3d480b1f90dcfcb" 734 | dependencies = [ 735 | "bitflags 2.6.0", 736 | "block", 737 | "core-graphics-types", 738 | "foreign-types", 739 | "log", 740 | "objc", 741 | "paste", 742 | ] 743 | 744 | [[package]] 745 | name = "naga" 746 | version = "0.20.0" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "e536ae46fcab0876853bd4a632ede5df4b1c2527a58f6c5a4150fe86be858231" 749 | dependencies = [ 750 | "arrayvec", 751 | "bit-set", 752 | "bitflags 2.6.0", 753 | "codespan-reporting", 754 | "hexf-parse", 755 | "indexmap 2.2.6", 756 | "log", 757 | "num-traits", 758 | "petgraph", 759 | "rustc-hash", 760 | "spirv 0.3.0+sdk-1.3.268.0", 761 | "termcolor", 762 | "thiserror", 763 | "unicode-xid", 764 | ] 765 | 766 | [[package]] 767 | name = "ndk-sys" 768 | version = "0.5.0+25.2.9519653" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 771 | dependencies = [ 772 | "jni-sys", 773 | ] 774 | 775 | [[package]] 776 | name = "num-traits" 777 | version = "0.2.19" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 780 | dependencies = [ 781 | "autocfg", 782 | "libm", 783 | ] 784 | 785 | [[package]] 786 | name = "objc" 787 | version = "0.2.7" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 790 | dependencies = [ 791 | "malloc_buf", 792 | ] 793 | 794 | [[package]] 795 | name = "once_cell" 796 | version = "1.19.0" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 799 | 800 | [[package]] 801 | name = "parking_lot" 802 | version = "0.12.3" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 805 | dependencies = [ 806 | "lock_api", 807 | "parking_lot_core", 808 | ] 809 | 810 | [[package]] 811 | name = "parking_lot_core" 812 | version = "0.9.10" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 815 | dependencies = [ 816 | "cfg-if", 817 | "libc", 818 | "redox_syscall", 819 | "smallvec", 820 | "windows-targets", 821 | ] 822 | 823 | [[package]] 824 | name = "paste" 825 | version = "1.0.15" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 828 | 829 | [[package]] 830 | name = "petgraph" 831 | version = "0.6.5" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" 834 | dependencies = [ 835 | "fixedbitset", 836 | "indexmap 2.2.6", 837 | ] 838 | 839 | [[package]] 840 | name = "pin-project-lite" 841 | version = "0.2.14" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 844 | 845 | [[package]] 846 | name = "pin-utils" 847 | version = "0.1.0" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 850 | 851 | [[package]] 852 | name = "pkg-config" 853 | version = "0.3.30" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 856 | 857 | [[package]] 858 | name = "presser" 859 | version = "0.3.1" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 862 | 863 | [[package]] 864 | name = "proc-macro2" 865 | version = "1.0.86" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 868 | dependencies = [ 869 | "unicode-ident", 870 | ] 871 | 872 | [[package]] 873 | name = "profiling" 874 | version = "1.0.15" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" 877 | 878 | [[package]] 879 | name = "quote" 880 | version = "1.0.36" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 883 | dependencies = [ 884 | "proc-macro2", 885 | ] 886 | 887 | [[package]] 888 | name = "range-alloc" 889 | version = "0.1.3" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" 892 | 893 | [[package]] 894 | name = "raw-string" 895 | version = "0.3.5" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2" 898 | 899 | [[package]] 900 | name = "raw-window-handle" 901 | version = "0.6.2" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 904 | 905 | [[package]] 906 | name = "redox_syscall" 907 | version = "0.5.2" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" 910 | dependencies = [ 911 | "bitflags 2.6.0", 912 | ] 913 | 914 | [[package]] 915 | name = "regex" 916 | version = "1.10.5" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 919 | dependencies = [ 920 | "aho-corasick", 921 | "memchr", 922 | "regex-automata", 923 | "regex-syntax", 924 | ] 925 | 926 | [[package]] 927 | name = "regex-automata" 928 | version = "0.4.7" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 931 | dependencies = [ 932 | "aho-corasick", 933 | "memchr", 934 | "regex-syntax", 935 | ] 936 | 937 | [[package]] 938 | name = "regex-syntax" 939 | version = "0.8.4" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 942 | 943 | [[package]] 944 | name = "renderdoc-sys" 945 | version = "1.1.0" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 948 | 949 | [[package]] 950 | name = "rspirv" 951 | version = "0.11.0+1.5.4" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "1503993b59ca9ae4127365c3293517576d7ce56be9f3d8abb1625c85ddc583ba" 954 | dependencies = [ 955 | "fxhash", 956 | "num-traits", 957 | "spirv 0.2.0+1.5.4", 958 | ] 959 | 960 | [[package]] 961 | name = "rust-gpu-lodestar-runner" 962 | version = "0.1.0" 963 | dependencies = [ 964 | "futures", 965 | "spirv-builder", 966 | "wgpu", 967 | ] 968 | 969 | [[package]] 970 | name = "rustc-demangle" 971 | version = "0.1.24" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 974 | 975 | [[package]] 976 | name = "rustc-hash" 977 | version = "1.1.0" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 980 | 981 | [[package]] 982 | name = "rustc_codegen_spirv" 983 | version = "0.9.0" 984 | source = "git+https://github.com/LykenSol/rust-gpu?branch=ephemera/polaris#3463f416eeda7bdacd07721839c3a4df5d1b51db" 985 | dependencies = [ 986 | "ar", 987 | "either", 988 | "hashbrown 0.11.2", 989 | "indexmap 1.9.3", 990 | "itertools", 991 | "lazy_static", 992 | "libc", 993 | "num-traits", 994 | "once_cell", 995 | "regex", 996 | "rspirv", 997 | "rustc-demangle", 998 | "rustc_codegen_spirv-types", 999 | "sanitize-filename", 1000 | "serde", 1001 | "serde_json", 1002 | "smallvec", 1003 | "spirt", 1004 | "spirv-tools", 1005 | "syn 1.0.109", 1006 | ] 1007 | 1008 | [[package]] 1009 | name = "rustc_codegen_spirv-types" 1010 | version = "0.9.0" 1011 | source = "git+https://github.com/LykenSol/rust-gpu?branch=ephemera/polaris#3463f416eeda7bdacd07721839c3a4df5d1b51db" 1012 | dependencies = [ 1013 | "rspirv", 1014 | "serde", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "rustc_version" 1019 | version = "0.4.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1022 | dependencies = [ 1023 | "semver", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "ryu" 1028 | version = "1.0.18" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1031 | 1032 | [[package]] 1033 | name = "sanitize-filename" 1034 | version = "0.4.0" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "08c502bdb638f1396509467cb0580ef3b29aa2a45c5d43e5d84928241280296c" 1037 | dependencies = [ 1038 | "lazy_static", 1039 | "regex", 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "scopeguard" 1044 | version = "1.2.0" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1047 | 1048 | [[package]] 1049 | name = "semver" 1050 | version = "1.0.23" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 1053 | 1054 | [[package]] 1055 | name = "serde" 1056 | version = "1.0.203" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" 1059 | dependencies = [ 1060 | "serde_derive", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "serde_derive" 1065 | version = "1.0.203" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" 1068 | dependencies = [ 1069 | "proc-macro2", 1070 | "quote", 1071 | "syn 2.0.68", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "serde_json" 1076 | version = "1.0.118" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" 1079 | dependencies = [ 1080 | "itoa", 1081 | "ryu", 1082 | "serde", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "shared-alloc" 1087 | version = "0.1.0" 1088 | dependencies = [ 1089 | "spirv-std", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "slab" 1094 | version = "0.4.9" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1097 | dependencies = [ 1098 | "autocfg", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "slotmap" 1103 | version = "1.0.7" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 1106 | dependencies = [ 1107 | "version_check", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "smallvec" 1112 | version = "1.13.2" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1115 | dependencies = [ 1116 | "serde", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "spirt" 1121 | version = "0.4.0" 1122 | source = "git+https://github.com/LykenSol/spirt?branch=ephemera/polaris#28e9e825f644d4693d2900c4ec20f50dc8231db0" 1123 | dependencies = [ 1124 | "arrayvec", 1125 | "bytemuck", 1126 | "derive_more", 1127 | "elsa", 1128 | "indexmap 2.2.6", 1129 | "internal-iterator", 1130 | "itertools", 1131 | "lazy_static", 1132 | "longest-increasing-subsequence", 1133 | "rustc-hash", 1134 | "serde", 1135 | "serde_json", 1136 | "smallvec", 1137 | ] 1138 | 1139 | [[package]] 1140 | name = "spirv" 1141 | version = "0.2.0+1.5.4" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" 1144 | dependencies = [ 1145 | "bitflags 1.3.2", 1146 | "num-traits", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "spirv" 1151 | version = "0.3.0+sdk-1.3.268.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 1154 | dependencies = [ 1155 | "bitflags 2.6.0", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "spirv-builder" 1160 | version = "0.9.0" 1161 | source = "git+https://github.com/LykenSol/rust-gpu?branch=ephemera/polaris#3463f416eeda7bdacd07721839c3a4df5d1b51db" 1162 | dependencies = [ 1163 | "memchr", 1164 | "raw-string", 1165 | "rustc_codegen_spirv", 1166 | "rustc_codegen_spirv-types", 1167 | "serde", 1168 | "serde_json", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "spirv-std" 1173 | version = "0.9.0" 1174 | source = "git+https://github.com/LykenSol/rust-gpu?branch=ephemera/polaris#3463f416eeda7bdacd07721839c3a4df5d1b51db" 1175 | dependencies = [ 1176 | "bitflags 1.3.2", 1177 | "glam", 1178 | "num-traits", 1179 | "spirv-std-macros", 1180 | "spirv-std-types", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "spirv-std-macros" 1185 | version = "0.9.0" 1186 | source = "git+https://github.com/LykenSol/rust-gpu?branch=ephemera/polaris#3463f416eeda7bdacd07721839c3a4df5d1b51db" 1187 | dependencies = [ 1188 | "proc-macro2", 1189 | "quote", 1190 | "spirv-std-types", 1191 | "syn 1.0.109", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "spirv-std-types" 1196 | version = "0.9.0" 1197 | source = "git+https://github.com/LykenSol/rust-gpu?branch=ephemera/polaris#3463f416eeda7bdacd07721839c3a4df5d1b51db" 1198 | 1199 | [[package]] 1200 | name = "spirv-tools" 1201 | version = "0.10.0" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "bcb3b0832881834994b7ec82b709ec5491043ceb4bf8101e27da6b5234b24261" 1204 | dependencies = [ 1205 | "spirv-tools-sys", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "spirv-tools-sys" 1210 | version = "0.8.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "48e68b55a97aa6856e010a6f2477425875a97873e147bb0232160e73c45bdae7" 1213 | dependencies = [ 1214 | "cc", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "stable_deref_trait" 1219 | version = "1.2.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1222 | 1223 | [[package]] 1224 | name = "static_assertions" 1225 | version = "1.1.0" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1228 | 1229 | [[package]] 1230 | name = "syn" 1231 | version = "1.0.109" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1234 | dependencies = [ 1235 | "proc-macro2", 1236 | "quote", 1237 | "unicode-ident", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "syn" 1242 | version = "2.0.68" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" 1245 | dependencies = [ 1246 | "proc-macro2", 1247 | "quote", 1248 | "unicode-ident", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "termcolor" 1253 | version = "1.4.1" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1256 | dependencies = [ 1257 | "winapi-util", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "thiserror" 1262 | version = "1.0.61" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 1265 | dependencies = [ 1266 | "thiserror-impl", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "thiserror-impl" 1271 | version = "1.0.61" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 1274 | dependencies = [ 1275 | "proc-macro2", 1276 | "quote", 1277 | "syn 2.0.68", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "unicode-ident" 1282 | version = "1.0.12" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1285 | 1286 | [[package]] 1287 | name = "unicode-width" 1288 | version = "0.1.13" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" 1291 | 1292 | [[package]] 1293 | name = "unicode-xid" 1294 | version = "0.2.4" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 1297 | 1298 | [[package]] 1299 | name = "version_check" 1300 | version = "0.9.4" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1303 | 1304 | [[package]] 1305 | name = "wasi" 1306 | version = "0.11.0+wasi-snapshot-preview1" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1309 | 1310 | [[package]] 1311 | name = "wasm-bindgen" 1312 | version = "0.2.92" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 1315 | dependencies = [ 1316 | "cfg-if", 1317 | "wasm-bindgen-macro", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "wasm-bindgen-backend" 1322 | version = "0.2.92" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 1325 | dependencies = [ 1326 | "bumpalo", 1327 | "log", 1328 | "once_cell", 1329 | "proc-macro2", 1330 | "quote", 1331 | "syn 2.0.68", 1332 | "wasm-bindgen-shared", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "wasm-bindgen-futures" 1337 | version = "0.4.42" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 1340 | dependencies = [ 1341 | "cfg-if", 1342 | "js-sys", 1343 | "wasm-bindgen", 1344 | "web-sys", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "wasm-bindgen-macro" 1349 | version = "0.2.92" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 1352 | dependencies = [ 1353 | "quote", 1354 | "wasm-bindgen-macro-support", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "wasm-bindgen-macro-support" 1359 | version = "0.2.92" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 1362 | dependencies = [ 1363 | "proc-macro2", 1364 | "quote", 1365 | "syn 2.0.68", 1366 | "wasm-bindgen-backend", 1367 | "wasm-bindgen-shared", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "wasm-bindgen-shared" 1372 | version = "0.2.92" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 1375 | 1376 | [[package]] 1377 | name = "web-sys" 1378 | version = "0.3.69" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 1381 | dependencies = [ 1382 | "js-sys", 1383 | "wasm-bindgen", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "wgpu" 1388 | version = "0.20.1" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "90e37c7b9921b75dfd26dd973fdcbce36f13dfa6e2dc82aece584e0ed48c355c" 1391 | dependencies = [ 1392 | "arrayvec", 1393 | "cfg-if", 1394 | "cfg_aliases", 1395 | "document-features", 1396 | "js-sys", 1397 | "log", 1398 | "naga", 1399 | "parking_lot", 1400 | "profiling", 1401 | "raw-window-handle", 1402 | "smallvec", 1403 | "static_assertions", 1404 | "wasm-bindgen", 1405 | "wasm-bindgen-futures", 1406 | "web-sys", 1407 | "wgpu-core", 1408 | "wgpu-hal", 1409 | "wgpu-types", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "wgpu-core" 1414 | version = "0.21.1" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "d50819ab545b867d8a454d1d756b90cd5f15da1f2943334ca314af10583c9d39" 1417 | dependencies = [ 1418 | "arrayvec", 1419 | "bit-vec", 1420 | "bitflags 2.6.0", 1421 | "bytemuck", 1422 | "cfg_aliases", 1423 | "codespan-reporting", 1424 | "document-features", 1425 | "indexmap 2.2.6", 1426 | "log", 1427 | "naga", 1428 | "once_cell", 1429 | "parking_lot", 1430 | "profiling", 1431 | "raw-window-handle", 1432 | "rustc-hash", 1433 | "smallvec", 1434 | "thiserror", 1435 | "web-sys", 1436 | "wgpu-hal", 1437 | "wgpu-types", 1438 | ] 1439 | 1440 | [[package]] 1441 | name = "wgpu-hal" 1442 | version = "0.21.1" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | checksum = "172e490a87295564f3fcc0f165798d87386f6231b04d4548bca458cbbfd63222" 1445 | dependencies = [ 1446 | "android_system_properties", 1447 | "arrayvec", 1448 | "ash", 1449 | "bit-set", 1450 | "bitflags 2.6.0", 1451 | "block", 1452 | "cfg_aliases", 1453 | "core-graphics-types", 1454 | "d3d12", 1455 | "glow", 1456 | "glutin_wgl_sys", 1457 | "gpu-alloc", 1458 | "gpu-allocator", 1459 | "gpu-descriptor", 1460 | "hassle-rs", 1461 | "js-sys", 1462 | "khronos-egl", 1463 | "libc", 1464 | "libloading 0.8.4", 1465 | "log", 1466 | "metal", 1467 | "naga", 1468 | "ndk-sys", 1469 | "objc", 1470 | "once_cell", 1471 | "parking_lot", 1472 | "profiling", 1473 | "range-alloc", 1474 | "raw-window-handle", 1475 | "renderdoc-sys", 1476 | "rustc-hash", 1477 | "smallvec", 1478 | "thiserror", 1479 | "wasm-bindgen", 1480 | "web-sys", 1481 | "wgpu-types", 1482 | "winapi", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "wgpu-types" 1487 | version = "0.20.0" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "1353d9a46bff7f955a680577f34c69122628cc2076e1d6f3a9be6ef00ae793ef" 1490 | dependencies = [ 1491 | "bitflags 2.6.0", 1492 | "js-sys", 1493 | "web-sys", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "widestring" 1498 | version = "1.1.0" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" 1501 | 1502 | [[package]] 1503 | name = "winapi" 1504 | version = "0.3.9" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1507 | dependencies = [ 1508 | "winapi-i686-pc-windows-gnu", 1509 | "winapi-x86_64-pc-windows-gnu", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "winapi-i686-pc-windows-gnu" 1514 | version = "0.4.0" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1517 | 1518 | [[package]] 1519 | name = "winapi-util" 1520 | version = "0.1.8" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 1523 | dependencies = [ 1524 | "windows-sys", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "winapi-x86_64-pc-windows-gnu" 1529 | version = "0.4.0" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1532 | 1533 | [[package]] 1534 | name = "windows" 1535 | version = "0.52.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 1538 | dependencies = [ 1539 | "windows-core", 1540 | "windows-targets", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "windows-core" 1545 | version = "0.52.0" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1548 | dependencies = [ 1549 | "windows-targets", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "windows-sys" 1554 | version = "0.52.0" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1557 | dependencies = [ 1558 | "windows-targets", 1559 | ] 1560 | 1561 | [[package]] 1562 | name = "windows-targets" 1563 | version = "0.52.5" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 1566 | dependencies = [ 1567 | "windows_aarch64_gnullvm", 1568 | "windows_aarch64_msvc", 1569 | "windows_i686_gnu", 1570 | "windows_i686_gnullvm", 1571 | "windows_i686_msvc", 1572 | "windows_x86_64_gnu", 1573 | "windows_x86_64_gnullvm", 1574 | "windows_x86_64_msvc", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "windows_aarch64_gnullvm" 1579 | version = "0.52.5" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 1582 | 1583 | [[package]] 1584 | name = "windows_aarch64_msvc" 1585 | version = "0.52.5" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 1588 | 1589 | [[package]] 1590 | name = "windows_i686_gnu" 1591 | version = "0.52.5" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 1594 | 1595 | [[package]] 1596 | name = "windows_i686_gnullvm" 1597 | version = "0.52.5" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 1600 | 1601 | [[package]] 1602 | name = "windows_i686_msvc" 1603 | version = "0.52.5" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 1606 | 1607 | [[package]] 1608 | name = "windows_x86_64_gnu" 1609 | version = "0.52.5" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 1612 | 1613 | [[package]] 1614 | name = "windows_x86_64_gnullvm" 1615 | version = "0.52.5" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 1618 | 1619 | [[package]] 1620 | name = "windows_x86_64_msvc" 1621 | version = "0.52.5" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 1624 | 1625 | [[package]] 1626 | name = "working" 1627 | version = "0.1.0" 1628 | dependencies = [ 1629 | "shared-alloc", 1630 | "spirv-std", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "xml-rs" 1635 | version = "0.8.20" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" 1638 | 1639 | [[package]] 1640 | name = "zerocopy" 1641 | version = "0.7.34" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" 1644 | dependencies = [ 1645 | "zerocopy-derive", 1646 | ] 1647 | 1648 | [[package]] 1649 | name = "zerocopy-derive" 1650 | version = "0.7.34" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" 1653 | dependencies = [ 1654 | "proc-macro2", 1655 | "quote", 1656 | "syn 2.0.68", 1657 | ] 1658 | --------------------------------------------------------------------------------