@@ -37,6 +37,7 @@ use bevy_render::erased_render_asset::{
37
37
use bevy_render:: mesh:: mark_3d_meshes_as_changed_if_their_assets_changed;
38
38
use bevy_render:: render_asset:: { prepare_assets, RenderAssets } ;
39
39
use bevy_render:: renderer:: RenderQueue ;
40
+ use bevy_render:: RenderStartup ;
40
41
use bevy_render:: {
41
42
batching:: gpu_preprocessing:: GpuPreprocessingSupport ,
42
43
extract_resource:: ExtractResource ,
@@ -371,44 +372,40 @@ where
371
372
}
372
373
373
374
if let Some ( render_app) = app. get_sub_app_mut ( RenderApp ) {
374
- render_app. add_systems (
375
- ExtractSchedule ,
376
- (
377
- extract_mesh_materials :: < M > . in_set ( MaterialExtractionSystems ) ,
378
- early_sweep_material_instances :: < M >
379
- . after ( MaterialExtractionSystems )
380
- . before ( late_sweep_material_instances) ,
381
- extract_entities_needs_specialization :: < M > . after ( extract_cameras) ,
382
- ) ,
383
- ) ;
384
- }
385
- }
386
-
387
- fn finish ( & self , app : & mut App ) {
388
- let Some ( render_app) = app. get_sub_app_mut ( RenderApp ) else {
389
- return ;
390
- } ;
391
-
392
- render_app. world_mut ( ) . resource_scope (
393
- |world, mut bind_group_allocators : Mut < MaterialBindGroupAllocators > | {
394
- let render_device = world. resource :: < RenderDevice > ( ) ;
395
- bind_group_allocators. insert (
396
- TypeId :: of :: < M > ( ) ,
397
- MaterialBindGroupAllocator :: new (
398
- render_device,
399
- M :: label ( ) ,
400
- material_uses_bindless_resources :: < M > ( render_device)
401
- . then ( || M :: bindless_descriptor ( ) )
402
- . flatten ( ) ,
403
- M :: bind_group_layout ( render_device) ,
404
- M :: bindless_slot_count ( ) ,
375
+ render_app
376
+ . add_systems ( RenderStartup , setup_render_app :: < M > )
377
+ . add_systems (
378
+ ExtractSchedule ,
379
+ (
380
+ extract_mesh_materials :: < M > . in_set ( MaterialExtractionSystems ) ,
381
+ early_sweep_material_instances :: < M >
382
+ . after ( MaterialExtractionSystems )
383
+ . before ( late_sweep_material_instances) ,
384
+ extract_entities_needs_specialization :: < M > . after ( extract_cameras) ,
405
385
) ,
406
386
) ;
407
- } ,
408
- ) ;
387
+ }
409
388
}
410
389
}
411
390
391
+ fn setup_render_app < M : Material > (
392
+ render_device : Res < RenderDevice > ,
393
+ mut bind_group_allocators : ResMut < MaterialBindGroupAllocators > ,
394
+ ) {
395
+ bind_group_allocators. insert (
396
+ TypeId :: of :: < M > ( ) ,
397
+ MaterialBindGroupAllocator :: new (
398
+ & render_device,
399
+ M :: label ( ) ,
400
+ material_uses_bindless_resources :: < M > ( & render_device)
401
+ . then ( || M :: bindless_descriptor ( ) )
402
+ . flatten ( ) ,
403
+ M :: bind_group_layout ( & render_device) ,
404
+ M :: bindless_slot_count ( ) ,
405
+ ) ,
406
+ ) ;
407
+ }
408
+
412
409
/// A dummy [`AssetId`] that we use as a placeholder whenever a mesh doesn't
413
410
/// have a material.
414
411
///
0 commit comments