Skip to content

Commit 5bef128

Browse files
committed
Use RenderStartup for the simple cases in bevy_pbr.
1 parent 0ee9377 commit 5bef128

File tree

7 files changed

+197
-221
lines changed

7 files changed

+197
-221
lines changed

crates/bevy_pbr/src/deferred/mod.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
};
88
use crate::{DistanceFog, MeshPipelineKey, ViewFogUniformOffset, ViewLightsUniformOffset};
99
use bevy_app::prelude::*;
10-
use bevy_asset::{embedded_asset, load_embedded_asset, Handle};
10+
use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle};
1111
use bevy_core_pipeline::{
1212
core_3d::graph::{Core3d, Node3d},
1313
deferred::{
@@ -19,6 +19,7 @@ use bevy_core_pipeline::{
1919
use bevy_ecs::{prelude::*, query::QueryItem};
2020
use bevy_image::BevyDefault as _;
2121
use bevy_light::{EnvironmentMapLight, ShadowFilteringMethod};
22+
use bevy_render::RenderStartup;
2223
use bevy_render::{
2324
extract_component::{
2425
ComponentUniforms, ExtractComponent, ExtractComponentPlugin, UniformComponentPlugin,
@@ -104,6 +105,7 @@ impl Plugin for DeferredPbrLightingPlugin {
104105

105106
render_app
106107
.init_resource::<SpecializedRenderPipelines<DeferredLightingLayout>>()
108+
.add_systems(RenderStartup, init_deferred_lighting_layout)
107109
.add_systems(
108110
Render,
109111
(prepare_deferred_lighting_pipelines.in_set(RenderSystems::Prepare),),
@@ -121,14 +123,6 @@ impl Plugin for DeferredPbrLightingPlugin {
121123
),
122124
);
123125
}
124-
125-
fn finish(&self, app: &mut App) {
126-
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
127-
return;
128-
};
129-
130-
render_app.init_resource::<DeferredLightingLayout>();
131-
}
132126
}
133127

134128
#[derive(Default)]
@@ -394,22 +388,27 @@ impl SpecializedRenderPipeline for DeferredLightingLayout {
394388
}
395389
}
396390

397-
impl FromWorld for DeferredLightingLayout {
398-
fn from_world(world: &mut World) -> Self {
399-
let render_device = world.resource::<RenderDevice>();
400-
let layout = render_device.create_bind_group_layout(
401-
"deferred_lighting_layout",
402-
&BindGroupLayoutEntries::single(
403-
ShaderStages::VERTEX_FRAGMENT,
404-
uniform_buffer::<PbrDeferredLightingDepthId>(false),
405-
),
406-
);
407-
Self {
408-
mesh_pipeline: world.resource::<MeshPipeline>().clone(),
409-
bind_group_layout_2: layout,
410-
deferred_lighting_shader: load_embedded_asset!(world, "deferred_lighting.wgsl"),
411-
}
412-
}
391+
pub fn init_deferred_lighting_layout(
392+
mut commands: Commands,
393+
render_device: Res<RenderDevice>,
394+
mesh_pipeline: Res<MeshPipeline>,
395+
asset_server: Res<AssetServer>,
396+
) {
397+
let layout = render_device.create_bind_group_layout(
398+
"deferred_lighting_layout",
399+
&BindGroupLayoutEntries::single(
400+
ShaderStages::VERTEX_FRAGMENT,
401+
uniform_buffer::<PbrDeferredLightingDepthId>(false),
402+
),
403+
);
404+
commands.insert_resource(DeferredLightingLayout {
405+
mesh_pipeline: mesh_pipeline.clone(),
406+
bind_group_layout_2: layout,
407+
deferred_lighting_shader: load_embedded_asset!(
408+
asset_server.as_ref(),
409+
"deferred_lighting.wgsl"
410+
),
411+
});
413412
}
414413

415414
pub fn insert_deferred_lighting_pass_id_component(

crates/bevy_pbr/src/light_probe/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,7 @@ impl Plugin for LightProbePlugin {
289289
load_shader_library!(app, "irradiance_volume.wgsl");
290290

291291
app.add_plugins(ExtractInstancesPlugin::<EnvironmentMapIds>::new());
292-
}
293292

294-
fn finish(&self, app: &mut App) {
295293
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
296294
return;
297295
};

crates/bevy_pbr/src/lightmap/mod.rs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ use bevy_ecs::{
4242
reflect::ReflectComponent,
4343
resource::Resource,
4444
schedule::IntoScheduleConfigs,
45-
system::{Query, Res, ResMut},
46-
world::{FromWorld, World},
45+
system::{Commands, Query, Res, ResMut},
4746
};
4847
use bevy_image::Image;
4948
use bevy_math::{uvec2, vec4, Rect, UVec2};
@@ -57,7 +56,7 @@ use bevy_render::{
5756
sync_world::MainEntity,
5857
texture::{FallbackImage, GpuImage},
5958
view::ViewVisibility,
60-
Extract, ExtractSchedule, RenderApp,
59+
Extract, ExtractSchedule, RenderApp, RenderStartup,
6160
};
6261
use bevy_render::{renderer::RenderDevice, sync_world::MainEntityHashMap};
6362
use bevy_utils::default;
@@ -186,17 +185,16 @@ pub struct LightmapSlotIndex(pub(crate) NonMaxU16);
186185
impl Plugin for LightmapPlugin {
187186
fn build(&self, app: &mut App) {
188187
load_shader_library!(app, "lightmap.wgsl");
189-
}
190188

191-
fn finish(&self, app: &mut App) {
192189
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
193190
return;
194191
};
195-
196-
render_app.init_resource::<RenderLightmaps>().add_systems(
197-
ExtractSchedule,
198-
extract_lightmaps.after(MeshExtractionSystems),
199-
);
192+
render_app
193+
.add_systems(RenderStartup, init_render_lightmaps)
194+
.add_systems(
195+
ExtractSchedule,
196+
extract_lightmaps.after(MeshExtractionSystems),
197+
);
200198
}
201199
}
202200

@@ -334,21 +332,20 @@ impl Default for Lightmap {
334332
}
335333
}
336334

337-
impl FromWorld for RenderLightmaps {
338-
fn from_world(world: &mut World) -> Self {
339-
let render_device = world.resource::<RenderDevice>();
340-
let render_adapter = world.resource::<RenderAdapter>();
341-
342-
let bindless_supported = binding_arrays_are_usable(render_device, render_adapter);
343-
344-
RenderLightmaps {
345-
render_lightmaps: default(),
346-
slabs: vec![],
347-
free_slabs: FixedBitSet::new(),
348-
pending_lightmaps: default(),
349-
bindless_supported,
350-
}
351-
}
335+
pub fn init_render_lightmaps(
336+
mut commands: Commands,
337+
render_device: Res<RenderDevice>,
338+
render_adapter: Res<RenderAdapter>,
339+
) {
340+
let bindless_supported = binding_arrays_are_usable(&render_device, &render_adapter);
341+
342+
commands.insert_resource(RenderLightmaps {
343+
render_lightmaps: default(),
344+
slabs: vec![],
345+
free_slabs: FixedBitSet::new(),
346+
pending_lightmaps: default(),
347+
bindless_supported,
348+
});
352349
}
353350

354351
impl RenderLightmaps {

crates/bevy_pbr/src/prepass/mod.rs

Lines changed: 86 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ use bevy_render::{
2121
renderer::RenderAdapter,
2222
sync_world::RenderEntity,
2323
view::{RenderVisibilityRanges, RetainedViewEntity, VISIBILITY_RANGES_STORAGE_BUFFER_COUNT},
24-
ExtractSchedule, Render, RenderApp, RenderDebugFlags, RenderSystems,
24+
ExtractSchedule, Render, RenderApp, RenderDebugFlags, RenderStartup, RenderSystems,
2525
};
2626
pub use prepass_bindings::*;
2727

28-
use bevy_asset::{embedded_asset, load_embedded_asset, Handle};
28+
use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle};
2929
use bevy_core_pipeline::{
3030
core_3d::CORE_3D_DEPTH_FORMAT, deferred::*, prelude::Camera3d, prepass::*,
3131
};
@@ -87,22 +87,16 @@ impl Plugin for PrepassPipelinePlugin {
8787
};
8888

8989
render_app
90+
.add_systems(
91+
RenderStartup,
92+
(init_prepass_pipeline, init_prepass_view_bind_group).chain(),
93+
)
9094
.add_systems(
9195
Render,
9296
prepare_prepass_view_bind_group.in_set(RenderSystems::PrepareBindGroups),
9397
)
9498
.init_resource::<SpecializedMeshPipelines<PrepassPipelineSpecializer>>();
9599
}
96-
97-
fn finish(&self, app: &mut App) {
98-
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
99-
return;
100-
};
101-
102-
render_app
103-
.init_resource::<PrepassPipeline>()
104-
.init_resource::<PrepassViewBindGroup>();
105-
}
106100
}
107101

108102
/// Sets up the prepasses for a material.
@@ -273,78 +267,79 @@ pub struct PrepassPipeline {
273267
pub material_pipeline: MaterialPipeline,
274268
}
275269

276-
impl FromWorld for PrepassPipeline {
277-
fn from_world(world: &mut World) -> Self {
278-
let render_device = world.resource::<RenderDevice>();
279-
let render_adapter = world.resource::<RenderAdapter>();
280-
let visibility_ranges_buffer_binding_type = render_device
281-
.get_supported_read_only_binding_type(VISIBILITY_RANGES_STORAGE_BUFFER_COUNT);
282-
283-
let view_layout_motion_vectors = render_device.create_bind_group_layout(
284-
"prepass_view_layout_motion_vectors",
285-
&BindGroupLayoutEntries::with_indices(
286-
ShaderStages::VERTEX_FRAGMENT,
270+
pub fn init_prepass_pipeline(
271+
mut commands: Commands,
272+
render_device: Res<RenderDevice>,
273+
render_adapter: Res<RenderAdapter>,
274+
mesh_pipeline: Res<MeshPipeline>,
275+
material_pipeline: Res<MaterialPipeline>,
276+
asset_server: Res<AssetServer>,
277+
) {
278+
let visibility_ranges_buffer_binding_type =
279+
render_device.get_supported_read_only_binding_type(VISIBILITY_RANGES_STORAGE_BUFFER_COUNT);
280+
281+
let view_layout_motion_vectors = render_device.create_bind_group_layout(
282+
"prepass_view_layout_motion_vectors",
283+
&BindGroupLayoutEntries::with_indices(
284+
ShaderStages::VERTEX_FRAGMENT,
285+
(
286+
// View
287+
(0, uniform_buffer::<ViewUniform>(true)),
288+
// Globals
289+
(1, uniform_buffer::<GlobalsUniform>(false)),
290+
// PreviousViewUniforms
291+
(2, uniform_buffer::<PreviousViewData>(true)),
292+
// VisibilityRanges
287293
(
288-
// View
289-
(0, uniform_buffer::<ViewUniform>(true)),
290-
// Globals
291-
(1, uniform_buffer::<GlobalsUniform>(false)),
292-
// PreviousViewUniforms
293-
(2, uniform_buffer::<PreviousViewData>(true)),
294-
// VisibilityRanges
295-
(
296-
14,
297-
buffer_layout(
298-
visibility_ranges_buffer_binding_type,
299-
false,
300-
Some(Vec4::min_size()),
301-
)
302-
.visibility(ShaderStages::VERTEX),
303-
),
294+
14,
295+
buffer_layout(
296+
visibility_ranges_buffer_binding_type,
297+
false,
298+
Some(Vec4::min_size()),
299+
)
300+
.visibility(ShaderStages::VERTEX),
304301
),
305302
),
306-
);
303+
),
304+
);
307305

308-
let view_layout_no_motion_vectors = render_device.create_bind_group_layout(
309-
"prepass_view_layout_no_motion_vectors",
310-
&BindGroupLayoutEntries::with_indices(
311-
ShaderStages::VERTEX_FRAGMENT,
306+
let view_layout_no_motion_vectors = render_device.create_bind_group_layout(
307+
"prepass_view_layout_no_motion_vectors",
308+
&BindGroupLayoutEntries::with_indices(
309+
ShaderStages::VERTEX_FRAGMENT,
310+
(
311+
// View
312+
(0, uniform_buffer::<ViewUniform>(true)),
313+
// Globals
314+
(1, uniform_buffer::<GlobalsUniform>(false)),
315+
// VisibilityRanges
312316
(
313-
// View
314-
(0, uniform_buffer::<ViewUniform>(true)),
315-
// Globals
316-
(1, uniform_buffer::<GlobalsUniform>(false)),
317-
// VisibilityRanges
318-
(
319-
14,
320-
buffer_layout(
321-
visibility_ranges_buffer_binding_type,
322-
false,
323-
Some(Vec4::min_size()),
324-
)
325-
.visibility(ShaderStages::VERTEX),
326-
),
317+
14,
318+
buffer_layout(
319+
visibility_ranges_buffer_binding_type,
320+
false,
321+
Some(Vec4::min_size()),
322+
)
323+
.visibility(ShaderStages::VERTEX),
327324
),
328325
),
329-
);
326+
),
327+
);
330328

331-
let mesh_pipeline = world.resource::<MeshPipeline>();
332-
333-
let depth_clip_control_supported = render_device
334-
.features()
335-
.contains(WgpuFeatures::DEPTH_CLIP_CONTROL);
336-
PrepassPipeline {
337-
view_layout_motion_vectors,
338-
view_layout_no_motion_vectors,
339-
mesh_layouts: mesh_pipeline.mesh_layouts.clone(),
340-
default_prepass_shader: load_embedded_asset!(world, "prepass.wgsl"),
341-
skins_use_uniform_buffers: skin::skins_use_uniform_buffers(render_device),
342-
depth_clip_control_supported,
343-
binding_arrays_are_usable: binding_arrays_are_usable(render_device, render_adapter),
344-
empty_layout: render_device.create_bind_group_layout("prepass_empty_layout", &[]),
345-
material_pipeline: world.resource::<MaterialPipeline>().clone(),
346-
}
347-
}
329+
let depth_clip_control_supported = render_device
330+
.features()
331+
.contains(WgpuFeatures::DEPTH_CLIP_CONTROL);
332+
commands.insert_resource(PrepassPipeline {
333+
view_layout_motion_vectors,
334+
view_layout_no_motion_vectors,
335+
mesh_layouts: mesh_pipeline.mesh_layouts.clone(),
336+
default_prepass_shader: load_embedded_asset!(asset_server.as_ref(), "prepass.wgsl"),
337+
skins_use_uniform_buffers: skin::skins_use_uniform_buffers(&render_device),
338+
depth_clip_control_supported,
339+
binding_arrays_are_usable: binding_arrays_are_usable(&render_device, &render_adapter),
340+
empty_layout: render_device.create_bind_group_layout("prepass_empty_layout", &[]),
341+
material_pipeline: material_pipeline.clone(),
342+
});
348343
}
349344

350345
pub struct PrepassPipelineSpecializer {
@@ -702,22 +697,21 @@ pub struct PrepassViewBindGroup {
702697
pub empty_bind_group: BindGroup,
703698
}
704699

705-
impl FromWorld for PrepassViewBindGroup {
706-
fn from_world(world: &mut World) -> Self {
707-
let pipeline = world.resource::<PrepassPipeline>();
708-
709-
let render_device = world.resource::<RenderDevice>();
710-
let empty_bind_group = render_device.create_bind_group(
711-
"prepass_view_empty_bind_group",
712-
&pipeline.empty_layout,
713-
&[],
714-
);
715-
PrepassViewBindGroup {
716-
motion_vectors: None,
717-
no_motion_vectors: None,
718-
empty_bind_group,
719-
}
720-
}
700+
pub fn init_prepass_view_bind_group(
701+
mut commands: Commands,
702+
render_device: Res<RenderDevice>,
703+
pipeline: Res<PrepassPipeline>,
704+
) {
705+
let empty_bind_group = render_device.create_bind_group(
706+
"prepass_view_empty_bind_group",
707+
&pipeline.empty_layout,
708+
&[],
709+
);
710+
commands.insert_resource(PrepassViewBindGroup {
711+
motion_vectors: None,
712+
no_motion_vectors: None,
713+
empty_bind_group,
714+
});
721715
}
722716

723717
pub fn prepare_prepass_view_bind_group(

0 commit comments

Comments
 (0)