ranim_render/graph/view/
vitem_compute.rs

1use crate::{
2    RenderContext,
3    graph::{RenderPacketsQuery, view::ViewRenderNodeTrait},
4    pipelines::VItemComputePipeline,
5    primitives::viewport::ViewportGpuPacket,
6};
7
8pub struct MergedVItemComputeNode;
9
10impl ViewRenderNodeTrait for MergedVItemComputeNode {
11    type Query = ();
12
13    fn run(
14        &self,
15        #[cfg(not(feature = "profiling"))] encoder: &mut wgpu::CommandEncoder,
16        #[cfg(feature = "profiling")] encoder: &mut wgpu_profiler::Scope<'_, wgpu::CommandEncoder>,
17        _packets: <Self::Query as RenderPacketsQuery>::Output<'_>,
18        ctx: RenderContext,
19        _viewport: &ViewportGpuPacket,
20    ) {
21        let Some(merged) = ctx.merged_buffer else {
22            return;
23        };
24        if merged.item_count() == 0 {
25            return;
26        }
27
28        #[cfg(feature = "profiling")]
29        let mut encoder = encoder.scope("Merged Compute Pass");
30
31        {
32            #[cfg(feature = "profiling")]
33            let mut cpass = encoder.scoped_compute_pass("Merged VItem Map Points Compute Pass");
34            #[cfg(not(feature = "profiling"))]
35            let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor {
36                label: Some("Merged VItem Map Points Compute Pass"),
37                timestamp_writes: None,
38            });
39            cpass.set_pipeline(
40                &ctx.pipelines
41                    .get_or_init::<VItemComputePipeline>(ctx.wgpu_ctx),
42            );
43            cpass.set_bind_group(0, merged.compute_bind_group.as_ref().unwrap(), &[]);
44            cpass.dispatch_workgroups(merged.total_points().div_ceil(256), 1, 1);
45        }
46    }
47}