diff --git a/.gitignore b/.gitignore index 815f5c3986..5f1f0aaff2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ target/ perf.data* profile.json flamegraph.svg - +.idea/ diff --git a/Cargo.lock b/Cargo.lock index 0c347cf8f7..41a0b96f0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -864,37 +864,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "compilation-client" -version = "0.1.0" -dependencies = [ - "anyhow", - "dyn-any", - "gpu-compiler-bin-wrapper", - "gpu-executor", - "graph-craft", - "graphene-core", - "reqwest", - "serde_json", - "wgpu-executor", -] - -[[package]] -name = "compilation-server" -version = "0.1.0" -dependencies = [ - "anyhow", - "axum", - "futures", - "gpu-compiler-bin-wrapper", - "graph-craft", - "serde", - "serde_json", - "tempfile", - "tokio", - "tower-http", -] - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -2151,19 +2120,6 @@ dependencies = [ "windows 0.58.0", ] -[[package]] -name = "gpu-compiler-bin-wrapper" -version = "0.1.0" -dependencies = [ - "anyhow", - "gpu-executor", - "graph-craft", - "log", - "serde", - "serde_json", - "wgpu-executor", -] - [[package]] name = "gpu-descriptor" version = "0.3.1" @@ -2184,24 +2140,6 @@ dependencies = [ "bitflags 2.9.0", ] -[[package]] -name = "gpu-executor" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bytemuck", - "dyn-any", - "futures", - "glam", - "graphene-core", - "log", - "node-macro", - "num-traits", - "serde", - "web-sys", -] - [[package]] name = "graph-craft" version = "0.1.0" @@ -2246,7 +2184,6 @@ dependencies = [ "fern", "futures", "glam", - "gpu-executor", "graph-craft", "graphene-core", "graphene-std", @@ -2305,13 +2242,10 @@ dependencies = [ "base64 0.22.1", "bezier-rs", "bytemuck", - "compilation-client", "dyn-any", "fastnoise-lite", "futures", "glam", - "gpu-compiler-bin-wrapper", - "gpu-executor", "graph-craft", "graphene-core", "image", @@ -2374,7 +2308,6 @@ dependencies = [ "env_logger", "futures", "glam", - "gpu-executor", "graph-craft", "graphene-core", "graphene-std", @@ -3064,7 +2997,6 @@ dependencies = [ "futures", "glam", "glob", - "gpu-executor", "graph-craft", "graphene-core", "graphene-std", @@ -5691,15 +5623,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -6643,9 +6566,7 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -6767,20 +6688,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower-http" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" -dependencies = [ - "bitflags 2.9.0", - "bytes", - "http", - "pin-project-lite", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-layer" version = "0.3.3" @@ -7591,7 +7498,6 @@ dependencies = [ "futures", "futures-intrusive", "glam", - "gpu-executor", "graphene-core", "half", "log", diff --git a/Cargo.toml b/Cargo.toml index 1c50e83ee1..d132db5337 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,18 +10,13 @@ members = [ "node-graph/graphene-cli", "node-graph/interpreted-executor", "node-graph/node-macro", - "node-graph/compilation-server", - "node-graph/compilation-client", "node-graph/wgpu-executor", - "node-graph/gpu-executor", - "node-graph/gpu-compiler/gpu-compiler-bin-wrapper", "libraries/dyn-any", "libraries/path-bool", "libraries/bezier-rs", "libraries/math-parser", "website/other/bezier-rs-demos/wasm", ] -exclude = ["node-graph/gpu-compiler"] default-members = [ "editor", "frontend/wasm", diff --git a/editor/Cargo.toml b/editor/Cargo.toml index 2191161bcb..5de0171b36 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -15,10 +15,8 @@ default = ["wasm"] wasm = ["wasm-bindgen", "graphene-std/wasm", "wasm-bindgen-futures"] gpu = [ "interpreted-executor/gpu", - "graphene-std/gpu", "graphene-core/gpu", "wgpu-executor", - "gpu-executor", ] tauri = ["ron", "decouple-execution"] decouple-execution = [] @@ -72,7 +70,6 @@ spin = "0.9.8" # Optional local dependencies wgpu-executor = { path = "../node-graph/wgpu-executor", optional = true } -gpu-executor = { path = "../node-graph/gpu-executor", optional = true } # Optional workspace dependencies wasm-bindgen = { workspace = true, optional = true } diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index 9a51084206..1a32dd0be5 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -23,8 +23,6 @@ use graphene_core::vector::VectorDataTable; use graphene_core::*; use graphene_std::ops::XY; use std::collections::{HashMap, HashSet, VecDeque}; -#[cfg(feature = "gpu")] -use wgpu_executor::{Bindgroup, CommandBuffer, PipelineLayout, ShaderHandle, ShaderInputFrame, WgpuShaderInput}; pub struct NodePropertiesContext<'a> { pub persistent_data: &'a PersistentData, @@ -1115,87 +1113,6 @@ fn static_nodes() -> Vec { description: Cow::Borrowed("TODO"), properties: None, }, - #[cfg(feature = "gpu")] - DocumentNodeDefinition { - identifier: "Uniform", - category: "Debug: GPU", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(2), 0)], - nodes: [ - DocumentNode { - inputs: vec![NodeInput::scope("editor-api")], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode")), - ..Default::default() - }, - DocumentNode { - inputs: vec![NodeInput::network(generic!(T), 0), NodeInput::node(NodeId(0), 0)], - manual_composition: Some(concrete!(Context)), - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("wgpu_executor::UniformNode")), - ..Default::default() - }, - DocumentNode { - manual_composition: Some(concrete!(Context)), - inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::memo::MemoNode")), - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }), - inputs: vec![NodeInput::value(TaggedValue::F64(0.), true)], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![("In", "TODO").into()], - output_names: vec!["Uniform".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [ - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Extract Executor".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Create Uniform".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cache".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(14, 0)), - ..Default::default() - }, - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, DocumentNodeDefinition { identifier: "Storage", category: "Debug: GPU", @@ -1355,284 +1272,6 @@ fn static_nodes() -> Vec { properties: None, }, #[cfg(feature = "gpu")] - DocumentNodeDefinition { - identifier: "Create Compute Pass", - category: "Debug: GPU", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(2), 0)], - nodes: [ - DocumentNode { - inputs: vec![NodeInput::scope("editor-api")], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode")), - ..Default::default() - }, - DocumentNode { - inputs: vec![ - NodeInput::network(concrete!(PipelineLayout), 0), - NodeInput::node(NodeId(0), 0), - NodeInput::network(concrete!(WgpuShaderInput), 2), - NodeInput::network(concrete!(gpu_executor::ComputePassDimensions), 3), - ], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("wgpu_executor::CreateComputePassNode")), - ..Default::default() - }, - DocumentNode { - manual_composition: Some(concrete!(Context)), - inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::memo::MemoNode")), - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }), - inputs: vec![ - NodeInput::network(concrete!(PipelineLayout), 0), - NodeInput::network(concrete!(WgpuShaderInput), 2), - NodeInput::network(concrete!(gpu_executor::ComputePassDimensions), 3), - ], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![("In", "TODO").into(), ("In", "TODO").into(), ("In", "TODO").into()], - output_names: vec!["Command Buffer".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [ - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Extract Executor".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Create Compute Pass".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cache".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(14, 0)), - ..Default::default() - }, - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, - #[cfg(feature = "gpu")] - DocumentNodeDefinition { - identifier: "Create Pipeline Layout", - category: "Debug: GPU", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::proto("wgpu_executor::CreatePipelineLayoutNode"), - inputs: vec![ - NodeInput::network(concrete!(ShaderHandle), 0), - NodeInput::network(concrete!(String), 1), - NodeInput::network(concrete!(Bindgroup), 2), - NodeInput::network(concrete!(Arc), 3), - ], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![ - ("Shader Handle", "TODO").into(), - ("String", "TODO").into(), - ("Bindgroup", "TODO").into(), - ("Arc Shader Input", "TODO").into(), - ], - output_names: vec!["Pipeline Layout".to_string()], - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, - #[cfg(feature = "gpu")] - DocumentNodeDefinition { - identifier: "Execute Compute Pipeline", - category: "Debug: GPU", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(2), 0)], - nodes: [ - DocumentNode { - inputs: vec![NodeInput::scope("editor-api")], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode")), - ..Default::default() - }, - DocumentNode { - inputs: vec![NodeInput::network(concrete!(CommandBuffer), 0), NodeInput::node(NodeId(0), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("wgpu_executor::ExecuteComputePipelineNode")), - ..Default::default() - }, - DocumentNode { - manual_composition: Some(concrete!(Context)), - inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::memo::MemoNode")), - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }), - inputs: vec![NodeInput::value(TaggedValue::None, true)], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![("In", "TODO").into()], - output_names: vec!["Pipeline Result".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [ - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Extract Executor".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Execute Compute Pipeline".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cache".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(14, 0)), - ..Default::default() - }, - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, - #[cfg(feature = "gpu")] - DocumentNodeDefinition { - identifier: "Read Output Buffer", - category: "Debug: GPU", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(2), 0)], - nodes: [ - DocumentNode { - inputs: vec![NodeInput::scope("editor-api")], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode")), - ..Default::default() - }, - DocumentNode { - inputs: vec![NodeInput::network(concrete!(Arc), 0), NodeInput::node(NodeId(0), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("wgpu_executor::ReadOutputBufferNode")), - ..Default::default() - }, - DocumentNode { - manual_composition: Some(concrete!(Context)), - inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::memo::MemoNode")), - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }), - inputs: vec![NodeInput::value(TaggedValue::None, true)], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![("In", "TODO").into()], - output_names: vec!["Buffer".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [ - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Extract Executor".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Read Output Buffer".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cache".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(14, 0)), - ..Default::default() - }, - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, - #[cfg(feature = "gpu")] DocumentNodeDefinition { identifier: "Create GPU Surface", category: "Debug: GPU", @@ -1698,77 +1337,6 @@ fn static_nodes() -> Vec { description: Cow::Borrowed("TODO"), properties: None, }, - #[cfg(feature = "gpu")] - DocumentNodeDefinition { - identifier: "Render Texture", - category: "Debug: GPU", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0)], - nodes: [ - DocumentNode { - inputs: vec![NodeInput::scope("editor-api")], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode")), - ..Default::default() - }, - DocumentNode { - manual_composition: Some(concrete!(Context)), - inputs: vec![ - NodeInput::network(concrete!(ShaderInputFrame), 0), - NodeInput::network(concrete!(Arc), 1), - NodeInput::node(NodeId(0), 0), - ], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("wgpu_executor::RenderTextureNode")), - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }), - inputs: vec![NodeInput::value(TaggedValue::None, true), NodeInput::value(TaggedValue::None, true)], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![("Texture", "TODO").into(), ("Surface", "TODO").into()], - output_names: vec!["Rendered Texture".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [ - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Extract Executor".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Render Texture".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)), - ..Default::default() - }, - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, // #[cfg(feature = "gpu")] // DocumentNodeDefinition { // identifier: "Upload Texture", diff --git a/node-graph/compilation-client/Cargo.toml b/node-graph/compilation-client/Cargo.toml deleted file mode 100644 index 466f8110ff..0000000000 --- a/node-graph/compilation-client/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "compilation-client" -version = "0.1.0" -edition = "2024" -license = "MIT OR Apache-2.0" - -[dependencies] -# Local dependencies -graph-craft = { path = "../graph-craft", features = ["serde"] } -gpu-executor = { path = "../gpu-executor" } -wgpu-executor = { path = "../wgpu-executor" } -gpu-compiler-bin-wrapper = { path = "../gpu-compiler/gpu-compiler-bin-wrapper" } - -# Workspace dependencies -graphene-core = { workspace = true } -dyn-any = { workspace = true } -anyhow = { workspace = true } -serde_json = { workspace = true } -reqwest = { workspace = true, features = ["blocking", "json", "rustls-tls"] } diff --git a/node-graph/compilation-client/src/lib.rs b/node-graph/compilation-client/src/lib.rs deleted file mode 100644 index 192ef53d5b..0000000000 --- a/node-graph/compilation-client/src/lib.rs +++ /dev/null @@ -1,28 +0,0 @@ -use gpu_compiler_bin_wrapper::CompileRequest; -use graph_craft::Type; -use graph_craft::proto::ProtoNetwork; -use wgpu_executor::ShaderIO; - -pub async fn compile(networks: Vec, inputs: Vec, outputs: Vec, io: ShaderIO) -> Result { - let client = reqwest::Client::new(); - - let compile_request = CompileRequest::new(networks, inputs.clone(), outputs.clone(), io.clone()); - let response = client.post("http://localhost:3000/compile/spirv").json(&compile_request).send(); - let response = response.await?; - response.bytes().await.map(|b| Shader { - spirv_binary: b.chunks(4).map(|x| u32::from_le_bytes(x.try_into().unwrap())).collect(), - input_types: inputs, - output_types: outputs, - io, - }) -} - -// TODO: should we add the entry point as a field? -/// A compiled shader with type annotations. -#[derive(dyn_any::DynAny)] -pub struct Shader { - pub spirv_binary: Vec, - pub input_types: Vec, - pub output_types: Vec, - pub io: ShaderIO, -} diff --git a/node-graph/compilation-client/src/main.rs b/node-graph/compilation-client/src/main.rs deleted file mode 100644 index 0c7a771ac8..0000000000 --- a/node-graph/compilation-client/src/main.rs +++ /dev/null @@ -1,68 +0,0 @@ -use gpu_compiler_bin_wrapper::CompileRequest; -use graph_craft::concrete; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::*; -use graphene_core::Color; -use graphene_core::raster::adjustments::BlendMode; -use std::time::Duration; -use wgpu_executor::{ShaderIO, ShaderInput}; - -fn main() { - let client = reqwest::blocking::Client::new(); - - let network = add_network(); - let compiler = graph_craft::graphene_compiler::Compiler {}; - let proto_network = compiler.compile_single(network).unwrap(); - - let io = ShaderIO { - inputs: vec![ - ShaderInput::StorageBuffer((), concrete!(Color)), // background image - ShaderInput::StorageBuffer((), concrete!(Color)), // foreground image - ShaderInput::StorageBuffer((), concrete!(u32)), // width/height of the foreground image - ShaderInput::OutputBuffer((), concrete!(Color)), - ], - output: ShaderInput::OutputBuffer((), concrete!(Color)), - }; - - let compile_request = CompileRequest::new(vec![proto_network], vec![concrete!(Color), concrete!(Color), concrete!(u32)], vec![concrete!(Color)], io); - let response = client - .post("http://localhost:3000/compile/spirv") - .timeout(Duration::from_secs(30)) - .json(&compile_request) - .send() - .unwrap(); - println!("response: {response:?}"); -} - -fn add_network() -> NodeNetwork { - NodeNetwork { - exports: vec![NodeInput::node(NodeId(0), 0)], - nodes: [DocumentNode { - inputs: vec![NodeInput::Inline(InlineRust::new( - format!( - r#"graphene_core::raster::adjustments::BlendNode::new( - graphene_core::value::CopiedNode::new({}), - graphene_core::value::CopiedNode::new({}), - ).eval(( - i1[_global_index.x as usize], - if _global_index.x < i2[2] {{ - i0[_global_index.x as usize] - }} else {{ - Color::from_rgbaf32_unchecked(0., 0., 0., 0.) - }}, - ))"#, - TaggedValue::BlendMode(BlendMode::Normal).to_primitive_string(), - TaggedValue::F64(1.).to_primitive_string(), - ), - concrete![Color], - ))], - implementation: DocumentNodeImplementation::ProtoNode("graphene_core::value::CopiedNode".into()), - ..Default::default() - }] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - } -} diff --git a/node-graph/compilation-server/Cargo.toml b/node-graph/compilation-server/Cargo.toml deleted file mode 100644 index 4dbf81b9e8..0000000000 --- a/node-graph/compilation-server/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "compilation-server" -version = "0.1.0" -edition = "2024" -license = "MIT OR Apache-2.0" - -[dependencies] -# Local dependencies -graph-craft = { path = "../graph-craft", features = ["serde"] } -gpu-compiler-bin-wrapper = { path = "../gpu-compiler/gpu-compiler-bin-wrapper" } -tokio = { workspace = true, features = ["full"] } -axum = { workspace = true } -serde_json = { workspace = true } -serde = { workspace = true, features = ["derive"] } -tempfile = { workspace = true } -anyhow = { workspace = true } -futures = { workspace = true } - -# Required dependencies -tower-http = { version = "0.6", features = ["cors"] } diff --git a/node-graph/compilation-server/src/main.rs b/node-graph/compilation-server/src/main.rs deleted file mode 100644 index 0ad46e847c..0000000000 --- a/node-graph/compilation-server/src/main.rs +++ /dev/null @@ -1,48 +0,0 @@ -use axum::Router; -use axum::extract::{Json, State}; -use axum::http::StatusCode; -use axum::routing::{get, post}; -use gpu_compiler_bin_wrapper::CompileRequest; -use std::collections::HashMap; -use std::sync::Arc; -use std::sync::RwLock; -use tower_http::cors::CorsLayer; - -struct AppState { - compile_dir: tempfile::TempDir, - cache: RwLock, StatusCode>>>, -} - -#[tokio::main] -async fn main() { - let shared_state = Arc::new(AppState { - compile_dir: tempfile::tempdir().expect("failed to create tempdir"), - cache: Default::default(), - }); - - // build our application with a single route - let app = Router::new() - .route("/", get(|| async { "Hello from compilation server!" })) - .route("/compile", get(|| async { "Supported targets: spirv" })) - .route("/compile/spirv", post(post_compile_spirv)) - .layer(CorsLayer::permissive()) - .with_state(shared_state); - - // run it with hyper on localhost:3000 - let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); - axum::serve(listener, app).await.unwrap(); -} - -async fn post_compile_spirv(State(state): State>, Json(compile_request): Json) -> Result, StatusCode> { - if let Some(result) = state.cache.read().unwrap().get(&compile_request) { - return result.clone(); - } - - let path = std::env::var("CARGO_MANIFEST_DIR").unwrap() + "/../gpu-compiler/Cargo.toml"; - let result = compile_request.compile(state.compile_dir.path().to_str().expect("non utf8 tempdir path"), &path).map_err(|e| { - eprintln!("compilation failed: {e}"); - StatusCode::INTERNAL_SERVER_ERROR - })?; - state.cache.write().unwrap().insert(compile_request, Ok(result.clone())); - Ok(result) -} diff --git a/node-graph/gpu-compiler/Cargo.lock b/node-graph/gpu-compiler/Cargo.lock deleted file mode 100644 index 6849c75745..0000000000 --- a/node-graph/gpu-compiler/Cargo.lock +++ /dev/null @@ -1,4866 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" - -[[package]] -name = "ab_glyph" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.15", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom 0.2.15", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-activity" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" -dependencies = [ - "android-properties", - "bitflags 2.9.0", - "cc", - "cesu8", - "jni", - "jni-sys", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "num_enum", - "thiserror 1.0.69", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" - -[[package]] -name = "ar" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bezier-rs" -version = "0.4.0" -dependencies = [ - "dyn-any", - "glam", - "serde", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" -dependencies = [ - "objc-sys", -] - -[[package]] -name = "block2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" -dependencies = [ - "block-sys", - "objc2", -] - -[[package]] -name = "bstr" -version = "1.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "bytemuck" -version = "1.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "calloop" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" -dependencies = [ - "bitflags 2.9.0", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cc" -version = "1.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "windows-link", -] - -[[package]] -name = "chrono-tz" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "color" -version = "0.1.0" -source = "git+https://github.com/linebender/color.git?rev=a4fa61aff6c3f292b729dc409e7832e5f0166e4a#a4fa61aff6c3f292b729dc409e7832e5f0166e4a" -dependencies = [ - "serde", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.99", -] - -[[package]] -name = "cursor-icon" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" - -[[package]] -name = "data-url" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" - -[[package]] -name = "derive_more" -version = "0.99.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" -dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.99", -] - -[[package]] -name = "deunicode" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "document-features" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" -dependencies = [ - "litrs", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dyn-any" -version = "0.3.1" -dependencies = [ - "dyn-any-derive", - "glam", - "log", - "reqwest", -] - -[[package]] -name = "dyn-any-derive" -version = "0.3.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elsa" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2343daaeabe09879d4ea058bb4f1e63da3fc07dadc6634e01bda1b3d6a9d9d2b" -dependencies = [ - "indexmap 2.7.1", - "stable_deref_trait", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "euclid" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" -dependencies = [ - "num-traits", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" - -[[package]] -name = "font-types" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d868ec188a98bb014c606072edd47e52e7ab7297db943b0b28503121e1d037bd" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "fontconfig-parser" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" -dependencies = [ - "roxmltree", -] - -[[package]] -name = "fontdb" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a6f9af55fb97ad673fb7a69533eb2f967648a06fa21f8c9bb2cd6d33975716" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.24.1", -] - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glam" -version = "0.29.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" -dependencies = [ - "bytemuck", - "libm", - "serde", -] - -[[package]] -name = "globset" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "globwalk" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" -dependencies = [ - "bitflags 2.9.0", - "ignore", - "walkdir", -] - -[[package]] -name = "glow" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.9.0", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "gpu-allocator" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" -dependencies = [ - "log", - "presser", - "thiserror 1.0.69", - "windows", -] - -[[package]] -name = "gpu-compiler" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64", - "bytemuck", - "dyn-any", - "glam", - "gpu-executor", - "graph-craft", - "graphene-core", - "log", - "num-traits", - "nvtx", - "serde", - "serde_json", - "spirv-builder", - "tempfile", - "tera", -] - -[[package]] -name = "gpu-descriptor" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" -dependencies = [ - "bitflags 2.9.0", - "gpu-descriptor-types", - "hashbrown 0.15.2", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "gpu-executor" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64", - "bytemuck", - "dyn-any", - "futures", - "glam", - "graphene-core", - "log", - "node-macro", - "num-traits", - "serde", - "web-sys", -] - -[[package]] -name = "graph-craft" -version = "0.1.0" -dependencies = [ - "base64", - "bezier-rs", - "bytemuck", - "dyn-any", - "futures", - "glam", - "graphene-core", - "js-sys", - "log", - "num-traits", - "reqwest", - "rustc-hash 2.1.1", - "serde", - "specta", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-executor", - "winit", -] - -[[package]] -name = "graphene-core" -version = "0.1.0" -dependencies = [ - "base64", - "bezier-rs", - "bytemuck", - "ctor", - "dyn-any", - "glam", - "half", - "image", - "kurbo", - "log", - "math-parser", - "node-macro", - "num-derive", - "num-traits", - "rand 0.9.0", - "rand_chacha 0.9.0", - "rustybuzz 0.20.1", - "serde", - "specta", - "spirv-std", - "tinyvec", - "usvg", - "web-sys", - "wgpu", -] - -[[package]] -name = "guillotiere" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" -dependencies = [ - "euclid", - "svg_fmt", -] - -[[package]] -name = "h2" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.7.1", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "bytemuck", - "cfg-if", - "crunchy", - "serde", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "http" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "humansize" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" -dependencies = [ - "libm", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core 0.52.0", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icrate" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" -dependencies = [ - "block2", - "dispatch", - "objc2", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "image" -version = "0.25.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" -dependencies = [ - "bytemuck", - "byteorder-lite", - "num-traits", - "png", -] - -[[package]] -name = "imagesize" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", -] - -[[package]] -name = "indoc" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" - -[[package]] -name = "internal-iterator" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969ee3fc68ec2e88eb21434ce4d9b7e1600d1ce92ff974560a6c4a304f5124b9" - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", - "pkg-config", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - -[[package]] -name = "kurbo" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" -dependencies = [ - "arrayvec", - "serde", - "smallvec", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.170" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" - -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.0", - "libc", - "redox_syscall 0.5.10", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" - -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "litrs" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" - -[[package]] -name = "longest-increasing-subsequence" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "math-parser" -version = "0.0.0" -dependencies = [ - "lazy_static", - "log", - "num-complex", - "pest", - "pest_derive", - "thiserror 2.0.12", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.0", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "naga" -version = "23.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.9.0", - "cfg_aliases 0.1.1", - "codespan-reporting", - "hexf-parse", - "indexmap 2.7.1", - "log", - "petgraph", - "rustc-hash 1.1.0", - "spirv 0.3.0+sdk-1.3.268.0", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" -dependencies = [ - "bitflags 2.9.0", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "node-macro" -version = "0.0.0" -dependencies = [ - "convert_case 0.7.1", - "indoc", - "proc-macro-crate", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "nvtx" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad2e855e8019f99e4b94ac33670eb4e4f570a2e044f3749a0b2c7f83b841e52c" -dependencies = [ - "cc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2-encode" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" - -[[package]] -name = "openssl" -version = "0.10.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" -dependencies = [ - "bitflags 2.9.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "orbclient" -version = "0.3.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" -dependencies = [ - "libredox", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" -dependencies = [ - "ttf-parser 0.25.1", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.10", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" -dependencies = [ - "regex", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "peniko" -version = "0.2.0" -source = "git+https://github.com/linebender/peniko.git?rev=d114c62#d114c6292dbcfb03e7360692198be423168a0edd" -dependencies = [ - "color", - "kurbo", - "smallvec", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" -dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "pest_meta" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.7.1", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy 0.7.35", -] - -[[package]] -name = "presser" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "proc-macro2" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" - -[[package]] -name = "quick-xml" -version = "0.37.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.1", - "rustls", - "socket2", - "thiserror 2.0.12", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" -dependencies = [ - "bytes", - "getrandom 0.2.15", - "rand 0.8.5", - "ring", - "rustc-hash 2.1.1", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time 1.1.0", -] - -[[package]] -name = "quinn-udp" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" -dependencies = [ - "cfg_aliases 0.2.1", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", - "zerocopy 0.8.23", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.1", -] - -[[package]] -name = "range-alloc" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" - -[[package]] -name = "raw-string" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2" - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "read-fonts" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f9e8a4f503e5c8750e4cd3b32a4e090035c46374b305a15c70bad833dca05f" -dependencies = [ - "bytemuck", - "font-types", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "renderdoc-sys" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" - -[[package]] -name = "reqwest" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "windows-registry", -] - -[[package]] -name = "ring" -version = "0.17.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "roxmltree" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" - -[[package]] -name = "rspirv" -version = "0.11.0+1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1503993b59ca9ae4127365c3293517576d7ce56be9f3d8abb1625c85ddc583ba" -dependencies = [ - "fxhash", - "num-traits", - "spirv 0.2.0+1.5.4", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc_codegen_spirv" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f05d43c1d9ef3b0e5e2be3dcc9025e5ed103f99c36bb29a1b396386bd032ce" -dependencies = [ - "ar", - "either", - "hashbrown 0.11.2", - "indexmap 1.9.3", - "itertools", - "lazy_static", - "libc", - "num-traits", - "once_cell", - "regex", - "rspirv", - "rustc-demangle", - "rustc_codegen_spirv-types", - "sanitize-filename", - "serde", - "serde_json", - "smallvec", - "spirt", - "spirv-tools", - "syn 1.0.109", -] - -[[package]] -name = "rustc_codegen_spirv-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13333711bd68d2a02617c2093fa6535ae40024fef610c37e6826d1ea77e97710" -dependencies = [ - "rspirv", - "serde", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dade4812df5c384711475be5fcd8c162555352945401aed22a35bffeab61f657" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys 0.9.2", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" -dependencies = [ - "web-time 1.1.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "rustybuzz" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181" -dependencies = [ - "bitflags 2.9.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.24.1", - "unicode-bidi-mirroring 0.3.0", - "unicode-ccc 0.3.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.9.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.25.1", - "unicode-bidi-mirroring 0.4.0", - "unicode-ccc 0.4.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "sanitize-filename" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c502bdb638f1396509467cb0580ef3b29aa2a45c5d43e5d84928241280296c" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sctk-adwaita" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" - -[[package]] -name = "serde" -version = "1.0.218" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.218" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simplecss" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" -dependencies = [ - "log", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "skrifa" -version = "0.26.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc1aa86c26dbb1b63875a7180aa0819709b33348eb5b1491e4321fae388179d" -dependencies = [ - "bytemuck", - "read-fonts", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - -[[package]] -name = "slug" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724" -dependencies = [ - "deunicode", - "wasm-bindgen", -] - -[[package]] -name = "smallvec" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" -dependencies = [ - "serde", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" -dependencies = [ - "bitflags 2.9.0", - "calloop", - "calloop-wayland-source", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.44", - "thiserror 1.0.69", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "specta" -version = "2.0.0-rc.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7f01e9310a820edd31c80fde3cae445295adde21a3f9416517d7d65015b971" -dependencies = [ - "glam", - "specta-macros", - "thiserror 1.0.69", -] - -[[package]] -name = "specta-macros" -version = "2.0.0-rc.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0074b9e30ed84c6924eb63ad8d2fe71cdc82628525d84b1fcb1f2fd40676517" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "spirt" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e1f7903720ff818d6da824edf2c4082c6e7a029a99317fd10c39dd7c40c7ff" -dependencies = [ - "arrayvec", - "bytemuck", - "derive_more", - "elsa", - "indexmap 1.9.3", - "internal-iterator", - "itertools", - "lazy_static", - "longest-increasing-subsequence", - "rustc-hash 1.1.0", - "serde", - "serde_json", - "smallvec", -] - -[[package]] -name = "spirv" -version = "0.2.0+1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" -dependencies = [ - "bitflags 1.3.2", - "num-traits", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "spirv-builder" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee97a4472a73b2f6adc911468b16405fa5b732f510e5ae11a33a914f36fe5ad" -dependencies = [ - "memchr", - "raw-string", - "rustc_codegen_spirv", - "rustc_codegen_spirv-types", - "serde", - "serde_json", -] - -[[package]] -name = "spirv-std" -version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu.git#6e2c84d4fe64e32df4c060c5a7f3e35a32e45421" -dependencies = [ - "bitflags 1.3.2", - "glam", - "num-traits", - "spirv-std-macros", - "spirv-std-types", -] - -[[package]] -name = "spirv-std-macros" -version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu.git#6e2c84d4fe64e32df4c060c5a7f3e35a32e45421" -dependencies = [ - "proc-macro2", - "quote", - "spirv-std-types", - "syn 2.0.99", -] - -[[package]] -name = "spirv-std-types" -version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu.git#6e2c84d4fe64e32df4c060c5a7f3e35a32e45421" - -[[package]] -name = "spirv-tools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc7c8ca2077515286505bd3ccd396e55ac5706e80322e1d6d22a82e1cad4f7c3" -dependencies = [ - "memchr", - "spirv-tools-sys", - "tempfile", -] - -[[package]] -name = "spirv-tools-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b32d9d6469cd6b50dcd6bd841204b5946b4fb7b70a97872717cdc417659c9a" -dependencies = [ - "cc", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -dependencies = [ - "float-cmp", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "svg_fmt" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" - -[[package]] -name = "svgtypes" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" -dependencies = [ - "kurbo", - "siphasher", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.9.0", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" -dependencies = [ - "cfg-if", - "fastrand", - "getrandom 0.3.1", - "once_cell", - "rustix 1.0.1", - "windows-sys 0.59.0", -] - -[[package]] -name = "tera" -version = "1.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee" -dependencies = [ - "chrono", - "chrono-tz", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding", - "pest", - "pest_derive", - "rand 0.8.5", - "regex", - "serde", - "serde_json", - "slug", - "unic-segment", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" - -[[package]] -name = "toml_edit" -version = "0.22.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" -dependencies = [ - "indexmap 2.7.1", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "ttf-parser" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" -dependencies = [ - "core_maths", -] - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -dependencies = [ - "core_maths", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64af057ad7466495ca113126be61838d8af947f41d93a949980b2389a118082f" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - -[[package]] -name = "unicode-ccc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" - -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-properties" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" - -[[package]] -name = "unicode-script" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-vo" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "usvg" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447e703d7223b067607655e625e0dbca80822880248937da65966194c4864e6" -dependencies = [ - "base64", - "data-url", - "flate2", - "fontdb", - "imagesize", - "kurbo", - "log", - "pico-args", - "roxmltree", - "rustybuzz 0.18.0", - "simplecss", - "siphasher", - "strict-num", - "svgtypes", - "tiny-skia-path", - "unicode-bidi", - "unicode-script", - "unicode-vo", - "xmlwriter", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vello" -version = "0.3.0" -source = "git+https://github.com/linebender/vello.git?rev=3275ec8#3275ec85d831180be81820de06cca29a97a757f5" -dependencies = [ - "bytemuck", - "futures-intrusive", - "log", - "peniko", - "png", - "skrifa", - "static_assertions", - "thiserror 2.0.12", - "vello_encoding", - "vello_shaders", - "wgpu", -] - -[[package]] -name = "vello_encoding" -version = "0.3.0" -source = "git+https://github.com/linebender/vello.git?rev=3275ec8#3275ec85d831180be81820de06cca29a97a757f5" -dependencies = [ - "bytemuck", - "guillotiere", - "peniko", - "skrifa", - "smallvec", -] - -[[package]] -name = "vello_shaders" -version = "0.3.0" -source = "git+https://github.com/linebender/vello.git?rev=3275ec8#3275ec85d831180be81820de06cca29a97a757f5" -dependencies = [ - "bytemuck", - "naga", - "thiserror 2.0.12", - "vello_encoding", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.99", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wayland-backend" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" -dependencies = [ - "cc", - "downcast-rs", - "rustix 0.38.44", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" -dependencies = [ - "bitflags 2.9.0", - "rustix 0.38.44", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.9.0", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" -dependencies = [ - "rustix 0.38.44", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" -dependencies = [ - "bitflags 2.9.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" -dependencies = [ - "bitflags 2.9.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" -dependencies = [ - "bitflags 2.9.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "wgpu" -version = "23.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" -dependencies = [ - "arrayvec", - "cfg_aliases 0.1.1", - "document-features", - "js-sys", - "log", - "naga", - "parking_lot", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core" -version = "23.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" -dependencies = [ - "arrayvec", - "bit-vec", - "bitflags 2.9.0", - "bytemuck", - "cfg_aliases 0.1.1", - "document-features", - "indexmap 2.7.1", - "log", - "naga", - "once_cell", - "parking_lot", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-executor" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64", - "bytemuck", - "dyn-any", - "futures", - "futures-intrusive", - "glam", - "gpu-executor", - "graphene-core", - "half", - "log", - "node-macro", - "num-traits", - "serde", - "spirv 0.3.0+sdk-1.3.268.0", - "vello", - "web-sys", - "wgpu", - "winit", -] - -[[package]] -name = "wgpu-hal" -version = "23.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set", - "bitflags 2.9.0", - "block", - "bytemuck", - "cfg_aliases 0.1.1", - "core-graphics-types", - "glow", - "glutin_wgl_sys", - "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", - "js-sys", - "khronos-egl", - "libc", - "libloading", - "log", - "metal", - "naga", - "ndk-sys", - "objc", - "once_cell", - "parking_lot", - "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wasm-bindgen", - "web-sys", - "wgpu-types", - "windows", - "windows-core 0.58.0", -] - -[[package]] -name = "wgpu-types" -version = "23.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" -dependencies = [ - "bitflags 2.9.0", - "js-sys", - "web-sys", -] - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "windows-link" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winit" -version = "0.29.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" -dependencies = [ - "ahash 0.8.11", - "android-activity", - "atomic-waker", - "bitflags 2.9.0", - "bytemuck", - "calloop", - "cfg_aliases 0.1.1", - "core-foundation", - "core-graphics", - "cursor-icon", - "icrate", - "js-sys", - "libc", - "log", - "memmap2", - "ndk", - "ndk-sys", - "objc2", - "once_cell", - "orbclient", - "percent-encoding", - "raw-window-handle", - "redox_syscall 0.3.5", - "rustix 0.38.44", - "sctk-adwaita", - "smithay-client-toolkit", - "smol_str", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time 0.2.4", - "windows-sys 0.48.0", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - -[[package]] -name = "winnow" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix 0.38.44", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "xcursor" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.9.0", - "dlib", - "log", - "once_cell", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xml-rs" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" - -[[package]] -name = "xmlwriter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" -dependencies = [ - "zerocopy-derive 0.8.23", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] diff --git a/node-graph/gpu-compiler/Cargo.toml b/node-graph/gpu-compiler/Cargo.toml deleted file mode 100644 index bcbede7f0c..0000000000 --- a/node-graph/gpu-compiler/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "gpu-compiler" -version = "0.1.0" -edition = "2024" -license = "MIT OR Apache-2.0" - -[features] -default = [] -profiling = ["nvtx"] -serde = ["graphene-core/serde", "glam/serde"] - -# NOTE: We can't use workspace dependencies in this crate because it uses a different toolchain -[dependencies] -# Local dependencies -graph-craft = { path = "../graph-craft", features = ["serde"] } -gpu-executor = { path = "../gpu-executor" } -graphene-core = { path = "../gcore", features = ["std", "alloc"] } -dyn-any = { path = "../../libraries/dyn-any", features = [ - "log-bad-types", - "rc", - "glam", -] } - -# Required dependencies -num-traits = { version = "0.2", default-features = false, features = ["i128"] } -log = "0.4" -serde = { version = "1.0", features = ["derive", "rc"] } -glam = { version = "0.29", default-features = false, features = ["serde"] } -base64 = "0.22" -bytemuck = { version = "1.13", features = ["derive"] } -tempfile = "3.6" -anyhow = "1.0" -serde_json = "1.0" -tera = { version = "1.17.1" } -spirv-builder = { version = "0.9", default-features = false, features = [ - "use-installed-tools", -] } - -# Optional dependencies -nvtx = { version = "1.3", optional = true } diff --git a/node-graph/gpu-compiler/gpu-compiler-bin-wrapper/Cargo.toml b/node-graph/gpu-compiler/gpu-compiler-bin-wrapper/Cargo.toml deleted file mode 100644 index b0662d6759..0000000000 --- a/node-graph/gpu-compiler/gpu-compiler-bin-wrapper/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "gpu-compiler-bin-wrapper" -version = "0.1.0" -edition = "2024" -license = "MIT OR Apache-2.0" - -[features] -default = [] -profiling = [] - -[dependencies] -# Local dependencies -graph-craft = { path = "../../graph-craft", features = ["serde", "wgpu"] } -gpu-executor = { path = "../../gpu-executor" } -wgpu-executor = { path = "../../wgpu-executor" } - -# Workspace dependencies -log = { workspace = true } -anyhow = { workspace = true } -serde_json = { workspace = true } -serde = { workspace = true, features = ["derive"] } diff --git a/node-graph/gpu-compiler/gpu-compiler-bin-wrapper/src/lib.rs b/node-graph/gpu-compiler/gpu-compiler-bin-wrapper/src/lib.rs deleted file mode 100644 index 6ffb79988b..0000000000 --- a/node-graph/gpu-compiler/gpu-compiler-bin-wrapper/src/lib.rs +++ /dev/null @@ -1,68 +0,0 @@ -use graph_craft::Type; -use graph_craft::proto::ProtoNetwork; -use std::io::Write; -use wgpu_executor::ShaderIO; - -pub fn compile_spirv(request: &CompileRequest, compile_dir: Option<&str>, manifest_path: &str) -> anyhow::Result> { - let serialized_graph = serde_json::to_string(&graph_craft::graphene_compiler::CompileRequest { - networks: request.networks.clone(), - io: request.shader_io.clone(), - })?; - - #[cfg(not(feature = "profiling"))] - let features = ""; - #[cfg(feature = "profiling")] - let features = "profiling"; - - println!("calling cargo run!"); - let non_cargo_env_vars = std::env::vars().filter(|(k, _)| k.starts_with("PATH")).collect::>(); - let mut cargo_command = std::process::Command::new("cargo") - .arg("run") - .arg("--release") - .arg("--manifest-path") - .arg(manifest_path) - .current_dir(manifest_path.replace("Cargo.toml", "")) - .env_clear() - .envs(non_cargo_env_vars) - .arg("--features") - .arg(features) - // TODO: handle None case properly - .arg(compile_dir.unwrap()) - .stdin(std::process::Stdio::piped()) - .stdout(std::process::Stdio::piped()) - .spawn()?; - - cargo_command.stdin.as_mut().unwrap().write_all(serialized_graph.as_bytes())?; - let output = cargo_command.wait_with_output()?; - if !output.status.success() { - return Err(anyhow::anyhow!("cargo failed: {}", String::from_utf8_lossy(&output.stderr))); - } - Ok(std::fs::read(compile_dir.unwrap().to_owned() + "/shader.spv")?) -} - -#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Hash, Eq)] -pub struct CompileRequest { - networks: Vec, - input_types: Vec, - output_types: Vec, - shader_io: ShaderIO, -} - -impl CompileRequest { - pub fn new(networks: Vec, input_types: Vec, output_types: Vec, io: ShaderIO) -> Self { - // TODO: add type checking - // for (input, buffer) in input_types.iter().zip(io.inputs.iter()) { - // assert_eq!(input, &buffer.ty()); - // } - // assert_eq!(output_type, io.output.ty()); - Self { - networks, - input_types, - output_types, - shader_io: io, - } - } - pub fn compile(&self, compile_dir: &str, manifest_path: &str) -> anyhow::Result> { - compile_spirv(self, Some(compile_dir), manifest_path) - } -} diff --git a/node-graph/gpu-compiler/rust-toolchain.toml b/node-graph/gpu-compiler/rust-toolchain.toml deleted file mode 100644 index 71d5d023f4..0000000000 --- a/node-graph/gpu-compiler/rust-toolchain.toml +++ /dev/null @@ -1,10 +0,0 @@ -[toolchain] -channel = "nightly-2023-05-27" -components = [ - "rust-src", - "rustc-dev", - "llvm-tools-preview", - "clippy", - "rustfmt", - "rustc", -] diff --git a/node-graph/gpu-compiler/src/lib.rs b/node-graph/gpu-compiler/src/lib.rs deleted file mode 100644 index 75905c9feb..0000000000 --- a/node-graph/gpu-compiler/src/lib.rs +++ /dev/null @@ -1,259 +0,0 @@ -use gpu_executor::{GPUConstant, ShaderIO, ShaderInput, SpirVCompiler}; -use graph_craft::proto::*; -use graphene_core::Cow; -use std::path::{Path, PathBuf}; -use tera::Context; - -fn create_cargo_toml(metadata: &Metadata) -> Result { - let mut tera = tera::Tera::default(); - tera.add_raw_template("cargo_toml", include_str!("templates/Cargo-template.toml"))?; - let mut context = Context::new(); - context.insert("name", &metadata.name); - context.insert("authors", &metadata.authors); - context.insert("gcore_path", &format!("{}{}", env!("CARGO_MANIFEST_DIR"), "/../gcore")); - tera.render("cargo_toml", &context) -} - -pub struct Metadata { - name: String, - authors: Vec, -} - -impl Metadata { - pub fn new(name: String, authors: Vec) -> Self { - Self { name, authors } - } -} - -pub fn create_files(metadata: &Metadata, networks: &[ProtoNetwork], compile_dir: &Path, io: &ShaderIO) -> anyhow::Result<()> { - let src = compile_dir.join("src"); - let cargo_file = compile_dir.join("Cargo.toml"); - let cargo_toml = create_cargo_toml(metadata)?; - std::fs::write(cargo_file, cargo_toml)?; - - let toolchain_file = compile_dir.join("rust-toolchain.toml"); - let toolchain = include_str!("templates/rust-toolchain.toml"); - std::fs::write(toolchain_file, toolchain)?; - - // create src dir - match std::fs::create_dir(&src) { - Ok(_) => {} - Err(e) => { - if e.kind() != std::io::ErrorKind::AlreadyExists { - return Err(e.into()); - } - } - } - let lib = src.join("lib.rs"); - let shader = serialize_gpu(networks, io)?; - eprintln!("{shader}"); - std::fs::write(lib, shader)?; - Ok(()) -} - -fn constant_attribute(constant: &GPUConstant) -> &'static str { - match constant { - GPUConstant::SubGroupId => "subgroup_id", - GPUConstant::SubGroupInvocationId => "subgroup_local_invocation_id", - GPUConstant::SubGroupSize => todo!(), - GPUConstant::NumSubGroups => "num_subgroups", - GPUConstant::WorkGroupId => "workgroup_id", - GPUConstant::WorkGroupInvocationId => "local_invocation_id", - GPUConstant::WorkGroupSize => todo!(), - GPUConstant::NumWorkGroups => "num_workgroups", - GPUConstant::GlobalInvocationId => "global_invocation_id", - GPUConstant::GlobalSize => todo!(), - } -} - -pub fn construct_argument(input: &ShaderInput, position: u32, binding_offset: u32) -> String { - let line = match input { - ShaderInput::Constant(constant) => format!("#[spirv({})] i{}: {}", constant_attribute(constant), position, constant.ty()), - ShaderInput::UniformBuffer(_, ty) => { - format!("#[spirv(uniform, descriptor_set = 0, binding = {})] i{}: &{}", position + binding_offset, position, ty,) - } - ShaderInput::StorageBuffer(_, ty) | ShaderInput::ReadBackBuffer(_, ty) => { - format!("#[spirv(storage_buffer, descriptor_set = 0, binding = {})] i{}: &[{}]", position + binding_offset, position, ty,) - } - ShaderInput::StorageTextureBuffer(_, ty) => { - format!("#[spirv(storage_buffer, descriptor_set = 0, binding = {})] i{}: &mut [{}]]", position + binding_offset, position, ty,) - } - ShaderInput::TextureView(_, _) => { - format!( - "#[spirv(texture, descriptor_set = 0, binding = {})] i{}: spirv_std::image::Image2d", - position + binding_offset, - position, - ) - } - ShaderInput::TextureBuffer(_, _) => { - panic!("Texture Buffers cannot be used as inputs use TextureView instead") - } - ShaderInput::OutputBuffer(_, ty) => { - format!("#[spirv(storage_buffer, descriptor_set = 0, binding = {})] o{}: &mut[{}]", position + binding_offset, position, ty,) - } - ShaderInput::WorkGroupMemory(_, ty) => format!("#[spirv(workgroup_memory] i{}: {}", position, ty,), - }; - line.replace("glam::u32::uvec3::UVec3", "spirv_std::glam::UVec3") -} - -struct GpuCompiler { - compile_dir: PathBuf, -} - -impl SpirVCompiler for GpuCompiler { - fn compile(&self, networks: &[ProtoNetwork], io: &ShaderIO) -> anyhow::Result { - let metadata = Metadata::new("project".to_owned(), vec!["test@example.com".to_owned()]); - - create_files(&metadata, networks, &self.compile_dir, io)?; - let result = compile(&self.compile_dir)?; - - let bytes = std::fs::read(result.module.unwrap_single())?; - let words = bytes.chunks(4).map(|chunk| u32::from_ne_bytes(chunk.try_into().unwrap())).collect::>(); - - Ok(gpu_executor::Shader { - source: Cow::Owned(words), - name: "", - io: io.clone(), - }) - } -} - -pub fn serialize_gpu(networks: &[ProtoNetwork], io: &ShaderIO) -> anyhow::Result { - fn nid(id: &u64) -> String { - format!("n{id:0x}") - } - - dbg!(&io); - let mut inputs = io - .inputs - .iter() - .filter(|x| !x.is_output()) - .enumerate() - .map(|(i, input)| construct_argument(input, i as u32, 0)) - .collect::>(); - let offset = inputs.len() as u32; - - inputs.extend(io.inputs.iter().filter(|x| x.is_output()).enumerate().map(|(i, input)| construct_argument(input, i as u32, offset))); - - let mut nodes = Vec::new(); - let mut input_nodes = Vec::new(); - let mut output_nodes = Vec::new(); - for network in networks { - dbg!(&network); - // assert_eq!(network.inputs.len(), io.inputs.iter().filter(|x| !x.is_output()).count()); - #[derive(serde::Serialize, Debug)] - struct Node { - id: String, - index: usize, - fqn: String, - args: Vec, - } - for (i, id) in network.inputs.iter().enumerate() { - let Some((_, node)) = network.nodes.iter().find(|(i, _)| i == id) else { - anyhow::bail!("Input node not found"); - }; - let fqn = &node.identifier.name; - let id = nid(id); - let node = Node { - id: id.clone(), - index: i + 2, - fqn: fqn.to_string().split('<').next().unwrap().to_owned(), - args: node.construction_args.new_function_args(), - }; - dbg!(&node); - if !io.inputs[i].is_output() { - if input_nodes.iter().any(|x: &Node| x.id == id) { - continue; - } - input_nodes.push(node); - } - } - - for (ref id, node) in network.nodes.iter() { - if network.inputs.contains(id) { - continue; - } - - let fqn = &node.identifier.name; - let id = nid(id); - - if nodes.iter().any(|x: &Node| x.id == id) { - continue; - } - nodes.push(Node { - id, - index: 0, - fqn: fqn.to_string().split("<").next().unwrap().to_owned(), - args: node.construction_args.new_function_args(), - }); - } - - let output = nid(&network.output); - output_nodes.push(output); - } - dbg!(&input_nodes); - - let template = include_str!("templates/spirv-template.rs"); - let mut tera = tera::Tera::default(); - tera.add_raw_template("spirv", template)?; - let mut context = Context::new(); - context.insert("inputs", &inputs); - context.insert("input_nodes", &input_nodes); - context.insert("output_nodes", &output_nodes); - context.insert("nodes", &nodes); - context.insert("compute_threads", "12, 8"); - Ok(tera.render("spirv", &context)?) -} - -use spirv_builder::{MetadataPrintout, SpirvBuilder, SpirvMetadata}; -pub fn compile(dir: &Path) -> Result { - dbg!(&dir); - let result = SpirvBuilder::new(dir, "spirv-unknown-vulkan1.2") - .print_metadata(MetadataPrintout::DependencyOnly) - .multimodule(false) - .preserve_bindings(true) - .release(true) - .spirv_metadata(SpirvMetadata::Full) - // .scalar_block_layout(true) - .relax_logical_pointer(true) - // .capability(spirv_builder::Capability::Float64) - // .capability(spirv_builder::Capability::VariablePointersStorageBuffer) - .extra_arg("no-early-report-zombies") - .extra_arg("no-infer-storage-classes") - .extra_arg("spirt-passes=qptr") - .build()?; - - Ok(result) -} - -#[cfg(test)] -mod test { - #[test] - fn test_create_cargo_toml() { - let cargo_toml = super::create_cargo_toml(&super::Metadata { - name: "project".to_owned(), - authors: vec!["Example ".to_owned(), "smith.john@example.com".to_owned()], - }); - let cargo_toml = cargo_toml.expect("Failed to build cargo toml template"); - let lines = cargo_toml.split('\n').collect::>(); - let cargo_toml = lines[..lines.len() - 2].join("\n"); - let reference = r#"[package] -name = "project-node" -version = "0.1.0" -authors = ["Example ", "smith.john@example.com", ] -edition = "2024" -license = "MIT OR Apache-2.0" -publish = false - -[lib] -crate-type = ["dylib", "lib"] - -[patch.crates-io] -libm = { git = "https://github.com/rust-lang/libm", tag = "0.2.5" } - -[dependencies] -spirv-std = { git = "https://github.com/EmbarkStudios/rust-gpu" , features= ["glam"]}"#; - - assert_eq!(cargo_toml, reference); - } -} diff --git a/node-graph/gpu-compiler/src/main.rs b/node-graph/gpu-compiler/src/main.rs deleted file mode 100644 index a3a70fc04e..0000000000 --- a/node-graph/gpu-compiler/src/main.rs +++ /dev/null @@ -1,25 +0,0 @@ -use gpu_compiler as compiler; -use gpu_executor::CompileRequest; -use graph_craft::document::NodeNetwork; -use std::io::Write; - -fn main() -> anyhow::Result<()> { - println!("Starting GPU Compiler!"); - let mut stdin = std::io::stdin(); - let mut stdout = std::io::stdout(); - let compile_dir = std::env::args().nth(1).map(|x| std::path::PathBuf::from(&x)).unwrap_or(tempfile::tempdir()?.into_path()); - let request: CompileRequest = serde_json::from_reader(&mut stdin)?; - dbg!(&compile_dir); - - let metadata = compiler::Metadata::new("project".to_owned(), vec!["test@example.com".to_owned()]); - - compiler::create_files(&metadata, &request.networks, &compile_dir, &request.io)?; - let result = compiler::compile(&compile_dir)?; - - let bytes = std::fs::read(result.module.unwrap_single())?; - // TODO: properly resolve this - let spirv_path = compile_dir.join("shader.spv"); - std::fs::write(&spirv_path, &bytes)?; - - Ok(()) -} diff --git a/node-graph/gpu-compiler/src/templates/Cargo-template.toml b/node-graph/gpu-compiler/src/templates/Cargo-template.toml deleted file mode 100644 index ffe746dc60..0000000000 --- a/node-graph/gpu-compiler/src/templates/Cargo-template.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -authors = [{% for author in authors %}"{{author}}", {% endfor %}] -name = "{{name}}-node" -version = "0.1.0" -edition = "2024" -license = "MIT OR Apache-2.0" -publish = false - -[lib] -crate-type = ["dylib", "lib"] - -[patch.crates-io] -libm = { git = "https://github.com/rust-lang/libm", tag = "0.2.5" } - -[dependencies] -spirv-std = { version = "0.9" } -graphene-core = { path = "{{gcore_path}}", default-features = false, features = [ - "gpu", -] } diff --git a/node-graph/gpu-compiler/src/templates/rust-toolchain.toml b/node-graph/gpu-compiler/src/templates/rust-toolchain.toml deleted file mode 100644 index 71d5d023f4..0000000000 --- a/node-graph/gpu-compiler/src/templates/rust-toolchain.toml +++ /dev/null @@ -1,10 +0,0 @@ -[toolchain] -channel = "nightly-2023-05-27" -components = [ - "rust-src", - "rustc-dev", - "llvm-tools-preview", - "clippy", - "rustfmt", - "rustc", -] diff --git a/node-graph/gpu-compiler/src/templates/spirv-template.rs b/node-graph/gpu-compiler/src/templates/spirv-template.rs deleted file mode 100644 index f39edf16db..0000000000 --- a/node-graph/gpu-compiler/src/templates/spirv-template.rs +++ /dev/null @@ -1,44 +0,0 @@ -#![no_std] -#![feature(unchecked_math)] - -#[cfg(target_arch = "spirv")] -extern crate spirv_std; - -// #[cfg(target_arch = "spirv")] -// pub mod gpu { -// use super::*; - -use spirv_std::spirv; -use spirv_std::glam; -use spirv_std::glam::{UVec3, Vec2, Mat2, BVec2}; - -#[allow(unused)] -#[spirv(compute(threads({{compute_threads}})))] -pub fn eval ( - #[spirv(global_invocation_id)] _global_index: UVec3, - {% for input in inputs %} - {{input}}, - {% endfor %} -) { - use graphene_core::{Node, NodeMut}; - use graphene_core::raster::adjustments::{BlendMode, BlendNode}; - use graphene_core::Color; - - {% for input in input_nodes %} - let _i{{input.index}} = graphene_core::value::CopiedNode::new(*i{{input.index}}); - let _{{input.id}} = {{input.fqn}}::new({% for arg in input.args %}{{arg}}, {% endfor %}); - let {{input.id}} = graphene_core::structural::ComposeNode::new(_i{{input.index}}, _{{input.id}}); - {% endfor %} - - {% for node in nodes %} - let mut {{node.id}} = {{node.fqn}}::new({% for arg in node.args %}{{arg}}, {% endfor %}); - {% endfor %} - - {% for output in output_nodes %} - let v = {{output}}.eval(()); - o{{loop.index0}}[(_global_index.y * i0 + _global_index.x) as usize] = v; - {% endfor %} - // TODO: Write output to buffer -} - -// } diff --git a/node-graph/gpu-executor/Cargo.toml b/node-graph/gpu-executor/Cargo.toml deleted file mode 100644 index 38c6b77b38..0000000000 --- a/node-graph/gpu-executor/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "gpu-executor" -version = "0.1.0" -edition = "2024" -license = "MIT OR Apache-2.0" - -[features] -default = [] - -[dependencies] -# Local dependencies -node-macro = { path = "../node-macro" } - -# Workspace dependencies -graphene-core = { workspace = true, features = ["std", "alloc", "gpu"] } -dyn-any = { workspace = true, features = ["log-bad-types", "rc", "glam"] } -num-traits = { workspace = true } -log = { workspace = true } -serde = { workspace = true } -glam = { workspace = true } -base64 = { workspace = true } -bytemuck = { workspace = true } -anyhow = { workspace = true } -futures = { workspace = true } -web-sys = { workspace = true, features = [ - "HtmlCanvasElement", - "ImageBitmapRenderingContext", -] } diff --git a/node-graph/gpu-executor/src/lib.rs b/node-graph/gpu-executor/src/lib.rs deleted file mode 100644 index ca5aedbc19..0000000000 --- a/node-graph/gpu-executor/src/lib.rs +++ /dev/null @@ -1,152 +0,0 @@ -use bytemuck::{Pod, Zeroable}; -use dyn_any::{StaticType, StaticTypeSized}; -use glam::UVec3; -use graphene_core::raster::color::RGBA16F; -use graphene_core::raster::{Image, Pixel, SRGBA8}; -use graphene_core::*; -use std::borrow::Cow; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, dyn_any::DynAny)] -pub enum ComputePassDimensions { - X(u32), - XY(u32, u32), - XYZ(u32, u32, u32), -} - -impl ComputePassDimensions { - pub fn get(&self) -> (u32, u32, u32) { - match self { - ComputePassDimensions::X(x) => (*x, 1, 1), - ComputePassDimensions::XY(x, y) => (*x, *y, 1), - ComputePassDimensions::XYZ(x, y, z) => (*x, *y, *z), - } - } -} - -pub trait Texture { - fn width(&self) -> u32; - fn height(&self) -> u32; - fn format(&self) -> TextureBufferType; - fn view(&self) -> TextureView; -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] -/// GPU constants that can be used as inputs to a shader. -pub enum GPUConstant { - SubGroupId, - SubGroupInvocationId, - SubGroupSize, - NumSubGroups, - WorkGroupId, - WorkGroupInvocationId, - WorkGroupSize, - NumWorkGroups, - GlobalInvocationId, - GlobalSize, -} - -impl GPUConstant { - pub fn ty(&self) -> Type { - match self { - GPUConstant::SubGroupId => concrete!(u32), - GPUConstant::SubGroupInvocationId => concrete!(u32), - GPUConstant::SubGroupSize => concrete!(u32), - GPUConstant::NumSubGroups => concrete!(u32), - GPUConstant::WorkGroupId => concrete!(UVec3), - GPUConstant::WorkGroupInvocationId => concrete!(UVec3), - GPUConstant::WorkGroupSize => concrete!(u32), - GPUConstant::NumWorkGroups => concrete!(u32), - GPUConstant::GlobalInvocationId => concrete!(UVec3), - GPUConstant::GlobalSize => concrete!(UVec3), - } - } -} - -pub struct StorageBufferOptions { - pub cpu_writable: bool, - pub gpu_writable: bool, - pub cpu_readable: bool, - pub storage: bool, -} - -pub enum TextureBufferOptions { - Storage, - Texture, - Surface, -} - -pub trait ToUniformBuffer: StaticType { - fn to_bytes(&self) -> Cow<[u8]>; -} - -impl ToUniformBuffer for T { - fn to_bytes(&self) -> Cow<[u8]> { - Cow::Owned(bytemuck::bytes_of(self).into()) - } -} - -pub trait ToStorageBuffer: StaticType { - fn to_bytes(&self) -> Cow<[u8]>; - fn ty(&self) -> Type; -} - -impl ToStorageBuffer for Vec { - fn to_bytes(&self) -> Cow<[u8]> { - Cow::Borrowed(bytemuck::cast_slice(self.as_slice())) - } - fn ty(&self) -> Type { - concrete!(T) - } -} - -pub trait TextureFormat { - fn format() -> TextureBufferType; -} - -impl TextureFormat for Color { - fn format() -> TextureBufferType { - TextureBufferType::Rgba32Float - } -} -impl TextureFormat for SRGBA8 { - fn format() -> TextureBufferType { - TextureBufferType::Rgba8Srgb - } -} -impl TextureFormat for RGBA16F { - fn format() -> TextureBufferType { - TextureBufferType::Rgba16Float - } -} - -// TODO use wgpu type -pub enum TextureBufferType { - Rgba32Float, - Rgba16Float, - Rgba8Srgb, -} - -pub trait ToTextureBuffer: StaticType { - fn to_bytes(&self) -> Cow<[u8]>; - fn ty() -> Type; - fn format() -> TextureBufferType; - fn size(&self) -> (u32, u32); -} - -impl ToTextureBuffer for Image -where - T::Static: Pixel, -{ - fn to_bytes(&self) -> Cow<[u8]> { - Cow::Borrowed(bytemuck::cast_slice(self.data.as_slice())) - } - fn ty() -> Type { - concrete!(T) - } - fn format() -> TextureBufferType { - T::format() - } - fn size(&self) -> (u32, u32) { - (self.width, self.height) - } -} diff --git a/node-graph/graph-craft/src/graphene_compiler.rs b/node-graph/graph-craft/src/graphene_compiler.rs index 0c3f77935b..7eafc49844 100644 --- a/node-graph/graph-craft/src/graphene_compiler.rs +++ b/node-graph/graph-craft/src/graphene_compiler.rs @@ -34,9 +34,3 @@ impl Compiler { pub trait Executor { fn execute(&self, input: I) -> LocalFuture>>; } -#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg(feature = "wgpu")] -pub struct CompileRequest { - pub networks: Vec, - pub io: wgpu_executor::ShaderIO, -} diff --git a/node-graph/graph-craft/src/util.rs b/node-graph/graph-craft/src/util.rs index eddeec842c..be5e2535c5 100644 --- a/node-graph/graph-craft/src/util.rs +++ b/node-graph/graph-craft/src/util.rs @@ -1,6 +1,4 @@ use crate::document::NodeNetwork; -use crate::graphene_compiler::Compiler; -use crate::proto::ProtoNetwork; pub fn load_network(document_string: &str) -> NodeNetwork { let document: serde_json::Value = serde_json::from_str(document_string).expect("Failed to parse document"); @@ -8,11 +6,6 @@ pub fn load_network(document_string: &str) -> NodeNetwork { serde_json::from_str::(&document).expect("Failed to parse document") } -pub fn compile(network: NodeNetwork) -> ProtoNetwork { - let compiler = Compiler {}; - compiler.compile_single(network).unwrap() -} - pub fn load_from_name(name: &str) -> NodeNetwork { let content = std::fs::read(format!("../../demo-artwork/{name}.graphite")).expect("failed to read file"); let content = std::str::from_utf8(&content).unwrap(); diff --git a/node-graph/graphene-cli/Cargo.toml b/node-graph/graphene-cli/Cargo.toml index 40f52e7071..cbd0fef4ee 100644 --- a/node-graph/graphene-cli/Cargo.toml +++ b/node-graph/graphene-cli/Cargo.toml @@ -17,7 +17,6 @@ gpu = [ "graphene-std/gpu", "graphene-core/gpu", "wgpu-executor", - "gpu-executor", ] [dependencies] @@ -50,7 +49,6 @@ clap = { version = "4.5.31", features = ["cargo", "derive"] } # Optional local dependencies wgpu-executor = { path = "../wgpu-executor", optional = true } -gpu-executor = { path = "../gpu-executor", optional = true } # Optional workspace dependencies wasm-bindgen = { workspace = true, optional = true } diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index f144b9f680..74829b069a 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -8,12 +8,7 @@ license = "MIT OR Apache-2.0" [features] default = ["wasm", "imaginate"] -gpu = [ - "graphene-core/gpu", - "gpu-compiler-bin-wrapper", - "compilation-client", - "gpu-executor", -] +gpu = [ "graphene-core/gpu" ] wgpu = ["gpu", "dep:wgpu", "graph-craft/wgpu"] wasm = ["wasm-bindgen", "web-sys", "js-sys"] imaginate = ["image/png", "base64", "js-sys", "web-sys", "wasm-bindgen-futures"] @@ -59,11 +54,6 @@ image = { workspace = true, default-features = false, features = [ "jpeg", ] } -# Optional local dependencies -gpu-executor = { path = "../gpu-executor", optional = true } -gpu-compiler-bin-wrapper = { path = "../gpu-compiler/gpu-compiler-bin-wrapper", optional = true } -compilation-client = { path = "../compilation-client", optional = true } - # Optional workspace dependencies base64 = { workspace = true, optional = true } wgpu = { workspace = true, optional = true } diff --git a/node-graph/gstd/src/gpu_nodes.rs b/node-graph/gstd/src/gpu_nodes.rs deleted file mode 100644 index 01cd671272..0000000000 --- a/node-graph/gstd/src/gpu_nodes.rs +++ /dev/null @@ -1,455 +0,0 @@ -use glam::{DAffine2, DVec2, Mat2, Vec2}; -use gpu_executor::{ComputePassDimensions, StorageBufferOptions}; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::*; -use graph_craft::proto::*; -use graphene_core::raster::BlendMode; -use graphene_core::raster::image::{Image, RasterDataTable}; -use graphene_core::*; -use std::sync::Arc; -use wgpu_executor::{Bindgroup, PipelineLayout, Shader, ShaderIO, ShaderInput, WgpuExecutor}; - -// TODO: Move to graph-craft -#[node_macro::node(category("Debug: GPU"))] -async fn compile_gpu<'a: 'n>(_: impl Ctx, node: &'a DocumentNode, typing_context: TypingContext, io: ShaderIO) -> Result { - let mut typing_context = typing_context; - let compiler = graph_craft::graphene_compiler::Compiler {}; - let DocumentNodeImplementation::Network(ref network) = node.implementation else { panic!() }; - let proto_networks: Result, _> = compiler.compile(network.clone()).collect(); - let proto_networks = proto_networks?; - - for network in proto_networks.iter() { - typing_context.update(network).expect("Failed to type check network"); - } - // TODO: do a proper union - let input_types = proto_networks[0] - .inputs - .iter() - .map(|id| typing_context.type_of(*id).unwrap()) - .map(|node_io| node_io.return_value.clone()) - .collect(); - let output_types = proto_networks.iter().map(|network| typing_context.type_of(network.output).unwrap().return_value.clone()).collect(); - - Ok(compilation_client::compile(proto_networks, input_types, output_types, io).await.unwrap()) -} - -#[node_macro::node(category("Debug: GPU"))] -async fn blend_gpu_image(_: impl Ctx, foreground: RasterDataTable, background: RasterDataTable, blend_mode: BlendMode, opacity: f64) -> RasterDataTable { - let mut result_table = RasterDataTable::default(); - - for (foreground_instance, mut background_instance) in foreground.instance_iter().zip(background.instance_iter()) { - let foreground_transform = foreground_instance.transform; - let background_transform = background_instance.transform; - - let foreground = foreground_instance.instance; - let background = background_instance.instance; - - let foreground_size = DVec2::new(foreground.width as f64, foreground.height as f64); - let background_size = DVec2::new(background.width as f64, background.height as f64); - - // Transforms a point from the background image to the foreground image - let bg_to_fg = DAffine2::from_scale(foreground_size) * foreground_transform.inverse() * background_transform * DAffine2::from_scale(1. / background_size); - - let transform_matrix: Mat2 = bg_to_fg.matrix2.as_mat2(); - let translation: Vec2 = bg_to_fg.translation.as_vec2(); - - log::debug!("Executing gpu blend node!"); - let compiler = graph_craft::graphene_compiler::Compiler {}; - - let network = NodeNetwork { - exports: vec![NodeInput::node(NodeId(0), 0)], - nodes: [DocumentNode { - inputs: vec![NodeInput::Inline(InlineRust::new( - format!( - r#"graphene_core::raster::adjustments::BlendNode::new( - graphene_core::value::CopiedNode::new({}), - graphene_core::value::CopiedNode::new({}), - ).eval(( - {{ - let bg_point = Vec2::new(_global_index.x as f32, _global_index.y as f32); - let fg_point = (*i4) * bg_point + (*i5); - - if !((fg_point.cmpge(Vec2::ZERO) & bg_point.cmpge(Vec2::ZERO)) == BVec2::new(true, true)) {{ - Color::from_rgbaf32_unchecked(0., 0., 0., 0.) - }} else {{ - i2[((fg_point.y as u32) * i3 + (fg_point.x as u32)) as usize] - }} - }}, - i1[(_global_index.y * i0 + _global_index.x) as usize], - ))"#, - TaggedValue::BlendMode(blend_mode).to_primitive_string(), - TaggedValue::F64(opacity).to_primitive_string(), - ), - concrete![Color], - ))], - implementation: DocumentNodeImplementation::ProtoNode("graphene_core::value::CopiedNode".into()), - ..Default::default() - }] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }; - log::debug!("compiling network"); - let proto_networks: Result, _> = compiler.compile(network.clone()).collect(); - let Ok(proto_networks_result) = proto_networks else { - log::error!("Error compiling network in 'blend_gpu_image()"); - return RasterDataTable::default(); - }; - let proto_networks = proto_networks_result; - log::debug!("compiling shader"); - - let shader = compilation_client::compile( - proto_networks, - vec![ - concrete!(u32), - concrete!(Color), - concrete!(Color), - concrete!(u32), - concrete_with_name!(Mat2, "Mat2"), - concrete_with_name!(Vec2, "Vec2"), - ], - vec![concrete!(Color)], - ShaderIO { - inputs: vec![ - ShaderInput::UniformBuffer((), concrete!(u32)), // width of the output image - ShaderInput::StorageBuffer((), concrete!(Color)), // background image - ShaderInput::StorageBuffer((), concrete!(Color)), // foreground image - ShaderInput::UniformBuffer((), concrete!(u32)), // width of the foreground image - ShaderInput::UniformBuffer((), concrete_with_name!(Mat2, "Mat2")), // bg_to_fg.matrix2 - ShaderInput::UniformBuffer((), concrete_with_name!(Vec2, "Vec2")), // bg_to_fg.translation - ShaderInput::OutputBuffer((), concrete!(Color)), - ], - output: ShaderInput::OutputBuffer((), concrete!(Color)), - }, - ) - .await - .unwrap(); - let len = background.data.len(); - - let executor = WgpuExecutor::new() - .await - .expect("Failed to create wgpu executor. Please make sure that webgpu is enabled for your browser."); - log::debug!("creating buffer"); - let width_uniform = executor.create_uniform_buffer(background.width).unwrap(); - let bg_storage_buffer = executor - .create_storage_buffer( - background.data.clone(), - StorageBufferOptions { - cpu_writable: false, - gpu_writable: true, - cpu_readable: false, - storage: true, - }, - ) - .unwrap(); - let fg_storage_buffer = executor - .create_storage_buffer( - foreground.data.clone(), - StorageBufferOptions { - cpu_writable: false, - gpu_writable: true, - cpu_readable: false, - storage: true, - }, - ) - .unwrap(); - let fg_width_uniform = executor.create_uniform_buffer(foreground.width).unwrap(); - let transform_uniform = executor.create_uniform_buffer(transform_matrix).unwrap(); - let translation_uniform = executor.create_uniform_buffer(translation).unwrap(); - let width_uniform = Arc::new(width_uniform); - let bg_storage_buffer = Arc::new(bg_storage_buffer); - let fg_storage_buffer = Arc::new(fg_storage_buffer); - let fg_width_uniform = Arc::new(fg_width_uniform); - let transform_uniform = Arc::new(transform_uniform); - let translation_uniform = Arc::new(translation_uniform); - let output_buffer = executor.create_output_buffer(len, concrete!(Color), false).unwrap(); - let output_buffer = Arc::new(output_buffer); - let readback_buffer = executor.create_output_buffer(len, concrete!(Color), true).unwrap(); - let readback_buffer = Arc::new(readback_buffer); - log::debug!("created buffer"); - let bind_group = Bindgroup { - buffers: vec![ - width_uniform.clone(), - bg_storage_buffer.clone(), - fg_storage_buffer.clone(), - fg_width_uniform.clone(), - transform_uniform.clone(), - translation_uniform.clone(), - ], - }; - - let shader = Shader { - source: shader.spirv_binary.into(), - name: "gpu::eval", - io: shader.io, - }; - log::debug!("loading shader"); - log::debug!("shader: {:?}", shader.source); - let shader = executor.load_shader(shader).unwrap(); - log::debug!("loaded shader"); - let pipeline = PipelineLayout { - shader: shader.into(), - entry_point: "eval".to_string(), - bind_group: bind_group.into(), - output_buffer: output_buffer.clone(), - }; - log::debug!("created pipeline"); - let compute_pass = executor - .create_compute_pass(&pipeline, Some(readback_buffer.clone()), ComputePassDimensions::XY(background.width, background.height)) - .unwrap(); - executor.execute_compute_pipeline(compute_pass).unwrap(); - log::debug!("executed pipeline"); - log::debug!("reading buffer"); - let result = executor.read_output_buffer(readback_buffer).await.unwrap(); - let colors = bytemuck::pod_collect_to_vec::(result.as_slice()); - - let created_image = Image { - data: colors, - width: background.width, - height: background.height, - ..Default::default() - }; - - background_instance.instance = created_image; - background_instance.source_node_id = None; - result_table.push(background_instance); - } - - result_table -} - -// struct ComputePass { -// pipeline_layout: PipelineLayout, -// readback_buffer: Option>, -// } - -// impl Clone for ComputePass { -// fn clone(&self) -> Self { -// Self { -// pipeline_layout: self.pipeline_layout.clone(), -// readback_buffer: self.readback_buffer.clone(), -// } -// } -// } - -// pub struct MapGpuNode { -// node: Node, -// editor_api: EditorApi, -// cache: Mutex>, -// } - -// #[node_macro::old_node_impl(MapGpuNode)] -// async fn map_gpu<'a: 'input>(image: RasterDataTable, node: DocumentNode, editor_api: &'a graphene_core::application_io::EditorApi) -> RasterDataTable { -// let image_frame_table = ℑ -// let image = image.instance_ref_iter().next().unwrap().instance; - -// log::debug!("Executing gpu node"); -// let executor = &editor_api.application_io.as_ref().and_then(|io| io.gpu_executor()).unwrap(); - -// #[cfg(feature = "image-compare")] -// let img: image::DynamicImage = image::Rgba32FImage::from_raw(image.width, image.height, bytemuck::cast_vec(image.data.clone())).unwrap().into(); - -// // TODO: The cache should be based on the network topology not the node name -// let compute_pass_descriptor = if self.cache.lock().as_ref().unwrap().contains_key("placeholder") { -// self.cache.lock().as_ref().unwrap().get("placeholder").unwrap().clone() -// } else { -// let name = "placeholder".to_string(); -// let Ok(compute_pass_descriptor) = create_compute_pass_descriptor(node, image_frame_table, executor).await else { -// log::error!("Error creating compute pass descriptor in 'map_gpu()"); -// return RasterDataTable::default(); -// }; -// self.cache.lock().as_mut().unwrap().insert(name, compute_pass_descriptor.clone()); -// log::error!("created compute pass"); -// compute_pass_descriptor -// }; - -// let compute_pass = executor -// .create_compute_pass( -// &compute_pass_descriptor.pipeline_layout, -// compute_pass_descriptor.readback_buffer.clone(), -// ComputePassDimensions::XY(image.width / 12 + 1, image.height / 8 + 1), -// ) -// .unwrap(); -// executor.execute_compute_pipeline(compute_pass).unwrap(); -// log::debug!("executed pipeline"); -// log::debug!("reading buffer"); -// let result = executor.read_output_buffer(compute_pass_descriptor.readback_buffer.clone().unwrap()).await.unwrap(); -// let colors = bytemuck::pod_collect_to_vec::(result.as_slice()); -// log::debug!("first color: {:?}", colors[0]); - -// #[cfg(feature = "image-compare")] -// let img2: image::DynamicImage = image::Rgba32FImage::from_raw(image.width, image.height, bytemuck::cast_vec(colors.clone())).unwrap().into(); -// #[cfg(feature = "image-compare")] -// let score = image_compare::rgb_hybrid_compare(&img.into_rgb8(), &img2.into_rgb8()).unwrap(); -// #[cfg(feature = "image-compare")] -// log::debug!("score: {:?}", score.score); - -// let new_image = Image { -// data: colors, -// width: image.width, -// height: image.height, -// ..Default::default() -// }; -// let mut result = RasterDataTable::new(new_image); -// *result.transform_mut() = image_frame_table.transform(); -// *result.instance_mut_iter().next().unwrap().alpha_blending = *image_frame_table.instance_ref_iter().next().unwrap().alpha_blending; - -// result -// } - -// impl MapGpuNode { -// pub fn new(node: Node, editor_api: EditorApi) -> Self { -// Self { -// node, -// editor_api, -// cache: Mutex::new(HashMap::new()), -// } -// } -// } - -// async fn create_compute_pass_descriptor(node: DocumentNode, image: &RasterDataTable, executor: &&WgpuExecutor) -> Result -// where -// GraphicElement: From>, -// T::Static: Pixel, -// { -// let image = image.instance_ref_iter().next().unwrap().instance; - -// let compiler = graph_craft::graphene_compiler::Compiler {}; -// let inner_network = NodeNetwork::value_network(node); - -// log::debug!("inner_network: {inner_network:?}"); -// let network = NodeNetwork { -// exports: vec![NodeInput::node(NodeId(2), 0)], -// nodes: [ -// DocumentNode { -// inputs: vec![NodeInput::Inline(InlineRust::new("i1[(_global_index.y * i0 + _global_index.x) as usize]".into(), concrete![Color]))], -// implementation: DocumentNodeImplementation::ProtoNode("graphene_core::value::CopiedNode".into()), -// ..Default::default() -// }, -// DocumentNode { -// inputs: vec![NodeInput::network(concrete!(u32), 0)], -// implementation: DocumentNodeImplementation::ProtoNode("graphene_core::ops::IdentityNode".into()), -// ..Default::default() -// }, -// // DocumentNode { -// // name: "Index".into(), -// // // inputs: vec![NodeInput::Network(concrete!(UVec3))], -// // inputs: vec![NodeInput::Inline(InlineRust::new("i1.x as usize".into(), concrete![u32]))], -// // implementation: DocumentNodeImplementation::ProtoNode("graphene_core::value::CopiedNode".into()), -// // ..Default::default() -// // }, -// // DocumentNode { -// // name: "Get Node".into(), -// // inputs: vec![NodeInput::node(NodeId(1), 0), NodeInput::node(NodeId(0), 0)], -// // implementation: DocumentNodeImplementation::ProtoNode("graphene_core::storage::GetNode".into()), -// // ..Default::default() -// // }, -// DocumentNode { -// inputs: vec![NodeInput::node(NodeId(0), 0)], -// implementation: DocumentNodeImplementation::Network(inner_network), -// ..Default::default() -// }, -// // DocumentNode { -// // name: "Save Node".into(), -// // inputs: vec![ -// // NodeInput::node(NodeId(5), 0), -// // NodeInput::Inline(InlineRust::new( -// // "|x| o0[(_global_index.y * i1 + _global_index.x) as usize] = x".into(), -// // // "|x|()".into(), -// // Type::Fn(Box::new(concrete!(PackedPixel)), Box::new(concrete!(()))), -// // )), -// // ], -// // implementation: DocumentNodeImplementation::ProtoNode("graphene_core::generic::FnMutNode".into()), -// // ..Default::default() -// // }, -// ] -// .into_iter() -// .enumerate() -// .map(|(id, node)| (NodeId(id as u64), node)) -// .collect(), -// ..Default::default() -// }; -// log::debug!("compiling network"); -// let proto_networks: Result, _> = compiler.compile(network.clone()).collect(); -// log::debug!("compiling shader"); -// let shader = compilation_client::compile( -// proto_networks?, -// vec![concrete!(u32), concrete!(Color)], -// vec![concrete!(Color)], -// ShaderIO { -// inputs: vec![ -// ShaderInput::UniformBuffer((), concrete!(u32)), -// ShaderInput::StorageBuffer((), concrete!(Color)), -// ShaderInput::OutputBuffer((), concrete!(Color)), -// ], -// output: ShaderInput::OutputBuffer((), concrete!(Color)), -// }, -// ) -// .await -// .unwrap(); - -// let len: usize = image.data.len(); - -// let storage_buffer = executor -// .create_storage_buffer( -// image.data.clone(), -// StorageBufferOptions { -// cpu_writable: false, -// gpu_writable: true, -// cpu_readable: false, -// storage: true, -// }, -// ) -// .unwrap(); - -// // let canvas = editor_api.application_io.create_surface(); - -// // let surface = unsafe { executor.create_surface(canvas) }.unwrap(); -// // let surface_id = surface.surface_id; - -// // let texture = executor.create_texture_buffer(image.clone(), TextureBufferOptions::Texture).unwrap(); - -// // // executor.create_render_pass(texture, surface).unwrap(); - -// // let frame = SurfaceFrame { -// // surface_id, -// // transform: image.transform, -// // }; -// // return frame; - -// log::debug!("creating buffer"); -// let width_uniform = executor.create_uniform_buffer(image.width).unwrap(); - -// let storage_buffer = Arc::new(storage_buffer); -// let output_buffer = executor.create_output_buffer(len, concrete!(Color), false).unwrap(); -// let output_buffer = Arc::new(output_buffer); -// let readback_buffer = executor.create_output_buffer(len, concrete!(Color), true).unwrap(); -// let readback_buffer = Arc::new(readback_buffer); -// log::debug!("created buffer"); -// let bind_group = Bindgroup { -// buffers: vec![width_uniform.into(), storage_buffer], -// }; - -// let shader = Shader { -// source: shader.spirv_binary.into(), -// name: "gpu::eval", -// io: shader.io, -// }; -// log::debug!("loading shader"); -// let shader = executor.load_shader(shader).unwrap(); -// log::debug!("loaded shader"); -// let pipeline = PipelineLayout { -// shader: shader.into(), -// entry_point: "eval".to_string(), -// bind_group: bind_group.into(), -// output_buffer, -// }; -// log::debug!("created pipeline"); - -// Ok(ComputePass { -// pipeline_layout: pipeline, -// readback_buffer: Some(readback_buffer), -// }) -// } diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index 2beb43cb33..c469d9d375 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -1,6 +1,4 @@ pub mod any; -#[cfg(feature = "gpu")] -pub mod gpu_nodes; pub mod http; pub mod raster; pub mod text; diff --git a/node-graph/interpreted-executor/Cargo.toml b/node-graph/interpreted-executor/Cargo.toml index bafdf68ff4..592b7ca328 100644 --- a/node-graph/interpreted-executor/Cargo.toml +++ b/node-graph/interpreted-executor/Cargo.toml @@ -13,7 +13,6 @@ gpu = ["graphene-std/gpu", "graphene-core/gpu", "graphene-std/wgpu"] # Local dependencies graphene-std = { path = "../gstd", features = ["serde"] } graph-craft = { path = "../graph-craft" } -gpu-executor = { path = "../gpu-executor" } wgpu-executor = { path = "../wgpu-executor" } # Workspace dependencies diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 48121df1bd..c7659ffc48 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -19,8 +19,6 @@ use node_registry_macros::{async_node, into_node}; use once_cell::sync::Lazy; use std::collections::HashMap; use std::sync::Arc; -#[cfg(feature = "gpu")] -use wgpu_executor::ShaderInputFrame; use wgpu_executor::{WgpuExecutor, WgpuSurface, WindowHandle}; // TODO: turn into hashmap @@ -108,12 +106,8 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => ShaderInputFrame]), - #[cfg(feature = "gpu")] async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => wgpu_executor::WgpuSurface]), #[cfg(feature = "gpu")] - async_node!(graphene_core::memo::ImpureMemoNode<_, _, _>, input: Context, fn_params: [Context => ShaderInputFrame]), - #[cfg(feature = "gpu")] into_node!(from: &WasmEditorApi, to: &WgpuExecutor), #[cfg(feature = "gpu")] ( diff --git a/node-graph/node-macro/src/parsing.rs b/node-graph/node-macro/src/parsing.rs index 548623c027..7692710f1e 100644 --- a/node-graph/node-macro/src/parsing.rs +++ b/node-graph/node-macro/src/parsing.rs @@ -474,7 +474,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul } let unit = extract_attribute(attrs, "unit") - .map(|attr| attr.parse_args::().map_err(|e| Error::new_spanned(attr, format!("Expected a unit type as string")))) + .map(|attr| attr.parse_args::().map_err(|_e| Error::new_spanned(attr, format!("Expected a unit type as string")))) .transpose()?; let number_display_decimal_places = extract_attribute(attrs, "display_decimal_places") diff --git a/node-graph/wgpu-executor/Cargo.toml b/node-graph/wgpu-executor/Cargo.toml index fd53617130..285dd85936 100644 --- a/node-graph/wgpu-executor/Cargo.toml +++ b/node-graph/wgpu-executor/Cargo.toml @@ -10,9 +10,6 @@ profiling = ["nvtx"] passthrough = [] [dependencies] -# Local dependencies -gpu-executor = { path = "../gpu-executor" } - # Workspace dependencies graphene-core = { workspace = true, features = ["std", "alloc", "gpu", "wgpu"] } dyn-any = { workspace = true, features = ["log-bad-types", "rc", "glam"] } diff --git a/node-graph/wgpu-executor/src/executor.rs b/node-graph/wgpu-executor/src/executor.rs deleted file mode 100644 index 82b0f81938..0000000000 --- a/node-graph/wgpu-executor/src/executor.rs +++ /dev/null @@ -1,250 +0,0 @@ -use super::context::Context; -use bytemuck::Pod; -use dyn_any::StaticTypeSized; -use std::borrow::Cow; -use std::error::Error; -use std::pin::Pin; -use std::sync::Arc; -use wgpu::util::DeviceExt; - -pub type LocalFuture<'n, T> = Pin + 'n>>; - -#[derive(Debug)] -pub struct GpuExecutor<'a, I: StaticTypeSized, O> { - context: Context, - entry_point: String, - shader: Cow<'a, [u32]>, - _phantom: std::marker::PhantomData<(I, O)>, -} - -impl<'a, I: StaticTypeSized + Sync + Pod + Send, O: StaticTypeSized + Send + Sync + Pod> GpuExecutor<'a, I, O> { - pub fn new(context: Context, shader: Cow<'a, [u32]>, entry_point: String) -> anyhow::Result { - Ok(Self { - context, - entry_point, - shader, - _phantom: std::marker::PhantomData, - }) - } - - pub fn execute(&self, input: Vec) -> LocalFuture, Box>> { - let context = &self.context; - let future = execute_shader(context.device.clone(), context.queue.clone(), self.shader.to_vec(), input, self.entry_point.clone()); - Box::pin(async move { - let result = future.await; - - let result: Vec = result.ok_or_else(|| String::from("Failed to execute shader"))?; - Ok(result) - }) - } -} - -async fn execute_shader(device: Arc, queue: Arc, shader: Vec, data: Vec, entry_point: String) -> Option> { - // Loads the shader from WGSL - dbg!(&shader); - // write shader to file - use std::io::Write; - let mut file = std::fs::File::create("/tmp/shader.spv").unwrap(); - file.write_all(bytemuck::cast_slice(&shader)).unwrap(); - let cs_module = device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: None, - source: wgpu::ShaderSource::SpirV(shader.into()), - }); - - // Gets the size in bytes of the buffer. - let slice_size = data.len() * std::mem::size_of::(); - let size = slice_size as wgpu::BufferAddress; - - // Instantiates buffer without data. - // `usage` of buffer specifies how it can be used: - // `BufferUsages::MAP_READ` allows it to be read (outside the shader). - // `BufferUsages::COPY_DST` allows it to be the destination of the copy. - let staging_buffer = device.create_buffer(&wgpu::BufferDescriptor { - label: None, - size, - usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, - mapped_at_creation: false, - }); - - // Instantiates buffer with data (`numbers`). - // Usage allowing the buffer to be: - // A storage buffer (can be bound within a bind group and thus available to a shader). - // The destination of a copy. - // The source of a copy. - let storage_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Storage Buffer"), - contents: bytemuck::cast_slice(&data), - usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::COPY_SRC, - }); - - // Instantiates empty buffer for the result. - // Usage allowing the buffer to be: - // A storage buffer (can be bound within a bind group and thus available to a shader). - // The destination of a copy. - // The source of a copy. - let dest_buffer = device.create_buffer(&wgpu::BufferDescriptor { - label: Some("Destination Buffer"), - size, - usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC, - mapped_at_creation: false, - }); - - // A bind group defines how buffers are accessed by shaders. - // It is to WebGPU what a descriptor set is to Vulkan. - // `binding` here refers to the `binding` of a buffer in the shader (`layout(set = 0, binding = 0) buffer`). - - // A pipeline specifies the operation of a shader - - // Instantiates the pipeline. - let compute_pipeline = device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { - label: None, - layout: None, - module: &cs_module, - entry_point: Some(entry_point.as_str()), - compilation_options: Default::default(), - cache: None, - }); - - // Instantiates the bind group, once again specifying the binding of buffers. - let bind_group_layout = compute_pipeline.get_bind_group_layout(0); - let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - label: None, - layout: &bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: storage_buffer.as_entire_binding(), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: dest_buffer.as_entire_binding(), - }, - ], - }); - - // A command encoder executes one or many pipelines. - // It is to WebGPU what a command buffer is to Vulkan. - let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); - { - let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None, timestamp_writes: None }); - cpass.set_pipeline(&compute_pipeline); - cpass.set_bind_group(0, Some(&bind_group), &[]); - cpass.insert_debug_marker("compute node network evaluation"); - cpass.dispatch_workgroups(data.len().min(65535) as u32, 1, 1); // Number of cells to run, the (x,y,z) size of item being processed - } - // Sets adds copy operation to command encoder. - // Will copy data from storage buffer on GPU to staging buffer on CPU. - encoder.copy_buffer_to_buffer(&dest_buffer, 0, &staging_buffer, 0, size); - - // Submits command encoder for processing - queue.submit(Some(encoder.finish())); - - // Note that we're not calling `.await` here. - let buffer_slice = staging_buffer.slice(..); - // Sets the buffer up for mapping, sending over the result of the mapping back to us when it is finished. - let (sender, receiver) = futures_intrusive::channel::shared::oneshot_channel(); - buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap()); - - // Poll the device in a blocking manner so that our future resolves. - // In an actual application, `device.poll(...)` should - // be called in an event loop or on another thread. - device.poll(wgpu::Maintain::Wait); - - // Awaits until `buffer_future` can be read from - #[cfg(feature = "profiling")] - nvtx::range_push!("compute"); - let result = receiver.receive().await; - #[cfg(feature = "profiling")] - nvtx::range_pop!(); - if let Some(Ok(())) = result { - // Gets contents of buffer - let data = buffer_slice.get_mapped_range(); - // Since contents are got in bytes, this converts these bytes back to u32 - let result = bytemuck::cast_slice(&data).to_vec(); - - // With the current interface, we have to make sure all mapped views are dropped before we unmap the buffer - drop(data); - // Unmaps buffer from memory - staging_buffer.unmap(); - // If you are familiar with C++ these 2 lines can be thought of similarly to `delete myPointer; myPointer = NULL;`. - // It effectively frees the memory. - - // Returns data from buffer - Some(result) - } else { - panic!("failed to run compute on gpu!") - } -} - -// TODO: Fix this test -// #[cfg(test)] -// mod test { -// use super::*; -// -// use graph_craft::concrete; -// use graph_craft::generic; -// use graph_craft::proto::*; - -// #[test] -// fn add_on_gpu() { -// use crate::executor::Executor; -// let m = compiler::Metadata::new("project".to_owned(), vec!["test@example.com".to_owned()]); -// let network = inc_network(); -// let temp_dir = tempfile::tempdir().expect("failed to create tempdir"); - -// let executor: GpuExecutor = GpuExecutor::new(Context::new(), network, m, temp_dir.path()).unwrap(); - -// let data: Vec<_> = (0..1024).map(|x| x as u32).collect(); -// let result = executor.execute(Box::new(data)).unwrap(); -// let result = dyn_any::downcast::>(result).unwrap(); -// for (i, r) in result.iter().enumerate() { -// assert_eq!(*r, i as u32 + 3); -// } -// } - -// fn inc_network() -> ProtoNetwork { -// let mut construction_network = ProtoNetwork { -// inputs: vec![NodeId(10)], -// output: NodeId(1), -// nodes: [ -// ( -// NodeId(1), -// ProtoNode { -// identifier: ProtoNodeIdentifier::new("graphene_core::ops::IdentityNode", &[generic!("u32")]), -// input: ProtoNodeInput::Node(11), -// construction_args: ConstructionArgs::Nodes(vec![]), -// }, -// ), -// ( -// NodeId(10), -// ProtoNode { -// identifier: ProtoNodeIdentifier::new("graphene_core::structural::ConsNode", &[generic!("&ValueNode"), generic!("()")]), -// input: ProtoNodeInput::Network, -// construction_args: ConstructionArgs::Nodes(vec![14]), -// }, -// ), -// ( -// NodeId(11), -// ProtoNode { -// identifier: ProtoNodeIdentifier::new("graphene_core::ops::AddPairNode", &[generic!("u32"), generic!("u32")]), -// input: ProtoNodeInput::Node(10), -// construction_args: ConstructionArgs::Nodes(vec![]), -// }, -// ), -// ( -// NodeId(14), -// ProtoNode { -// identifier: ProtoNodeIdentifier::new("graphene_core::value::ValueNode", &[concrete!("u32")]), -// input: ProtoNodeInput::None, -// construction_args: ConstructionArgs::Value(Box::new(3_u32)), -// }, -// ), -// ] -// .into_iter() -// .collect(), -// }; -// construction_network.resolve_inputs(); -// construction_network.reorder_ids(); -// construction_network -// } -// } diff --git a/node-graph/wgpu-executor/src/lib.rs b/node-graph/wgpu-executor/src/lib.rs index b354186d00..a32d3cc930 100644 --- a/node-graph/wgpu-executor/src/lib.rs +++ b/node-graph/wgpu-executor/src/lib.rs @@ -1,38 +1,24 @@ mod context; -mod executor; -use anyhow::{Result, bail}; +use anyhow::Result; pub use context::Context; -use dyn_any::{DynAny, StaticType}; -pub use executor::GpuExecutor; -use futures::Future; -use glam::{DAffine2, UVec2}; -use gpu_executor::{ComputePassDimensions, GPUConstant, StorageBufferOptions, TextureBufferOptions, TextureBufferType, ToStorageBuffer, ToUniformBuffer}; +use dyn_any::StaticType; +use glam::UVec2; use graphene_core::application_io::{ApplicationIo, EditorApi, SurfaceHandle}; -use graphene_core::transform::{Footprint, Transform}; -use graphene_core::{Color, Cow, Ctx, Node, SurfaceFrame, Type}; -use std::pin::Pin; +use graphene_core::{Color, Ctx}; use std::sync::Arc; use vello::{AaConfig, AaSupport, RenderParams, Renderer, RendererOptions, Scene}; -use wgpu::util::DeviceExt; -use wgpu::{Buffer, BufferDescriptor, Origin3d, ShaderModule, SurfaceConfiguration, SurfaceError, Texture, TextureAspect, TextureView}; - -#[cfg(target_arch = "wasm32")] -use web_sys::HtmlCanvasElement; +use wgpu::{Origin3d, SurfaceConfiguration, TextureAspect}; #[derive(dyn_any::DynAny)] pub struct WgpuExecutor { pub context: Context, - render_configuration: RenderConfiguration, - vello_renderer: futures::lock::Mutex, + vello_renderer: futures::lock::Mutex, } impl std::fmt::Debug for WgpuExecutor { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("WgpuExecutor") - .field("context", &self.context) - .field("render_configuration", &self.render_configuration) - .finish() + f.debug_struct("WgpuExecutor").field("context", &self.context).finish() } } @@ -51,72 +37,12 @@ impl graphene_core::application_io::Size for Surface { } } -#[repr(C)] -#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] -struct Vertex { - position: [f32; 3], - tex_coords: [f32; 2], -} - -impl Vertex { - fn desc() -> wgpu::VertexBufferLayout<'static> { - use std::mem; - wgpu::VertexBufferLayout { - array_stride: mem::size_of::() as wgpu::BufferAddress, - step_mode: wgpu::VertexStepMode::Vertex, - attributes: &[ - wgpu::VertexAttribute { - offset: 0, - shader_location: 0, - format: wgpu::VertexFormat::Float32x3, - }, - wgpu::VertexAttribute { - offset: mem::size_of::<[f32; 3]>() as wgpu::BufferAddress, - shader_location: 1, - format: wgpu::VertexFormat::Float32x2, - }, - ], - } - } -} - -const VERTICES: &[Vertex] = &[ - Vertex { - position: [-1., 1., 0.], - tex_coords: [0., 0.], - }, // A - Vertex { - position: [-1., -1., 0.], - tex_coords: [0., 1.], - }, // B - Vertex { - position: [1., 1., 0.], - tex_coords: [1., 0.], - }, // C - Vertex { - position: [1., -1., 0.], - tex_coords: [1., 1.], - }, // D -]; - -const INDICES: &[u16] = &[0, 1, 2, 2, 1, 3]; - -#[derive(Debug, DynAny)] -#[repr(transparent)] -pub struct CommandBuffer(wgpu::CommandBuffer); - -#[derive(Debug, DynAny)] -#[repr(transparent)] -pub struct ShaderModuleWrapper(ShaderModule); -pub type ShaderHandle = ShaderModuleWrapper; -pub type BufferHandle = Buffer; -pub type TextureHandle = Texture; pub struct Surface { pub inner: wgpu::Surface<'static>, resolution: UVec2, } #[cfg(target_arch = "wasm32")] -pub type Window = HtmlCanvasElement; +pub type Window = web_sys::HtmlCanvasElement; #[cfg(not(target_arch = "wasm32"))] pub type Window = Arc; @@ -126,10 +52,6 @@ unsafe impl StaticType for Surface { pub use graphene_core::renderer::RenderContext; -// pub trait SpirVCompiler { -// fn compile(&self, network: &[ProtoNetwork], io: &ShaderIO) -> Result; -// } - impl WgpuExecutor { pub async fn render_vello_scene(&self, scene: &Scene, surface: &WgpuSurface, width: u32, height: u32, context: &RenderContext, background: Color) -> Result<()> { let surface = &surface.surface.inner; @@ -181,338 +103,6 @@ impl WgpuExecutor { Ok(()) } - pub fn load_shader(&self, shader: Shader) -> Result { - #[cfg(not(feature = "passthrough"))] - let shader_module = self.context.device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: Some(shader.name), - source: wgpu::ShaderSource::SpirV(shader.source), - }); - #[cfg(feature = "passthrough")] - let shader_module = unsafe { - self.context.device.create_shader_module_spirv(&wgpu::ShaderModuleDescriptorSpirV { - label: Some(shader.name), - source: shader.source, - }) - }; - Ok(ShaderModuleWrapper(shader_module)) - } - - pub fn create_uniform_buffer(&self, data: T) -> Result { - let bytes = data.to_bytes(); - let buffer = self.context.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: None, - contents: bytes.as_ref(), - usage: wgpu::BufferUsages::UNIFORM, - }); - Ok(ShaderInput::UniformBuffer(buffer, Type::new::())) - } - - pub fn create_storage_buffer(&self, data: T, options: StorageBufferOptions) -> Result { - let bytes = data.to_bytes(); - let mut usage = wgpu::BufferUsages::empty(); - - if options.storage { - usage |= wgpu::BufferUsages::STORAGE; - } - if options.gpu_writable { - usage |= wgpu::BufferUsages::COPY_SRC | wgpu::BufferUsages::COPY_DST; - } - if options.cpu_readable { - usage |= wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST; - } - if options.cpu_writable { - usage |= wgpu::BufferUsages::MAP_WRITE | wgpu::BufferUsages::COPY_SRC; - } - - log::warn!("Creating storage buffer with usage {:?} and len: {}", usage, bytes.len()); - let buffer = self.context.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: None, - contents: bytes.as_ref(), - usage, - }); - Ok(ShaderInput::StorageBuffer(buffer, data.ty())) - } - pub fn create_texture_buffer(&self, data: T, options: TextureBufferOptions) -> Result { - let bytes = data.to_bytes(); - let usage = match options { - TextureBufferOptions::Storage => wgpu::TextureUsages::STORAGE_BINDING | wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::COPY_SRC, - TextureBufferOptions::Texture => wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::COPY_SRC, - TextureBufferOptions::Surface => wgpu::TextureUsages::RENDER_ATTACHMENT, - }; - - let format = match T::format() { - TextureBufferType::Rgba32Float => wgpu::TextureFormat::Rgba32Float, - TextureBufferType::Rgba16Float => wgpu::TextureFormat::Rgba16Float, - TextureBufferType::Rgba8Srgb => wgpu::TextureFormat::Rgba8UnormSrgb, - }; - - let buffer = self.context.device.create_texture_with_data( - self.context.queue.as_ref(), - &wgpu::TextureDescriptor { - label: None, - size: wgpu::Extent3d { - width: data.size().0, - height: data.size().1, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format, - usage, - view_formats: &[format], - }, - wgpu::util::TextureDataOrder::LayerMajor, - bytes.as_ref(), - ); - match options { - TextureBufferOptions::Storage => Ok(ShaderInput::StorageTextureBuffer(buffer, T::ty())), - TextureBufferOptions::Texture => Ok(ShaderInput::TextureBuffer(buffer, T::ty())), - TextureBufferOptions::Surface => Ok(ShaderInput::TextureBuffer(buffer, T::ty())), - } - } - - pub fn create_output_buffer(&self, len: usize, ty: Type, cpu_readable: bool) -> Result { - log::warn!("Creating output buffer with len: {len}"); - let create_buffer = |usage| { - Ok::<_, anyhow::Error>(self.context.device.create_buffer(&BufferDescriptor { - label: None, - size: len as u64 * ty.size().ok_or_else(|| anyhow::anyhow!("Cannot create buffer of type {ty:?}"))? as u64, - usage, - mapped_at_creation: false, - })) - }; - let buffer = match cpu_readable { - true => ShaderInput::ReadBackBuffer(create_buffer(wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ)?, ty), - false => ShaderInput::OutputBuffer(create_buffer(wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC)?, ty), - }; - Ok(buffer) - } - pub fn create_compute_pass(&self, layout: &PipelineLayout, read_back: Option>, instances: ComputePassDimensions) -> Result { - let compute_pipeline = self.context.device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { - label: None, - layout: None, - module: &layout.shader.0, - entry_point: Some(layout.entry_point.as_str()), - compilation_options: Default::default(), - cache: None, - }); - let bind_group_layout = compute_pipeline.get_bind_group_layout(0); - - let entries = layout - .bind_group - .buffers - .iter() - .chain(std::iter::once(&layout.output_buffer)) - .flat_map(|input| input.binding()) - .enumerate() - .map(|(i, buffer)| wgpu::BindGroupEntry { - binding: i as u32, - resource: match buffer { - BindingType::UniformBuffer(buf) => buf.as_entire_binding(), - BindingType::StorageBuffer(buf) => buf.as_entire_binding(), - BindingType::TextureView(buf) => wgpu::BindingResource::TextureView(buf), - }, - }) - .collect::>(); - - let bind_group = self.context.device.create_bind_group(&wgpu::BindGroupDescriptor { - label: None, - layout: &bind_group_layout, - entries: entries.as_slice(), - }); - - let mut encoder = self.context.device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Some("compute encoder") }); - { - let dimensions = instances.get(); - let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: None, timestamp_writes: None }); - cpass.set_pipeline(&compute_pipeline); - cpass.set_bind_group(0, Some(&bind_group), &[]); - cpass.insert_debug_marker("compute node network evaluation"); - cpass.push_debug_group("compute shader"); - cpass.dispatch_workgroups(dimensions.0, dimensions.1, dimensions.2); // Number of cells to run, the (x,y,z) size of item being processed - cpass.pop_debug_group(); - } - // Sets adds copy operation to command encoder. - // Will copy data from storage buffer on GPU to staging buffer on CPU. - if let Some(buffer) = read_back { - let ShaderInput::ReadBackBuffer(output, _ty) = buffer.as_ref() else { - bail!("Tried to read back from a non read back buffer"); - }; - let size = output.size(); - let ShaderInput::OutputBuffer(output_buffer, ty) = layout.output_buffer.as_ref() else { - bail!("Tried to read back from a non output buffer"); - }; - assert_eq!(size, output_buffer.size()); - assert_eq!(ty, &layout.output_buffer.ty()); - encoder.copy_buffer_to_buffer(output_buffer, 0, output, 0, size); - } - - // Submits command encoder for processing - Ok(CommandBuffer(encoder.finish())) - } - - pub fn create_render_pass(&self, _footprint: Footprint, texture: ShaderInputFrame, canvas: Arc>) -> Result<()> { - let transform = texture.transform; - let texture = texture.shader_input.texture().expect("Expected texture input"); - let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { - format: Some(wgpu::TextureFormat::Rgba16Float), - ..Default::default() - }); - - let surface = &canvas.as_ref().surface.inner; - let surface_caps = surface.get_capabilities(&self.context.adapter); - if surface_caps.formats.is_empty() { - log::warn!("No surface formats available"); - return Ok(()); - } - // TODO: - let resolution = transform.decompose_scale().as_uvec2(); - let surface_format = wgpu::TextureFormat::Bgra8Unorm; - let config = SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: surface_format, - width: resolution.x, - height: resolution.y, - present_mode: surface_caps.present_modes[0], - alpha_mode: surface_caps.alpha_modes[0], - view_formats: vec![], - desired_maximum_frame_latency: 2, - }; - surface.configure(&self.context.device, &config); - let result = surface.get_current_texture(); - - let output = match result { - Err(SurfaceError::Timeout) => { - log::warn!("Timeout when getting current texture"); - return Ok(()); - } - Err(SurfaceError::Lost) => { - log::warn!("Surface lost"); - - // surface.configure(&self.context.device, &new_config); - return Ok(()); - } - Err(SurfaceError::OutOfMemory) => { - log::warn!("Out of memory"); - return Ok(()); - } - Err(SurfaceError::Outdated) => { - log::warn!("Surface outdated"); - // surface.configure(&self.context.device, &new_config); - return Ok(()); - } - Ok(surface) => surface, - }; - let view = output.texture.create_view(&wgpu::TextureViewDescriptor { - format: Some(wgpu::TextureFormat::Bgra8Unorm), - ..Default::default() - }); - let output_texture_bind_group = self.context.device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &self.render_configuration.texture_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: wgpu::BindingResource::TextureView(&texture_view), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::Sampler(&self.render_configuration.sampler), - }, - ], - label: Some("output_texture_bind_group"), - }); - - let mut encoder = self.context.device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Some("Render Encoder") }); - - { - let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("Render Pass"), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color::RED), - store: wgpu::StoreOp::Store, - }, - })], - depth_stencil_attachment: None, - timestamp_writes: None, - occlusion_query_set: None, - }); - - render_pass.set_pipeline(&self.render_configuration.render_pipeline); - render_pass.set_bind_group(0, Some(&output_texture_bind_group), &[]); - render_pass.set_vertex_buffer(0, self.render_configuration.vertex_buffer.slice(..)); - render_pass.set_index_buffer(self.render_configuration.index_buffer.slice(..), wgpu::IndexFormat::Uint16); - render_pass.draw_indexed(0..self.render_configuration.num_indices, 0, 0..1); - render_pass.insert_debug_marker("render node network"); - } - - let encoder = encoder.finish(); - #[cfg(feature = "profiling")] - nvtx::range_push!("render"); - self.context.queue.submit(Some(encoder)); - #[cfg(feature = "profiling")] - nvtx::range_pop!(); - log::trace!("Submitted render pass"); - output.present(); - - Ok(()) - } - - pub fn execute_compute_pipeline(&self, encoder: CommandBuffer) -> Result<()> { - self.context.queue.submit(Some(encoder.0)); - - Ok(()) - } - - pub fn read_output_buffer(&self, buffer: Arc) -> Pin>> + Send>> { - Box::pin(async move { - let ShaderInput::ReadBackBuffer(buffer, _) = buffer.as_ref() else { - bail!("Tried to read a non readback buffer") - }; - - let buffer_slice = buffer.slice(..); - - // Sets the buffer up for mapping, sending over the result of the mapping back to us when it is finished. - let (sender, receiver) = futures_intrusive::channel::shared::oneshot_channel(); - buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap()); - - // Wait for the mapping to finish. - #[cfg(feature = "profiling")] - nvtx::range_push!("compute"); - let result = receiver.receive().await; - #[cfg(feature = "profiling")] - nvtx::range_pop!(); - - if result.is_none_or(|x| x.is_err()) { - bail!("failed to run compute on gpu!") - } - // Gets contents of buffer - let data = buffer_slice.get_mapped_range(); - // Since contents are got in bytes, this converts these bytes back to u32 - let result = bytemuck::cast_slice(&data).to_vec(); - - // With the current interface, we have to make sure all mapped views are - // dropped before we unmap the buffer. - drop(data); - buffer.unmap(); // Unmaps buffer from memory - - // Returns data from buffer - Ok(result) - }) - } - - pub fn create_texture_view(&self, texture: WgpuShaderInput) -> Result { - // Ok(ShaderInput::TextureView(texture.create_view(&wgpu::TextureViewDescriptor::default()), ) ) - let ShaderInput::TextureBuffer(texture, ty) = &texture else { - bail!("Tried to create a texture view from a non texture"); - }; - let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); - Ok(ShaderInput::TextureView(view, ty.clone())) - } - #[cfg(target_arch = "wasm32")] pub fn create_surface(&self, canvas: graphene_core::WasmSurfaceHandle) -> Result> { let surface = self.context.instance.create_surface(wgpu::SurfaceTarget::Canvas(canvas.surface))?; @@ -541,117 +131,6 @@ impl WgpuExecutor { impl WgpuExecutor { pub async fn new() -> Option { let context = Context::new().await?; - println!("wgpu executor created"); - - let texture_bind_group_layout = context.device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - multisampled: false, - view_dimension: wgpu::TextureViewDimension::D2, - sample_type: wgpu::TextureSampleType::Float { filterable: false }, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 1, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering), - count: None, - }, - ], - label: Some("texture_bind_group_layout"), - }); - - let sampler = context.device.create_sampler(&wgpu::SamplerDescriptor { - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: wgpu::FilterMode::Nearest, - min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, - ..Default::default() - }); - - let shader = context.device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: Some("Shader"), - source: wgpu::ShaderSource::Wgsl(include_str!("shader.wgsl").into()), - }); - - let render_pipeline_layout = context.device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: Some("Render Pipeline Layout"), - bind_group_layouts: &[&texture_bind_group_layout], - push_constant_ranges: &[], - }); - - let render_pipeline = context.device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Render Pipeline"), - layout: Some(&render_pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: Some("vs_main"), - buffers: &[Vertex::desc()], - compilation_options: Default::default(), - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: Some("fs_main"), - targets: &[Some(wgpu::ColorTargetState { - format: wgpu::TextureFormat::Bgra8Unorm, - blend: Some(wgpu::BlendState { - color: wgpu::BlendComponent::REPLACE, - alpha: wgpu::BlendComponent::REPLACE, - }), - write_mask: wgpu::ColorWrites::ALL, - })], - compilation_options: Default::default(), - }), - primitive: wgpu::PrimitiveState { - topology: wgpu::PrimitiveTopology::TriangleList, - strip_index_format: None, - front_face: wgpu::FrontFace::Ccw, - cull_mode: None, - // Setting this to anything other than Fill requires Features::POLYGON_MODE_LINE - // or Features::POLYGON_MODE_POINT - polygon_mode: wgpu::PolygonMode::Fill, - // Requires Features::DEPTH_CLIP_CONTROL - unclipped_depth: false, - // Requires Features::CONSERVATIVE_RASTERIZATION - conservative: false, - }, - depth_stencil: None, - multisample: wgpu::MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, - // If the pipeline will be used with a multiview render pass, this - // indicates how many array layers the attachments will have. - multiview: None, - cache: None, - }); - - let vertex_buffer = context.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex Buffer"), - contents: bytemuck::cast_slice(VERTICES), - usage: wgpu::BufferUsages::VERTEX, - }); - let index_buffer = context.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Index Buffer"), - contents: bytemuck::cast_slice(INDICES), - usage: wgpu::BufferUsages::INDEX, - }); - let num_indices = INDICES.len() as u32; - let render_configuration = RenderConfiguration { - vertex_buffer, - index_buffer, - num_indices, - render_pipeline, - texture_bind_group_layout, - sampler, - }; let vello_renderer = Renderer::new( &context.device, @@ -667,209 +146,11 @@ impl WgpuExecutor { Some(Self { context, - render_configuration, vello_renderer: vello_renderer.into(), }) } } -#[derive(Debug)] -struct RenderConfiguration { - vertex_buffer: wgpu::Buffer, - index_buffer: wgpu::Buffer, - num_indices: u32, - render_pipeline: wgpu::RenderPipeline, - texture_bind_group_layout: wgpu::BindGroupLayout, - sampler: wgpu::Sampler, -} - -pub type WgpuShaderInput = ShaderInput; -pub type AbstractShaderInput = ShaderInput<(), (), ()>; - -#[derive(Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] -/// All the possible inputs to a shader. -pub enum ShaderInput { - UniformBuffer(BufferHandle, Type), - StorageBuffer(BufferHandle, Type), - TextureBuffer(TextureHandle, Type), - StorageTextureBuffer(TextureHandle, Type), - TextureView(TextureView, Type), - /// A struct representing a work group memory buffer. This cannot be accessed by the CPU. - WorkGroupMemory(usize, Type), - Constant(GPUConstant), - OutputBuffer(BufferHandle, Type), - ReadBackBuffer(BufferHandle, Type), -} - -unsafe impl StaticType for ShaderInput { - type Static = ShaderInput; -} - -pub enum BindingType<'a> { - UniformBuffer(&'a BufferHandle), - StorageBuffer(&'a BufferHandle), - TextureView(&'a TextureView), -} - -/// Extract the buffer handle from a shader input. -impl ShaderInput { - pub fn binding(&self) -> Option { - match self { - ShaderInput::UniformBuffer(buffer, _) => Some(BindingType::UniformBuffer(buffer)), - ShaderInput::StorageBuffer(buffer, _) => Some(BindingType::StorageBuffer(buffer)), - ShaderInput::WorkGroupMemory(_, _) => None, - ShaderInput::Constant(_) => None, - ShaderInput::TextureBuffer(_, _) => None, - ShaderInput::StorageTextureBuffer(_, _) => None, - ShaderInput::TextureView(tex, _) => Some(BindingType::TextureView(tex)), - ShaderInput::OutputBuffer(buffer, _) => Some(BindingType::StorageBuffer(buffer)), - ShaderInput::ReadBackBuffer(buffer, _) => Some(BindingType::StorageBuffer(buffer)), - } - } - pub fn buffer(&self) -> Option<&BufferHandle> { - match self { - ShaderInput::UniformBuffer(buffer, _) => Some(buffer), - ShaderInput::StorageBuffer(buffer, _) => Some(buffer), - ShaderInput::WorkGroupMemory(_, _) => None, - ShaderInput::Constant(_) => None, - ShaderInput::TextureBuffer(_, _) => None, - ShaderInput::StorageTextureBuffer(_, _) => None, - ShaderInput::TextureView(_tex, _) => None, - ShaderInput::OutputBuffer(buffer, _) => Some(buffer), - ShaderInput::ReadBackBuffer(buffer, _) => Some(buffer), - } - } - pub fn texture(&self) -> Option<&TextureHandle> { - match self { - ShaderInput::UniformBuffer(_, _) => None, - ShaderInput::StorageBuffer(_, _) => None, - ShaderInput::WorkGroupMemory(_, _) => None, - ShaderInput::Constant(_) => None, - ShaderInput::TextureBuffer(tex, _) => Some(tex), - ShaderInput::StorageTextureBuffer(tex, _) => Some(tex), - ShaderInput::TextureView(_, _) => None, - ShaderInput::OutputBuffer(_, _) => None, - ShaderInput::ReadBackBuffer(_, _) => None, - } - } -} -impl ShaderInput { - pub fn ty(&self) -> Type { - match self { - ShaderInput::UniformBuffer(_, ty) => ty.clone(), - ShaderInput::StorageBuffer(_, ty) => ty.clone(), - ShaderInput::WorkGroupMemory(_, ty) => ty.clone(), - ShaderInput::Constant(c) => c.ty(), - ShaderInput::TextureBuffer(_, ty) => ty.clone(), - ShaderInput::StorageTextureBuffer(_, ty) => ty.clone(), - ShaderInput::TextureView(_, ty) => ty.clone(), - ShaderInput::OutputBuffer(_, ty) => ty.clone(), - ShaderInput::ReadBackBuffer(_, ty) => ty.clone(), - } - } - - pub fn is_output(&self) -> bool { - matches!(self, ShaderInput::OutputBuffer(_, _)) - } -} - -pub struct Shader<'a> { - pub source: Cow<'a, [u32]>, - pub name: &'a str, - pub io: ShaderIO, -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, dyn_any::DynAny)] -pub struct ShaderIO { - pub inputs: Vec, - pub output: AbstractShaderInput, -} - -/// Collection of all arguments that are passed to the shader. -#[derive(DynAny)] -pub struct Bindgroup { - pub buffers: Vec>, -} - -/// A struct representing a compute pipeline. -#[derive(DynAny, Clone)] -pub struct PipelineLayout { - pub shader: Arc, - pub entry_point: String, - pub bind_group: Arc, - pub output_buffer: Arc, -} - -/// Extracts arguments from the function arguments and wraps them in a node. -pub struct ShaderInputNode { - data: T, -} - -impl<'i, T: 'i> Node<'i, ()> for ShaderInputNode { - type Output = &'i T; - - fn eval(&'i self, _: ()) -> Self::Output { - &self.data - } -} - -impl ShaderInputNode { - pub fn new(data: T) -> Self { - Self { data } - } -} - -#[node_macro::node(category(""))] -async fn uniform<'a: 'n, T: ToUniformBuffer + Send + 'n>(_: impl Ctx, #[implementations(f32, DAffine2)] data: T, executor: &'a WgpuExecutor) -> WgpuShaderInput { - executor.create_uniform_buffer(data).unwrap() -} - -#[node_macro::node(category(""))] -async fn storage<'a: 'n, T: ToStorageBuffer + Send + 'n>(_: impl Ctx, #[implementations(Vec)] data: T, executor: &'a WgpuExecutor) -> WgpuShaderInput { - executor - .create_storage_buffer( - data, - StorageBufferOptions { - cpu_writable: false, - gpu_writable: true, - cpu_readable: false, - storage: true, - }, - ) - .unwrap() -} - -#[node_macro::node(category(""))] -async fn create_output_buffer<'a: 'n>(_: impl Ctx + 'a, size: usize, executor: &'a WgpuExecutor, ty: Type) -> Arc { - Arc::new(executor.create_output_buffer(size, ty, true).unwrap()) -} - -#[node_macro::node(skip_impl)] -async fn create_compute_pass<'a: 'n>(_: impl Ctx + 'a, layout: PipelineLayout, executor: &'a WgpuExecutor, output: WgpuShaderInput, instances: ComputePassDimensions) -> CommandBuffer { - executor.create_compute_pass(&layout, Some(output.into()), instances).unwrap() -} - -#[node_macro::node(category("Debug: GPU"))] -async fn create_pipeline_layout( - _: impl Ctx, - shader: impl Node<(), Output = ShaderHandle>, - entry_point: String, - bind_group: impl Node<(), Output = Bindgroup>, - output_buffer: Arc, -) -> PipelineLayout { - PipelineLayout { - shader: shader.eval(()).await.into(), - entry_point, - bind_group: bind_group.eval(()).await.into(), - output_buffer, - } -} - -#[node_macro::node(category(""))] -async fn read_output_buffer<'a: 'n>(_: impl Ctx + 'a, buffer: Arc, executor: &'a WgpuExecutor, _compute_pass: ()) -> Vec { - executor.read_output_buffer(buffer).await.unwrap() -} - pub type WindowHandle = Arc>; #[node_macro::node(skip_impl)] @@ -879,34 +160,6 @@ fn create_gpu_surface<'a: 'n, Io: ApplicationIo, - transform: DAffine2, -} - -#[node_macro::node(category(""))] -async fn render_texture<'a: 'n>( - _: impl Ctx + 'a, - footprint: Footprint, - image: impl Node, - surface: Option, - executor: &'a WgpuExecutor, -) -> SurfaceFrame { - let surface = surface.unwrap(); - let surface_id = surface.window_id; - let image = image.eval(footprint).await; - let transform = image.transform; - - executor.create_render_pass(footprint, image, surface).unwrap(); - - SurfaceFrame { - surface_id, - transform, - resolution: footprint.resolution, - } -} - // #[node_macro::node(category(""))] // async fn upload_texture<'a: 'n>(_: impl ExtractFootprint + Ctx, input: RasterDataTable, executor: &'a WgpuExecutor) -> TextureFrameTable { // let mut result_table = TextureFrameTable::default(); diff --git a/node-graph/wgpu-executor/src/shader.wgsl b/node-graph/wgpu-executor/src/shader.wgsl deleted file mode 100644 index 6598baa00b..0000000000 --- a/node-graph/wgpu-executor/src/shader.wgsl +++ /dev/null @@ -1,43 +0,0 @@ -// Vertex shader - -struct VertexInput { - @location(0) position: vec3, - @location(1) tex_coords: vec2, -} - -struct VertexOutput { - @builtin(position) clip_position: vec4, - @location(0) tex_coords: vec2, -} - -@vertex -fn vs_main( - model: VertexInput, -) -> VertexOutput { - var out: VertexOutput; - out.tex_coords = model.tex_coords; - out.clip_position = vec4(model.position, 1.0); - return out; -} - -// Fragment shader - -@group(0) @binding(0) -var t_diffuse: texture_2d; -@group(0)@binding(1) -var s_diffuse: sampler; - -fn linearToSRGB(color: vec3) -> vec3 { - let a = 0.055; - return select(pow(color, vec3(1.0 / 2.2)) * (1.0 + a) - a, - color / 12.92, - color <= vec3(0.0031308)); -} - -@fragment -fn fs_main(in: VertexOutput) -> @location(0) vec4 { - var color = textureSample(t_diffuse, s_diffuse, in.tex_coords); - var linearColor = color.rgb; - var srgbColor = linearToSRGB(linearColor); - return vec4(srgbColor, color.a); -}