Skip to main content

vk_graph/
node.rs

1//! Handles for Vulkan smart-pointer resources.
2
3use std::sync::Arc;
4
5use crate::{
6    Node,
7    driver::{
8        accel_struct::AccelerationStructure, buffer::Buffer, image::Image,
9        swapchain::SwapchainImage,
10    },
11    pool::Lease,
12};
13
14use super::{AnyResource, NodeIndex};
15
16/// Specifies either an owned acceleration structure or one obtained from a pool.
17#[derive(Clone, Copy, Debug)]
18pub enum AnyAccelerationStructureNode {
19    /// An owned acceleration structure.
20    AccelerationStructure(AccelerationStructureNode),
21
22    /// An acceleration structure obtained from a pool.
23    AccelerationStructureLease(AccelerationStructureLeaseNode),
24}
25
26impl From<AccelerationStructureNode> for AnyAccelerationStructureNode {
27    fn from(node: AccelerationStructureNode) -> Self {
28        Self::AccelerationStructure(node)
29    }
30}
31
32impl From<AccelerationStructureLeaseNode> for AnyAccelerationStructureNode {
33    fn from(node: AccelerationStructureLeaseNode) -> Self {
34        Self::AccelerationStructureLease(node)
35    }
36}
37
38impl Node for AnyAccelerationStructureNode {
39    type Resource = AccelerationStructure;
40
41    fn borrow(self, resources: &[AnyResource]) -> &Self::Resource {
42        resources[self.index()].expect_accel_struct()
43    }
44
45    fn index(&self) -> NodeIndex {
46        match self {
47            Self::AccelerationStructure(node) => node.index(),
48            Self::AccelerationStructureLease(node) => node.index(),
49        }
50    }
51}
52
53/// Specifies either an owned buffer or one obtained from a pool.
54#[derive(Clone, Copy, Debug)]
55pub enum AnyBufferNode {
56    /// An owned buffer.
57    Buffer(BufferNode),
58
59    /// A buffer obtained from a pool.
60    BufferLease(BufferLeaseNode),
61}
62
63impl From<BufferNode> for AnyBufferNode {
64    fn from(node: BufferNode) -> Self {
65        Self::Buffer(node)
66    }
67}
68
69impl From<BufferLeaseNode> for AnyBufferNode {
70    fn from(node: BufferLeaseNode) -> Self {
71        Self::BufferLease(node)
72    }
73}
74
75impl Node for AnyBufferNode {
76    type Resource = Buffer;
77
78    fn borrow(self, resources: &[AnyResource]) -> &Self::Resource {
79        resources[self.index()].expect_buffer()
80    }
81
82    fn index(&self) -> NodeIndex {
83        match self {
84            Self::Buffer(node) => node.index(),
85            Self::BufferLease(node) => node.index(),
86        }
87    }
88}
89
90/// Specifies either an owned image or one obtained from a pool.
91///
92/// The image may also be a special swapchain type of image.
93#[derive(Clone, Copy, Debug)]
94pub enum AnyImageNode {
95    /// An owned image.
96    Image(ImageNode),
97
98    /// An image obtained from a pool.
99    ImageLease(ImageLeaseNode),
100
101    /// A special swapchain image.
102    SwapchainImage(SwapchainImageNode),
103}
104
105impl From<ImageNode> for AnyImageNode {
106    fn from(node: ImageNode) -> Self {
107        Self::Image(node)
108    }
109}
110
111impl From<ImageLeaseNode> for AnyImageNode {
112    fn from(node: ImageLeaseNode) -> Self {
113        Self::ImageLease(node)
114    }
115}
116
117impl From<SwapchainImageNode> for AnyImageNode {
118    fn from(node: SwapchainImageNode) -> Self {
119        Self::SwapchainImage(node)
120    }
121}
122
123impl Node for AnyImageNode {
124    type Resource = Image;
125
126    fn borrow(self, resources: &[AnyResource]) -> &Self::Resource {
127        resources[self.index()].expect_image()
128    }
129
130    fn index(&self) -> NodeIndex {
131        match self {
132            Self::Image(node) => node.index(),
133            Self::ImageLease(node) => node.index(),
134            Self::SwapchainImage(node) => node.index(),
135        }
136    }
137}
138
139macro_rules! node {
140    ($name:ident, $resource:ty, $fn_name:ident) => {
141        paste::paste! {
142            /// Resource node.
143            #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
144            pub struct [<$name Node>] {
145                index: NodeIndex,
146            }
147
148            impl [<$name Node>] {
149                pub(crate) fn new(index: usize) -> Self {
150                    Self {
151                        index,
152                    }
153                }
154            }
155
156            impl Node for [<$name Node>] {
157                type Resource = $resource;
158
159                fn borrow(self, resources: &[AnyResource]) -> &Self::Resource {
160                    let AnyResource::$name(res) = &resources[self.index] else {
161                        panic!("invalid resource node handle");
162                    };
163
164                    res
165                }
166
167                fn index(&self) -> NodeIndex {
168                    self.index
169                }
170            }
171        }
172    };
173}
174
175node!(
176    AccelerationStructure,
177    Arc<AccelerationStructure>,
178    as_accel_struct
179);
180node!(
181    AccelerationStructureLease,
182    Arc<Lease<AccelerationStructure>>,
183    as_accel_struct
184);
185node!(Buffer, Arc<Buffer>, as_buffer);
186node!(BufferLease, Arc<Lease<Buffer>>, as_buffer);
187node!(Image, Arc<Image>, as_image);
188node!(ImageLease, Arc<Lease<Image>>, as_image);
189node!(SwapchainImage, SwapchainImage, as_swapchain_image);