use super::*;
#[derive(Clone, Debug)]
pub struct WgpuSetup {
pub instance: wgpu::Instance,
pub adapter: wgpu::Adapter,
pub device: wgpu::Device,
pub queue: wgpu::Queue,
pub backend: wgpu::Backend,
}
pub fn init_device(setup: WgpuSetup, options: RuntimeOptions) -> WgpuDevice {
use core::sync::atomic::{AtomicU32, Ordering};
static COUNTER: AtomicU32 = AtomicU32::new(0);
let device_id = COUNTER.fetch_add(1, Ordering::Relaxed);
if device_id == u32::MAX {
core::panic!("Memory ID overflowed");
}
let device_id = WgpuDevice::Existing(device_id);
let server = create_server(setup, options);
let _ = ComputeClient::<WgpuRuntime>::init(&device_id, server);
device_id
}
pub fn init_setup<G: GraphicsApi>(device: &WgpuDevice, options: RuntimeOptions) -> WgpuSetup {
cfg_if::cfg_if! {
if #[cfg(target_family = "wasm")] {
let _ = (device, options);
panic!("Creating a wgpu setup synchronously is unsupported on wasm. Use init_async instead");
} else {
future::block_on(init_setup_async::<G>(device, options))
}
}
}
pub async fn init_setup_async<G: GraphicsApi>(
device: &WgpuDevice,
options: RuntimeOptions,
) -> WgpuSetup {
let setup = create_setup_for_device(device, G::backend()).await;
let return_setup = setup.clone();
let server = create_server(setup, options);
let _ = ComputeClient::<WgpuRuntime>::init(device, server);
return_setup
}
pub(crate) async fn create_setup_for_device(
device: &WgpuDevice,
backend: wgpu::Backend,
) -> WgpuSetup {
let (instance, adapter) = super::adapters::request_adapter(device, backend).await;
let (device, queue) = backend::request_device(&adapter).await;
log::info!(
"Created wgpu compute server on device {:?} => {:?}",
device,
adapter.get_info()
);
WgpuSetup {
instance,
adapter,
device,
queue,
backend,
}
}