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