Skip to content

Commit f930970

Browse files
committed
updated remaining post-processing nodes to make use of the new builder API
updated builder API to support arbitrary attachments TrackedRenderPass methods can be chained associated TrackedRenderPass with the view Entity added render_phase method to TrackedRenderPass added TrackedRenderPassBuilder changed set_camera_viewport method to take &Camera instead of &Viewport
1 parent e22572d commit f930970

File tree

9 files changed

+362
-262
lines changed

9 files changed

+362
-262
lines changed

crates/bevy_core_pipeline/src/clear_color.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use bevy_derive::{Deref, DerefMut};
22
use bevy_ecs::prelude::*;
33
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
4+
use bevy_render::render_resource::{LoadOp, RawColor};
45
use bevy_render::{color::Color, extract_resource::ExtractResource};
56
use serde::{Deserialize, Serialize};
67

@@ -13,6 +14,17 @@ pub enum ClearColorConfig {
1314
None,
1415
}
1516

17+
impl ClearColorConfig {
18+
#[inline]
19+
pub fn load_op(&self, world: &World) -> LoadOp<RawColor> {
20+
match self {
21+
ClearColorConfig::Default => LoadOp::Clear(world.resource::<ClearColor>().0.into()),
22+
ClearColorConfig::Custom(color) => LoadOp::Clear((*color).into()),
23+
ClearColorConfig::None => LoadOp::Load,
24+
}
25+
}
26+
}
27+
1628
/// A [`Resource`] that stores the color that is used to clear the screen between frames.
1729
///
1830
/// This color appears as the "background" color for simple apps,

crates/bevy_core_pipeline/src/core_2d/main_pass_2d_node.rs

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
use crate::{
2-
clear_color::{ClearColor, ClearColorConfig},
3-
core_2d::{camera_2d::Camera2d, Transparent2d},
4-
};
1+
use crate::core_2d::{camera_2d::Camera2d, Transparent2d};
52
use bevy_ecs::prelude::*;
63
use bevy_render::{
74
camera::ExtractedCamera,
85
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
96
render_phase::RenderPhase,
10-
render_resource::{LoadOp, Operations, RenderPassDescriptor},
117
renderer::RenderContext,
128
view::{ExtractedView, ViewTarget},
139
};
@@ -63,46 +59,31 @@ impl Node for MainPass2dNode {
6359
#[cfg(feature = "trace")]
6460
let _main_pass_2d = info_span!("main_pass_2d").entered();
6561

66-
let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
67-
label: Some("main_pass_2d"),
68-
color_attachments: &[Some(target.get_color_attachment(Operations {
69-
load: match camera_2d.clear_color {
70-
ClearColorConfig::Default => {
71-
LoadOp::Clear(world.resource::<ClearColor>().0.into())
72-
}
73-
ClearColorConfig::Custom(color) => LoadOp::Clear(color.into()),
74-
ClearColorConfig::None => LoadOp::Load,
75-
},
76-
store: true,
77-
}))],
78-
depth_stencil_attachment: None,
79-
});
80-
81-
if let Some(viewport) = camera.viewport.as_ref() {
82-
render_pass.set_camera_viewport(viewport);
83-
}
84-
85-
transparent_phase.render(&mut render_pass, world, view_entity);
62+
render_context
63+
.render_pass(view_entity)
64+
.set_label("main_pass_2d")
65+
.add_view_target(target)
66+
.set_color_ops(camera_2d.clear_color.load_op(world), true)
67+
.begin()
68+
.set_camera_viewport(camera)
69+
.render_phase(transparent_phase, world);
8670
}
8771

8872
// WebGL2 quirk: if ending with a render pass with a custom viewport, the viewport isn't
8973
// reset for the next render pass so add an empty render pass without a custom viewport
9074
#[cfg(feature = "webgl")]
9175
if camera.viewport.is_some() {
76+
use bevy_render::render_resource::LoadOp;
77+
9278
#[cfg(feature = "trace")]
9379
let _reset_viewport_pass_2d = info_span!("reset_viewport_pass_2d").entered();
94-
let pass_descriptor = RenderPassDescriptor {
95-
label: Some("reset_viewport_pass_2d"),
96-
color_attachments: &[Some(target.get_color_attachment(Operations {
97-
load: LoadOp::Load,
98-
store: true,
99-
}))],
100-
depth_stencil_attachment: None,
101-
};
10280

10381
render_context
104-
.command_encoder()
105-
.begin_render_pass(&pass_descriptor);
82+
.render_pass(view_entity)
83+
.set_label("reset_view_port_pass_2d")
84+
.add_view_target(target)
85+
.set_color_ops(LoadOp::Load, true)
86+
.begin();
10687
}
10788

10889
Ok(())

crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs

Lines changed: 50 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::{
2-
clear_color::{ClearColor, ClearColorConfig},
32
core_3d::{AlphaMask3d, Camera3d, Opaque3d, Transparent3d},
43
prepass::{DepthPrepass, NormalPrepass},
54
};
@@ -8,15 +7,13 @@ use bevy_render::{
87
camera::ExtractedCamera,
98
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
109
render_phase::RenderPhase,
11-
render_resource::{LoadOp, Operations, RenderPassDepthStencilAttachment, RenderPassDescriptor},
10+
render_resource::LoadOp,
1211
renderer::RenderContext,
1312
view::{ExtractedView, ViewDepthTexture, ViewTarget},
1413
};
1514
#[cfg(feature = "trace")]
1615
use bevy_utils::tracing::info_span;
1716

18-
use super::Camera3dDepthLoadOp;
19-
2017
pub struct MainPass3dNode {
2118
query: QueryState<
2219
(
@@ -82,44 +79,24 @@ impl Node for MainPass3dNode {
8279
#[cfg(feature = "trace")]
8380
let _main_opaque_pass_3d_span = info_span!("main_opaque_pass_3d").entered();
8481

85-
let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
86-
label: Some("main_opaque_pass_3d"),
87-
// NOTE: The opaque pass loads the color
88-
// buffer as well as writing to it.
89-
color_attachments: &[Some(target.get_color_attachment(Operations {
90-
load: match camera_3d.clear_color {
91-
ClearColorConfig::Default => {
92-
LoadOp::Clear(world.resource::<ClearColor>().0.into())
93-
}
94-
ClearColorConfig::Custom(color) => LoadOp::Clear(color.into()),
95-
ClearColorConfig::None => LoadOp::Load,
96-
},
97-
store: true,
98-
}))],
99-
depth_stencil_attachment: Some(RenderPassDepthStencilAttachment {
100-
view: &depth.view,
101-
// NOTE: The opaque main pass loads the depth buffer and possibly overwrites it
102-
depth_ops: Some(Operations {
103-
load: if depth_prepass.is_some() || normal_prepass.is_some() {
104-
// if any prepass runs, it will generate a depth buffer so we should use it,
105-
// even if only the normal_prepass is used.
106-
Camera3dDepthLoadOp::Load
107-
} else {
108-
// NOTE: 0.0 is the far plane due to bevy's use of reverse-z projections.
109-
camera_3d.depth_load_op.clone()
110-
}
111-
.into(),
112-
store: true,
113-
}),
114-
stencil_ops: None,
115-
}),
116-
});
117-
118-
if let Some(viewport) = camera.viewport.as_ref() {
119-
render_pass.set_camera_viewport(viewport);
120-
}
121-
122-
opaque_phase.render(&mut render_pass, world, view_entity);
82+
let depth_load_op = if depth_prepass.is_some() || normal_prepass.is_some() {
83+
// if any prepass runs, it will generate a depth buffer so we should use it,
84+
// even if only the normal_prepass is used.
85+
LoadOp::Load
86+
} else {
87+
camera_3d.depth_load_op.clone().into()
88+
};
89+
90+
render_context
91+
.render_pass(view_entity)
92+
.set_label("main_opaque_pass_3d")
93+
.add_view_target(target)
94+
.set_color_ops(camera_3d.clear_color.load_op(world), true)
95+
.set_depth_stencil_attachment(&depth.view)
96+
.set_depth_ops(depth_load_op, true)
97+
.begin()
98+
.set_camera_viewport(camera)
99+
.render_phase(opaque_phase, world);
123100
}
124101

125102
if !alpha_mask_phase.items.is_empty() {
@@ -128,29 +105,16 @@ impl Node for MainPass3dNode {
128105
#[cfg(feature = "trace")]
129106
let _main_alpha_mask_pass_3d_span = info_span!("main_alpha_mask_pass_3d").entered();
130107

131-
let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
132-
label: Some("main_alpha_mask_pass_3d"),
133-
// NOTE: The alpha_mask pass loads the color buffer as well as overwriting it where appropriate.
134-
color_attachments: &[Some(target.get_color_attachment(Operations {
135-
load: LoadOp::Load,
136-
store: true,
137-
}))],
138-
depth_stencil_attachment: Some(RenderPassDepthStencilAttachment {
139-
view: &depth.view,
140-
// NOTE: The alpha mask pass loads the depth buffer and possibly overwrites it
141-
depth_ops: Some(Operations {
142-
load: LoadOp::Load,
143-
store: true,
144-
}),
145-
stencil_ops: None,
146-
}),
147-
});
148-
149-
if let Some(viewport) = camera.viewport.as_ref() {
150-
render_pass.set_camera_viewport(viewport);
151-
}
152-
153-
alpha_mask_phase.render(&mut render_pass, world, view_entity);
108+
render_context
109+
.render_pass(view_entity)
110+
.set_label("main_alpha_mask_pass_3d")
111+
.add_view_target(target)
112+
.set_color_ops(LoadOp::Load, true)
113+
.set_depth_stencil_attachment(&depth.view)
114+
.set_depth_ops(LoadOp::Load, true)
115+
.begin()
116+
.set_camera_viewport(camera)
117+
.render_phase(alpha_mask_phase, world);
154118
}
155119

156120
if !transparent_phase.items.is_empty() {
@@ -159,34 +123,22 @@ impl Node for MainPass3dNode {
159123
#[cfg(feature = "trace")]
160124
let _main_transparent_pass_3d_span = info_span!("main_transparent_pass_3d").entered();
161125

162-
let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
163-
label: Some("main_transparent_pass_3d"),
164-
// NOTE: The transparent pass loads the color buffer as well as overwriting it where appropriate.
165-
color_attachments: &[Some(target.get_color_attachment(Operations {
166-
load: LoadOp::Load,
167-
store: true,
168-
}))],
169-
depth_stencil_attachment: Some(RenderPassDepthStencilAttachment {
170-
view: &depth.view,
171-
// NOTE: For the transparent pass we load the depth buffer. There should be no
172-
// need to write to it, but store is set to `true` as a workaround for issue #3776,
173-
// https://github.com/bevyengine/bevy/issues/3776
174-
// so that wgpu does not clear the depth buffer.
175-
// As the opaque and alpha mask passes run first, opaque meshes can occlude
176-
// transparent ones.
177-
depth_ops: Some(Operations {
178-
load: LoadOp::Load,
179-
store: true,
180-
}),
181-
stencil_ops: None,
182-
}),
183-
});
184-
185-
if let Some(viewport) = camera.viewport.as_ref() {
186-
render_pass.set_camera_viewport(viewport);
187-
}
188-
189-
transparent_phase.render(&mut render_pass, world, view_entity);
126+
// NOTE: For the transparent pass we load the depth buffer. There should be no
127+
// need to write to it, but store is set to `true` as a workaround for issue #3776,
128+
// https://github.com/bevyengine/bevy/issues/3776
129+
// so that wgpu does not clear the depth buffer.
130+
// As the opaque and alpha mask passes run first, opaque meshes can occlude
131+
// transparent ones.
132+
render_context
133+
.render_pass(view_entity)
134+
.set_label("main_transparent_pass_3d")
135+
.add_view_target(target)
136+
.set_color_ops(LoadOp::Load, true)
137+
.set_depth_stencil_attachment(&depth.view)
138+
.set_depth_ops(LoadOp::Load, true)
139+
.begin()
140+
.set_camera_viewport(camera)
141+
.render_phase(transparent_phase, world);
190142
}
191143

192144
// WebGL2 quirk: if ending with a render pass with a custom viewport, the viewport isn't
@@ -195,18 +147,13 @@ impl Node for MainPass3dNode {
195147
if camera.viewport.is_some() {
196148
#[cfg(feature = "trace")]
197149
let _reset_viewport_pass_3d = info_span!("reset_viewport_pass_3d").entered();
198-
let pass_descriptor = RenderPassDescriptor {
199-
label: Some("reset_viewport_pass_3d"),
200-
color_attachments: &[Some(target.get_color_attachment(Operations {
201-
load: LoadOp::Load,
202-
store: true,
203-
}))],
204-
depth_stencil_attachment: None,
205-
};
206150

207151
render_context
208-
.command_encoder()
209-
.begin_render_pass(&pass_descriptor);
152+
.render_pass(view_entity)
153+
.set_label("reset_viewport_pass_3d")
154+
.add_view_target(target)
155+
.set_color_ops(LoadOp::Load, true)
156+
.begin();
210157
}
211158

212159
Ok(())

crates/bevy_core_pipeline/src/fxaa/node.rs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
use std::sync::Mutex;
2-
31
use crate::fxaa::{CameraFxaaPipeline, Fxaa, FxaaPipeline};
4-
use bevy_ecs::prelude::*;
5-
use bevy_ecs::query::QueryState;
2+
use bevy_ecs::{prelude::*, query::QueryState};
63
use bevy_render::{
74
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
85
render_resource::{
9-
BindGroup, BindGroupDescriptor, BindGroupEntry, BindingResource, FilterMode, Operations,
10-
PipelineCache, RenderPassColorAttachment, RenderPassDescriptor, SamplerDescriptor,
11-
TextureViewId,
6+
BindGroup, BindGroupDescriptor, BindGroupEntry, BindingResource, FilterMode, PipelineCache,
7+
SamplerDescriptor, TextureViewId,
128
},
139
renderer::RenderContext,
1410
view::{ExtractedView, ViewTarget},
1511
};
1612
use bevy_utils::default;
13+
use std::sync::Mutex;
1714

1815
pub struct FxaaNode {
1916
query: QueryState<
@@ -109,23 +106,14 @@ impl Node for FxaaNode {
109106
}
110107
};
111108

112-
let pass_descriptor = RenderPassDescriptor {
113-
label: Some("fxaa_pass"),
114-
color_attachments: &[Some(RenderPassColorAttachment {
115-
view: destination,
116-
resolve_target: None,
117-
ops: Operations::default(),
118-
})],
119-
depth_stencil_attachment: None,
120-
};
121-
122-
let mut render_pass = render_context
123-
.command_encoder()
124-
.begin_render_pass(&pass_descriptor);
125-
126-
render_pass.set_pipeline(pipeline);
127-
render_pass.set_bind_group(0, bind_group, &[]);
128-
render_pass.draw(0..3, 0..1);
109+
render_context
110+
.render_pass(view_entity)
111+
.set_label("fxaa_pass")
112+
.add_color_attachment(destination)
113+
.begin()
114+
.set_pipeline(pipeline)
115+
.set_bind_group(0, bind_group, &[])
116+
.draw(0..3, 0..1);
129117

130118
Ok(())
131119
}

crates/bevy_pbr/src/render/light.rs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1729,21 +1729,13 @@ impl Node for ShadowPassNode {
17291729
continue;
17301730
}
17311731

1732-
let mut render_pass =
1733-
render_context.begin_tracked_render_pass(RenderPassDescriptor {
1734-
label: Some(&view_light.pass_name),
1735-
color_attachments: &[],
1736-
depth_stencil_attachment: Some(RenderPassDepthStencilAttachment {
1737-
view: &view_light.depth_texture_view,
1738-
depth_ops: Some(Operations {
1739-
load: LoadOp::Clear(0.0),
1740-
store: true,
1741-
}),
1742-
stencil_ops: None,
1743-
}),
1744-
});
1745-
1746-
shadow_phase.render(&mut render_pass, world, view_light_entity);
1732+
render_context
1733+
.render_pass(view_entity)
1734+
.set_label(&view_light.pass_name)
1735+
.set_depth_stencil_attachment(&view_light.depth_texture_view)
1736+
.set_depth_ops(LoadOp::Clear(0.0), true)
1737+
.begin()
1738+
.render_phase(shadow_phase, world);
17471739
}
17481740
}
17491741

0 commit comments

Comments
 (0)