Skip to content

Commit 1d60bb7

Browse files
committed
Add a 'state lifetime to query items and fetches.
This allows them to borrow from the query state, which can avoid expensive clones in some cases.
1 parent 4dd6d99 commit 1d60bb7

File tree

42 files changed

+643
-492
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+643
-492
lines changed

crates/bevy_core/src/name.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ pub struct NameOrEntity {
131131
pub entity: Entity,
132132
}
133133

134-
impl<'a> std::fmt::Display for NameOrEntityItem<'a> {
134+
impl<'w, 's> std::fmt::Display for NameOrEntityItem<'w, 's> {
135135
#[inline(always)]
136136
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
137137
match self.name {

crates/bevy_core_pipeline/src/bloom/settings.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ impl ExtractComponent for Bloom {
218218
type QueryFilter = ();
219219
type Out = (Self, BloomUniforms);
220220

221-
fn extract_component((bloom, camera): QueryItem<'_, Self::QueryData>) -> Option<Self::Out> {
221+
fn extract_component((bloom, camera): QueryItem<'_, '_, Self::QueryData>) -> Option<Self::Out> {
222222
match (
223223
camera.physical_viewport_rect(),
224224
camera.physical_viewport_size(),

crates/bevy_core_pipeline/src/core_2d/main_opaque_pass_2d_node.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl ViewNode for MainOpaquePass2dNode {
3030
&self,
3131
graph: &mut RenderGraphContext,
3232
render_context: &mut RenderContext<'w>,
33-
(camera, target, depth): QueryItem<'w, Self::ViewQuery>,
33+
(camera, target, depth): QueryItem<'w, '_, Self::ViewQuery>,
3434
world: &'w World,
3535
) -> Result<(), NodeRunError> {
3636
let (Some(opaque_phases), Some(alpha_mask_phases)) = (

crates/bevy_core_pipeline/src/core_2d/main_transparent_pass_2d_node.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ impl ViewNode for MainTransparentPass2dNode {
2727
&self,
2828
graph: &mut RenderGraphContext,
2929
render_context: &mut RenderContext<'w>,
30-
(camera, target, depth): bevy_ecs::query::QueryItem<'w, Self::ViewQuery>,
30+
(camera, target, depth): bevy_ecs::query::QueryItem<'w, '_, Self::ViewQuery>,
3131
world: &'w World,
3232
) -> Result<(), NodeRunError> {
3333
let Some(transparent_phases) =

crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl ViewNode for MainOpaquePass3dNode {
4545
skybox_pipeline,
4646
skybox_bind_group,
4747
view_uniform_offset,
48-
): QueryItem<'w, Self::ViewQuery>,
48+
): QueryItem<'w, '_, Self::ViewQuery>,
4949
world: &'w World,
5050
) -> Result<(), NodeRunError> {
5151
let (Some(opaque_phases), Some(alpha_mask_phases)) = (

crates/bevy_core_pipeline/src/deferred/node.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ impl ViewNode for DeferredGBufferPrepassNode {
3737
&self,
3838
graph: &mut RenderGraphContext,
3939
render_context: &mut RenderContext<'w>,
40-
(view, camera, view_depth_texture, view_prepass_textures): QueryItem<'w, Self::ViewQuery>,
40+
(view, camera, view_depth_texture, view_prepass_textures): QueryItem<
41+
'w,
42+
'_,
43+
Self::ViewQuery,
44+
>,
4145
world: &'w World,
4246
) -> Result<(), NodeRunError> {
4347
let (Some(opaque_deferred_phases), Some(alpha_mask_deferred_phases)) = (

crates/bevy_core_pipeline/src/dof/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ impl ViewNode for DepthOfFieldNode {
348348
view_bind_group_layouts,
349349
depth_of_field_uniform_index,
350350
auxiliary_dof_texture,
351-
): QueryItem<'w, Self::ViewQuery>,
351+
): QueryItem<'w, '_, Self::ViewQuery>,
352352
world: &'w World,
353353
) -> Result<(), NodeRunError> {
354354
let pipeline_cache = world.resource::<PipelineCache>();

crates/bevy_core_pipeline/src/msaa_writeback.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl ViewNode for MsaaWritebackNode {
6363
&self,
6464
_graph: &mut RenderGraphContext,
6565
render_context: &mut RenderContext<'w>,
66-
(target, blit_pipeline_id, msaa): QueryItem<'w, Self::ViewQuery>,
66+
(target, blit_pipeline_id, msaa): QueryItem<'w, '_, Self::ViewQuery>,
6767
world: &'w World,
6868
) -> Result<(), NodeRunError> {
6969
if *msaa == Msaa::Off {

crates/bevy_core_pipeline/src/post_process/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ impl ViewNode for PostProcessingNode {
360360
&self,
361361
_: &mut RenderGraphContext,
362362
render_context: &mut RenderContext<'w>,
363-
(view_target, pipeline_id, chromatic_aberration, post_processing_uniform_buffer_offsets): QueryItem<'w, Self::ViewQuery>,
363+
(view_target, pipeline_id, chromatic_aberration, post_processing_uniform_buffer_offsets): QueryItem<'w, '_, Self::ViewQuery>,
364364
world: &'w World,
365365
) -> Result<(), NodeRunError> {
366366
let pipeline_cache = world.resource::<PipelineCache>();
@@ -493,7 +493,7 @@ impl ExtractComponent for ChromaticAberration {
493493
type Out = ChromaticAberration;
494494

495495
fn extract_component(
496-
chromatic_aberration: QueryItem<'_, Self::QueryData>,
496+
chromatic_aberration: QueryItem<'_, '_, Self::QueryData>,
497497
) -> Option<Self::Out> {
498498
// Skip the postprocessing phase entirely if the intensity is zero.
499499
if chromatic_aberration.intensity > 0.0 {

crates/bevy_core_pipeline/src/prepass/node.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl ViewNode for PrepassNode {
5353
skybox_prepass_pipeline,
5454
skybox_prepass_bind_group,
5555
view_prev_uniform_offset,
56-
): QueryItem<'w, Self::ViewQuery>,
56+
): QueryItem<'w, '_, Self::ViewQuery>,
5757
world: &'w World,
5858
) -> Result<(), NodeRunError> {
5959
let (Some(opaque_prepass_phases), Some(alpha_mask_prepass_phases)) = (

crates/bevy_core_pipeline/src/skybox/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ impl ExtractComponent for Skybox {
114114
type QueryFilter = ();
115115
type Out = (Self, SkyboxUniforms);
116116

117-
fn extract_component((skybox, exposure): QueryItem<'_, Self::QueryData>) -> Option<Self::Out> {
117+
fn extract_component(
118+
(skybox, exposure): QueryItem<'_, '_, Self::QueryData>,
119+
) -> Option<Self::Out> {
118120
let exposure = exposure
119121
.map(Exposure::exposure)
120122
.unwrap_or_else(|| Exposure::default().exposure());

crates/bevy_core_pipeline/src/smaa/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,7 @@ impl ViewNode for SmaaNode {
845845
view_smaa_uniform_offset,
846846
smaa_textures,
847847
view_smaa_bind_groups,
848-
): QueryItem<'w, Self::ViewQuery>,
848+
): QueryItem<'w, '_, Self::ViewQuery>,
849849
world: &'w World,
850850
) -> Result<(), NodeRunError> {
851851
let pipeline_cache = world.resource::<PipelineCache>();

crates/bevy_ecs/macros/src/query_data.rs

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
9595
let user_generics_with_world = {
9696
let mut generics = ast.generics;
9797
generics.params.insert(0, parse_quote!('__w));
98+
generics.params.insert(0, parse_quote!('__s));
9899
generics
99100
};
100101
let (user_impl_generics_with_world, user_ty_generics_with_world, user_where_clauses_with_world) =

crates/bevy_ecs/macros/src/query_filter.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub fn derive_query_filter_impl(input: TokenStream) -> TokenStream {
2626
let user_generics_with_world = {
2727
let mut generics = ast.generics;
2828
generics.params.insert(0, parse_quote!('__w));
29+
generics.params.insert(0, parse_quote!('__s));
2930
generics
3031
};
3132
let (user_impl_generics_with_world, user_ty_generics_with_world, user_where_clauses_with_world) =
@@ -127,8 +128,8 @@ pub fn derive_query_filter_impl(input: TokenStream) -> TokenStream {
127128

128129
#[allow(unused_variables)]
129130
#[inline(always)]
130-
unsafe fn filter_fetch<'__w>(
131-
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w>,
131+
unsafe fn filter_fetch<'__w, '__s>(
132+
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w, '__s>,
132133
_entity: #path::entity::Entity,
133134
_table_row: #path::storage::TableRow,
134135
) -> bool {

crates/bevy_ecs/macros/src/world_query.rs

+27-27
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ pub(crate) fn item_struct(
3535
#derive_macro_call
3636
#item_attrs
3737
#visibility struct #item_struct_name #user_impl_generics_with_world #user_where_clauses_with_world {
38-
#(#(#field_attrs)* #field_visibilities #field_idents: <#field_types as #path::query::WorldQuery>::Item<'__w>,)*
38+
#(#(#field_attrs)* #field_visibilities #field_idents: <#field_types as #path::query::WorldQuery>::Item<'__w, '__s>,)*
3939
}
4040
},
4141
Fields::Unnamed(_) => quote! {
4242
#derive_macro_call
4343
#item_attrs
4444
#visibility struct #item_struct_name #user_impl_generics_with_world #user_where_clauses_with_world(
45-
#( #field_visibilities <#field_types as #path::query::WorldQuery>::Item<'__w>, )*
45+
#( #field_visibilities <#field_types as #path::query::WorldQuery>::Item<'__w, '__s>, )*
4646
);
4747
},
4848
Fields::Unit => quote! {
@@ -82,16 +82,16 @@ pub(crate) fn world_query_impl(
8282
)]
8383
#[automatically_derived]
8484
#visibility struct #fetch_struct_name #user_impl_generics_with_world #user_where_clauses_with_world {
85-
#(#named_field_idents: <#field_types as #path::query::WorldQuery>::Fetch<'__w>,)*
86-
#marker_name: &'__w (),
85+
#(#named_field_idents: <#field_types as #path::query::WorldQuery>::Fetch<'__w, '__s>,)*
86+
#marker_name: (&'__w(), &'__s()),
8787
}
8888

8989
impl #user_impl_generics_with_world Clone for #fetch_struct_name #user_ty_generics_with_world
9090
#user_where_clauses_with_world {
9191
fn clone(&self) -> Self {
9292
Self {
9393
#(#named_field_idents: self.#named_field_idents.clone(),)*
94-
#marker_name: &(),
94+
#marker_name: (&(), &()),
9595
}
9696
}
9797
}
@@ -100,37 +100,37 @@ pub(crate) fn world_query_impl(
100100
unsafe impl #user_impl_generics #path::query::WorldQuery
101101
for #struct_name #user_ty_generics #user_where_clauses {
102102

103-
type Item<'__w> = #item_struct_name #user_ty_generics_with_world;
104-
type Fetch<'__w> = #fetch_struct_name #user_ty_generics_with_world;
103+
type Item<'__w, '__s> = #item_struct_name #user_ty_generics_with_world;
104+
type Fetch<'__w, '__s> = #fetch_struct_name #user_ty_generics_with_world;
105105
type State = #state_struct_name #user_ty_generics;
106106

107-
fn shrink<'__wlong: '__wshort, '__wshort>(
108-
item: <#struct_name #user_ty_generics as #path::query::WorldQuery>::Item<'__wlong>
109-
) -> <#struct_name #user_ty_generics as #path::query::WorldQuery>::Item<'__wshort> {
107+
fn shrink<'__wlong: '__wshort, '__wshort, '__s>(
108+
item: <#struct_name #user_ty_generics as #path::query::WorldQuery>::Item<'__wlong, '__s>
109+
) -> <#struct_name #user_ty_generics as #path::query::WorldQuery>::Item<'__wshort, '__s> {
110110
#item_struct_name {
111111
#(
112112
#field_idents: <#field_types>::shrink(item.#field_idents),
113113
)*
114114
}
115115
}
116116

117-
fn shrink_fetch<'__wlong: '__wshort, '__wshort>(
118-
fetch: <#struct_name #user_ty_generics as #path::query::WorldQuery>::Fetch<'__wlong>
119-
) -> <#struct_name #user_ty_generics as #path::query::WorldQuery>::Fetch<'__wshort> {
117+
fn shrink_fetch<'__wlong: '__wshort, '__wshort, '__s>(
118+
fetch: <#struct_name #user_ty_generics as #path::query::WorldQuery>::Fetch<'__wlong, '__s>
119+
) -> <#struct_name #user_ty_generics as #path::query::WorldQuery>::Fetch<'__wshort, '__s> {
120120
#fetch_struct_name {
121121
#(
122122
#named_field_idents: <#field_types>::shrink_fetch(fetch.#named_field_idents),
123123
)*
124-
#marker_name: &(),
124+
#marker_name: (&(), &()),
125125
}
126126
}
127127

128-
unsafe fn init_fetch<'__w>(
128+
unsafe fn init_fetch<'__w, '__s>(
129129
_world: #path::world::unsafe_world_cell::UnsafeWorldCell<'__w>,
130-
state: &Self::State,
130+
state: &'__s Self::State,
131131
_last_run: #path::component::Tick,
132132
_this_run: #path::component::Tick,
133-
) -> <Self as #path::query::WorldQuery>::Fetch<'__w> {
133+
) -> <Self as #path::query::WorldQuery>::Fetch<'__w, '__s> {
134134
#fetch_struct_name {
135135
#(#named_field_idents:
136136
<#field_types>::init_fetch(
@@ -140,17 +140,17 @@ pub(crate) fn world_query_impl(
140140
_this_run,
141141
),
142142
)*
143-
#marker_name: &(),
143+
#marker_name: (&(), &()),
144144
}
145145
}
146146

147147
const IS_DENSE: bool = true #(&& <#field_types>::IS_DENSE)*;
148148

149149
/// SAFETY: we call `set_archetype` for each member that implements `Fetch`
150150
#[inline]
151-
unsafe fn set_archetype<'__w>(
152-
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w>,
153-
_state: &Self::State,
151+
unsafe fn set_archetype<'__w, '__s>(
152+
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w, '__s>,
153+
_state: &'__s Self::State,
154154
_archetype: &'__w #path::archetype::Archetype,
155155
_table: &'__w #path::storage::Table
156156
) {
@@ -159,21 +159,21 @@ pub(crate) fn world_query_impl(
159159

160160
/// SAFETY: we call `set_table` for each member that implements `Fetch`
161161
#[inline]
162-
unsafe fn set_table<'__w>(
163-
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w>,
164-
_state: &Self::State,
162+
unsafe fn set_table<'__w, '__s>(
163+
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w, '__s>,
164+
_state: &'__s Self::State,
165165
_table: &'__w #path::storage::Table
166166
) {
167167
#(<#field_types>::set_table(&mut _fetch.#named_field_idents, &_state.#named_field_idents, _table);)*
168168
}
169169

170170
/// SAFETY: we call `fetch` for each member that implements `Fetch`.
171171
#[inline(always)]
172-
unsafe fn fetch<'__w>(
173-
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w>,
172+
unsafe fn fetch<'__w, '__s>(
173+
_fetch: &mut <Self as #path::query::WorldQuery>::Fetch<'__w, '__s>,
174174
_entity: #path::entity::Entity,
175175
_table_row: #path::storage::TableRow,
176-
) -> <Self as #path::query::WorldQuery>::Item<'__w> {
176+
) -> <Self as #path::query::WorldQuery>::Item<'__w, '__s> {
177177
Self::Item {
178178
#(#field_idents: <#field_types>::fetch(&mut _fetch.#named_field_idents, _entity, _table_row),)*
179179
}

0 commit comments

Comments
 (0)