ruda_driver_wgpu/runtime/
setup.rs1use super::*;
2
3#[derive(Clone, Debug)]
7pub struct WgpuSetup {
8 pub instance: wgpu::Instance,
10 pub adapter: wgpu::Adapter,
12 pub device: wgpu::Device,
14 pub queue: wgpu::Queue,
16 pub backend: wgpu::Backend,
18}
19
20pub fn init_device(setup: WgpuSetup, options: RuntimeOptions) -> WgpuDevice {
30 use core::sync::atomic::{AtomicU32, Ordering};
31
32 static COUNTER: AtomicU32 = AtomicU32::new(0);
33
34 let device_id = COUNTER.fetch_add(1, Ordering::Relaxed);
35 if device_id == u32::MAX {
36 core::panic!("Memory ID overflowed");
37 }
38
39 let device_id = WgpuDevice::Existing(device_id);
40 let server = create_server(setup, options);
41 let _ = ComputeClient::<WgpuRuntime>::init(&device_id, server);
42 device_id
43}
44
45pub fn init_setup<G: GraphicsApi>(device: &WgpuDevice, options: RuntimeOptions) -> WgpuSetup {
48 cfg_if::cfg_if! {
49 if #[cfg(target_family = "wasm")] {
50 let _ = (device, options);
51 panic!("Creating a wgpu setup synchronously is unsupported on wasm. Use init_async instead");
52 } else {
53 future::block_on(init_setup_async::<G>(device, options))
54 }
55 }
56}
57
58pub async fn init_setup_async<G: GraphicsApi>(
62 device: &WgpuDevice,
63 options: RuntimeOptions,
64) -> WgpuSetup {
65 let setup = create_setup_for_device(device, G::backend()).await;
66 let return_setup = setup.clone();
67 let server = create_server(setup, options);
68 let _ = ComputeClient::<WgpuRuntime>::init(device, server);
69 return_setup
70}
71
72pub(crate) async fn create_setup_for_device(
75 device: &WgpuDevice,
76 backend: wgpu::Backend,
77) -> WgpuSetup {
78 let (instance, adapter) = super::adapters::request_adapter(device, backend).await;
79 let (device, queue) = backend::request_device(&adapter).await;
80
81 log::info!(
82 "Created wgpu compute server on device {:?} => {:?}",
83 device,
84 adapter.get_info()
85 );
86
87 WgpuSetup {
88 instance,
89 adapter,
90 device,
91 queue,
92 backend,
93 }
94}