ranim_render/graph/view/
vitem_depth.rs

1use crate::{
2    RenderContext, RenderTextures,
3    graph::{RenderPacketsQuery, view::ViewRenderNodeTrait},
4    pipelines::VItemDepthPipeline,
5    primitives::viewport::ViewportGpuPacket,
6};
7
8pub struct MergedVItemDepthNode;
9
10impl ViewRenderNodeTrait for MergedVItemDepthNode {
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 Depth Render Pass");
30
31        {
32            let RenderTextures {
33                depth_stencil_view, ..
34            } = ctx.render_textures;
35            let rpass_desc = wgpu::RenderPassDescriptor {
36                label: Some("Merged VItem Depth Render Pass"),
37                color_attachments: &[],
38                depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
39                    view: depth_stencil_view,
40                    depth_ops: Some(wgpu::Operations {
41                        load: wgpu::LoadOp::Load,
42                        store: wgpu::StoreOp::Store,
43                    }),
44                    stencil_ops: None,
45                }),
46                timestamp_writes: None,
47                occlusion_query_set: None,
48            };
49            #[cfg(feature = "profiling")]
50            let mut rpass =
51                encoder.scoped_render_pass("Merged VItem Depth Render Pass", rpass_desc);
52            #[cfg(not(feature = "profiling"))]
53            let mut rpass = encoder.begin_render_pass(&rpass_desc);
54            rpass.set_pipeline(
55                &ctx.pipelines
56                    .get_or_init::<VItemDepthPipeline>(ctx.wgpu_ctx),
57            );
58            rpass.set_bind_group(0, &ctx.resolution_info.bind_group, &[]);
59            rpass.set_bind_group(1, &viewport.uniforms_bind_group.bind_group, &[]);
60            rpass.set_bind_group(2, merged.render_bind_group.as_ref().unwrap(), &[]);
61            rpass.draw(0..4, 0..merged.item_count());
62        }
63    }
64}