From bf5bf66017443874794d2ac6e317d434209baa74 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 09:29:16 -0500 Subject: [PATCH 01/12] Refactor render creation pt1 --- crates/bevy_render/src/lib.rs | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index b447125c36d09..e893c1dab18c5 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -298,21 +298,14 @@ impl Plugin for RenderPlugin { app.init_asset::() .init_asset_loader::(); - match &self.render_creation { - RenderCreation::Manual(resources) => { - let future_render_resources_wrapper = Arc::new(Mutex::new(Some(resources.clone()))); - app.insert_resource(FutureRenderResources( - future_render_resources_wrapper.clone(), - )); - // SAFETY: Plugins should be set up on the main thread. - unsafe { initialize_render_app(app) }; - } + let render_resources = match &self.render_creation { + RenderCreation::Manual(resources) => Some(FutureRenderResources(Arc::new(Mutex::new( + Some(resources.clone()), + )))), RenderCreation::Automatic(render_creation) => { if let Some(backends) = render_creation.backends { let future_render_resources_wrapper = Arc::new(Mutex::new(None)); - app.insert_resource(FutureRenderResources( - future_render_resources_wrapper.clone(), - )); + let render_resources = future_render_resources_wrapper.clone(); let primary_window = app .world_mut() @@ -351,13 +344,21 @@ impl Plugin for RenderPlugin { // Otherwise, just block for it to complete #[cfg(not(target_arch = "wasm32"))] bevy_tasks::block_on(async_renderer); - - // SAFETY: Plugins should be set up on the main thread. - unsafe { initialize_render_app(app) }; + Some(FutureRenderResources(render_resources)) + } else { + None } } }; + if let Some(render_resources) = render_resources { + app.insert_resource(render_resources); + // SAFETY: Plugins should be set up on the main thread. + unsafe { initialize_render_app(app) }; + } else { + bevy_log::error!("No backends found, failed to initialize the renderer"); + }; + app.add_plugins(( WindowRenderPlugin, CameraPlugin, From 564da154371323788974cceba7b4661ad0caef99 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 09:36:29 -0500 Subject: [PATCH 02/12] Refactor render creation pt2 --- crates/bevy_render/src/lib.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index e893c1dab18c5..a0e8e88f9f988 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -298,6 +298,20 @@ impl Plugin for RenderPlugin { app.init_asset::() .init_asset_loader::(); + let primary_window = app + .world_mut() + .query_filtered::<&RawHandleWrapperHolder, With>() + .single(app.world()) + .ok() + .cloned(); + + #[cfg(feature = "raw_vulkan_init")] + let raw_vulkan_init_settings = app + .world_mut() + .get_resource::() + .cloned() + .unwrap_or_default(); + let render_resources = match &self.render_creation { RenderCreation::Manual(resources) => Some(FutureRenderResources(Arc::new(Mutex::new( Some(resources.clone()), @@ -307,22 +321,8 @@ impl Plugin for RenderPlugin { let future_render_resources_wrapper = Arc::new(Mutex::new(None)); let render_resources = future_render_resources_wrapper.clone(); - let primary_window = app - .world_mut() - .query_filtered::<&RawHandleWrapperHolder, With>() - .single(app.world()) - .ok() - .cloned(); - let settings = render_creation.clone(); - #[cfg(feature = "raw_vulkan_init")] - let raw_vulkan_init_settings = app - .world_mut() - .get_resource::() - .cloned() - .unwrap_or_default(); - let async_renderer = async move { let render_resources = renderer::initialize_renderer( backends, From ba83acfdabbf737dfd58bdf55a0219f98deda316 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 09:38:31 -0500 Subject: [PATCH 03/12] Refactor render creation pt3 --- crates/bevy_render/src/lib.rs | 90 ++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index a0e8e88f9f988..4d1143d129b06 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -312,44 +312,12 @@ impl Plugin for RenderPlugin { .cloned() .unwrap_or_default(); - let render_resources = match &self.render_creation { - RenderCreation::Manual(resources) => Some(FutureRenderResources(Arc::new(Mutex::new( - Some(resources.clone()), - )))), - RenderCreation::Automatic(render_creation) => { - if let Some(backends) = render_creation.backends { - let future_render_resources_wrapper = Arc::new(Mutex::new(None)); - let render_resources = future_render_resources_wrapper.clone(); - - let settings = render_creation.clone(); - - let async_renderer = async move { - let render_resources = renderer::initialize_renderer( - backends, - primary_window, - &settings, - #[cfg(feature = "raw_vulkan_init")] - raw_vulkan_init_settings, - ) - .await; - - *future_render_resources_wrapper.lock().unwrap() = Some(render_resources); - }; - - // In wasm, spawn a task and detach it for execution - #[cfg(target_arch = "wasm32")] - bevy_tasks::IoTaskPool::get() - .spawn_local(async_renderer) - .detach(); - // Otherwise, just block for it to complete - #[cfg(not(target_arch = "wasm32"))] - bevy_tasks::block_on(async_renderer); - Some(FutureRenderResources(render_resources)) - } else { - None - } - } - }; + let render_resources = create_render( + &self.render_creation, + primary_window, + #[cfg(feature = "raw_vulkan_init")] + raw_vulkan_init_settings, + ); if let Some(render_resources) = render_resources { app.insert_resource(render_resources); @@ -443,6 +411,52 @@ impl Plugin for RenderPlugin { } } +fn create_render( + render_creation: &RenderCreation, + primary_window: Option, + #[cfg(feature = "raw_vulkan_init")] + raw_vulkan_init_settings: renderer::raw_vulkan_init::RawVulkanInitSettings, +) -> Option { + match render_creation { + RenderCreation::Manual(resources) => Some(FutureRenderResources(Arc::new(Mutex::new( + Some(resources.clone()), + )))), + RenderCreation::Automatic(render_creation) => { + if let Some(backends) = render_creation.backends { + let future_render_resources_wrapper = Arc::new(Mutex::new(None)); + let render_resources = future_render_resources_wrapper.clone(); + + let settings = render_creation.clone(); + + let async_renderer = async move { + let render_resources = renderer::initialize_renderer( + backends, + primary_window, + &settings, + #[cfg(feature = "raw_vulkan_init")] + raw_vulkan_init_settings, + ) + .await; + + *future_render_resources_wrapper.lock().unwrap() = Some(render_resources); + }; + + // In wasm, spawn a task and detach it for execution + #[cfg(target_arch = "wasm32")] + bevy_tasks::IoTaskPool::get() + .spawn_local(async_renderer) + .detach(); + // Otherwise, just block for it to complete + #[cfg(not(target_arch = "wasm32"))] + bevy_tasks::block_on(async_renderer); + Some(FutureRenderResources(render_resources)) + } else { + None + } + } + } +} + /// A "scratch" world used to avoid allocating new worlds every frame when /// swapping out the [`MainWorld`] for [`ExtractSchedule`]. #[derive(Resource, Default)] From a028b94fac87c7d00264b97cc659dfd761952c0a Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 09:39:50 -0500 Subject: [PATCH 04/12] Refactor render creation pt4 --- crates/bevy_render/src/lib.rs | 59 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 4d1143d129b06..f7d35ae17bbad 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -422,37 +422,34 @@ fn create_render( Some(resources.clone()), )))), RenderCreation::Automatic(render_creation) => { - if let Some(backends) = render_creation.backends { - let future_render_resources_wrapper = Arc::new(Mutex::new(None)); - let render_resources = future_render_resources_wrapper.clone(); - - let settings = render_creation.clone(); - - let async_renderer = async move { - let render_resources = renderer::initialize_renderer( - backends, - primary_window, - &settings, - #[cfg(feature = "raw_vulkan_init")] - raw_vulkan_init_settings, - ) - .await; - - *future_render_resources_wrapper.lock().unwrap() = Some(render_resources); - }; - - // In wasm, spawn a task and detach it for execution - #[cfg(target_arch = "wasm32")] - bevy_tasks::IoTaskPool::get() - .spawn_local(async_renderer) - .detach(); - // Otherwise, just block for it to complete - #[cfg(not(target_arch = "wasm32"))] - bevy_tasks::block_on(async_renderer); - Some(FutureRenderResources(render_resources)) - } else { - None - } + let backends = render_creation.backends?; + let future_render_resources_wrapper = Arc::new(Mutex::new(None)); + let render_resources = future_render_resources_wrapper.clone(); + + let settings = render_creation.clone(); + + let async_renderer = async move { + let render_resources = renderer::initialize_renderer( + backends, + primary_window, + &settings, + #[cfg(feature = "raw_vulkan_init")] + raw_vulkan_init_settings, + ) + .await; + + *future_render_resources_wrapper.lock().unwrap() = Some(render_resources); + }; + + // In wasm, spawn a task and detach it for execution + #[cfg(target_arch = "wasm32")] + bevy_tasks::IoTaskPool::get() + .spawn_local(async_renderer) + .detach(); + // Otherwise, just block for it to complete + #[cfg(not(target_arch = "wasm32"))] + bevy_tasks::block_on(async_renderer); + Some(FutureRenderResources(render_resources)) } } } From 3845f57c0616450b94bb3e81e0d0fc8de680cfc6 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 09:49:21 -0500 Subject: [PATCH 05/12] Refactor render creation pt5 --- crates/bevy_render/src/lib.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index f7d35ae17bbad..c0e550886f20a 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -320,7 +320,9 @@ impl Plugin for RenderPlugin { ); if let Some(render_resources) = render_resources { - app.insert_resource(render_resources); + app.insert_resource(FutureRenderResources(Arc::new(Mutex::new(Some( + render_resources, + ))))); // SAFETY: Plugins should be set up on the main thread. unsafe { initialize_render_app(app) }; } else { @@ -416,11 +418,9 @@ fn create_render( primary_window: Option, #[cfg(feature = "raw_vulkan_init")] raw_vulkan_init_settings: renderer::raw_vulkan_init::RawVulkanInitSettings, -) -> Option { +) -> Option { match render_creation { - RenderCreation::Manual(resources) => Some(FutureRenderResources(Arc::new(Mutex::new( - Some(resources.clone()), - )))), + RenderCreation::Manual(resources) => Some(resources.clone()), RenderCreation::Automatic(render_creation) => { let backends = render_creation.backends?; let future_render_resources_wrapper = Arc::new(Mutex::new(None)); @@ -449,7 +449,7 @@ fn create_render( // Otherwise, just block for it to complete #[cfg(not(target_arch = "wasm32"))] bevy_tasks::block_on(async_renderer); - Some(FutureRenderResources(render_resources)) + render_resources.lock().unwrap().clone() } } } From 54a1df1afe1f3cba71179e8eccb02c02990e02a4 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 09:54:44 -0500 Subject: [PATCH 06/12] Refactor render creation pt6 --- crates/bevy_render/src/lib.rs | 44 +-------------------------- crates/bevy_render/src/settings.rs | 49 ++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 45 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index c0e550886f20a..28c76ba5b14f3 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -312,8 +312,7 @@ impl Plugin for RenderPlugin { .cloned() .unwrap_or_default(); - let render_resources = create_render( - &self.render_creation, + let render_resources = self.render_creation.create_render( primary_window, #[cfg(feature = "raw_vulkan_init")] raw_vulkan_init_settings, @@ -413,47 +412,6 @@ impl Plugin for RenderPlugin { } } -fn create_render( - render_creation: &RenderCreation, - primary_window: Option, - #[cfg(feature = "raw_vulkan_init")] - raw_vulkan_init_settings: renderer::raw_vulkan_init::RawVulkanInitSettings, -) -> Option { - match render_creation { - RenderCreation::Manual(resources) => Some(resources.clone()), - RenderCreation::Automatic(render_creation) => { - let backends = render_creation.backends?; - let future_render_resources_wrapper = Arc::new(Mutex::new(None)); - let render_resources = future_render_resources_wrapper.clone(); - - let settings = render_creation.clone(); - - let async_renderer = async move { - let render_resources = renderer::initialize_renderer( - backends, - primary_window, - &settings, - #[cfg(feature = "raw_vulkan_init")] - raw_vulkan_init_settings, - ) - .await; - - *future_render_resources_wrapper.lock().unwrap() = Some(render_resources); - }; - - // In wasm, spawn a task and detach it for execution - #[cfg(target_arch = "wasm32")] - bevy_tasks::IoTaskPool::get() - .spawn_local(async_renderer) - .detach(); - // Otherwise, just block for it to complete - #[cfg(not(target_arch = "wasm32"))] - bevy_tasks::block_on(async_renderer); - render_resources.lock().unwrap().clone() - } - } -} - /// A "scratch" world used to avoid allocating new worlds every frame when /// swapping out the [`MainWorld`] for [`ExtractSchedule`]. #[derive(Resource, Default)] diff --git a/crates/bevy_render/src/settings.rs b/crates/bevy_render/src/settings.rs index c3b284ecc13b4..ce953bff350be 100644 --- a/crates/bevy_render/src/settings.rs +++ b/crates/bevy_render/src/settings.rs @@ -1,7 +1,9 @@ use crate::renderer::{ - RenderAdapter, RenderAdapterInfo, RenderDevice, RenderInstance, RenderQueue, + self, RenderAdapter, RenderAdapterInfo, RenderDevice, RenderInstance, RenderQueue, }; -use alloc::borrow::Cow; +use alloc::{borrow::Cow, sync::Arc}; +use bevy_window::RawHandleWrapperHolder; +use std::sync::Mutex; pub use wgpu::{ Backends, Dx12Compiler, Features as WgpuFeatures, Gles3MinorVersion, InstanceFlags, @@ -189,6 +191,49 @@ impl RenderCreation { ) .into() } + + /// Creates [`RenderResources`] from this [`RenderCreation`] and an optional primary window. + /// Note: [`RenderCreation::Manual`] will ignore the provided primary window. + pub fn create_render( + &self, + primary_window: Option, + #[cfg(feature = "raw_vulkan_init")] + raw_vulkan_init_settings: renderer::raw_vulkan_init::RawVulkanInitSettings, + ) -> Option { + match self { + RenderCreation::Manual(resources) => Some(resources.clone()), + RenderCreation::Automatic(render_creation) => { + let backends = render_creation.backends?; + let future_render_resources_wrapper = Arc::new(Mutex::new(None)); + let render_resources = future_render_resources_wrapper.clone(); + + let settings = render_creation.clone(); + + let async_renderer = async move { + let render_resources = renderer::initialize_renderer( + backends, + primary_window, + &settings, + #[cfg(feature = "raw_vulkan_init")] + raw_vulkan_init_settings, + ) + .await; + + *future_render_resources_wrapper.lock().unwrap() = Some(render_resources); + }; + + // In wasm, spawn a task and detach it for execution + #[cfg(target_arch = "wasm32")] + bevy_tasks::IoTaskPool::get() + .spawn_local(async_renderer) + .detach(); + // Otherwise, just block for it to complete + #[cfg(not(target_arch = "wasm32"))] + bevy_tasks::block_on(async_renderer); + render_resources.lock().unwrap().clone() + } + } + } } impl From for RenderCreation { From 3fb116663ec575f7d6cf2a4c35250eac3f5a97bf Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 10:01:31 -0500 Subject: [PATCH 07/12] ci --- crates/bevy_render/src/settings.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/bevy_render/src/settings.rs b/crates/bevy_render/src/settings.rs index ce953bff350be..f7594154f174d 100644 --- a/crates/bevy_render/src/settings.rs +++ b/crates/bevy_render/src/settings.rs @@ -153,8 +153,7 @@ pub struct RenderResources( pub RenderAdapterInfo, pub RenderAdapter, pub RenderInstance, - #[cfg(feature = "raw_vulkan_init")] - pub crate::renderer::raw_vulkan_init::AdditionalVulkanFeatures, + #[cfg(feature = "raw_vulkan_init")] pub renderer::raw_vulkan_init::AdditionalVulkanFeatures, ); /// An enum describing how the renderer will initialize resources. This is used when creating the [`RenderPlugin`](crate::RenderPlugin). @@ -178,7 +177,7 @@ impl RenderCreation { adapter: RenderAdapter, instance: RenderInstance, #[cfg(feature = "raw_vulkan_init")] - additional_vulkan_features: crate::renderer::raw_vulkan_init::AdditionalVulkanFeatures, + additional_vulkan_features: renderer::raw_vulkan_init::AdditionalVulkanFeatures, ) -> Self { RenderResources( device, From b6308b7ad9d5b8196f719f0e2dfb8ec8adbd5f7a Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 10:19:08 -0500 Subject: [PATCH 08/12] remove FutureRenderResources --- crates/bevy_render/src/lib.rs | 19 +++---------------- crates/bevy_render/src/settings.rs | 3 ++- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 28c76ba5b14f3..0d5d7e75f12b8 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -87,7 +87,6 @@ use crate::{ texture::TexturePlugin, view::{ViewPlugin, WindowRenderPlugin}, }; -use alloc::sync::Arc; use batching::gpu_preprocessing::BatchingPlugin; use bevy_app::{App, AppLabel, Plugin, SubApp}; use bevy_asset::{AssetApp, AssetServer}; @@ -108,7 +107,6 @@ use render_asset::{ RenderAssetBytesPerFrame, RenderAssetBytesPerFrameLimiter, }; use settings::RenderResources; -use std::sync::Mutex; use sync_world::{despawn_temporary_render_entities, entity_sync_system, SyncWorldPlugin}; /// Contains the default Bevy rendering backend based on wgpu. @@ -285,9 +283,6 @@ pub mod graph { pub struct CameraDriverLabel; } -#[derive(Resource)] -struct FutureRenderResources(Arc>>); - /// A label for the rendering sub-app. #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, AppLabel)] pub struct RenderApp; @@ -319,9 +314,7 @@ impl Plugin for RenderPlugin { ); if let Some(render_resources) = render_resources { - app.insert_resource(FutureRenderResources(Arc::new(Mutex::new(Some( - render_resources, - ))))); + app.insert_resource(render_resources); // SAFETY: Plugins should be set up on the main thread. unsafe { initialize_render_app(app) }; } else { @@ -361,20 +354,14 @@ impl Plugin for RenderPlugin { } fn ready(&self, app: &App) -> bool { - app.world() - .get_resource::() - .and_then(|frr| frr.0.try_lock().map(|locked| locked.is_some()).ok()) - .unwrap_or(true) + app.world().get_resource::().is_some() } fn finish(&self, app: &mut App) { load_shader_library!(app, "maths.wgsl"); load_shader_library!(app, "color_operations.wgsl"); load_shader_library!(app, "bindless.wgsl"); - if let Some(future_render_resources) = - app.world_mut().remove_resource::() - { - let render_resources = future_render_resources.0.lock().unwrap().take().unwrap(); + if let Some(render_resources) = app.world_mut().remove_resource::() { let RenderResources(device, queue, adapter_info, render_adapter, instance, ..) = render_resources; diff --git a/crates/bevy_render/src/settings.rs b/crates/bevy_render/src/settings.rs index f7594154f174d..fe32b4859b486 100644 --- a/crates/bevy_render/src/settings.rs +++ b/crates/bevy_render/src/settings.rs @@ -2,6 +2,7 @@ use crate::renderer::{ self, RenderAdapter, RenderAdapterInfo, RenderDevice, RenderInstance, RenderQueue, }; use alloc::{borrow::Cow, sync::Arc}; +use bevy_ecs::resource::Resource; use bevy_window::RawHandleWrapperHolder; use std::sync::Mutex; @@ -146,7 +147,7 @@ impl Default for WgpuSettings { } } -#[derive(Clone)] +#[derive(Clone, Resource)] pub struct RenderResources( pub RenderDevice, pub RenderQueue, From de7d0e7526c9953259e57bac29909500fc307f5e Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 11:18:32 -0500 Subject: [PATCH 09/12] Demote error to warning because some examples intentionally run without backends --- crates/bevy_render/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 0d5d7e75f12b8..8eb23e1cd3b8d 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -318,7 +318,7 @@ impl Plugin for RenderPlugin { // SAFETY: Plugins should be set up on the main thread. unsafe { initialize_render_app(app) }; } else { - bevy_log::error!("No backends found, failed to initialize the renderer"); + bevy_log::warn!("No backends found, renderer will not be initialized."); }; app.add_plugins(( From a03835282e5ef4e844be316ae2521994bad13ab7 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 12:48:21 -0500 Subject: [PATCH 10/12] try fixing example again --- crates/bevy_render/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 8eb23e1cd3b8d..d70a670236d4a 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -317,8 +317,6 @@ impl Plugin for RenderPlugin { app.insert_resource(render_resources); // SAFETY: Plugins should be set up on the main thread. unsafe { initialize_render_app(app) }; - } else { - bevy_log::warn!("No backends found, renderer will not be initialized."); }; app.add_plugins(( From aca70e021094636e1166815e098c81faa5efe092 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 18:24:13 -0500 Subject: [PATCH 11/12] try fixing again --- crates/bevy_render/src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index d70a670236d4a..d4c736bb4bcb5 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -283,6 +283,9 @@ pub mod graph { pub struct CameraDriverLabel; } +#[derive(Resource)] +struct NoRender; + /// A label for the rendering sub-app. #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, AppLabel)] pub struct RenderApp; @@ -317,6 +320,9 @@ impl Plugin for RenderPlugin { app.insert_resource(render_resources); // SAFETY: Plugins should be set up on the main thread. unsafe { initialize_render_app(app) }; + } else { + app.insert_resource(NoRender); + bevy_log::warn!("No backends found, renderer will not be initialized."); }; app.add_plugins(( @@ -353,6 +359,7 @@ impl Plugin for RenderPlugin { fn ready(&self, app: &App) -> bool { app.world().get_resource::().is_some() + || app.world().get_resource::().is_some() } fn finish(&self, app: &mut App) { From 3891d053d047cad36b97d76dd2892f151ae2498e Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 26 Jan 2026 18:26:04 -0500 Subject: [PATCH 12/12] remove that entirely actually --- crates/bevy_render/src/lib.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index d4c736bb4bcb5..8e0dea7c3002a 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -283,9 +283,6 @@ pub mod graph { pub struct CameraDriverLabel; } -#[derive(Resource)] -struct NoRender; - /// A label for the rendering sub-app. #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, AppLabel)] pub struct RenderApp; @@ -321,7 +318,6 @@ impl Plugin for RenderPlugin { // SAFETY: Plugins should be set up on the main thread. unsafe { initialize_render_app(app) }; } else { - app.insert_resource(NoRender); bevy_log::warn!("No backends found, renderer will not be initialized."); }; @@ -357,11 +353,6 @@ impl Plugin for RenderPlugin { } } - fn ready(&self, app: &App) -> bool { - app.world().get_resource::().is_some() - || app.world().get_resource::().is_some() - } - fn finish(&self, app: &mut App) { load_shader_library!(app, "maths.wgsl"); load_shader_library!(app, "color_operations.wgsl");