1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
use crate::registry::{HUB, Items}; use crate::{WeaklyStored, Device, AdapterId, DeviceId, InstanceId, }; #[cfg(feature = "winit")] use crate::{Surface, SurfaceId}; use hal::{self, Instance as _Instance, PhysicalDevice as _PhysicalDevice}; #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] pub enum PowerPreference { Default = 0, LowPower = 1, HighPerformance = 2, } #[repr(C)] pub struct AdapterDescriptor { pub power_preference: PowerPreference, } #[repr(C)] pub struct Extensions { pub anisotropic_filtering: bool, } #[repr(C)] pub struct DeviceDescriptor { pub extensions: Extensions, } #[no_mangle] pub extern "C" fn wgpu_create_instance() -> InstanceId { #[cfg(any( feature = "gfx-backend-vulkan", feature = "gfx-backend-dx11", feature = "gfx-backend-dx12", feature = "gfx-backend-metal" ))] { let inst = ::back::Instance::create("wgpu", 1); if true { return HUB.instances.write().register(inst); } } unimplemented!() } #[cfg(feature = "winit")] #[no_mangle] pub extern "C" fn wgpu_instance_create_surface_from_winit( instance_id: InstanceId, window: &winit::Window, ) -> SurfaceId { let raw = HUB.instances .read() .get(instance_id) .create_surface(window); let surface = Surface { raw, }; HUB.surfaces .write() .register(surface) } #[no_mangle] pub extern "C" fn wgpu_instance_get_adapter( instance_id: InstanceId, desc: &AdapterDescriptor, ) -> AdapterId { let instance_guard = HUB.instances.read(); let instance = instance_guard.get(instance_id); let (mut low, mut high, mut other) = (None, None, None); for adapter in instance.enumerate_adapters() { match adapter.info.device_type { hal::adapter::DeviceType::IntegratedGpu => low = Some(adapter), hal::adapter::DeviceType::DiscreteGpu => high = Some(adapter), _ => other = Some(adapter), } } let some = match desc.power_preference { PowerPreference::LowPower => low.or(high), PowerPreference::HighPerformance | PowerPreference::Default => high.or(low), }; HUB.adapters.write().register(some.or(other).unwrap()) } #[no_mangle] pub extern "C" fn wgpu_adapter_create_device( adapter_id: AdapterId, _desc: &DeviceDescriptor, ) -> DeviceId { let mut adapter_guard = HUB.adapters.write(); let adapter = adapter_guard.get_mut(adapter_id); let (raw, queue_group) = adapter.open_with::<_, hal::General>(1, |_qf| true).unwrap(); let mem_props = adapter.physical_device.memory_properties(); let device = Device::new(raw, WeaklyStored(adapter_id), queue_group, mem_props); HUB.devices .write() .register(device) }