Skip to content

Commit 7c45380

Browse files
committed
account for "still loading" textures in RenderResourceNodes
1 parent 704a116 commit 7c45380

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

crates/bevy_render/src/render_graph/nodes/render_resources_node.rs

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ impl<I, T: RenderResources> Default for RenderResourcesNodeState<I, T> {
434434

435435
fn render_resources_node_system<T: RenderResources>(
436436
mut state: Local<RenderResourcesNodeState<Entity, T>>,
437+
mut entities_waiting_for_textures: Local<Vec<Entity>>,
437438
render_resource_context: Res<Box<dyn RenderResourceContext>>,
438439
mut queries: QuerySet<(
439440
Query<(Entity, &T, &Draw, &mut RenderPipelines), Changed<T>>,
@@ -453,17 +454,32 @@ fn render_resources_node_system<T: RenderResources>(
453454
uniform_buffer_arrays.remove_bindings(*entity);
454455
}
455456

457+
// handle entities that were waiting for texture loads on the last update
458+
for entity in std::mem::take(&mut *entities_waiting_for_textures) {
459+
for (entity, uniforms, _draw, mut render_pipelines) in queries.q1_mut().get_mut(entity) {
460+
if !setup_uniform_texture_resources::<T>(
461+
&uniforms,
462+
render_resource_context,
463+
&mut render_pipelines.bindings,
464+
) {
465+
entities_waiting_for_textures.push(entity);
466+
}
467+
}
468+
}
469+
456470
for (entity, uniforms, draw, mut render_pipelines) in queries.q0_mut().iter_mut() {
457471
if !draw.is_visible {
458472
continue;
459473
}
460474

461475
uniform_buffer_arrays.prepare_uniform_buffers(entity, uniforms);
462-
setup_uniform_texture_resources::<T>(
476+
if !setup_uniform_texture_resources::<T>(
463477
&uniforms,
464478
render_resource_context,
465479
&mut render_pipelines.bindings,
466-
)
480+
) {
481+
entities_waiting_for_textures.push(entity);
482+
}
467483
}
468484

469485
let resized = uniform_buffer_arrays.resize_buffer_arrays(render_resource_context);
@@ -584,17 +600,19 @@ where
584600

585601
struct AssetRenderNodeState<T: Asset> {
586602
event_reader: EventReader<AssetEvent<T>>,
603+
assets_waiting_for_textures: Vec<HandleId>,
587604
}
588605

589606
impl<T: Asset> Default for AssetRenderNodeState<T> {
590607
fn default() -> Self {
591608
Self {
592609
event_reader: Default::default(),
610+
assets_waiting_for_textures: Default::default(),
593611
}
594612
}
595613
}
596614

597-
#[allow(clippy::clippy::too_many_arguments)]
615+
#[allow(clippy::too_many_arguments)]
598616
fn asset_render_resources_node_system<T: RenderResources + Asset>(
599617
mut state: Local<RenderResourcesNodeState<HandleId, T>>,
600618
mut asset_state: Local<AssetRenderNodeState<T>>,
@@ -634,6 +652,18 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
634652
}
635653
}
636654

655+
// handle assets that were waiting for texture loads on the last update
656+
for asset_handle in std::mem::take(&mut asset_state.assets_waiting_for_textures) {
657+
if let Some(asset) = assets.get(asset_handle) {
658+
let mut bindings =
659+
asset_render_resource_bindings.get_or_insert_mut(&Handle::<T>::weak(asset_handle));
660+
if !setup_uniform_texture_resources::<T>(&asset, render_resource_context, &mut bindings)
661+
{
662+
asset_state.assets_waiting_for_textures.push(asset_handle);
663+
}
664+
}
665+
}
666+
637667
uniform_buffer_arrays.begin_update();
638668
// initialize uniform buffer arrays using the first RenderResources
639669
if let Some(asset) = changed_assets.values().next() {
@@ -644,7 +674,9 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
644674
uniform_buffer_arrays.prepare_uniform_buffers(*asset_handle, asset);
645675
let mut bindings =
646676
asset_render_resource_bindings.get_or_insert_mut(&Handle::<T>::weak(*asset_handle));
647-
setup_uniform_texture_resources::<T>(&asset, render_resource_context, &mut bindings);
677+
if !setup_uniform_texture_resources::<T>(&asset, render_resource_context, &mut bindings) {
678+
asset_state.assets_waiting_for_textures.push(*asset_handle);
679+
}
648680
}
649681

650682
let resized = uniform_buffer_arrays.resize_buffer_arrays(render_resource_context);
@@ -721,9 +753,11 @@ fn setup_uniform_texture_resources<T>(
721753
uniforms: &T,
722754
render_resource_context: &dyn RenderResourceContext,
723755
render_resource_bindings: &mut RenderResourceBindings,
724-
) where
756+
) -> bool
757+
where
725758
T: renderer::RenderResources,
726759
{
760+
let mut success = true;
727761
for (i, render_resource) in uniforms.iter().enumerate() {
728762
if let Some(RenderResourceType::Texture) = render_resource.resource_type() {
729763
let render_resource_name = uniforms.get_render_resource_name(i).unwrap();
@@ -745,8 +779,12 @@ fn setup_uniform_texture_resources<T>(
745779
RenderResourceBinding::Sampler(sampler_resource.get_sampler().unwrap()),
746780
);
747781
continue;
782+
} else {
783+
success = false;
748784
}
749785
}
750786
}
751787
}
788+
789+
success
752790
}

0 commit comments

Comments
 (0)