Skip to content

Commit 329332a

Browse files
authored
Convert MeshPipelineViewLayouts , MeshPipeline and RenderDebugOverlayPipeline to RenderStartup system (#22443)
# Objective - Convert `MeshPipelineViewLayouts` , `MeshPipeline` and `RenderDebugOverlayPipeline` to `RenderStartup` system ## Solution - Do the thing ## Testing - Ran `animated_mesh` example
1 parent 80d15e4 commit 329332a

File tree

8 files changed

+161
-139
lines changed

8 files changed

+161
-139
lines changed

crates/bevy_dev_tools/src/render_debug.rs

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Renderer debugging overlay
22
33
use bevy_app::{App, Plugin};
4-
use bevy_asset::{embedded_asset, Handle};
4+
use bevy_asset::{embedded_asset, AssetServer, Handle};
55
use bevy_core_pipeline::{
66
mip_generation::experimental::depth::ViewDepthPyramid,
77
oit::OrderIndependentTransparencySettingsOffset,
@@ -13,12 +13,11 @@ use bevy_ecs::{
1313
component::Component,
1414
entity::Entity,
1515
message::{Message, MessageReader, MessageWriter},
16-
prelude::{Has, ReflectComponent, World},
16+
prelude::{Has, ReflectComponent},
1717
reflect::ReflectResource,
1818
resource::Resource,
1919
schedule::IntoScheduleConfigs,
2020
system::{Commands, Query, Res, ResMut},
21-
world::FromWorld,
2221
};
2322
use bevy_input::{prelude::KeyCode, ButtonInput};
2423
use bevy_log::info;
@@ -38,14 +37,15 @@ use bevy_render::{
3837
renderer::{RenderContext, RenderDevice, RenderQueue, ViewQuery},
3938
texture::{FallbackImage, GpuImage},
4039
view::{Msaa, ViewTarget, ViewUniformOffset},
41-
Render, RenderApp, RenderSystems,
40+
Render, RenderApp, RenderStartup, RenderSystems,
4241
};
4342
use bevy_shader::Shader;
4443

4544
use bevy_pbr::{
46-
Bluenoise, MeshPipelineViewLayoutKey, MeshPipelineViewLayouts, MeshViewBindGroup,
47-
ViewContactShadowsUniformOffset, ViewEnvironmentMapUniformOffset, ViewFogUniformOffset,
48-
ViewLightProbesUniformOffset, ViewLightsUniformOffset, ViewScreenSpaceReflectionsUniformOffset,
45+
Bluenoise, MeshPipelineSet, MeshPipelineViewLayoutKey, MeshPipelineViewLayouts,
46+
MeshViewBindGroup, ViewContactShadowsUniformOffset, ViewEnvironmentMapUniformOffset,
47+
ViewFogUniformOffset, ViewLightProbesUniformOffset, ViewLightsUniformOffset,
48+
ViewScreenSpaceReflectionsUniformOffset,
4949
};
5050

5151
/// Adds a rendering debug overlay to visualize various renderer buffers.
@@ -65,6 +65,15 @@ impl Plugin for RenderDebugOverlayPlugin {
6565
ExtractComponentPlugin::<RenderDebugOverlay>::default(),
6666
))
6767
.add_systems(bevy_app::Update, (handle_input, update_overlay).chain());
68+
69+
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
70+
return;
71+
};
72+
73+
render_app.add_systems(
74+
RenderStartup,
75+
init_render_debug_overlay_pipeline.after(MeshPipelineSet),
76+
);
6877
}
6978

7079
fn finish(&self, app: &mut App) {
@@ -73,7 +82,6 @@ impl Plugin for RenderDebugOverlayPlugin {
7382
};
7483

7584
render_app
76-
.init_resource::<RenderDebugOverlayPipeline>()
7785
.init_resource::<SpecializedRenderPipelines<RenderDebugOverlayPipeline>>()
7886
.init_resource::<RenderDebugOverlayUniforms>()
7987
.add_systems(
@@ -351,47 +359,45 @@ struct RenderDebugOverlayPipeline {
351359
fullscreen_vertex_shader: VertexState,
352360
}
353361

354-
impl FromWorld for RenderDebugOverlayPipeline {
355-
fn from_world(world: &mut World) -> Self {
356-
let render_device = world.resource::<RenderDevice>();
357-
let asset_server = world.resource::<bevy_asset::AssetServer>();
358-
let mesh_view_layouts = world.resource::<MeshPipelineViewLayouts>().clone();
359-
let fullscreen_vertex_shader = world.resource::<FullscreenShader>().to_vertex_state();
360-
361-
let sampler = render_device.create_sampler(&SamplerDescriptor::default());
362-
363-
let bind_group_layout_descriptor = BindGroupLayoutDescriptor::new(
364-
"debug_overlay_bind_group_layout",
365-
&BindGroupLayoutEntries::sequential(
366-
ShaderStages::FRAGMENT,
367-
(
368-
binding_types::uniform_buffer::<RenderDebugOverlayUniform>(true),
369-
binding_types::texture_2d(TextureSampleType::Float { filterable: true }),
370-
binding_types::sampler(
371-
bevy_render::render_resource::SamplerBindingType::Filtering,
372-
),
373-
binding_types::texture_2d(TextureSampleType::Float { filterable: true }),
374-
binding_types::sampler(
375-
bevy_render::render_resource::SamplerBindingType::Filtering,
376-
),
377-
),
362+
fn init_render_debug_overlay_pipeline(
363+
mut commands: Commands,
364+
render_device: Res<RenderDevice>,
365+
mesh_view_layouts: Res<MeshPipelineViewLayouts>,
366+
asset_server: Res<AssetServer>,
367+
fullscreen_shader: Res<FullscreenShader>,
368+
) {
369+
let fullscreen_vertex_shader = fullscreen_shader.to_vertex_state();
370+
371+
let sampler = render_device.create_sampler(&SamplerDescriptor::default());
372+
373+
let bind_group_layout_descriptor = BindGroupLayoutDescriptor::new(
374+
"debug_overlay_bind_group_layout",
375+
&BindGroupLayoutEntries::sequential(
376+
ShaderStages::FRAGMENT,
377+
(
378+
binding_types::uniform_buffer::<RenderDebugOverlayUniform>(true),
379+
binding_types::texture_2d(TextureSampleType::Float { filterable: true }),
380+
binding_types::sampler(bevy_render::render_resource::SamplerBindingType::Filtering),
381+
binding_types::texture_2d(TextureSampleType::Float { filterable: true }),
382+
binding_types::sampler(bevy_render::render_resource::SamplerBindingType::Filtering),
378383
),
379-
);
384+
),
385+
);
380386

381-
let bind_group_layout = render_device.create_bind_group_layout(
382-
bind_group_layout_descriptor.label.as_ref(),
383-
&bind_group_layout_descriptor.entries,
384-
);
387+
let bind_group_layout = render_device.create_bind_group_layout(
388+
bind_group_layout_descriptor.label.as_ref(),
389+
&bind_group_layout_descriptor.entries,
390+
);
385391

386-
Self {
387-
shader: asset_server.load("embedded://bevy_dev_tools/debug_overlay.wgsl"),
388-
mesh_view_layouts,
389-
bind_group_layout,
390-
bind_group_layout_descriptor,
391-
sampler,
392-
fullscreen_vertex_shader,
393-
}
394-
}
392+
let res = RenderDebugOverlayPipeline {
393+
shader: asset_server.load("embedded://bevy_dev_tools/debug_overlay.wgsl"),
394+
mesh_view_layouts: mesh_view_layouts.clone(),
395+
bind_group_layout,
396+
bind_group_layout_descriptor,
397+
sampler,
398+
fullscreen_vertex_shader,
399+
};
400+
commands.insert_resource(res);
395401
}
396402

397403
#[derive(PartialEq, Eq, Hash, Clone, Copy)]

crates/bevy_gizmos_render/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use bevy_ecs::{
3333
world::{FromWorld, World},
3434
};
3535
use bevy_math::Affine3Ext;
36+
use bevy_pbr::MeshPipelineSet;
3637
use bevy_reflect::Reflect;
3738

3839
use {bevy_gizmos::config::GizmoMeshConfig, bevy_mesh::VertexBufferLayout};
@@ -96,7 +97,10 @@ impl Plugin for GizmoRenderPlugin {
9697
.init_resource::<LineGizmoEntities>();
9798

9899
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
99-
render_app.add_systems(RenderStartup, init_line_gizmo_uniform_bind_group_layout);
100+
render_app.add_systems(
101+
RenderStartup,
102+
init_line_gizmo_uniform_bind_group_layout.after(MeshPipelineSet),
103+
);
100104

101105
render_app.add_systems(
102106
Render,

crates/bevy_pbr/src/deferred/mod.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
use crate::{
2-
DistanceFog, ExtractedAtmosphere, MeshPipelineKey, ViewFogUniformOffset,
3-
ViewLightsUniformOffset,
4-
};
5-
use crate::{
6-
MeshPipeline, MeshViewBindGroup, RenderViewLightProbes, ScreenSpaceAmbientOcclusion,
2+
DistanceFog, ExtractedAtmosphere, MeshPipeline, MeshPipelineKey, MeshPipelineSet,
3+
MeshViewBindGroup, RenderViewLightProbes, ScreenSpaceAmbientOcclusion,
74
ScreenSpaceReflectionsUniform, ViewContactShadowsUniformOffset,
8-
ViewEnvironmentMapUniformOffset, ViewLightProbesUniformOffset,
9-
ViewScreenSpaceReflectionsUniformOffset, TONEMAPPING_LUT_SAMPLER_BINDING_INDEX,
10-
TONEMAPPING_LUT_TEXTURE_BINDING_INDEX,
5+
ViewEnvironmentMapUniformOffset, ViewFogUniformOffset, ViewLightProbesUniformOffset,
6+
ViewLightsUniformOffset, ViewScreenSpaceReflectionsUniformOffset,
7+
TONEMAPPING_LUT_SAMPLER_BINDING_INDEX, TONEMAPPING_LUT_TEXTURE_BINDING_INDEX,
118
};
129
use bevy_app::prelude::*;
1310
use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle};
@@ -109,7 +106,10 @@ impl Plugin for DeferredPbrLightingPlugin {
109106

110107
render_app
111108
.init_resource::<SpecializedRenderPipelines<DeferredLightingLayout>>()
112-
.add_systems(RenderStartup, init_deferred_lighting_layout)
109+
.add_systems(
110+
RenderStartup,
111+
init_deferred_lighting_layout.after(MeshPipelineSet),
112+
)
113113
.add_systems(
114114
Render,
115115
(prepare_deferred_lighting_pipelines.in_set(RenderSystems::Prepare),),

crates/bevy_pbr/src/material.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ impl Plugin for MaterialsPlugin {
306306
.add_render_command::<Transparent3d, DrawMaterial>()
307307
.add_render_command::<Opaque3d, DrawMaterial>()
308308
.add_render_command::<AlphaMask3d, DrawMaterial>()
309-
.add_systems(RenderStartup, init_material_pipeline)
309+
.add_systems(RenderStartup, init_material_pipeline.after(MeshPipelineSet))
310310
.add_systems(
311311
Render,
312312
(

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
skin::skin_uniforms_from_world,
66
};
77
use bevy_asset::uuid::Uuid;
8-
use bevy_asset::{embedded_asset, load_embedded_asset, AssetId, AssetIndex};
8+
use bevy_asset::{embedded_asset, load_embedded_asset, AssetId, AssetIndex, AssetServer};
99
use bevy_camera::{
1010
primitives::Aabb,
1111
visibility::{NoFrustumCulling, RenderLayers, ViewVisibility, VisibilityRange},
@@ -24,7 +24,7 @@ use bevy_ecs::{
2424
prelude::*,
2525
query::{QueryData, ROQueryItem},
2626
relationship::RelationshipSourceCollection,
27-
system::{lifetimeless::*, SystemParamItem, SystemState},
27+
system::{lifetimeless::*, SystemParamItem},
2828
};
2929
use bevy_image::{BevyDefault, ImageSampler, TextureFormatPixelInfo};
3030
use bevy_light::{
@@ -131,6 +131,9 @@ impl MeshRenderPlugin {
131131
#[cfg(debug_assertions)]
132132
pub const MESH_PIPELINE_VIEW_LAYOUT_SAFE_MAX_TEXTURES: usize = 10;
133133

134+
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
135+
pub struct MeshPipelineSet;
136+
134137
impl Plugin for MeshRenderPlugin {
135138
fn build(&self, app: &mut App) {
136139
load_shader_library!(app, "forward_io.wgsl");
@@ -293,9 +296,12 @@ impl Plugin for MeshRenderPlugin {
293296
));
294297
}
295298

296-
render_app
297-
.init_resource::<MeshPipelineViewLayouts>()
298-
.init_resource::<MeshPipeline>();
299+
render_app.add_systems(
300+
RenderStartup,
301+
(init_mesh_pipeline_view_layouts, init_mesh_pipeline)
302+
.chain()
303+
.in_set(MeshPipelineSet),
304+
);
299305
}
300306

301307
// Load the mesh_bindings shader module here as it depends on runtime information about
@@ -2207,35 +2213,35 @@ pub struct MeshPipeline {
22072213
pub skins_use_uniform_buffers: bool,
22082214
}
22092215

2210-
impl FromWorld for MeshPipeline {
2211-
fn from_world(world: &mut World) -> Self {
2212-
let shader = load_embedded_asset!(world, "mesh.wgsl");
2213-
let mut system_state: SystemState<(
2214-
Res<RenderDevice>,
2215-
Res<RenderAdapter>,
2216-
Res<MeshPipelineViewLayouts>,
2217-
)> = SystemState::new(world);
2218-
let (render_device, render_adapter, view_layouts) = system_state.get_mut(world);
2219-
2220-
let clustered_forward_buffer_binding_type = render_device
2221-
.get_supported_read_only_binding_type(CLUSTERED_FORWARD_STORAGE_BUFFER_COUNT);
2222-
2223-
MeshPipeline {
2224-
view_layouts: view_layouts.clone(),
2225-
clustered_forward_buffer_binding_type,
2226-
mesh_layouts: MeshLayouts::new(&render_device, &render_adapter),
2227-
shader,
2228-
per_object_buffer_batch_size: GpuArrayBuffer::<MeshUniform>::batch_size(
2229-
&render_device.limits(),
2230-
),
2231-
binding_arrays_are_usable: binding_arrays_are_usable(&render_device, &render_adapter),
2232-
clustered_decals_are_usable: decal::clustered::clustered_decals_are_usable(
2233-
&render_device,
2234-
&render_adapter,
2235-
),
2236-
skins_use_uniform_buffers: skins_use_uniform_buffers(&render_device.limits()),
2237-
}
2238-
}
2216+
fn init_mesh_pipeline(
2217+
mut commands: Commands,
2218+
render_device: Res<RenderDevice>,
2219+
render_adapter: Res<RenderAdapter>,
2220+
view_layouts: Res<MeshPipelineViewLayouts>,
2221+
asset_server: Res<AssetServer>,
2222+
) {
2223+
let shader = load_embedded_asset!(asset_server.as_ref(), "mesh.wgsl");
2224+
2225+
let clustered_forward_buffer_binding_type =
2226+
render_device.get_supported_read_only_binding_type(CLUSTERED_FORWARD_STORAGE_BUFFER_COUNT);
2227+
2228+
let res = MeshPipeline {
2229+
view_layouts: view_layouts.clone(),
2230+
clustered_forward_buffer_binding_type,
2231+
mesh_layouts: MeshLayouts::new(&render_device, &render_adapter),
2232+
shader,
2233+
per_object_buffer_batch_size: GpuArrayBuffer::<MeshUniform>::batch_size(
2234+
&render_device.limits(),
2235+
),
2236+
binding_arrays_are_usable: binding_arrays_are_usable(&render_device, &render_adapter),
2237+
clustered_decals_are_usable: decal::clustered::clustered_decals_are_usable(
2238+
&render_device,
2239+
&render_adapter,
2240+
),
2241+
skins_use_uniform_buffers: skins_use_uniform_buffers(&render_device.limits()),
2242+
};
2243+
2244+
commands.insert_resource(res);
22392245
}
22402246

22412247
impl MeshPipeline {

0 commit comments

Comments
 (0)