1use super::*;
2use crate::graph::graph_builder::RenderGraphQueue;
3use rafx_api::{RafxColorClearValue, RafxDepthStencilClearValue};
4use std::fmt::Formatter;
5
6#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
10pub struct RenderGraphNodeId(pub(super) usize);
11
12pub type RenderGraphNodeName = &'static str;
13
14#[derive(Debug, Copy, Clone, PartialEq)]
15pub enum RenderGraphNodeKind {
16 Renderpass,
17 Callback,
18}
19
20#[derive(Debug, Clone)]
21pub struct RenderGraphImageCreate {
22 pub image: RenderGraphImageUsageId,
23 pub constraint: RenderGraphImageConstraint,
24}
25
26#[derive(Debug, Clone)]
27pub struct RenderGraphImageRead {
28 pub image: RenderGraphImageUsageId,
29 pub constraint: RenderGraphImageConstraint,
30}
31
32#[derive(Debug, Clone)]
33pub struct RenderGraphImageModify {
34 pub input: RenderGraphImageUsageId,
35 pub output: RenderGraphImageUsageId,
36 pub constraint: RenderGraphImageConstraint,
37}
38
39#[derive(Debug, Clone)]
40pub struct RenderGraphImageCopy {
41 pub input: RenderGraphImageUsageId,
42 pub output: RenderGraphImageUsageId,
43 pub constraint: RenderGraphImageConstraint,
44}
45
46#[derive(Debug, Clone)]
47pub struct RenderGraphBufferCreate {
48 pub buffer: RenderGraphBufferUsageId,
49 pub constraint: RenderGraphBufferConstraint,
50}
51
52#[derive(Debug, Clone)]
53pub struct RenderGraphBufferRead {
54 pub buffer: RenderGraphBufferUsageId,
55 pub constraint: RenderGraphBufferConstraint,
56}
57
58#[derive(Debug, Clone)]
59pub struct RenderGraphBufferModify {
60 pub input: RenderGraphBufferUsageId,
61 pub output: RenderGraphBufferUsageId,
62 pub constraint: RenderGraphBufferConstraint,
63}
64
65#[derive(Debug, Clone)]
66pub struct RenderGraphBufferCopy {
67 pub input: RenderGraphBufferUsageId,
68 pub output: RenderGraphBufferUsageId,
69 pub constraint: RenderGraphBufferConstraint,
70}
71
72#[derive(Debug, Copy, Clone)]
73pub enum RenderGraphPassAttachmentType {
74 Create,
75 Read,
76 Modify,
77}
78
79pub struct RenderGraphPassColorAttachmentInfo {
80 pub attachment_type: RenderGraphPassAttachmentType,
81 pub clear_color_value: Option<RafxColorClearValue>,
82 pub read_image: Option<RenderGraphImageUsageId>,
83 pub write_image: Option<RenderGraphImageUsageId>,
84}
85
86impl std::fmt::Debug for RenderGraphPassColorAttachmentInfo {
87 fn fmt(
88 &self,
89 f: &mut Formatter<'_>,
90 ) -> std::fmt::Result {
91 f.debug_struct("ColorAttachmentInfo")
92 .field("attachment_type", &self.attachment_type)
93 .field("read_image", &self.read_image)
94 .field("write_image", &self.write_image)
95 .finish()
96 }
97}
98
99pub struct RenderGraphPassDepthAttachmentInfo {
100 pub attachment_type: RenderGraphPassAttachmentType,
101 pub clear_depth_stencil_value: Option<RafxDepthStencilClearValue>,
102 pub read_image: Option<RenderGraphImageUsageId>,
103 pub write_image: Option<RenderGraphImageUsageId>,
104 pub has_depth: bool,
105 pub has_stencil: bool,
106}
107
108impl std::fmt::Debug for RenderGraphPassDepthAttachmentInfo {
109 fn fmt(
110 &self,
111 f: &mut Formatter<'_>,
112 ) -> std::fmt::Result {
113 f.debug_struct("DepthAttachmentInfo")
114 .field("attachment_type", &self.attachment_type)
115 .field("read_image", &self.read_image)
116 .field("write_image", &self.write_image)
117 .finish()
118 }
119}
120
121pub struct RenderGraphPassResolveAttachmentInfo {
122 pub attachment_type: RenderGraphPassAttachmentType,
123 pub write_image: RenderGraphImageUsageId,
124}
125
126impl std::fmt::Debug for RenderGraphPassResolveAttachmentInfo {
127 fn fmt(
128 &self,
129 f: &mut Formatter<'_>,
130 ) -> std::fmt::Result {
131 f.debug_struct("DepthAttachmentInfo")
132 .field("attachment_type", &self.attachment_type)
133 .field("write_image", &self.write_image)
134 .finish()
135 }
136}
137
138pub struct RenderGraphNode {
142 id: RenderGraphNodeId,
143 pub(super) name: Option<RenderGraphNodeName>,
144 pub(super) kind: RenderGraphNodeKind,
145 #[allow(dead_code)]
146 pub(super) queue: RenderGraphQueue,
147 pub(super) can_be_culled: bool,
148
149 pub(super) image_creates: Vec<RenderGraphImageCreate>,
154 pub(super) image_reads: Vec<RenderGraphImageRead>,
155 pub(super) image_modifies: Vec<RenderGraphImageModify>,
156 pub(super) image_copies: Vec<RenderGraphImageCopy>,
157
158 pub(super) buffer_creates: Vec<RenderGraphBufferCreate>,
159 pub(super) buffer_reads: Vec<RenderGraphBufferRead>,
160 pub(super) buffer_modifies: Vec<RenderGraphBufferModify>,
161 pub(super) buffer_copies: Vec<RenderGraphBufferCopy>,
162
163 pub(super) explicit_dependencies: Vec<RenderGraphNodeId>,
165
166 pub(super) color_attachments: Vec<Option<RenderGraphPassColorAttachmentInfo>>,
168 pub(super) depth_attachment: Option<RenderGraphPassDepthAttachmentInfo>,
169 pub(super) resolve_attachments: Vec<Option<RenderGraphPassResolveAttachmentInfo>>,
170 pub(super) sampled_images: Vec<RenderGraphImageUsageId>,
171 pub(super) storage_image_creates: Vec<RenderGraphImageUsageId>,
172 pub(super) storage_image_reads: Vec<RenderGraphImageUsageId>,
173 pub(super) storage_image_modifies: Vec<RenderGraphImageUsageId>,
174 pub(super) copy_src_image_reads: Vec<RenderGraphImageUsageId>,
175 pub(super) copy_dst_image_writes: Vec<RenderGraphImageUsageId>,
176
177 pub(super) vertex_buffer_reads: Vec<RenderGraphBufferUsageId>,
178 pub(super) index_buffer_reads: Vec<RenderGraphBufferUsageId>,
179 pub(super) indirect_buffer_reads: Vec<RenderGraphBufferUsageId>,
180 pub(super) uniform_buffer_reads: Vec<RenderGraphBufferUsageId>,
181 pub(super) storage_buffer_creates: Vec<RenderGraphBufferUsageId>,
182 pub(super) storage_buffer_reads: Vec<RenderGraphBufferUsageId>,
183 pub(super) storage_buffer_modifies: Vec<RenderGraphBufferUsageId>,
184 pub(super) copy_src_buffer_reads: Vec<RenderGraphBufferUsageId>,
185 pub(super) copy_dst_buffer_writes: Vec<RenderGraphBufferUsageId>,
186}
187
188impl std::fmt::Debug for RenderGraphNode {
189 fn fmt(
190 &self,
191 f: &mut Formatter<'_>,
192 ) -> std::fmt::Result {
193 f.debug_struct("RenderGraphNode")
194 .field("id", &self.id)
195 .field("name", &self.name)
196 .field("image_creates", &self.image_creates)
197 .field("image_reads", &self.image_reads)
198 .field("image_modifies", &self.image_modifies)
199 .field("image_copies", &self.image_copies)
200 .field("buffer_creates", &self.buffer_creates)
201 .field("buffer_reads", &self.buffer_reads)
202 .field("buffer_modifies", &self.buffer_modifies)
203 .field("buffer_copies", &self.buffer_copies)
204 .field("explicit_dependencies", &self.explicit_dependencies)
205 .field("color_attachments", &self.color_attachments)
206 .field("depth_attachment", &self.depth_attachment)
207 .field("resolve_attachments", &self.resolve_attachments)
208 .field("sampled_images", &self.sampled_images)
209 .field("storage_image_create", &self.storage_image_creates)
210 .field("storage_image_read", &self.storage_image_reads)
211 .field("storage_image_modify", &self.storage_image_modifies)
212 .field("copy_src_image_reads", &self.copy_src_image_reads)
213 .field("copy_dst_image_writes", &self.copy_dst_image_writes)
214 .field("vertex_buffer_reads", &self.vertex_buffer_reads)
215 .field("index_buffer_reads", &self.index_buffer_reads)
216 .field("indirect_buffer_reads", &self.indirect_buffer_reads)
217 .field("uniform_buffer_reads", &self.uniform_buffer_reads)
218 .field("storage_buffer_creates", &self.storage_buffer_creates)
219 .field("storage_buffer_reads", &self.storage_buffer_reads)
220 .field("storage_buffer_modifies", &self.storage_buffer_modifies)
221 .field("copy_src_buffer_reads", &self.copy_src_buffer_reads)
222 .field("copy_dst_buffer_writes", &self.copy_dst_buffer_writes)
223 .finish()
224 }
225}
226
227impl RenderGraphNode {
228 pub(super) fn new(
230 id: RenderGraphNodeId,
231 name: Option<RenderGraphNodeName>,
232 kind: RenderGraphNodeKind,
233 queue: RenderGraphQueue,
234 ) -> Self {
235 RenderGraphNode {
236 id,
237 name,
238 kind,
239 queue,
240 can_be_culled: true,
241 image_creates: Default::default(),
242 image_reads: Default::default(),
243 image_modifies: Default::default(),
244 image_copies: Default::default(),
245 buffer_creates: Default::default(),
246 buffer_reads: Default::default(),
247 buffer_modifies: Default::default(),
248 buffer_copies: Default::default(),
249 explicit_dependencies: Default::default(),
250 color_attachments: Default::default(),
251 depth_attachment: Default::default(),
252 resolve_attachments: Default::default(),
253 sampled_images: Default::default(),
254 storage_image_creates: Default::default(),
255 storage_image_reads: Default::default(),
256 storage_image_modifies: Default::default(),
257 copy_src_image_reads: Default::default(),
258 copy_dst_image_writes: Default::default(),
259 vertex_buffer_reads: Default::default(),
260 index_buffer_reads: Default::default(),
261 indirect_buffer_reads: Default::default(),
262 uniform_buffer_reads: Default::default(),
263 storage_buffer_creates: Default::default(),
264 storage_buffer_reads: Default::default(),
265 storage_buffer_modifies: Default::default(),
266 copy_src_buffer_reads: Default::default(),
267 copy_dst_buffer_writes: Default::default(),
268 }
269 }
270
271 pub fn id(&self) -> RenderGraphNodeId {
272 self.id
273 }
274
275 pub fn name(&self) -> Option<RenderGraphNodeName> {
276 self.name
277 }
278}