rafx_framework/graph/
graph_node.rs

1use super::*;
2use crate::graph::graph_builder::RenderGraphQueue;
3use rafx_api::{RafxColorClearValue, RafxDepthStencilClearValue};
4use std::fmt::Formatter;
5
6//
7// Nodes
8//
9#[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
138//
139// Graph nodes represent a "schedulable" event, generally a renderpass. It reads/writes resources.
140//
141pub 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    // This stores creates/reads/modifies for all images/buffers.. more detailed information about
150    // them may be included in other lists (like color_attachments). This is mainly used to
151    // determine image/buffer reuse compatibility across nodes. NOT for barriers/resource state
152    // managements
153    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    // Used when we want to force one node to execute before this one
164    pub(super) explicit_dependencies: Vec<RenderGraphNodeId>,
165
166    // Attachments are indexed by attachment index
167    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    // Create a render node with the given ID.
229    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}