1use 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#[derive(Clone, Copy, Debug)]
18pub enum AnyAccelerationStructureNode {
19 AccelerationStructure(AccelerationStructureNode),
21
22 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#[derive(Clone, Copy, Debug)]
55pub enum AnyBufferNode {
56 Buffer(BufferNode),
58
59 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#[derive(Clone, Copy, Debug)]
94pub enum AnyImageNode {
95 Image(ImageNode),
97
98 ImageLease(ImageLeaseNode),
100
101 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 #[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);