ranim_render/graph/view/
vitem_compute.rs1use 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}