mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-16 06:38:03 +08:00
Implement experimental WebGPU support (#1238)
* Web gpu execution MVP Ready infrastructure for wgpu experimentation Start implementing simple gpu test case Fix Extract Node not working with nested networks Convert inputs for extracted node to network inputs Fix missing cors headers Feature gate gcore to make it once again no-std compatible Add skeleton structure gpu shader Work on gpu node graph output saving Fix Get and Set nodes Fix storage nodes Fix shader construction errors -> spirv errors Add unsafe version Add once cell node Web gpu execution MVP
This commit is contained in:
committed by
Keavon Chambers
parent
4bd9fbd073
commit
0586d52f3a
@@ -39,6 +39,7 @@ pub struct AsyncComposeNode<First, Second, I> {
|
||||
phantom: PhantomData<I>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
impl<'i, 'f: 'i, 's: 'i, Input: 'static, First, Second> Node<'i, Input> for AsyncComposeNode<First, Second, Input>
|
||||
where
|
||||
First: Node<'i, Input>,
|
||||
@@ -54,6 +55,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
impl<'i, First, Second, Input: 'i> AsyncComposeNode<First, Second, Input>
|
||||
where
|
||||
First: Node<'i, Input>,
|
||||
@@ -77,6 +79,7 @@ pub trait Then<'i, Input: 'i>: Sized {
|
||||
|
||||
impl<'i, First: Node<'i, Input>, Input: 'i> Then<'i, Input> for First {}
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
pub trait AndThen<'i, Input: 'i>: Sized {
|
||||
fn and_then<Second>(self, second: Second) -> AsyncComposeNode<Self, Second, Input>
|
||||
where
|
||||
@@ -88,6 +91,7 @@ pub trait AndThen<'i, Input: 'i>: Sized {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
impl<'i, First: Node<'i, Input>, Input: 'i> AndThen<'i, Input> for First {}
|
||||
|
||||
pub struct ConsNode<I: From<()>, Root>(pub Root, PhantomData<I>);
|
||||
@@ -108,6 +112,38 @@ impl<'i, Root: Node<'i, I>, I: 'i + From<()>> ConsNode<I, Root> {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ApplyNode<O, N> {
|
||||
pub node: N,
|
||||
_o: PhantomData<O>,
|
||||
}
|
||||
/*
|
||||
#[node_macro::node_fn(ApplyNode)]
|
||||
fn apply<In, N>(input: In, node: &'any_input N) -> ()
|
||||
where
|
||||
// TODO: try to allows this to return output other than ()
|
||||
N: for<'any_input> Node<'any_input, In, Output = ()>,
|
||||
{
|
||||
node.eval(input)
|
||||
}
|
||||
*/
|
||||
impl<'input, In: 'input, N: 'input, S0: 'input, O: 'input> Node<'input, In> for ApplyNode<O, S0>
|
||||
where
|
||||
N: Node<'input, In, Output = O>,
|
||||
S0: Node<'input, (), Output = &'input N>,
|
||||
{
|
||||
type Output = <N as Node<'input, In>>::Output;
|
||||
#[inline]
|
||||
fn eval(&'input self, input: In) -> Self::Output {
|
||||
let node = self.node.eval(());
|
||||
node.eval(input)
|
||||
}
|
||||
}
|
||||
impl<'input, S0: 'input, O: 'static> ApplyNode<O, S0> {
|
||||
pub const fn new(node: S0) -> Self {
|
||||
Self { node, _o: PhantomData }
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::{ops::IdNode, value::ValueNode};
|
||||
@@ -134,4 +170,15 @@ mod test {
|
||||
|
||||
assert_eq!(compose.eval(()), &5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_apply() {
|
||||
let mut array = [1, 2, 3];
|
||||
let slice = &mut array;
|
||||
let set_node = crate::storage::SetOwnedNode::new(slice);
|
||||
|
||||
let apply = ApplyNode::new(ValueNode::new(set_node));
|
||||
|
||||
assert_eq!(apply.eval((1, 2)), ());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user