├── .gitignore ├── .vscode └── settings.json ├── benches └── fft_bench.rs ├── Cargo.toml ├── LICENSE ├── src ├── psd.rs ├── lib.rs ├── twiddles.rs ├── utils.rs ├── fft.rs └── ifft.rs ├── examples └── simple.rs ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .DS_Store -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.defaultFormatter": "rust-lang.rust-analyzer" 4 | } -------------------------------------------------------------------------------- /benches/fft_bench.rs: -------------------------------------------------------------------------------- 1 | use criterion::{black_box, criterion_group, criterion_main, Criterion}; 2 | 3 | type Runtime = cubecl::wgpu::WgpuRuntime; 4 | 5 | fn benchmark_fft(c: &mut Criterion) { 6 | let input_size = 1_000; 7 | let input: Vec = (0..input_size).map(|x| (x as f32) * 0.1).collect(); 8 | 9 | c.bench_function("fft", |b| { 10 | b.iter(|| { 11 | let device = Default::default(); 12 | gpu_fft::fft::fft::(&device, black_box(input.clone())) 13 | }) 14 | }); 15 | } 16 | 17 | criterion_group!(benches, benchmark_fft); 18 | criterion_main!(benches); 19 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "gpu-fft" 3 | version = "0.0.2" 4 | edition = "2021" 5 | authors = ["Eugene Hauptmann"] 6 | description = "A Rust library for performing Fast Fourier Transform (FFT) and Inverse FFT using GPU acceleration." 7 | repository = "https://github.com/name/gpu-fft.git" 8 | keywords = ["FFT", "GPU", "CubeCL", "Rust", "Kernel"] 9 | license = "MIT" 10 | readme = "README.md" 11 | homepage = "https://github.com/eugenehp/gpu-fft" 12 | documentation = "https://docs.rs/gpu-fft" 13 | 14 | [dependencies] 15 | cubecl = { version = "0.4.0" } 16 | 17 | [features] 18 | default = ["wgpu"] 19 | cuda = ["cubecl/cuda"] 20 | wgpu = ["cubecl/wgpu"] 21 | 22 | [dev-dependencies] 23 | criterion = "0.5.1" 24 | 25 | [[bench]] 26 | harness = false 27 | name = "fft_bench" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2025 Eugene Hauptmann 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /src/psd.rs: -------------------------------------------------------------------------------- 1 | /// Computes the Power Spectral Density (PSD) from the real and imaginary components of a signal. 2 | /// 3 | /// The Power Spectral Density is a measure of the power of a signal per unit frequency. This function 4 | /// calculates the PSD by first computing the magnitude of the complex numbers represented by the 5 | /// real and imaginary components, and then calculating the power from the magnitude. The result is 6 | /// normalized by the number of points in the input vectors. 7 | /// 8 | /// # Parameters 9 | /// 10 | /// - `real`: A vector of `f32` values representing the real parts of the complex signal. 11 | /// - `imag`: A vector of `f32` values representing the imaginary parts of the complex signal. 12 | /// 13 | /// # Returns 14 | /// 15 | /// A vector of `f32` values representing the Power Spectral Density of the input signal. The length 16 | /// of the output vector will be the same as the input vectors. 17 | /// 18 | /// # Example 19 | /// 20 | /// ```rust 21 | /// let real = vec![1.0, 0.0, 0.0, 0.0]; // Example real input 22 | /// let imag = vec![0.0, 0.0, 0.0, 0.0]; // Example imaginary input 23 | /// let psd_values = psd(real, imag); 24 | /// ``` 25 | /// 26 | /// # Note 27 | /// 28 | /// The normalization step (dividing by `n`) is optional and can be adjusted based on specific 29 | /// requirements or conventions in your application. 30 | pub fn psd(real: Vec, imag: Vec) -> Vec { 31 | let n = real.len(); 32 | let mut psd = Vec::with_capacity(n); 33 | 34 | for i in 0..n { 35 | // Calculate the magnitude 36 | let magnitude = (real[i] * real[i] + imag[i] * imag[i]).sqrt(); 37 | // Calculate the power 38 | let power = magnitude * magnitude; 39 | // Normalize the power (optional, depending on your needs) 40 | psd.push(power / n as f32); // Normalization by the number of points 41 | } 42 | 43 | psd 44 | } 45 | -------------------------------------------------------------------------------- /examples/simple.rs: -------------------------------------------------------------------------------- 1 | use std::time::Instant; 2 | 3 | use gpu_fft::{fft, ifft, psd, twiddles, utils}; 4 | 5 | type Runtime = cubecl::wgpu::WgpuRuntime; 6 | 7 | pub fn main() { 8 | let device = Default::default(); 9 | // let input = vec![1.0, 0.0, 3.0, 0.0, 0.0]; 10 | let sample_rate = 200.0; 11 | let frequency = 15.0; 12 | let threshold = 0.1; // 100.0; 13 | 14 | let input: Vec = utils::generate_sine_wave(frequency, sample_rate, 100.0); // 1 million samples 15 | 16 | println!("===================="); 17 | println!("\tInput with frequency - {frequency} Hz"); 18 | println!("===================="); 19 | println!("{} {:?}..", input.len(), &input[0..10]); 20 | 21 | let start_time = Instant::now(); 22 | let (real, imag) = fft::fft::(&device, input); 23 | // let (real, imag) = twiddles::fft::(&device, input); 24 | let elapsed_time = start_time.elapsed(); 25 | 26 | println!("===================="); 27 | println!("\tFFT {elapsed_time:?}"); 28 | println!("===================="); 29 | // for (i, (real, imag)) in real.iter().zip(imag.clone()).enumerate() { 30 | // println!("Output[{}]:\tReal: {}, Imag: {}", i, real, imag); 31 | // } 32 | 33 | let spectrum = psd::psd(real.clone(), imag.clone()); 34 | let frequencies = utils::calculate_frequencies(spectrum.len(), sample_rate); 35 | 36 | let dominant_frequencies = utils::find_dominant_frequencies(spectrum, frequencies, threshold); 37 | 38 | // Print dominant frequencies 39 | for (freq, power) in dominant_frequencies { 40 | println!("Frequency:\t{:.2} Hz, Power: {:.2}", freq, power); 41 | } 42 | 43 | let n = real.len(); 44 | let start_time = Instant::now(); 45 | let output = ifft::ifft::(&device, real, imag); 46 | let elapsed_time = start_time.elapsed(); 47 | 48 | println!("===================="); 49 | println!("\tIFFT {elapsed_time:?}"); 50 | println!("===================="); 51 | // for i in 0..n { 52 | // let real = output[i]; 53 | // let imag = output[i + n]; // Assuming output is interleaved 54 | // println!("Output[{}]: Real: {}, Imag: {}", i, real, imag); 55 | // } 56 | } 57 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod fft; 2 | pub mod ifft; 3 | pub mod psd; 4 | pub mod twiddles; 5 | pub mod utils; 6 | 7 | // The general advice for WebGPU is to choose a workgroup size of 64 8 | // Common sizes are 32, 64, 128, 256, or 512 threads per workgroup. 9 | // Apple Metal supports a maximum workgroup size of 1024 threads. 10 | pub(crate) const WORKGROUP_SIZE: u32 = 1024; 11 | 12 | #[cfg(feature = "wgpu")] 13 | type Runtime = cubecl::wgpu::WgpuRuntime; 14 | 15 | #[cfg(feature = "cuda")] 16 | type Runtime = cubecl::cuda::CudaRuntime; 17 | 18 | /// Computes the Fast Fourier Transform (FFT) of the given input vector. 19 | /// 20 | /// This function takes a vector of real numbers as input and returns a tuple 21 | /// containing two vectors: the real and imaginary parts of the FFT result. 22 | /// 23 | /// # Parameters 24 | /// 25 | /// - `input`: A vector of `f32` representing the input signal in the time domain. 26 | /// 27 | /// # Returns 28 | /// 29 | /// A tuple containing two vectors: 30 | /// - A vector of `f32` representing the real part of the FFT output. 31 | /// - A vector of `f32` representing the imaginary part of the FFT output. 32 | /// 33 | /// # Example 34 | /// 35 | /// ``` 36 | /// let input = vec![0.0, 1.0, 0.0, 0.0]; 37 | /// let (real, imag) = fft(input); 38 | /// ``` 39 | pub fn fft(input: Vec) -> (Vec, Vec) { 40 | fft::fft::(&Default::default(), input) 41 | } 42 | 43 | /// Computes the Inverse Fast Fourier Transform (IFFT) of the given real and imaginary parts. 44 | /// 45 | /// This function takes the real and imaginary parts of a frequency domain signal 46 | /// and returns the corresponding time domain signal as a vector of real numbers. 47 | /// 48 | /// # Parameters 49 | /// 50 | /// - `input_real`: A vector of `f32` representing the real part of the frequency domain signal. 51 | /// - `input_imag`: A vector of `f32` representing the imaginary part of the frequency domain signal. 52 | /// 53 | /// # Returns 54 | /// 55 | /// A vector of `f32` representing the reconstructed time domain signal. 56 | /// 57 | /// # Example 58 | /// 59 | /// ``` 60 | /// let real = vec![0.0, 1.0, 0.0, 0.0]; 61 | /// let imag = vec![0.0, 0.0, 0.0, 0.0]; 62 | /// let time_domain = ifft(real, imag); 63 | /// ``` 64 | pub fn ifft(input_real: Vec, input_imag: Vec) -> Vec { 65 | ifft::ifft::(&Default::default(), input_real, input_imag) 66 | } 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GPU-FFT 2 | 3 | This project demonstrates the use of the `gpu-fft` library in Rust to perform Fast Fourier Transform (FFT) and Inverse Fast Fourier Transform (IFFT) on a generated sine wave signal. The application calculates the dominant frequencies in the signal and prints them along with their power. 4 | 5 | ## Table of Contents 6 | 7 | - [Features](#features) 8 | - [Requirements](#requirements) 9 | - [Installation](#installation) 10 | - [Usage](#usage) 11 | - [License](#license) 12 | 13 | ## Features 14 | 15 | - Generate a sine wave signal. 16 | - Perform FFT to analyze the frequency components of the signal. 17 | - Calculate the Power Spectral Density (PSD). 18 | - Identify and print the dominant frequencies in the signal. 19 | - Perform IFFT to reconstruct the original signal. 20 | 21 | ## Roadmap 22 | 23 | - [x] Add twiddles algorithm 24 | - [ ] Add radix2 optimization 25 | - [ ] update to new CubeCL version 26 | 27 | ## Requirements 28 | 29 | - Rust (1.84.1 or later) 30 | - `gpu_fft` crate 31 | 32 | ## Installation 33 | 34 | ```base 35 | cargo add gpu_fft -F wgpu 36 | ``` 37 | 38 | ## Usage 39 | 40 | To run the application, use the following command: 41 | 42 | ```bash 43 | cargo run --example simple -F wgpu 44 | ``` 45 | 46 | The program will generate a sine wave with a specified frequency and sample rate, perform FFT, and print the dominant frequencies along with their power. 47 | 48 | ### Example Output 49 | 50 | ``` 51 | ==================== 52 | Input with frequency - 10 Hz 53 | ==================== 54 | 1000000 [0.0, 0.06279052, 0.12533323, 0.18738133, 0.2486899, 0.309017, 0.36812457, 0.4257793, 0.4817537, 0.5358268].. 55 | ==================== 56 | FFT 3.7933425s 57 | ==================== 58 | Frequency: 10.00 Hz, Power: 249999.38 59 | Frequency: 958.99 Hz, Power: 122.58 60 | Frequency: 990.00 Hz, Power: 247388.88 61 | ==================== 62 | IFFT 4.030771s 63 | ==================== 64 | ``` 65 | 66 | ## Benchmarks 67 | 68 | ```shell 69 | cargo bench 70 | ``` 71 | 72 | returns 73 | 74 | ```shell 75 | fft time: [728.14 µs 748.98 µs 769.46 µs] 76 | change: [-6.5555% -3.9636% -1.1877%] (p = 0.01 < 0.05) 77 | Performance has improved. 78 | ``` 79 | 80 | ## License 81 | 82 | This project is licensed under the MIT License. See the [LICENSE](/LICENSE) file for details. 83 | 84 | ## Copyright 85 | 86 | ©️ 2025, Eugene Hauptmann 87 | -------------------------------------------------------------------------------- /src/twiddles.rs: -------------------------------------------------------------------------------- 1 | use cubecl::prelude::*; 2 | use std::f32::consts::PI; 3 | 4 | use crate::WORKGROUP_SIZE; 5 | 6 | #[cube(launch_unchecked)] 7 | fn precompute_twiddles(twiddles: &mut Array>, #[comptime] n: u32) { 8 | let idx = ABSOLUTE_POS; 9 | if idx < n { 10 | for k in 0..n { 11 | let angle = 12 | F::new(-2.0) * F::new(PI) * F::cast_from(k) * F::cast_from(idx) / F::cast_from(n); 13 | let (cos_angle, sin_angle) = (F::cos(angle), F::sin(angle)); 14 | 15 | // Store the twiddle factors in the array 16 | twiddles[(k * n + idx) * 2] = Line::new(cos_angle); 17 | twiddles[(k * n + idx) * 2 + 1] = Line::new(sin_angle); 18 | } 19 | } 20 | } 21 | 22 | #[cube(launch_unchecked)] 23 | fn fft_kernel( 24 | input: &Array>, 25 | twiddles: &Array>, 26 | real_output: &mut Array>, 27 | imag_output: &mut Array>, 28 | #[comptime] n: u32, 29 | ) { 30 | let idx = ABSOLUTE_POS; 31 | if idx < n { 32 | let mut real = Line::::new(F::new(0.0)); 33 | let mut imag = Line::::new(F::new(0.0)); 34 | 35 | for k in 0..n { 36 | let cos_angle = twiddles[(k * n + idx) * 2]; // Get the cosine from the even index 37 | let sin_angle = twiddles[(k * n + idx) * 2 + 1]; // Get the sine from the odd index 38 | 39 | real += input[k] * Line::cast_from(cos_angle); 40 | imag += input[k] * Line::cast_from(sin_angle); 41 | } 42 | 43 | real_output[idx] = real; 44 | imag_output[idx] = imag; 45 | } 46 | } 47 | 48 | pub fn fft(device: &R::Device, input: Vec) -> (Vec, Vec) { 49 | let client = R::client(device); 50 | let n = input.len(); 51 | 52 | let input_handle = client.create(f32::as_bytes(&input)); 53 | let real_handle = client.empty(n * core::mem::size_of::()); 54 | let imag_handle = client.empty(n * core::mem::size_of::()); 55 | let twiddles_size = 2 * n * n; 56 | let twiddles_handle = client.empty(twiddles_size * core::mem::size_of::()); 57 | 58 | let num_workgroups = (n as u32 + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE; 59 | 60 | unsafe { 61 | precompute_twiddles::launch_unchecked::( 62 | &client, 63 | CubeCount::Static(num_workgroups, 1, 1), 64 | CubeDim::new(WORKGROUP_SIZE, 1, 1), 65 | ArrayArg::from_raw_parts::(&twiddles_handle, twiddles_size, 1), 66 | n as u32, 67 | ) 68 | }; 69 | 70 | let twiddles_bytes = client.read_one(twiddles_handle.clone().binding()); 71 | let twiddles = f32::from_bytes(&twiddles_bytes); 72 | println!("twiddles[{}] - {:#?}", twiddles.len(), &twiddles[0..10]); 73 | // println!("twiddles[{}] - {:?}", twiddles.len(), twiddles); 74 | // (vec![], vec![]) 75 | 76 | unsafe { 77 | fft_kernel::launch_unchecked::( 78 | &client, 79 | CubeCount::Static(num_workgroups, 1, 1), 80 | CubeDim::new(WORKGROUP_SIZE, 1, 1), 81 | ArrayArg::from_raw_parts::(&input_handle, n, 1), 82 | ArrayArg::from_raw_parts::(&twiddles_handle, twiddles_size, 1), 83 | ArrayArg::from_raw_parts::(&real_handle, n, 1), 84 | ArrayArg::from_raw_parts::(&imag_handle, n, 1), 85 | n as u32, 86 | ) 87 | }; 88 | 89 | let real_bytes = client.read_one(real_handle.binding()); 90 | let real = f32::from_bytes(&real_bytes); 91 | 92 | let imag_bytes = client.read_one(imag_handle.binding()); 93 | let imag = f32::from_bytes(&imag_bytes); 94 | 95 | println!( 96 | "real {:?}..{:?}", 97 | &real[0..10], 98 | &real[real.len() - 10..real.len() - 1] 99 | ); 100 | println!( 101 | "imag {:?}..{:?}", 102 | &imag[0..10], 103 | &imag[imag.len() - 10..imag.len() - 1] 104 | ); 105 | 106 | (real.into(), imag.into()) 107 | } 108 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use std::f32::consts::PI; 2 | 3 | /// Generates a sine wave signal based on the specified frequency, sample rate, and duration. 4 | /// 5 | /// This function creates a vector of samples representing a sine wave. The sine wave is generated 6 | /// using the formula: `sin(2 * π * frequency * time)`, where `time` is calculated based on the 7 | /// sample rate and the sample index. 8 | /// 9 | /// # Parameters 10 | /// 11 | /// - `frequency`: The frequency of the sine wave in Hertz (Hz). 12 | /// - `sample_rate`: The number of samples per second (samples/second). 13 | /// - `duration`: The duration of the sine wave in seconds. 14 | /// 15 | /// # Returns 16 | /// 17 | /// A vector of `f32` values representing the samples of the generated sine wave. The length of the 18 | /// output vector will be equal to the number of samples calculated as `sample_rate * duration`. 19 | /// 20 | /// # Example 21 | /// 22 | /// ```rust 23 | /// let frequency = 440.0; // A4 note 24 | /// let sample_rate = 44100.0; // CD quality 25 | /// let duration = 1.0; // 1 second 26 | /// let sine_wave = generate_sine_wave(frequency, sample_rate, duration); 27 | /// ``` 28 | pub fn generate_sine_wave(frequency: f32, sample_rate: f32, duration: f32) -> Vec { 29 | let num_samples = (sample_rate * duration) as usize; 30 | let mut sine_wave = Vec::with_capacity(num_samples); 31 | 32 | for n in 0..num_samples { 33 | let sample = (2.0 * PI * frequency * (n as f32 / sample_rate)).sin(); 34 | sine_wave.push(sample); 35 | } 36 | 37 | sine_wave 38 | } 39 | 40 | /// Calculates the frequency values corresponding to the given number of samples and sample rate. 41 | /// 42 | /// This function generates a vector of frequency values based on the number of samples and the 43 | /// sample rate. The frequencies are calculated as `k * sample_rate / n`, where `k` is the index 44 | /// of the frequency bin. 45 | /// 46 | /// # Parameters 47 | /// 48 | /// - `n`: The number of frequency bins (samples). 49 | /// - `sample_rate`: The sample rate in Hertz (Hz). 50 | /// 51 | /// # Returns 52 | /// 53 | /// A vector of `f32` values representing the frequency values for each bin. The length of the 54 | /// output vector will be equal to `n`. 55 | /// 56 | /// # Example 57 | /// 58 | /// ```rust 59 | /// let n = 1024; // Number of frequency bins 60 | /// let sample_rate = 44100.0; // Sample rate in Hz 61 | /// let frequencies = calculate_frequencies(n, sample_rate); 62 | /// ``` 63 | pub fn calculate_frequencies(n: usize, sample_rate: f32) -> Vec { 64 | (0..n).map(|k| k as f32 * sample_rate / n as f32).collect() 65 | } 66 | 67 | /// Finds the dominant frequencies in the Power Spectral Density (PSD) based on a threshold. 68 | /// 69 | /// This function identifies the dominant frequencies in the provided PSD by checking for peaks 70 | /// in the PSD values that exceed a specified threshold. A peak is defined as a point that is 71 | /// greater than its immediate neighbors. 72 | /// 73 | /// # Parameters 74 | /// 75 | /// - `psd`: A vector of `f32` values representing the Power Spectral Density of the signal. 76 | /// - `frequencies`: A vector of `f32` values representing the frequency values corresponding to 77 | /// the PSD. 78 | /// - `threshold`: A threshold value for identifying dominant frequencies. Only peaks above this 79 | /// threshold will be considered. 80 | /// 81 | /// # Returns 82 | /// 83 | /// A vector of tuples, where each tuple contains a dominant frequency and its corresponding PSD 84 | /// value. The first element of the tuple is the frequency, and the second element is the PSD value. 85 | /// 86 | /// # Example 87 | /// 88 | /// ```rust 89 | /// let psd = vec![0.1, 0.5, 0.3, 0.7, 0.2]; // Example PSD values 90 | /// let frequencies = vec![0.0, 100.0, 200.0, 300.0, 400.0]; // Corresponding frequencies 91 | /// let threshold = 0.4; // Threshold for dominance 92 | /// let dominant_freqs = find_dominant_frequencies(psd, frequencies, threshold); 93 | /// ``` 94 | pub fn find_dominant_frequencies( 95 | psd: Vec, 96 | frequencies: Vec, 97 | threshold: f32, 98 | ) -> Vec<(f32, f32)> { 99 | let mut dominant_frequencies = Vec::new(); 100 | 101 | for i in 1..(psd.len() - 1) { 102 | // Check if the current point is a peak 103 | if psd[i] > psd[i - 1] && psd[i] > psd[i + 1] && psd[i] > threshold { 104 | dominant_frequencies.push((frequencies[i], psd[i])); 105 | } 106 | } 107 | 108 | dominant_frequencies 109 | } 110 | -------------------------------------------------------------------------------- /src/fft.rs: -------------------------------------------------------------------------------- 1 | use cubecl::prelude::*; 2 | use std::f32::consts::PI; 3 | 4 | use crate::WORKGROUP_SIZE; 5 | 6 | /// Performs a Fast Fourier Transform (FFT) on the input data. 7 | /// 8 | /// This kernel computes the FFT of a given input array of complex numbers represented as 9 | /// separate real and imaginary parts. The FFT is computed using the Cooley-Tukey algorithm, 10 | /// which is efficient for large datasets. 11 | /// 12 | /// # Parameters 13 | /// 14 | /// - `input`: An array of complex numbers represented as lines of type `Line`, where `F` 15 | /// is a floating-point type. The input array should contain `n` complex numbers. 16 | /// - `real_output`: A mutable reference to an array of lines where the real parts of the 17 | /// FFT output will be stored. 18 | /// - `imag_output`: A mutable reference to an array of lines where the imaginary parts of 19 | /// the FFT output will be stored. 20 | /// - `n`: The number of complex samples in the input array. This value is provided at compile-time. 21 | /// 22 | /// # Safety 23 | /// 24 | /// This function is marked as `unsafe` because it performs raw pointer operations and assumes 25 | /// that the input and output arrays are correctly sized and aligned. The caller must ensure 26 | /// that the input data is valid and that the output arrays have sufficient space to store 27 | /// the results. 28 | /// 29 | /// # Example 30 | /// 31 | /// ```rust 32 | /// let input = vec![1.0, 0.0, 0.0, 0.0]; // Example input 33 | /// let (real, imag) = fft::(device, input); 34 | /// ``` 35 | /// 36 | /// # Returns 37 | /// 38 | /// This function does not return a value directly. Instead, it populates the `output` array 39 | /// with the real and imaginary parts of the FFT result interleaved. 40 | #[cube(launch)] 41 | fn fft_kernel(input: &Array>, output: &mut Array>, #[comptime] n: u32) { 42 | let idx = ABSOLUTE_POS; 43 | if idx < n { 44 | let mut real = Line::::new(F::new(0.0)); 45 | let mut imag = Line::::new(F::new(0.0)); 46 | 47 | // Precompute the angle increment 48 | let angle_increment = -2.0 * PI / n as f32; 49 | 50 | // #[unroll(true)] 51 | for k in 0..n { 52 | let angle = F::cast_from(angle_increment) * F::cast_from(k) * F::cast_from(idx); 53 | let (cos_angle, sin_angle) = (F::cos(angle), F::sin(angle)); 54 | 55 | // Combine the multiplication and addition 56 | real += input[k] * Line::new(cos_angle); 57 | imag += input[k] * Line::new(sin_angle); 58 | } 59 | 60 | // Store the real and imaginary parts in an interleaved manner 61 | output[idx * 2] = Line::new(F::cast_from(real)); // Real part 62 | output[idx * 2 + 1] = Line::new(F::cast_from(imag)); // Imaginary part 63 | } 64 | } 65 | 66 | /// Computes the Fast Fourier Transform (FFT) of a vector of f32 input data. 67 | /// 68 | /// This function initializes the FFT computation on the provided input vector, launching 69 | /// the FFT kernel to perform the transformation. The input data is expected to be in the 70 | /// form of real numbers, which are treated as complex numbers with zero imaginary parts. 71 | /// 72 | /// # Parameters 73 | /// 74 | /// - `device`: A reference to the device on which the FFT computation will be performed. 75 | /// - `input`: A vector of `f32` values representing the real parts of the input data. 76 | /// 77 | /// # Returns 78 | /// 79 | /// A tuple containing two vectors: 80 | /// - A vector of `f32` values representing the real parts of the FFT output. 81 | /// - A vector of `f32` values representing the imaginary parts of the FFT output. 82 | /// 83 | /// # Example 84 | /// 85 | /// ```rust 86 | /// let input = vec![1.0, 0.0, 0.0, 0.0]; // Example input 87 | /// let (real, imag) = fft::(device, input); 88 | /// ``` 89 | /// 90 | /// # Safety 91 | /// 92 | /// This function uses unsafe operations to interact with the underlying runtime and device. 93 | /// The caller must ensure that the input data is valid and that the device is properly set up 94 | /// for computation. 95 | pub fn fft(device: &R::Device, input: Vec) -> (Vec, Vec) { 96 | let client = R::client(device); 97 | let n = input.len(); 98 | 99 | let input_handle = client.create(f32::as_bytes(&input)); 100 | let output_handle = client.empty(n * 2 * core::mem::size_of::()); // Adjust for interleaved output 101 | 102 | let num_workgroups = (n as u32 + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE; 103 | 104 | unsafe { 105 | fft_kernel::launch::( 106 | &client, 107 | CubeCount::Static(num_workgroups, 1, 1), 108 | CubeDim::new(WORKGROUP_SIZE, 1, 1), 109 | ArrayArg::from_raw_parts::(&input_handle, n, 1), 110 | ArrayArg::from_raw_parts::(&output_handle, n * 2, 1), // Adjust for interleaved output 111 | n as u32, 112 | ) 113 | }; 114 | 115 | let output_bytes = client.read_one(output_handle.binding()); 116 | let output = f32::from_bytes(&output_bytes); 117 | 118 | // Split the interleaved output into real and imaginary parts 119 | let real: Vec = output.iter().step_by(2).cloned().collect(); 120 | let imag: Vec = output.iter().skip(1).step_by(2).cloned().collect(); 121 | 122 | // println!( 123 | // "real {:?}..{:?}", 124 | // &real[0..10], 125 | // &real[real.len() - 10..real.len() - 1] 126 | // ); 127 | // println!( 128 | // "imag {:?}..{:?}", 129 | // &imag[0..10], 130 | // &imag[imag.len() - 10..imag.len() - 1] 131 | // ); 132 | 133 | (real, imag) 134 | } 135 | -------------------------------------------------------------------------------- /src/ifft.rs: -------------------------------------------------------------------------------- 1 | use cubecl::prelude::*; 2 | use std::f32::consts::PI; 3 | 4 | use crate::WORKGROUP_SIZE; 5 | 6 | /// Performs an Inverse Fast Fourier Transform (IFFT) on the input data. 7 | /// 8 | /// This kernel computes the IFFT of a given input array of complex numbers represented as 9 | /// separate real and imaginary parts. The IFFT is computed using the inverse of the Cooley-Tukey 10 | /// algorithm, which is efficient for large datasets. 11 | /// 12 | /// # Parameters 13 | /// 14 | /// - `input_real`: An array of real parts of complex numbers represented as lines of type 15 | /// `Line`, where `F` is a floating-point type. The input array should contain `n` real 16 | /// components. 17 | /// - `input_imag`: An array of imaginary parts of complex numbers represented as lines of type 18 | /// `Line`. The input array should contain `n` imaginary components. 19 | /// - `output`: A mutable reference to an array of lines where the output of the IFFT will be 20 | /// stored. The output will contain interleaved real and imaginary parts. 21 | /// - `n`: The number of complex samples in the input arrays. This value is provided at compile-time. 22 | /// 23 | /// # Safety 24 | /// 25 | /// This function is marked as `unsafe` because it performs raw pointer operations and assumes 26 | /// that the input and output arrays are correctly sized and aligned. The caller must ensure 27 | /// that the input data is valid and that the output array has sufficient space to store 28 | /// the results. 29 | /// 30 | /// # Example 31 | /// 32 | /// ```rust 33 | /// let input_real = vec![1.0, 0.0, 0.0, 0.0]; // Example real input 34 | /// let input_imag = vec![0.0, 0.0, 0.0, 0.0]; // Example imaginary input 35 | /// let output = ifft::(device, input_real, input_imag); 36 | /// ``` 37 | /// 38 | /// # Returns 39 | /// 40 | /// This function does not return a value directly. Instead, it populates the `output` array 41 | /// with the interleaved real and imaginary parts of the IFFT result. 42 | #[cube(launch_unchecked)] 43 | fn ifft_kernel( 44 | input_real: &Array>, 45 | input_imag: &Array>, 46 | output: &mut Array>, 47 | #[comptime] n: u32, 48 | ) { 49 | let idx = ABSOLUTE_POS; 50 | if idx < n { 51 | let mut sum_real = Line::::new(F::new(0.0)); 52 | let mut sum_imag = Line::::new(F::new(0.0)); 53 | 54 | for k in 0..n { 55 | let angle = 56 | F::new(2.0) * F::new(PI) * F::cast_from(k) * F::cast_from(idx) / F::cast_from(n); 57 | let (cos_angle, sin_angle) = (F::cos(angle), F::sin(angle)); 58 | sum_real += input_real[k] * Line::new(cos_angle) - input_imag[k] * Line::new(sin_angle); 59 | sum_imag += input_real[k] * Line::new(sin_angle) + input_imag[k] * Line::new(cos_angle); 60 | } 61 | 62 | let n_line = Line::::new(F::cast_from(n)); 63 | 64 | // Scale the output by 1/n 65 | output[idx] = sum_real / n_line; 66 | output[idx + n] = sum_imag / n_line; 67 | } 68 | } 69 | 70 | /// Computes the Inverse Fast Fourier Transform (IFFT) of a vector of real and imaginary input data. 71 | /// 72 | /// This function initializes the IFFT computation on the provided input vectors, launching 73 | /// the IFFT kernel to perform the transformation. The input data is expected to be in the 74 | /// form of separate real and imaginary components of complex numbers. 75 | /// 76 | /// # Parameters 77 | /// 78 | /// - `device`: A reference to the device on which the IFFT computation will be performed. 79 | /// - `input_real`: A vector of `f32` values representing the real parts of the input data. 80 | /// - `input_imag`: A vector of `f32` values representing the imaginary parts of the input data. 81 | /// 82 | /// # Returns 83 | /// 84 | /// A vector of `f32` values representing the interleaved output of the IFFT, which contains 85 | /// both the real and imaginary parts of the result. 86 | /// 87 | /// # Example 88 | /// 89 | /// ```rust 90 | /// let input_real = vec![1.0, 0.0, 0.0, 0.0]; // Example real input 91 | /// let input_imag = vec![0.0, 0.0, 0.0, 0.0]; // Example imaginary input 92 | /// let output = ifft::(device, input_real, input_imag); 93 | /// ``` 94 | /// 95 | /// # Safety 96 | /// 97 | /// This function uses unsafe operations to interact with the underlying runtime and device. 98 | /// The caller must ensure that the input data is valid and that the device is properly set up 99 | /// for computation. 100 | pub fn ifft( 101 | device: &R::Device, 102 | input_real: Vec, 103 | input_imag: Vec, 104 | ) -> Vec { 105 | let client = R::client(device); 106 | let n = input_real.len(); 107 | 108 | let real_handle = client.create(f32::as_bytes(&input_real)); 109 | let imag_handle = client.create(f32::as_bytes(&input_imag)); 110 | let output_handle = client.empty(n * 2 * core::mem::size_of::()); // Assuming output is interleaved 111 | 112 | let num_workgroups = (n as u32 + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE; 113 | 114 | unsafe { 115 | ifft_kernel::launch_unchecked::( 116 | &client, 117 | CubeCount::Static(num_workgroups, 1, 1), 118 | CubeDim::new(WORKGROUP_SIZE, 1, 1), 119 | ArrayArg::from_raw_parts::(&real_handle, n, 1), 120 | ArrayArg::from_raw_parts::(&imag_handle, n, 1), 121 | ArrayArg::from_raw_parts::(&output_handle, n * 2, 1), 122 | n as u32, 123 | ) 124 | }; 125 | 126 | let output_bytes = client.read_one(output_handle.binding()); 127 | let output = f32::from_bytes(&output_bytes); 128 | 129 | output.into() 130 | } 131 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.8.11" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 10 | dependencies = [ 11 | "cfg-if", 12 | "once_cell", 13 | "version_check", 14 | "zerocopy", 15 | ] 16 | 17 | [[package]] 18 | name = "aho-corasick" 19 | version = "1.1.3" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 22 | dependencies = [ 23 | "memchr", 24 | ] 25 | 26 | [[package]] 27 | name = "allocator-api2" 28 | version = "0.2.21" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 31 | 32 | [[package]] 33 | name = "android_system_properties" 34 | version = "0.1.5" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 37 | dependencies = [ 38 | "libc", 39 | ] 40 | 41 | [[package]] 42 | name = "anes" 43 | version = "0.1.6" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" 46 | 47 | [[package]] 48 | name = "anstyle" 49 | version = "1.0.10" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 52 | 53 | [[package]] 54 | name = "arrayvec" 55 | version = "0.7.6" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 58 | 59 | [[package]] 60 | name = "ash" 61 | version = "0.38.0+1.3.281" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" 64 | dependencies = [ 65 | "libloading", 66 | ] 67 | 68 | [[package]] 69 | name = "async-channel" 70 | version = "2.3.1" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 73 | dependencies = [ 74 | "concurrent-queue", 75 | "event-listener-strategy", 76 | "futures-core", 77 | "pin-project-lite", 78 | ] 79 | 80 | [[package]] 81 | name = "async-lock" 82 | version = "3.4.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 85 | dependencies = [ 86 | "event-listener", 87 | "event-listener-strategy", 88 | "pin-project-lite", 89 | ] 90 | 91 | [[package]] 92 | name = "autocfg" 93 | version = "1.4.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 96 | 97 | [[package]] 98 | name = "bit-set" 99 | version = "0.8.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 102 | dependencies = [ 103 | "bit-vec", 104 | ] 105 | 106 | [[package]] 107 | name = "bit-vec" 108 | version = "0.8.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 111 | 112 | [[package]] 113 | name = "bitflags" 114 | version = "1.3.2" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 117 | 118 | [[package]] 119 | name = "bitflags" 120 | version = "2.8.0" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 123 | 124 | [[package]] 125 | name = "block" 126 | version = "0.1.6" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 129 | 130 | [[package]] 131 | name = "bumpalo" 132 | version = "3.17.0" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 135 | 136 | [[package]] 137 | name = "bytemuck" 138 | version = "1.21.0" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 141 | dependencies = [ 142 | "bytemuck_derive", 143 | ] 144 | 145 | [[package]] 146 | name = "bytemuck_derive" 147 | version = "1.8.1" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" 150 | dependencies = [ 151 | "proc-macro2", 152 | "quote", 153 | "syn", 154 | ] 155 | 156 | [[package]] 157 | name = "byteorder" 158 | version = "1.5.0" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 161 | 162 | [[package]] 163 | name = "cast" 164 | version = "0.3.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" 167 | 168 | [[package]] 169 | name = "cfg-if" 170 | version = "1.0.0" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 173 | 174 | [[package]] 175 | name = "cfg_aliases" 176 | version = "0.1.1" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 179 | 180 | [[package]] 181 | name = "cfg_aliases" 182 | version = "0.2.1" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 185 | 186 | [[package]] 187 | name = "ciborium" 188 | version = "0.2.2" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 191 | dependencies = [ 192 | "ciborium-io", 193 | "ciborium-ll", 194 | "serde", 195 | ] 196 | 197 | [[package]] 198 | name = "ciborium-io" 199 | version = "0.2.2" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 202 | 203 | [[package]] 204 | name = "ciborium-ll" 205 | version = "0.2.2" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 208 | dependencies = [ 209 | "ciborium-io", 210 | "half", 211 | ] 212 | 213 | [[package]] 214 | name = "clap" 215 | version = "4.5.31" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" 218 | dependencies = [ 219 | "clap_builder", 220 | ] 221 | 222 | [[package]] 223 | name = "clap_builder" 224 | version = "4.5.31" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" 227 | dependencies = [ 228 | "anstyle", 229 | "clap_lex", 230 | ] 231 | 232 | [[package]] 233 | name = "clap_lex" 234 | version = "0.7.4" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 237 | 238 | [[package]] 239 | name = "codespan-reporting" 240 | version = "0.11.1" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 243 | dependencies = [ 244 | "termcolor", 245 | "unicode-width", 246 | ] 247 | 248 | [[package]] 249 | name = "concurrent-queue" 250 | version = "2.5.0" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 253 | dependencies = [ 254 | "crossbeam-utils", 255 | ] 256 | 257 | [[package]] 258 | name = "core-foundation" 259 | version = "0.9.4" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 262 | dependencies = [ 263 | "core-foundation-sys", 264 | "libc", 265 | ] 266 | 267 | [[package]] 268 | name = "core-foundation-sys" 269 | version = "0.8.7" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 272 | 273 | [[package]] 274 | name = "core-graphics-types" 275 | version = "0.1.3" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 278 | dependencies = [ 279 | "bitflags 1.3.2", 280 | "core-foundation", 281 | "libc", 282 | ] 283 | 284 | [[package]] 285 | name = "criterion" 286 | version = "0.5.1" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" 289 | dependencies = [ 290 | "anes", 291 | "cast", 292 | "ciborium", 293 | "clap", 294 | "criterion-plot", 295 | "is-terminal", 296 | "itertools", 297 | "num-traits", 298 | "once_cell", 299 | "oorandom", 300 | "plotters", 301 | "rayon", 302 | "regex", 303 | "serde", 304 | "serde_derive", 305 | "serde_json", 306 | "tinytemplate", 307 | "walkdir", 308 | ] 309 | 310 | [[package]] 311 | name = "criterion-plot" 312 | version = "0.5.0" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" 315 | dependencies = [ 316 | "cast", 317 | "itertools", 318 | ] 319 | 320 | [[package]] 321 | name = "crossbeam-deque" 322 | version = "0.8.6" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 325 | dependencies = [ 326 | "crossbeam-epoch", 327 | "crossbeam-utils", 328 | ] 329 | 330 | [[package]] 331 | name = "crossbeam-epoch" 332 | version = "0.9.18" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 335 | dependencies = [ 336 | "crossbeam-utils", 337 | ] 338 | 339 | [[package]] 340 | name = "crossbeam-utils" 341 | version = "0.8.21" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 344 | 345 | [[package]] 346 | name = "crunchy" 347 | version = "0.2.3" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" 350 | 351 | [[package]] 352 | name = "cubecl" 353 | version = "0.4.0" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "aecf090429a4172d94c819e2977f440d7f5846c09f31d36937de309f986c878e" 356 | dependencies = [ 357 | "cubecl-core", 358 | "cubecl-cuda", 359 | "cubecl-hip", 360 | "cubecl-linalg", 361 | "cubecl-runtime", 362 | "cubecl-wgpu", 363 | "half", 364 | ] 365 | 366 | [[package]] 367 | name = "cubecl-common" 368 | version = "0.4.0" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "10239ee4800968f367fbc4828250d38acf5d14fa53e8d0370d5f474387591322" 371 | dependencies = [ 372 | "derive-new", 373 | "embassy-futures", 374 | "futures-lite", 375 | "getrandom", 376 | "log", 377 | "portable-atomic", 378 | "rand", 379 | "serde", 380 | "spin", 381 | "web-time", 382 | ] 383 | 384 | [[package]] 385 | name = "cubecl-core" 386 | version = "0.4.0" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "d249976814abe45ee5d04bdfd5e2359558b409affdc03914625bea778dab5ade" 389 | dependencies = [ 390 | "bytemuck", 391 | "cubecl-common", 392 | "cubecl-macros", 393 | "cubecl-runtime", 394 | "derive-new", 395 | "derive_more", 396 | "half", 397 | "log", 398 | "num-traits", 399 | "paste", 400 | "serde", 401 | "serde_json", 402 | ] 403 | 404 | [[package]] 405 | name = "cubecl-cpp" 406 | version = "0.4.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "8463629d0bdf4d09d47150bce35132236c1a597f65eba213b45073406048a596" 409 | dependencies = [ 410 | "bytemuck", 411 | "cubecl-common", 412 | "cubecl-core", 413 | "cubecl-runtime", 414 | "derive-new", 415 | "half", 416 | "log", 417 | ] 418 | 419 | [[package]] 420 | name = "cubecl-cuda" 421 | version = "0.4.0" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "12c0b49113ba986e984538cf54c3d7390c0af934a80f083b6c99cad737d22c59" 424 | dependencies = [ 425 | "bytemuck", 426 | "cubecl-common", 427 | "cubecl-core", 428 | "cubecl-cpp", 429 | "cubecl-runtime", 430 | "cudarc", 431 | "derive-new", 432 | "half", 433 | "log", 434 | ] 435 | 436 | [[package]] 437 | name = "cubecl-hip" 438 | version = "0.4.0" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "976e150315f9d7d6bb84c51cb13c19221ea5d185bb6d61347a3c392dd29720de" 441 | dependencies = [ 442 | "bytemuck", 443 | "cubecl-common", 444 | "cubecl-core", 445 | "cubecl-cpp", 446 | "cubecl-hip-sys", 447 | "cubecl-runtime", 448 | "derive-new", 449 | "half", 450 | "log", 451 | "paste", 452 | ] 453 | 454 | [[package]] 455 | name = "cubecl-hip-sys" 456 | version = "6.3.1001" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "c7e92df7f9feff6a469932fc4d4b349d28000af9e6f34e583eb4f8df70038d48" 459 | dependencies = [ 460 | "libc", 461 | ] 462 | 463 | [[package]] 464 | name = "cubecl-linalg" 465 | version = "0.4.0" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "640c379e225fecb1336f963affd3b8f1ff66b9320a972dfe92d8158dca8b6382" 468 | dependencies = [ 469 | "bytemuck", 470 | "cubecl-core", 471 | "cubecl-runtime", 472 | "half", 473 | "serde", 474 | ] 475 | 476 | [[package]] 477 | name = "cubecl-macros" 478 | version = "0.4.0" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "f05d95f3be436814f909a3ac97209159f63076d3d2b254914bc02db2ac7faefb" 481 | dependencies = [ 482 | "cubecl-common", 483 | "darling", 484 | "derive-new", 485 | "ident_case", 486 | "prettyplease", 487 | "proc-macro2", 488 | "quote", 489 | "syn", 490 | ] 491 | 492 | [[package]] 493 | name = "cubecl-runtime" 494 | version = "0.4.0" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "75e84f4ae5a096e4d0c410db01d18b673d6efcd6eea1724d1a001ab60484df87" 497 | dependencies = [ 498 | "async-channel", 499 | "async-lock", 500 | "cfg_aliases 0.2.1", 501 | "cubecl-common", 502 | "derive-new", 503 | "dirs", 504 | "hashbrown 0.14.5", 505 | "log", 506 | "md5", 507 | "sanitize-filename", 508 | "serde", 509 | "serde_json", 510 | "spin", 511 | "wasm-bindgen-futures", 512 | ] 513 | 514 | [[package]] 515 | name = "cubecl-wgpu" 516 | version = "0.4.0" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "3cf8105d01ef4cd103d4e31bee9ae583fabc807253234923fb08218b28db7d15" 519 | dependencies = [ 520 | "async-channel", 521 | "bytemuck", 522 | "cfg-if", 523 | "cfg_aliases 0.2.1", 524 | "cubecl-common", 525 | "cubecl-core", 526 | "cubecl-runtime", 527 | "derive-new", 528 | "hashbrown 0.14.5", 529 | "log", 530 | "web-time", 531 | "wgpu", 532 | ] 533 | 534 | [[package]] 535 | name = "cudarc" 536 | version = "0.12.1" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "38cd60a9a42ec83a2ed7effb0b1f073270264ea99da7acfc44f7e8d74dee0384" 539 | dependencies = [ 540 | "libloading", 541 | ] 542 | 543 | [[package]] 544 | name = "darling" 545 | version = "0.20.10" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 548 | dependencies = [ 549 | "darling_core", 550 | "darling_macro", 551 | ] 552 | 553 | [[package]] 554 | name = "darling_core" 555 | version = "0.20.10" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 558 | dependencies = [ 559 | "fnv", 560 | "ident_case", 561 | "proc-macro2", 562 | "quote", 563 | "strsim", 564 | "syn", 565 | ] 566 | 567 | [[package]] 568 | name = "darling_macro" 569 | version = "0.20.10" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 572 | dependencies = [ 573 | "darling_core", 574 | "quote", 575 | "syn", 576 | ] 577 | 578 | [[package]] 579 | name = "derive-new" 580 | version = "0.6.0" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" 583 | dependencies = [ 584 | "proc-macro2", 585 | "quote", 586 | "syn", 587 | ] 588 | 589 | [[package]] 590 | name = "derive_more" 591 | version = "1.0.0" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 594 | dependencies = [ 595 | "derive_more-impl", 596 | ] 597 | 598 | [[package]] 599 | name = "derive_more-impl" 600 | version = "1.0.0" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 603 | dependencies = [ 604 | "proc-macro2", 605 | "quote", 606 | "syn", 607 | "unicode-xid", 608 | ] 609 | 610 | [[package]] 611 | name = "dirs" 612 | version = "5.0.1" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 615 | dependencies = [ 616 | "dirs-sys", 617 | ] 618 | 619 | [[package]] 620 | name = "dirs-sys" 621 | version = "0.4.1" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 624 | dependencies = [ 625 | "libc", 626 | "option-ext", 627 | "redox_users", 628 | "windows-sys 0.48.0", 629 | ] 630 | 631 | [[package]] 632 | name = "document-features" 633 | version = "0.2.11" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" 636 | dependencies = [ 637 | "litrs", 638 | ] 639 | 640 | [[package]] 641 | name = "either" 642 | version = "1.14.0" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" 645 | 646 | [[package]] 647 | name = "embassy-futures" 648 | version = "0.1.1" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" 651 | 652 | [[package]] 653 | name = "equivalent" 654 | version = "1.0.2" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 657 | 658 | [[package]] 659 | name = "event-listener" 660 | version = "5.4.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 663 | dependencies = [ 664 | "concurrent-queue", 665 | "parking", 666 | "pin-project-lite", 667 | ] 668 | 669 | [[package]] 670 | name = "event-listener-strategy" 671 | version = "0.5.3" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 674 | dependencies = [ 675 | "event-listener", 676 | "pin-project-lite", 677 | ] 678 | 679 | [[package]] 680 | name = "fastrand" 681 | version = "2.3.0" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 684 | 685 | [[package]] 686 | name = "fnv" 687 | version = "1.0.7" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 690 | 691 | [[package]] 692 | name = "foldhash" 693 | version = "0.1.4" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 696 | 697 | [[package]] 698 | name = "foreign-types" 699 | version = "0.5.0" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 702 | dependencies = [ 703 | "foreign-types-macros", 704 | "foreign-types-shared", 705 | ] 706 | 707 | [[package]] 708 | name = "foreign-types-macros" 709 | version = "0.2.3" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 712 | dependencies = [ 713 | "proc-macro2", 714 | "quote", 715 | "syn", 716 | ] 717 | 718 | [[package]] 719 | name = "foreign-types-shared" 720 | version = "0.3.1" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 723 | 724 | [[package]] 725 | name = "futures-core" 726 | version = "0.3.31" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 729 | 730 | [[package]] 731 | name = "futures-io" 732 | version = "0.3.31" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 735 | 736 | [[package]] 737 | name = "futures-lite" 738 | version = "2.6.0" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 741 | dependencies = [ 742 | "fastrand", 743 | "futures-core", 744 | "futures-io", 745 | "parking", 746 | "pin-project-lite", 747 | ] 748 | 749 | [[package]] 750 | name = "getrandom" 751 | version = "0.2.15" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 754 | dependencies = [ 755 | "cfg-if", 756 | "js-sys", 757 | "libc", 758 | "wasi", 759 | "wasm-bindgen", 760 | ] 761 | 762 | [[package]] 763 | name = "gl_generator" 764 | version = "0.14.0" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 767 | dependencies = [ 768 | "khronos_api", 769 | "log", 770 | "xml-rs", 771 | ] 772 | 773 | [[package]] 774 | name = "glow" 775 | version = "0.14.2" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" 778 | dependencies = [ 779 | "js-sys", 780 | "slotmap", 781 | "wasm-bindgen", 782 | "web-sys", 783 | ] 784 | 785 | [[package]] 786 | name = "glutin_wgl_sys" 787 | version = "0.6.1" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" 790 | dependencies = [ 791 | "gl_generator", 792 | ] 793 | 794 | [[package]] 795 | name = "gpu-alloc" 796 | version = "0.6.0" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 799 | dependencies = [ 800 | "bitflags 2.8.0", 801 | "gpu-alloc-types", 802 | ] 803 | 804 | [[package]] 805 | name = "gpu-alloc-types" 806 | version = "0.3.0" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 809 | dependencies = [ 810 | "bitflags 2.8.0", 811 | ] 812 | 813 | [[package]] 814 | name = "gpu-allocator" 815 | version = "0.27.0" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" 818 | dependencies = [ 819 | "log", 820 | "presser", 821 | "thiserror", 822 | "windows", 823 | ] 824 | 825 | [[package]] 826 | name = "gpu-descriptor" 827 | version = "0.3.1" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" 830 | dependencies = [ 831 | "bitflags 2.8.0", 832 | "gpu-descriptor-types", 833 | "hashbrown 0.15.2", 834 | ] 835 | 836 | [[package]] 837 | name = "gpu-descriptor-types" 838 | version = "0.2.0" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 841 | dependencies = [ 842 | "bitflags 2.8.0", 843 | ] 844 | 845 | [[package]] 846 | name = "gpu-fft" 847 | version = "0.0.2" 848 | dependencies = [ 849 | "criterion", 850 | "cubecl", 851 | ] 852 | 853 | [[package]] 854 | name = "half" 855 | version = "2.4.1" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 858 | dependencies = [ 859 | "bytemuck", 860 | "cfg-if", 861 | "crunchy", 862 | "num-traits", 863 | "serde", 864 | ] 865 | 866 | [[package]] 867 | name = "hashbrown" 868 | version = "0.14.5" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 871 | dependencies = [ 872 | "ahash", 873 | "allocator-api2", 874 | ] 875 | 876 | [[package]] 877 | name = "hashbrown" 878 | version = "0.15.2" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 881 | dependencies = [ 882 | "foldhash", 883 | ] 884 | 885 | [[package]] 886 | name = "hermit-abi" 887 | version = "0.4.0" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 890 | 891 | [[package]] 892 | name = "hexf-parse" 893 | version = "0.2.1" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 896 | 897 | [[package]] 898 | name = "ident_case" 899 | version = "1.0.1" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 902 | 903 | [[package]] 904 | name = "indexmap" 905 | version = "2.7.1" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 908 | dependencies = [ 909 | "equivalent", 910 | "hashbrown 0.15.2", 911 | ] 912 | 913 | [[package]] 914 | name = "is-terminal" 915 | version = "0.4.15" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" 918 | dependencies = [ 919 | "hermit-abi", 920 | "libc", 921 | "windows-sys 0.59.0", 922 | ] 923 | 924 | [[package]] 925 | name = "itertools" 926 | version = "0.10.5" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 929 | dependencies = [ 930 | "either", 931 | ] 932 | 933 | [[package]] 934 | name = "itoa" 935 | version = "1.0.14" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 938 | 939 | [[package]] 940 | name = "jni-sys" 941 | version = "0.3.0" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 944 | 945 | [[package]] 946 | name = "js-sys" 947 | version = "0.3.77" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 950 | dependencies = [ 951 | "once_cell", 952 | "wasm-bindgen", 953 | ] 954 | 955 | [[package]] 956 | name = "khronos-egl" 957 | version = "6.0.0" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 960 | dependencies = [ 961 | "libc", 962 | "libloading", 963 | "pkg-config", 964 | ] 965 | 966 | [[package]] 967 | name = "khronos_api" 968 | version = "3.1.0" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 971 | 972 | [[package]] 973 | name = "lazy_static" 974 | version = "1.5.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 977 | 978 | [[package]] 979 | name = "libc" 980 | version = "0.2.170" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" 983 | 984 | [[package]] 985 | name = "libloading" 986 | version = "0.8.6" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 989 | dependencies = [ 990 | "cfg-if", 991 | "windows-targets 0.52.6", 992 | ] 993 | 994 | [[package]] 995 | name = "libm" 996 | version = "0.2.11" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 999 | 1000 | [[package]] 1001 | name = "libredox" 1002 | version = "0.1.3" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1005 | dependencies = [ 1006 | "bitflags 2.8.0", 1007 | "libc", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "litrs" 1012 | version = "0.4.1" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 1015 | 1016 | [[package]] 1017 | name = "lock_api" 1018 | version = "0.4.12" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1021 | dependencies = [ 1022 | "autocfg", 1023 | "scopeguard", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "log" 1028 | version = "0.4.26" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 1031 | 1032 | [[package]] 1033 | name = "malloc_buf" 1034 | version = "0.0.6" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1037 | dependencies = [ 1038 | "libc", 1039 | ] 1040 | 1041 | [[package]] 1042 | name = "md5" 1043 | version = "0.7.0" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 1046 | 1047 | [[package]] 1048 | name = "memchr" 1049 | version = "2.7.4" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1052 | 1053 | [[package]] 1054 | name = "metal" 1055 | version = "0.29.0" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" 1058 | dependencies = [ 1059 | "bitflags 2.8.0", 1060 | "block", 1061 | "core-graphics-types", 1062 | "foreign-types", 1063 | "log", 1064 | "objc", 1065 | "paste", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "naga" 1070 | version = "23.1.0" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" 1073 | dependencies = [ 1074 | "arrayvec", 1075 | "bit-set", 1076 | "bitflags 2.8.0", 1077 | "cfg_aliases 0.1.1", 1078 | "codespan-reporting", 1079 | "hexf-parse", 1080 | "indexmap", 1081 | "log", 1082 | "rustc-hash", 1083 | "spirv", 1084 | "termcolor", 1085 | "thiserror", 1086 | "unicode-xid", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "ndk-sys" 1091 | version = "0.5.0+25.2.9519653" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 1094 | dependencies = [ 1095 | "jni-sys", 1096 | ] 1097 | 1098 | [[package]] 1099 | name = "num-traits" 1100 | version = "0.2.19" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1103 | dependencies = [ 1104 | "autocfg", 1105 | "libm", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "objc" 1110 | version = "0.2.7" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1113 | dependencies = [ 1114 | "malloc_buf", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "once_cell" 1119 | version = "1.20.3" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 1122 | 1123 | [[package]] 1124 | name = "oorandom" 1125 | version = "11.1.4" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" 1128 | 1129 | [[package]] 1130 | name = "option-ext" 1131 | version = "0.2.0" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1134 | 1135 | [[package]] 1136 | name = "parking" 1137 | version = "2.2.1" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1140 | 1141 | [[package]] 1142 | name = "parking_lot" 1143 | version = "0.12.3" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1146 | dependencies = [ 1147 | "lock_api", 1148 | "parking_lot_core", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "parking_lot_core" 1153 | version = "0.9.10" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1156 | dependencies = [ 1157 | "cfg-if", 1158 | "libc", 1159 | "redox_syscall", 1160 | "smallvec", 1161 | "windows-targets 0.52.6", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "paste" 1166 | version = "1.0.15" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1169 | 1170 | [[package]] 1171 | name = "pin-project-lite" 1172 | version = "0.2.16" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1175 | 1176 | [[package]] 1177 | name = "pkg-config" 1178 | version = "0.3.31" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1181 | 1182 | [[package]] 1183 | name = "plotters" 1184 | version = "0.3.7" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" 1187 | dependencies = [ 1188 | "num-traits", 1189 | "plotters-backend", 1190 | "plotters-svg", 1191 | "wasm-bindgen", 1192 | "web-sys", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "plotters-backend" 1197 | version = "0.3.7" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" 1200 | 1201 | [[package]] 1202 | name = "plotters-svg" 1203 | version = "0.3.7" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" 1206 | dependencies = [ 1207 | "plotters-backend", 1208 | ] 1209 | 1210 | [[package]] 1211 | name = "portable-atomic" 1212 | version = "1.11.0" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" 1215 | 1216 | [[package]] 1217 | name = "ppv-lite86" 1218 | version = "0.2.20" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1221 | dependencies = [ 1222 | "zerocopy", 1223 | ] 1224 | 1225 | [[package]] 1226 | name = "presser" 1227 | version = "0.3.1" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 1230 | 1231 | [[package]] 1232 | name = "prettyplease" 1233 | version = "0.2.29" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" 1236 | dependencies = [ 1237 | "proc-macro2", 1238 | "syn", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "proc-macro2" 1243 | version = "1.0.93" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1246 | dependencies = [ 1247 | "unicode-ident", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "profiling" 1252 | version = "1.0.16" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 1255 | 1256 | [[package]] 1257 | name = "quote" 1258 | version = "1.0.38" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1261 | dependencies = [ 1262 | "proc-macro2", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "rand" 1267 | version = "0.8.5" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1270 | dependencies = [ 1271 | "libc", 1272 | "rand_chacha", 1273 | "rand_core", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "rand_chacha" 1278 | version = "0.3.1" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1281 | dependencies = [ 1282 | "ppv-lite86", 1283 | "rand_core", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "rand_core" 1288 | version = "0.6.4" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1291 | dependencies = [ 1292 | "getrandom", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "range-alloc" 1297 | version = "0.1.4" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" 1300 | 1301 | [[package]] 1302 | name = "raw-window-handle" 1303 | version = "0.6.2" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 1306 | 1307 | [[package]] 1308 | name = "rayon" 1309 | version = "1.10.0" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1312 | dependencies = [ 1313 | "either", 1314 | "rayon-core", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "rayon-core" 1319 | version = "1.12.1" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1322 | dependencies = [ 1323 | "crossbeam-deque", 1324 | "crossbeam-utils", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "redox_syscall" 1329 | version = "0.5.9" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" 1332 | dependencies = [ 1333 | "bitflags 2.8.0", 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "redox_users" 1338 | version = "0.4.6" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1341 | dependencies = [ 1342 | "getrandom", 1343 | "libredox", 1344 | "thiserror", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "regex" 1349 | version = "1.11.1" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1352 | dependencies = [ 1353 | "aho-corasick", 1354 | "memchr", 1355 | "regex-automata", 1356 | "regex-syntax", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "regex-automata" 1361 | version = "0.4.9" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1364 | dependencies = [ 1365 | "aho-corasick", 1366 | "memchr", 1367 | "regex-syntax", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "regex-syntax" 1372 | version = "0.8.5" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1375 | 1376 | [[package]] 1377 | name = "renderdoc-sys" 1378 | version = "1.1.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 1381 | 1382 | [[package]] 1383 | name = "rustc-hash" 1384 | version = "1.1.0" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1387 | 1388 | [[package]] 1389 | name = "rustversion" 1390 | version = "1.0.19" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1393 | 1394 | [[package]] 1395 | name = "ryu" 1396 | version = "1.0.19" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1399 | 1400 | [[package]] 1401 | name = "same-file" 1402 | version = "1.0.6" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1405 | dependencies = [ 1406 | "winapi-util", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "sanitize-filename" 1411 | version = "0.5.0" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" 1414 | dependencies = [ 1415 | "lazy_static", 1416 | "regex", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "scopeguard" 1421 | version = "1.2.0" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1424 | 1425 | [[package]] 1426 | name = "serde" 1427 | version = "1.0.218" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" 1430 | dependencies = [ 1431 | "serde_derive", 1432 | ] 1433 | 1434 | [[package]] 1435 | name = "serde_derive" 1436 | version = "1.0.218" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" 1439 | dependencies = [ 1440 | "proc-macro2", 1441 | "quote", 1442 | "syn", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "serde_json" 1447 | version = "1.0.139" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" 1450 | dependencies = [ 1451 | "itoa", 1452 | "memchr", 1453 | "ryu", 1454 | "serde", 1455 | ] 1456 | 1457 | [[package]] 1458 | name = "slotmap" 1459 | version = "1.0.7" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 1462 | dependencies = [ 1463 | "version_check", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "smallvec" 1468 | version = "1.14.0" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1471 | 1472 | [[package]] 1473 | name = "spin" 1474 | version = "0.9.8" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1477 | dependencies = [ 1478 | "lock_api", 1479 | "portable-atomic", 1480 | ] 1481 | 1482 | [[package]] 1483 | name = "spirv" 1484 | version = "0.3.0+sdk-1.3.268.0" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 1487 | dependencies = [ 1488 | "bitflags 2.8.0", 1489 | ] 1490 | 1491 | [[package]] 1492 | name = "static_assertions" 1493 | version = "1.1.0" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1496 | 1497 | [[package]] 1498 | name = "strsim" 1499 | version = "0.11.1" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1502 | 1503 | [[package]] 1504 | name = "syn" 1505 | version = "2.0.98" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 1508 | dependencies = [ 1509 | "proc-macro2", 1510 | "quote", 1511 | "unicode-ident", 1512 | ] 1513 | 1514 | [[package]] 1515 | name = "termcolor" 1516 | version = "1.4.1" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1519 | dependencies = [ 1520 | "winapi-util", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "thiserror" 1525 | version = "1.0.69" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1528 | dependencies = [ 1529 | "thiserror-impl", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "thiserror-impl" 1534 | version = "1.0.69" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1537 | dependencies = [ 1538 | "proc-macro2", 1539 | "quote", 1540 | "syn", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "tinytemplate" 1545 | version = "1.2.1" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" 1548 | dependencies = [ 1549 | "serde", 1550 | "serde_json", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "unicode-ident" 1555 | version = "1.0.17" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" 1558 | 1559 | [[package]] 1560 | name = "unicode-width" 1561 | version = "0.1.14" 1562 | source = "registry+https://github.com/rust-lang/crates.io-index" 1563 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 1564 | 1565 | [[package]] 1566 | name = "unicode-xid" 1567 | version = "0.2.6" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 1570 | 1571 | [[package]] 1572 | name = "version_check" 1573 | version = "0.9.5" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1576 | 1577 | [[package]] 1578 | name = "walkdir" 1579 | version = "2.5.0" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1582 | dependencies = [ 1583 | "same-file", 1584 | "winapi-util", 1585 | ] 1586 | 1587 | [[package]] 1588 | name = "wasi" 1589 | version = "0.11.0+wasi-snapshot-preview1" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1592 | 1593 | [[package]] 1594 | name = "wasm-bindgen" 1595 | version = "0.2.100" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1598 | dependencies = [ 1599 | "cfg-if", 1600 | "once_cell", 1601 | "rustversion", 1602 | "wasm-bindgen-macro", 1603 | ] 1604 | 1605 | [[package]] 1606 | name = "wasm-bindgen-backend" 1607 | version = "0.2.100" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1610 | dependencies = [ 1611 | "bumpalo", 1612 | "log", 1613 | "proc-macro2", 1614 | "quote", 1615 | "syn", 1616 | "wasm-bindgen-shared", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "wasm-bindgen-futures" 1621 | version = "0.4.50" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1624 | dependencies = [ 1625 | "cfg-if", 1626 | "js-sys", 1627 | "once_cell", 1628 | "wasm-bindgen", 1629 | "web-sys", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "wasm-bindgen-macro" 1634 | version = "0.2.100" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1637 | dependencies = [ 1638 | "quote", 1639 | "wasm-bindgen-macro-support", 1640 | ] 1641 | 1642 | [[package]] 1643 | name = "wasm-bindgen-macro-support" 1644 | version = "0.2.100" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1647 | dependencies = [ 1648 | "proc-macro2", 1649 | "quote", 1650 | "syn", 1651 | "wasm-bindgen-backend", 1652 | "wasm-bindgen-shared", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "wasm-bindgen-shared" 1657 | version = "0.2.100" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1660 | dependencies = [ 1661 | "unicode-ident", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "web-sys" 1666 | version = "0.3.77" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1669 | dependencies = [ 1670 | "js-sys", 1671 | "wasm-bindgen", 1672 | ] 1673 | 1674 | [[package]] 1675 | name = "web-time" 1676 | version = "1.1.0" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 1679 | dependencies = [ 1680 | "js-sys", 1681 | "wasm-bindgen", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "wgpu" 1686 | version = "23.0.1" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" 1689 | dependencies = [ 1690 | "arrayvec", 1691 | "cfg_aliases 0.1.1", 1692 | "document-features", 1693 | "js-sys", 1694 | "log", 1695 | "naga", 1696 | "parking_lot", 1697 | "profiling", 1698 | "raw-window-handle", 1699 | "smallvec", 1700 | "static_assertions", 1701 | "wasm-bindgen", 1702 | "wasm-bindgen-futures", 1703 | "web-sys", 1704 | "wgpu-core", 1705 | "wgpu-hal", 1706 | "wgpu-types", 1707 | ] 1708 | 1709 | [[package]] 1710 | name = "wgpu-core" 1711 | version = "23.0.1" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" 1714 | dependencies = [ 1715 | "arrayvec", 1716 | "bit-vec", 1717 | "bitflags 2.8.0", 1718 | "cfg_aliases 0.1.1", 1719 | "document-features", 1720 | "indexmap", 1721 | "log", 1722 | "naga", 1723 | "once_cell", 1724 | "parking_lot", 1725 | "profiling", 1726 | "raw-window-handle", 1727 | "rustc-hash", 1728 | "smallvec", 1729 | "thiserror", 1730 | "wgpu-hal", 1731 | "wgpu-types", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "wgpu-hal" 1736 | version = "23.0.1" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" 1739 | dependencies = [ 1740 | "android_system_properties", 1741 | "arrayvec", 1742 | "ash", 1743 | "bit-set", 1744 | "bitflags 2.8.0", 1745 | "block", 1746 | "bytemuck", 1747 | "cfg_aliases 0.1.1", 1748 | "core-graphics-types", 1749 | "glow", 1750 | "glutin_wgl_sys", 1751 | "gpu-alloc", 1752 | "gpu-allocator", 1753 | "gpu-descriptor", 1754 | "js-sys", 1755 | "khronos-egl", 1756 | "libc", 1757 | "libloading", 1758 | "log", 1759 | "metal", 1760 | "naga", 1761 | "ndk-sys", 1762 | "objc", 1763 | "once_cell", 1764 | "parking_lot", 1765 | "profiling", 1766 | "range-alloc", 1767 | "raw-window-handle", 1768 | "renderdoc-sys", 1769 | "rustc-hash", 1770 | "smallvec", 1771 | "thiserror", 1772 | "wasm-bindgen", 1773 | "web-sys", 1774 | "wgpu-types", 1775 | "windows", 1776 | "windows-core", 1777 | ] 1778 | 1779 | [[package]] 1780 | name = "wgpu-types" 1781 | version = "23.0.0" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" 1784 | dependencies = [ 1785 | "bitflags 2.8.0", 1786 | "js-sys", 1787 | "web-sys", 1788 | ] 1789 | 1790 | [[package]] 1791 | name = "winapi-util" 1792 | version = "0.1.9" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 1795 | dependencies = [ 1796 | "windows-sys 0.59.0", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "windows" 1801 | version = "0.58.0" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 1804 | dependencies = [ 1805 | "windows-core", 1806 | "windows-targets 0.52.6", 1807 | ] 1808 | 1809 | [[package]] 1810 | name = "windows-core" 1811 | version = "0.58.0" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 1814 | dependencies = [ 1815 | "windows-implement", 1816 | "windows-interface", 1817 | "windows-result", 1818 | "windows-strings", 1819 | "windows-targets 0.52.6", 1820 | ] 1821 | 1822 | [[package]] 1823 | name = "windows-implement" 1824 | version = "0.58.0" 1825 | source = "registry+https://github.com/rust-lang/crates.io-index" 1826 | checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 1827 | dependencies = [ 1828 | "proc-macro2", 1829 | "quote", 1830 | "syn", 1831 | ] 1832 | 1833 | [[package]] 1834 | name = "windows-interface" 1835 | version = "0.58.0" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" 1838 | dependencies = [ 1839 | "proc-macro2", 1840 | "quote", 1841 | "syn", 1842 | ] 1843 | 1844 | [[package]] 1845 | name = "windows-result" 1846 | version = "0.2.0" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 1849 | dependencies = [ 1850 | "windows-targets 0.52.6", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "windows-strings" 1855 | version = "0.1.0" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 1858 | dependencies = [ 1859 | "windows-result", 1860 | "windows-targets 0.52.6", 1861 | ] 1862 | 1863 | [[package]] 1864 | name = "windows-sys" 1865 | version = "0.48.0" 1866 | source = "registry+https://github.com/rust-lang/crates.io-index" 1867 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1868 | dependencies = [ 1869 | "windows-targets 0.48.5", 1870 | ] 1871 | 1872 | [[package]] 1873 | name = "windows-sys" 1874 | version = "0.59.0" 1875 | source = "registry+https://github.com/rust-lang/crates.io-index" 1876 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1877 | dependencies = [ 1878 | "windows-targets 0.52.6", 1879 | ] 1880 | 1881 | [[package]] 1882 | name = "windows-targets" 1883 | version = "0.48.5" 1884 | source = "registry+https://github.com/rust-lang/crates.io-index" 1885 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1886 | dependencies = [ 1887 | "windows_aarch64_gnullvm 0.48.5", 1888 | "windows_aarch64_msvc 0.48.5", 1889 | "windows_i686_gnu 0.48.5", 1890 | "windows_i686_msvc 0.48.5", 1891 | "windows_x86_64_gnu 0.48.5", 1892 | "windows_x86_64_gnullvm 0.48.5", 1893 | "windows_x86_64_msvc 0.48.5", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "windows-targets" 1898 | version = "0.52.6" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1901 | dependencies = [ 1902 | "windows_aarch64_gnullvm 0.52.6", 1903 | "windows_aarch64_msvc 0.52.6", 1904 | "windows_i686_gnu 0.52.6", 1905 | "windows_i686_gnullvm", 1906 | "windows_i686_msvc 0.52.6", 1907 | "windows_x86_64_gnu 0.52.6", 1908 | "windows_x86_64_gnullvm 0.52.6", 1909 | "windows_x86_64_msvc 0.52.6", 1910 | ] 1911 | 1912 | [[package]] 1913 | name = "windows_aarch64_gnullvm" 1914 | version = "0.48.5" 1915 | source = "registry+https://github.com/rust-lang/crates.io-index" 1916 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1917 | 1918 | [[package]] 1919 | name = "windows_aarch64_gnullvm" 1920 | version = "0.52.6" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1923 | 1924 | [[package]] 1925 | name = "windows_aarch64_msvc" 1926 | version = "0.48.5" 1927 | source = "registry+https://github.com/rust-lang/crates.io-index" 1928 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1929 | 1930 | [[package]] 1931 | name = "windows_aarch64_msvc" 1932 | version = "0.52.6" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1935 | 1936 | [[package]] 1937 | name = "windows_i686_gnu" 1938 | version = "0.48.5" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1941 | 1942 | [[package]] 1943 | name = "windows_i686_gnu" 1944 | version = "0.52.6" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1947 | 1948 | [[package]] 1949 | name = "windows_i686_gnullvm" 1950 | version = "0.52.6" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1953 | 1954 | [[package]] 1955 | name = "windows_i686_msvc" 1956 | version = "0.48.5" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1959 | 1960 | [[package]] 1961 | name = "windows_i686_msvc" 1962 | version = "0.52.6" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1965 | 1966 | [[package]] 1967 | name = "windows_x86_64_gnu" 1968 | version = "0.48.5" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1971 | 1972 | [[package]] 1973 | name = "windows_x86_64_gnu" 1974 | version = "0.52.6" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1977 | 1978 | [[package]] 1979 | name = "windows_x86_64_gnullvm" 1980 | version = "0.48.5" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1983 | 1984 | [[package]] 1985 | name = "windows_x86_64_gnullvm" 1986 | version = "0.52.6" 1987 | source = "registry+https://github.com/rust-lang/crates.io-index" 1988 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1989 | 1990 | [[package]] 1991 | name = "windows_x86_64_msvc" 1992 | version = "0.48.5" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1995 | 1996 | [[package]] 1997 | name = "windows_x86_64_msvc" 1998 | version = "0.52.6" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2001 | 2002 | [[package]] 2003 | name = "xml-rs" 2004 | version = "0.8.25" 2005 | source = "registry+https://github.com/rust-lang/crates.io-index" 2006 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" 2007 | 2008 | [[package]] 2009 | name = "zerocopy" 2010 | version = "0.7.35" 2011 | source = "registry+https://github.com/rust-lang/crates.io-index" 2012 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2013 | dependencies = [ 2014 | "byteorder", 2015 | "zerocopy-derive", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "zerocopy-derive" 2020 | version = "0.7.35" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2023 | dependencies = [ 2024 | "proc-macro2", 2025 | "quote", 2026 | "syn", 2027 | ] 2028 | --------------------------------------------------------------------------------