renderer init: create a detached task only on wasm, block otherwise (#9830)
# Objective - When initializing the renderer, Bevy currently create a detached task - This is needed on wasm but not on native ## Solution - Don't create a detached task on native but block on the future
This commit is contained in:
parent
73e06e33da
commit
401b2e77f3
@ -251,41 +251,43 @@ impl Plugin for RenderPlugin {
|
|||||||
let primary_window = system_state.get(&app.world).get_single().ok().cloned();
|
let primary_window = system_state.get(&app.world).get_single().ok().cloned();
|
||||||
|
|
||||||
let settings = self.wgpu_settings.clone();
|
let settings = self.wgpu_settings.clone();
|
||||||
bevy_tasks::IoTaskPool::get()
|
let async_renderer = async move {
|
||||||
.spawn_local(async move {
|
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
|
||||||
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
|
backends,
|
||||||
backends,
|
dx12_shader_compiler: settings.dx12_shader_compiler.clone(),
|
||||||
dx12_shader_compiler: settings.dx12_shader_compiler.clone(),
|
});
|
||||||
});
|
let surface = primary_window.map(|wrapper| unsafe {
|
||||||
let surface = primary_window.map(|wrapper| unsafe {
|
// SAFETY: Plugins should be set up on the main thread.
|
||||||
// SAFETY: Plugins should be set up on the main thread.
|
let handle = wrapper.get_handle();
|
||||||
let handle = wrapper.get_handle();
|
instance
|
||||||
instance
|
.create_surface(&handle)
|
||||||
.create_surface(&handle)
|
.expect("Failed to create wgpu surface")
|
||||||
.expect("Failed to create wgpu surface")
|
});
|
||||||
});
|
|
||||||
|
|
||||||
let request_adapter_options = wgpu::RequestAdapterOptions {
|
let request_adapter_options = wgpu::RequestAdapterOptions {
|
||||||
power_preference: settings.power_preference,
|
power_preference: settings.power_preference,
|
||||||
compatible_surface: surface.as_ref(),
|
compatible_surface: surface.as_ref(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
let (device, queue, adapter_info, render_adapter) =
|
let (device, queue, adapter_info, render_adapter) =
|
||||||
renderer::initialize_renderer(
|
renderer::initialize_renderer(&instance, &settings, &request_adapter_options)
|
||||||
&instance,
|
|
||||||
&settings,
|
|
||||||
&request_adapter_options,
|
|
||||||
)
|
|
||||||
.await;
|
.await;
|
||||||
debug!("Configured wgpu adapter Limits: {:#?}", device.limits());
|
debug!("Configured wgpu adapter Limits: {:#?}", device.limits());
|
||||||
debug!("Configured wgpu adapter Features: {:#?}", device.features());
|
debug!("Configured wgpu adapter Features: {:#?}", device.features());
|
||||||
let mut future_renderer_resources_inner =
|
let mut future_renderer_resources_inner =
|
||||||
future_renderer_resources_wrapper.lock().unwrap();
|
future_renderer_resources_wrapper.lock().unwrap();
|
||||||
*future_renderer_resources_inner =
|
*future_renderer_resources_inner =
|
||||||
Some((device, queue, adapter_info, render_adapter, instance));
|
Some((device, queue, adapter_info, render_adapter, instance));
|
||||||
})
|
};
|
||||||
|
// In wasm, spawn a task and detach it for execution
|
||||||
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
bevy_tasks::IoTaskPool::get()
|
||||||
|
.spawn_local(async_renderer)
|
||||||
.detach();
|
.detach();
|
||||||
|
// Otherwise, just block for it to complete
|
||||||
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
|
futures_lite::future::block_on(async_renderer);
|
||||||
|
|
||||||
app.init_resource::<ScratchMainWorld>();
|
app.init_resource::<ScratchMainWorld>();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user