Skip to content

Commit e33bc1a

Browse files
committed
Use RenderStartup for all basic cases in bevy_core_pipeline.
1 parent 1fb5a62 commit e33bc1a

File tree

17 files changed

+389
-441
lines changed

17 files changed

+389
-441
lines changed

crates/bevy_core_pipeline/src/auto_exposure/mod.rs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use bevy_render::{
99
Buffer, BufferDescriptor, BufferUsages, PipelineCache, SpecializedComputePipelines,
1010
},
1111
renderer::RenderDevice,
12-
ExtractSchedule, Render, RenderApp, RenderSystems,
12+
ExtractSchedule, Render, RenderApp, RenderStartup, RenderSystems,
1313
};
1414

1515
mod buffers;
@@ -25,7 +25,9 @@ use pipeline::{AutoExposurePass, AutoExposurePipeline, ViewAutoExposurePipeline}
2525
pub use settings::AutoExposure;
2626

2727
use crate::{
28-
auto_exposure::compensation_curve::GpuAutoExposureCompensationCurve,
28+
auto_exposure::{
29+
compensation_curve::GpuAutoExposureCompensationCurve, pipeline::init_auto_exposure_pipeline,
30+
},
2931
core_3d::graph::{Core3d, Node3d},
3032
};
3133

@@ -61,6 +63,10 @@ impl Plugin for AutoExposurePlugin {
6163
render_app
6264
.init_resource::<SpecializedComputePipelines<AutoExposurePipeline>>()
6365
.init_resource::<AutoExposureBuffers>()
66+
.add_systems(
67+
RenderStartup,
68+
(init_auto_exposure_pipeline, init_auto_exposure_resources),
69+
)
6470
.add_systems(ExtractSchedule, extract_buffers)
6571
.add_systems(
6672
Render,
@@ -75,30 +81,17 @@ impl Plugin for AutoExposurePlugin {
7581
(Node3d::EndMainPass, node::AutoExposure, Node3d::Tonemapping),
7682
);
7783
}
78-
79-
fn finish(&self, app: &mut App) {
80-
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
81-
return;
82-
};
83-
84-
render_app.init_resource::<AutoExposurePipeline>();
85-
render_app.init_resource::<AutoExposureResources>();
86-
}
8784
}
8885

89-
impl FromWorld for AutoExposureResources {
90-
fn from_world(world: &mut World) -> Self {
91-
Self {
92-
histogram: world
93-
.resource::<RenderDevice>()
94-
.create_buffer(&BufferDescriptor {
95-
label: Some("histogram buffer"),
96-
size: pipeline::HISTOGRAM_BIN_COUNT * 4,
97-
usage: BufferUsages::STORAGE,
98-
mapped_at_creation: false,
99-
}),
100-
}
101-
}
86+
pub fn init_auto_exposure_resources(mut commands: Commands, render_device: Res<RenderDevice>) {
87+
commands.insert_resource(AutoExposureResources {
88+
histogram: render_device.create_buffer(&BufferDescriptor {
89+
label: Some("histogram buffer"),
90+
size: pipeline::HISTOGRAM_BIN_COUNT * 4,
91+
usage: BufferUsages::STORAGE,
92+
mapped_at_creation: false,
93+
}),
94+
});
10295
}
10396

10497
fn queue_view_auto_exposure_pipelines(

crates/bevy_core_pipeline/src/auto_exposure/pipeline.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,31 @@ pub enum AutoExposurePass {
4747

4848
pub const HISTOGRAM_BIN_COUNT: u64 = 64;
4949

50-
impl FromWorld for AutoExposurePipeline {
51-
fn from_world(world: &mut World) -> Self {
52-
let render_device = world.resource::<RenderDevice>();
53-
54-
Self {
55-
histogram_layout: render_device.create_bind_group_layout(
56-
"compute histogram bind group",
57-
&BindGroupLayoutEntries::sequential(
58-
ShaderStages::COMPUTE,
59-
(
60-
uniform_buffer::<GlobalsUniform>(false),
61-
uniform_buffer::<AutoExposureUniform>(false),
62-
texture_2d(TextureSampleType::Float { filterable: false }),
63-
texture_2d(TextureSampleType::Float { filterable: false }),
64-
texture_1d(TextureSampleType::Float { filterable: false }),
65-
uniform_buffer::<AutoExposureCompensationCurveUniform>(false),
66-
storage_buffer_sized(false, NonZero::<u64>::new(HISTOGRAM_BIN_COUNT * 4)),
67-
storage_buffer_sized(false, NonZero::<u64>::new(4)),
68-
storage_buffer::<ViewUniform>(true),
69-
),
50+
pub fn init_auto_exposure_pipeline(
51+
mut commands: Commands,
52+
render_device: Res<RenderDevice>,
53+
asset_server: Res<AssetServer>,
54+
) {
55+
commands.insert_resource(AutoExposurePipeline {
56+
histogram_layout: render_device.create_bind_group_layout(
57+
"compute histogram bind group",
58+
&BindGroupLayoutEntries::sequential(
59+
ShaderStages::COMPUTE,
60+
(
61+
uniform_buffer::<GlobalsUniform>(false),
62+
uniform_buffer::<AutoExposureUniform>(false),
63+
texture_2d(TextureSampleType::Float { filterable: false }),
64+
texture_2d(TextureSampleType::Float { filterable: false }),
65+
texture_1d(TextureSampleType::Float { filterable: false }),
66+
uniform_buffer::<AutoExposureCompensationCurveUniform>(false),
67+
storage_buffer_sized(false, NonZero::<u64>::new(HISTOGRAM_BIN_COUNT * 4)),
68+
storage_buffer_sized(false, NonZero::<u64>::new(4)),
69+
storage_buffer::<ViewUniform>(true),
7070
),
7171
),
72-
histogram_shader: load_embedded_asset!(world, "auto_exposure.wgsl"),
73-
}
74-
}
72+
),
73+
histogram_shader: load_embedded_asset!(asset_server.as_ref(), "auto_exposure.wgsl"),
74+
});
7575
}
7676

7777
impl SpecializedComputePipeline for AutoExposurePipeline {

crates/bevy_core_pipeline/src/blit/mod.rs

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use crate::FullscreenShader;
22
use bevy_app::{App, Plugin};
3-
use bevy_asset::{embedded_asset, load_embedded_asset, Handle};
3+
use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle};
44
use bevy_ecs::prelude::*;
55
use bevy_render::{
66
render_resource::{
77
binding_types::{sampler, texture_2d},
88
*,
99
},
1010
renderer::RenderDevice,
11-
RenderApp,
11+
RenderApp, RenderStartup,
1212
};
1313
use bevy_utils::default;
1414

@@ -19,18 +19,14 @@ impl Plugin for BlitPlugin {
1919
fn build(&self, app: &mut App) {
2020
embedded_asset!(app, "blit.wgsl");
2121

22-
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
23-
render_app.allow_ambiguous_resource::<SpecializedRenderPipelines<BlitPipeline>>();
24-
}
25-
}
26-
27-
fn finish(&self, app: &mut App) {
2822
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
2923
return;
3024
};
25+
3126
render_app
32-
.init_resource::<BlitPipeline>()
33-
.init_resource::<SpecializedRenderPipelines<BlitPipeline>>();
27+
.allow_ambiguous_resource::<SpecializedRenderPipelines<BlitPipeline>>()
28+
.init_resource::<SpecializedRenderPipelines<BlitPipeline>>()
29+
.add_systems(RenderStartup, init_blit_pipeline);
3430
}
3531
}
3632

@@ -42,30 +38,31 @@ pub struct BlitPipeline {
4238
pub fragment_shader: Handle<Shader>,
4339
}
4440

45-
impl FromWorld for BlitPipeline {
46-
fn from_world(render_world: &mut World) -> Self {
47-
let render_device = render_world.resource::<RenderDevice>();
48-
49-
let texture_bind_group = render_device.create_bind_group_layout(
50-
"blit_bind_group_layout",
51-
&BindGroupLayoutEntries::sequential(
52-
ShaderStages::FRAGMENT,
53-
(
54-
texture_2d(TextureSampleType::Float { filterable: false }),
55-
sampler(SamplerBindingType::NonFiltering),
56-
),
41+
pub fn init_blit_pipeline(
42+
mut commands: Commands,
43+
render_device: Res<RenderDevice>,
44+
fullscreen_shader: Res<FullscreenShader>,
45+
asset_server: Res<AssetServer>,
46+
) {
47+
let texture_bind_group = render_device.create_bind_group_layout(
48+
"blit_bind_group_layout",
49+
&BindGroupLayoutEntries::sequential(
50+
ShaderStages::FRAGMENT,
51+
(
52+
texture_2d(TextureSampleType::Float { filterable: false }),
53+
sampler(SamplerBindingType::NonFiltering),
5754
),
58-
);
55+
),
56+
);
5957

60-
let sampler = render_device.create_sampler(&SamplerDescriptor::default());
58+
let sampler = render_device.create_sampler(&SamplerDescriptor::default());
6159

62-
BlitPipeline {
63-
texture_bind_group,
64-
sampler,
65-
fullscreen_shader: render_world.resource::<FullscreenShader>().clone(),
66-
fragment_shader: load_embedded_asset!(render_world, "blit.wgsl"),
67-
}
68-
}
60+
commands.insert_resource(BlitPipeline {
61+
texture_bind_group,
62+
sampler,
63+
fullscreen_shader: fullscreen_shader.clone(),
64+
fragment_shader: load_embedded_asset!(asset_server.as_ref(), "blit.wgsl"),
65+
});
6966
}
7067

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

crates/bevy_core_pipeline/src/bloom/downsampling_pipeline.rs

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
use crate::FullscreenShader;
22

33
use super::{Bloom, BLOOM_TEXTURE_FORMAT};
4-
use bevy_asset::{load_embedded_asset, Handle};
4+
use bevy_asset::{load_embedded_asset, AssetServer, Handle};
55
use bevy_ecs::{
66
prelude::{Component, Entity},
77
resource::Resource,
88
system::{Commands, Query, Res, ResMut},
9-
world::{FromWorld, World},
109
};
1110
use bevy_math::{Vec2, Vec4};
1211
use bevy_render::{
@@ -53,42 +52,43 @@ pub struct BloomUniforms {
5352
pub aspect: f32,
5453
}
5554

56-
impl FromWorld for BloomDownsamplingPipeline {
57-
fn from_world(world: &mut World) -> Self {
58-
let render_device = world.resource::<RenderDevice>();
59-
60-
// Bind group layout
61-
let bind_group_layout = render_device.create_bind_group_layout(
62-
"bloom_downsampling_bind_group_layout_with_settings",
63-
&BindGroupLayoutEntries::sequential(
64-
ShaderStages::FRAGMENT,
65-
(
66-
// Input texture binding
67-
texture_2d(TextureSampleType::Float { filterable: true }),
68-
// Sampler binding
69-
sampler(SamplerBindingType::Filtering),
70-
// Downsampling settings binding
71-
uniform_buffer::<BloomUniforms>(true),
72-
),
55+
pub fn init_bloom_downsampling_pipeline(
56+
mut commands: Commands,
57+
render_device: Res<RenderDevice>,
58+
fullscreen_shader: Res<FullscreenShader>,
59+
asset_server: Res<AssetServer>,
60+
) {
61+
// Bind group layout
62+
let bind_group_layout = render_device.create_bind_group_layout(
63+
"bloom_downsampling_bind_group_layout_with_settings",
64+
&BindGroupLayoutEntries::sequential(
65+
ShaderStages::FRAGMENT,
66+
(
67+
// Input texture binding
68+
texture_2d(TextureSampleType::Float { filterable: true }),
69+
// Sampler binding
70+
sampler(SamplerBindingType::Filtering),
71+
// Downsampling settings binding
72+
uniform_buffer::<BloomUniforms>(true),
7373
),
74-
);
75-
76-
// Sampler
77-
let sampler = render_device.create_sampler(&SamplerDescriptor {
78-
min_filter: FilterMode::Linear,
79-
mag_filter: FilterMode::Linear,
80-
address_mode_u: AddressMode::ClampToEdge,
81-
address_mode_v: AddressMode::ClampToEdge,
82-
..Default::default()
83-
});
84-
85-
BloomDownsamplingPipeline {
86-
bind_group_layout,
87-
sampler,
88-
fullscreen_shader: world.resource::<FullscreenShader>().clone(),
89-
fragment_shader: load_embedded_asset!(world, "bloom.wgsl"),
90-
}
91-
}
74+
),
75+
);
76+
77+
// Sampler
78+
let sampler = render_device.create_sampler(&SamplerDescriptor {
79+
min_filter: FilterMode::Linear,
80+
mag_filter: FilterMode::Linear,
81+
address_mode_u: AddressMode::ClampToEdge,
82+
address_mode_v: AddressMode::ClampToEdge,
83+
..Default::default()
84+
});
85+
86+
commands.insert_resource(BloomDownsamplingPipeline {
87+
bind_group_layout,
88+
sampler,
89+
fullscreen_shader: fullscreen_shader.clone(),
90+
fragment_shader: load_embedded_asset!(asset_server.as_ref(), "bloom.wgsl"),
91+
});
9292
}
9393

9494
impl SpecializedRenderPipeline for BloomDownsamplingPipeline {

crates/bevy_core_pipeline/src/bloom/mod.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ use bevy_image::ToExtents;
66
pub use settings::{Bloom, BloomCompositeMode, BloomPrefilter};
77

88
use crate::{
9+
bloom::{
10+
downsampling_pipeline::init_bloom_downsampling_pipeline,
11+
upsampling_pipeline::init_bloom_upscaling_pipeline,
12+
},
913
core_2d::graph::{Core2d, Node2d},
1014
core_3d::graph::{Core3d, Node3d},
1115
};
@@ -25,7 +29,7 @@ use bevy_render::{
2529
renderer::{RenderContext, RenderDevice},
2630
texture::{CachedTexture, TextureCache},
2731
view::ViewTarget,
28-
Render, RenderApp, RenderSystems,
32+
Render, RenderApp, RenderStartup, RenderSystems,
2933
};
3034
use downsampling_pipeline::{
3135
prepare_downsampling_pipeline, BloomDownsamplingPipeline, BloomDownsamplingPipelineIds,
@@ -59,6 +63,13 @@ impl Plugin for BloomPlugin {
5963
render_app
6064
.init_resource::<SpecializedRenderPipelines<BloomDownsamplingPipeline>>()
6165
.init_resource::<SpecializedRenderPipelines<BloomUpsamplingPipeline>>()
66+
.add_systems(
67+
RenderStartup,
68+
(
69+
init_bloom_downsampling_pipeline,
70+
init_bloom_upscaling_pipeline,
71+
),
72+
)
6273
.add_systems(
6374
Render,
6475
(
@@ -81,15 +92,6 @@ impl Plugin for BloomPlugin {
8192
(Node2d::EndMainPass, Node2d::Bloom, Node2d::Tonemapping),
8293
);
8394
}
84-
85-
fn finish(&self, app: &mut App) {
86-
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
87-
return;
88-
};
89-
render_app
90-
.init_resource::<BloomDownsamplingPipeline>()
91-
.init_resource::<BloomUpsamplingPipeline>();
92-
}
9395
}
9496

9597
#[derive(Default)]

0 commit comments

Comments
 (0)