From e88e3517d63d114d20d8d063f366c8de8f792669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20L=C3=B6bel?= Date: Wed, 17 Jun 2020 19:47:20 +0200 Subject: [PATCH] Move backend selection to Instance::new() Keep `inputs` parameter in `pick_adapter()` --- player/src/main.rs | 3 +- wgpu-core/src/hub.rs | 8 +- wgpu-core/src/instance.rs | 157 ++++++++++++++++++++++++-------------- 3 files changed, 105 insertions(+), 63 deletions(-) diff --git a/player/src/main.rs b/player/src/main.rs index 047fdb226a..0ce03d416d 100644 --- a/player/src/main.rs +++ b/player/src/main.rs @@ -486,7 +486,8 @@ fn main() { .build(&event_loop) .unwrap(); - let global = wgc::hub::Global::new("player", IdentityPassThroughFactory); + let global = + wgc::hub::Global::new("player", IdentityPassThroughFactory, wgt::BackendBit::all()); let mut command_buffer_id_manager = wgc::hub::IdentityManager::default(); #[cfg(feature = "winit")] diff --git a/wgpu-core/src/hub.rs b/wgpu-core/src/hub.rs index 8ff49b97dc..1a57cce4ca 100644 --- a/wgpu-core/src/hub.rs +++ b/wgpu-core/src/hub.rs @@ -576,9 +576,9 @@ pub struct Global { } impl Global { - pub fn new(name: &str, factory: G) -> Self { + pub fn new(name: &str, factory: G, backends: wgt::BackendBit) -> Self { Global { - instance: Instance::new(name, 1), + instance: Instance::new(name, 1, backends), surfaces: Registry::without_backend(&factory, "Surface"), hubs: Hubs::new(&factory), } @@ -637,7 +637,7 @@ impl GfxBackend for backend::Metal { &global.hubs.metal } fn get_surface_mut(surface: &mut Surface) -> &mut Self::Surface { - &mut surface.metal + surface.metal.as_mut().unwrap() } } @@ -659,7 +659,7 @@ impl GfxBackend for backend::Dx11 { &global.hubs.dx11 } fn get_surface_mut(surface: &mut Surface) -> &mut Self::Surface { - &mut surface.dx11 + surface.dx11.as_mut().unwrap() } } diff --git a/wgpu-core/src/instance.rs b/wgpu-core/src/instance.rs index 634da9dcc2..b9c7ae0a92 100644 --- a/wgpu-core/src/instance.rs +++ b/wgpu-core/src/instance.rs @@ -50,27 +50,43 @@ pub struct Instance { ))] pub vulkan: Option, #[cfg(any(target_os = "ios", target_os = "macos"))] - pub metal: gfx_backend_metal::Instance, + pub metal: Option, #[cfg(windows)] pub dx12: Option, #[cfg(windows)] - pub dx11: gfx_backend_dx11::Instance, + pub dx11: Option, } impl Instance { - pub fn new(name: &str, version: u32) -> Self { + pub fn new(name: &str, version: u32, backends: BackendBit) -> Self { Instance { #[cfg(any( not(any(target_os = "ios", target_os = "macos")), feature = "gfx-backend-vulkan" ))] - vulkan: gfx_backend_vulkan::Instance::create(name, version).ok(), + vulkan: if backends.contains(Backend::Vulkan.into()) { + gfx_backend_vulkan::Instance::create(name, version).ok() + } else { + None + }, #[cfg(any(target_os = "ios", target_os = "macos"))] - metal: gfx_backend_metal::Instance::create(name, version).unwrap(), + metal: if backends.contains(Backend::Metal.into()) { + Some(gfx_backend_metal::Instance::create(name, version).unwrap()) + } else { + None + }, #[cfg(windows)] - dx12: gfx_backend_dx12::Instance::create(name, version).ok(), + dx12: if backends.contains(Backend::Dx12.into()) { + gfx_backend_dx12::Instance::create(name, version).ok() + } else { + None + }, #[cfg(windows)] - dx11: gfx_backend_dx11::Instance::create(name, version).unwrap(), + dx11: if backends.contains(Backend::Dx11.into()) { + Some(gfx_backend_dx11::Instance::create(name, version).unwrap()) + } else { + None + }, } } @@ -86,14 +102,18 @@ impl Instance { } #[cfg(any(target_os = "ios", target_os = "macos"))] unsafe { - self.metal.destroy_surface(surface.metal); + if let Some(suf) = surface.metal { + self.metal.as_mut().unwrap().destroy_surface(suf); + } } #[cfg(windows)] unsafe { if let Some(suf) = surface.dx12 { self.dx12.as_mut().unwrap().destroy_surface(suf); } - self.dx11.destroy_surface(surface.dx11); + if let Some(suf) = surface.dx11 { + self.dx11.as_mut().unwrap().destroy_surface(suf); + } } } } @@ -108,11 +128,11 @@ pub struct Surface { ))] pub vulkan: Option>, #[cfg(any(target_os = "ios", target_os = "macos"))] - pub metal: GfxSurface, + pub metal: Option>, #[cfg(windows)] pub dx12: Option>, #[cfg(windows)] - pub dx11: GfxSurface, + pub dx11: Option>, } #[derive(Debug)] @@ -288,7 +308,11 @@ impl Global { .as_ref() .and_then(|inst| inst.create_surface(handle).ok()), #[cfg(any(target_os = "ios", target_os = "macos"))] - metal: self.instance.metal.create_surface(handle).unwrap(), + metal: self + .instance + .metal + .as_ref() + .and_then(|inst| inst.create_surface(handle).ok()), #[cfg(windows)] dx12: self .instance @@ -296,7 +320,11 @@ impl Global { .as_ref() .and_then(|inst| inst.create_surface(handle).ok()), #[cfg(windows)] - dx11: self.instance.dx11.create_surface(handle).unwrap(), + dx11: self + .instance + .dx11 + .as_ref() + .and_then(|inst| inst.create_surface(handle).ok()), } }; @@ -334,15 +362,17 @@ impl Global { } #[cfg(any(target_os = "ios", target_os = "macos"))] { - if let Some(id_metal) = inputs.find(Backend::Metal) { - for raw in instance.metal.enumerate_adapters() { - let adapter = Adapter::new(raw, unsafe_extensions); - log::info!("Adapter Metal {:?}", adapter.raw.info); - adapters.push(backend::Metal::hub(self).adapters.register_identity( - id_metal.clone(), - adapter, - &mut token, - )); + if let Some(ref inst) = instance.metal { + if let Some(id_metal) = inputs.find(Backend::Metal) { + for raw in inst.enumerate_adapters() { + let adapter = Adapter::new(raw, unsafe_extensions); + log::info!("Adapter Metal {:?}", adapter.raw.info); + adapters.push(backend::Metal::hub(self).adapters.register_identity( + id_metal.clone(), + adapter, + &mut token, + )); + } } } } @@ -361,16 +391,17 @@ impl Global { } } } - - if let Some(id_dx11) = inputs.find(Backend::Dx11) { - for raw in instance.dx11.enumerate_adapters() { - let adapter = Adapter::new(raw, unsafe_extensions); - log::info!("Adapter Dx11 {:?}", adapter.raw.info); - adapters.push(backend::Dx11::hub(self).adapters.register_identity( - id_dx11.clone(), - adapter, - &mut token, - )); + if let Some(ref inst) = instance.dx11 { + if let Some(id_dx11) = inputs.find(Backend::Dx11) { + for raw in inst.enumerate_adapters() { + let adapter = Adapter::new(raw, unsafe_extensions); + log::info!("Adapter Dx11 {:?}", adapter.raw.info); + adapters.push(backend::Dx11::hub(self).adapters.register_identity( + id_dx11.clone(), + adapter, + &mut token, + )); + } } } } @@ -420,20 +451,25 @@ impl Global { _ => Vec::new(), }; #[cfg(any(target_os = "ios", target_os = "macos"))] - let mut adapters_mtl = if id_metal.is_some() { - let mut adapters = instance.metal.enumerate_adapters(); - if let Some(surface) = compatible_surface { - adapters.retain(|a| { - a.queue_families - .iter() - .find(|qf| qf.queue_type().supports_graphics()) - .map_or(false, |qf| surface.metal.supports_queue_family(qf)) - }); + let mut adapters_mtl = match instance.metal { + Some(ref inst) if id_metal.is_some() => { + let mut adapters = inst.enumerate_adapters(); + if let Some(&Surface { + metal: Some(ref surface), + .. + }) = compatible_surface + { + adapters.retain(|a| { + a.queue_families + .iter() + .find(|qf| qf.queue_type().supports_graphics()) + .map_or(false, |qf| surface.supports_queue_family(qf)) + }); + } + device_types.extend(adapters.iter().map(|ad| ad.info.device_type.clone())); + adapters } - device_types.extend(adapters.iter().map(|ad| ad.info.device_type.clone())); - adapters - } else { - Vec::new() + _ => Vec::new(), }; #[cfg(windows)] let mut adapters_dx12 = match instance.dx12 { @@ -457,20 +493,25 @@ impl Global { _ => Vec::new(), }; #[cfg(windows)] - let mut adapters_dx11 = if id_dx11.is_some() { - let mut adapters = instance.dx11.enumerate_adapters(); - if let Some(surface) = compatible_surface { - adapters.retain(|a| { - a.queue_families - .iter() - .find(|qf| qf.queue_type().supports_graphics()) - .map_or(false, |qf| surface.dx11.supports_queue_family(qf)) - }); + let mut adapters_dx11 = match instance.dx11 { + Some(ref inst) if id_dx11.is_some() => { + let mut adapters = inst.enumerate_adapters(); + if let Some(&Surface { + dx11: Some(ref surface), + .. + }) = compatible_surface + { + adapters.retain(|a| { + a.queue_families + .iter() + .find(|qf| qf.queue_type().supports_graphics()) + .map_or(false, |qf| surface.supports_queue_family(qf)) + }); + } + device_types.extend(adapters.iter().map(|ad| ad.info.device_type.clone())); + adapters } - device_types.extend(adapters.iter().map(|ad| ad.info.device_type.clone())); - adapters - } else { - Vec::new() + _ => Vec::new(), }; if device_types.is_empty() {