Skip to content

Commit e245a26

Browse files
committed
extract common RenderPhase render logic
1 parent aa146b3 commit e245a26

File tree

5 files changed

+64
-87
lines changed

5 files changed

+64
-87
lines changed

crates/bevy_core_pipeline/src/core_2d/main_pass_2d_node.rs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use bevy_ecs::prelude::*;
66
use bevy_render::{
77
camera::ExtractedCamera,
88
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
9-
render_phase::{DrawFunctions, RenderPhase, TrackedRenderPass},
9+
render_phase::RenderPhase,
1010
render_resource::{LoadOp, Operations, RenderPassDescriptor},
1111
renderer::RenderContext,
1212
view::{ExtractedView, ViewTarget},
@@ -77,22 +77,13 @@ impl Node for MainPass2dNode {
7777
depth_stencil_attachment: None,
7878
};
7979

80-
let draw_functions = world.resource::<DrawFunctions<Transparent2d>>();
81-
82-
let render_pass = render_context
83-
.command_encoder
84-
.begin_render_pass(&pass_descriptor);
85-
86-
let mut draw_functions = draw_functions.write();
87-
draw_functions.prepare(world);
88-
let mut tracked_pass = TrackedRenderPass::new(render_pass);
89-
if let Some(viewport) = camera.viewport.as_ref() {
90-
tracked_pass.set_camera_viewport(viewport);
91-
}
92-
for item in &transparent_phase.items {
93-
let draw_function = draw_functions.get_mut(item.draw_function).unwrap();
94-
draw_function.draw(world, &mut tracked_pass, view_entity, item);
95-
}
80+
transparent_phase.render(
81+
world,
82+
render_context,
83+
view_entity,
84+
camera.viewport.as_ref(),
85+
pass_descriptor,
86+
);
9687
}
9788

9889
// WebGL2 quirk: if ending with a render pass with a custom viewport, the viewport isn't

crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs

Lines changed: 22 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use bevy_ecs::prelude::*;
66
use bevy_render::{
77
camera::ExtractedCamera,
88
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
9-
render_phase::{DrawFunctions, RenderPhase, TrackedRenderPass},
9+
render_phase::RenderPhase,
1010
render_resource::{LoadOp, Operations, RenderPassDepthStencilAttachment, RenderPassDescriptor},
1111
renderer::RenderContext,
1212
view::{ExtractedView, ViewDepthTexture, ViewTarget},
@@ -95,21 +95,13 @@ impl Node for MainPass3dNode {
9595
}),
9696
};
9797

98-
let draw_functions = world.resource::<DrawFunctions<Opaque3d>>();
99-
100-
let render_pass = render_context
101-
.command_encoder
102-
.begin_render_pass(&pass_descriptor);
103-
let mut draw_functions = draw_functions.write();
104-
draw_functions.prepare(world);
105-
let mut tracked_pass = TrackedRenderPass::new(render_pass);
106-
if let Some(viewport) = camera.viewport.as_ref() {
107-
tracked_pass.set_camera_viewport(viewport);
108-
}
109-
for item in &opaque_phase.items {
110-
let draw_function = draw_functions.get_mut(item.draw_function).unwrap();
111-
draw_function.draw(world, &mut tracked_pass, view_entity, item);
112-
}
98+
opaque_phase.render(
99+
world,
100+
render_context,
101+
view_entity,
102+
camera.viewport.as_ref(),
103+
pass_descriptor,
104+
);
113105
}
114106

115107
if !alpha_mask_phase.items.is_empty() {
@@ -135,21 +127,13 @@ impl Node for MainPass3dNode {
135127
}),
136128
};
137129

138-
let draw_functions = world.resource::<DrawFunctions<AlphaMask3d>>();
139-
140-
let render_pass = render_context
141-
.command_encoder
142-
.begin_render_pass(&pass_descriptor);
143-
let mut draw_functions = draw_functions.write();
144-
draw_functions.prepare(world);
145-
let mut tracked_pass = TrackedRenderPass::new(render_pass);
146-
if let Some(viewport) = camera.viewport.as_ref() {
147-
tracked_pass.set_camera_viewport(viewport);
148-
}
149-
for item in &alpha_mask_phase.items {
150-
let draw_function = draw_functions.get_mut(item.draw_function).unwrap();
151-
draw_function.draw(world, &mut tracked_pass, view_entity, item);
152-
}
130+
alpha_mask_phase.render(
131+
world,
132+
render_context,
133+
view_entity,
134+
camera.viewport.as_ref(),
135+
pass_descriptor,
136+
);
153137
}
154138

155139
if !transparent_phase.items.is_empty() {
@@ -180,21 +164,13 @@ impl Node for MainPass3dNode {
180164
}),
181165
};
182166

183-
let draw_functions = world.resource::<DrawFunctions<Transparent3d>>();
184-
185-
let render_pass = render_context
186-
.command_encoder
187-
.begin_render_pass(&pass_descriptor);
188-
let mut draw_functions = draw_functions.write();
189-
draw_functions.prepare(world);
190-
let mut tracked_pass = TrackedRenderPass::new(render_pass);
191-
if let Some(viewport) = camera.viewport.as_ref() {
192-
tracked_pass.set_camera_viewport(viewport);
193-
}
194-
for item in &transparent_phase.items {
195-
let draw_function = draw_functions.get_mut(item.draw_function).unwrap();
196-
draw_function.draw(world, &mut tracked_pass, view_entity, item);
197-
}
167+
transparent_phase.render(
168+
world,
169+
render_context,
170+
view_entity,
171+
camera.viewport.as_ref(),
172+
pass_descriptor,
173+
);
198174
}
199175

200176
// WebGL2 quirk: if ending with a render pass with a custom viewport, the viewport isn't

crates/bevy_pbr/src/render/light.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,17 +1783,7 @@ impl Node for ShadowPassNode {
17831783
}),
17841784
};
17851785

1786-
let draw_functions = world.resource::<DrawFunctions<Shadow>>();
1787-
let render_pass = render_context
1788-
.command_encoder
1789-
.begin_render_pass(&pass_descriptor);
1790-
let mut draw_functions = draw_functions.write();
1791-
draw_functions.prepare(world);
1792-
let mut tracked_pass = TrackedRenderPass::new(render_pass);
1793-
for item in &shadow_phase.items {
1794-
let draw_function = draw_functions.get_mut(item.draw_function).unwrap();
1795-
draw_function.draw(world, &mut tracked_pass, view_light_entity, item);
1796-
}
1786+
shadow_phase.render(world, render_context, view_entity, None, pass_descriptor);
17971787
}
17981788
}
17991789

crates/bevy_render/src/render_phase/mod.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
mod draw;
22
mod draw_state;
33

4+
use bevy_ecs::entity::Entity;
45
pub use draw::*;
56
pub use draw_state::*;
7+
use wgpu::RenderPassDescriptor;
68

9+
use crate::camera::Viewport;
10+
use crate::renderer::RenderContext;
711
use bevy_ecs::prelude::{Component, Query};
12+
use bevy_ecs::world::World;
813

914
/// A resource to collect and sort draw requests for specific [`PhaseItems`](PhaseItem).
1015
#[derive(Component)]
@@ -29,6 +34,33 @@ impl<I: PhaseItem> RenderPhase<I> {
2934
pub fn sort(&mut self) {
3035
I::sort(&mut self.items);
3136
}
37+
38+
pub fn render(
39+
&self,
40+
world: &World,
41+
render_context: &mut RenderContext,
42+
view: Entity,
43+
viewport: Option<&Viewport>,
44+
pass_descriptor: RenderPassDescriptor,
45+
) {
46+
let render_pass = render_context
47+
.command_encoder
48+
.begin_render_pass(&pass_descriptor);
49+
let mut render_pass = TrackedRenderPass::new(render_pass);
50+
51+
if let Some(viewport) = viewport {
52+
render_pass.set_camera_viewport(viewport);
53+
}
54+
55+
let draw_functions = world.resource::<DrawFunctions<I>>();
56+
let mut draw_functions = draw_functions.write();
57+
draw_functions.prepare(world);
58+
59+
for item in &self.items {
60+
let draw_function = draw_functions.get_mut(item.draw_function()).unwrap();
61+
draw_function.draw(world, &mut render_pass, view, item);
62+
}
63+
}
3264
}
3365

3466
impl<I: BatchedPhaseItem> RenderPhase<I> {

crates/bevy_ui/src/render/render_pass.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,7 @@ impl Node for UiPassNode {
8585
depth_stencil_attachment: None,
8686
};
8787

88-
let draw_functions = world.resource::<DrawFunctions<TransparentUi>>();
89-
90-
let render_pass = render_context
91-
.command_encoder
92-
.begin_render_pass(&pass_descriptor);
93-
94-
let mut draw_functions = draw_functions.write();
95-
draw_functions.prepare(world);
96-
let mut tracked_pass = TrackedRenderPass::new(render_pass);
97-
for item in &transparent_phase.items {
98-
let draw_function = draw_functions.get_mut(item.draw_function).unwrap();
99-
draw_function.draw(world, &mut tracked_pass, view_entity, item);
100-
}
88+
transparent_phase.render(world, render_context, view_entity, None, pass_descriptor);
10189
Ok(())
10290
}
10391
}

0 commit comments

Comments
 (0)