From ab8dcf91bdcad6c8d0a39802f2823e65aafa8f0a Mon Sep 17 00:00:00 2001 From: Downtime Date: Sun, 21 Mar 2021 11:42:25 +0800 Subject: [PATCH 1/2] Support choosing `wgpu` backend using env var --- wgpu/src/window/compositor.rs | 41 ++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 36d6ab1a..3d785f71 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -15,6 +15,35 @@ pub struct Compositor { local_pool: futures::executor::LocalPool, } +#[derive(Clone)] +pub enum WgpuBackend { + Auto, + Vulkan, + Metal, + Dx12, + Dx11, + Gl, + BrowserWgpu, +} + +impl WgpuBackend { + fn from_env() -> Self { + if let Ok(backend) = std::env::var("WGPU_BACKEND") { + match backend.to_lowercase().as_str() { + "vulkan" => WgpuBackend::Vulkan, + "metal" => WgpuBackend::Metal, + "dx12" => WgpuBackend::Dx12, + "dx11" => WgpuBackend::Dx11, + "gl" => WgpuBackend::Gl, + "webgpu" => WgpuBackend::BrowserWgpu, + other => panic!("Unknown backend: {}", other), + } + } else { + WgpuBackend::Auto + } + } +} + impl Compositor { const CHUNK_SIZE: u64 = 10 * 1024; @@ -22,7 +51,17 @@ impl Compositor { /// /// Returns `None` if no compatible graphics adapter could be found. pub async fn request(settings: Settings) -> Option { - let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); + let backend = match WgpuBackend::from_env() { + WgpuBackend::Auto => wgpu::BackendBit::PRIMARY, + WgpuBackend::Vulkan => wgpu::BackendBit::VULKAN, + WgpuBackend::Metal => wgpu::BackendBit::METAL, + WgpuBackend::Dx12 => wgpu::BackendBit::DX12, + WgpuBackend::Dx11 => wgpu::BackendBit::DX11, + WgpuBackend::Gl => wgpu::BackendBit::GL, + WgpuBackend::BrowserWgpu => wgpu::BackendBit::BROWSER_WEBGPU, + }; + + let instance = wgpu::Instance::new(backend); let adapter = instance .request_adapter(&wgpu::RequestAdapterOptions { From 883c7e71ae699a29c23b8f95b7335d015e5a985d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Thu, 25 Mar 2021 11:27:31 +0100 Subject: [PATCH 2/2] Introduce `internal_backend` to `iced_wgpu::Settings` --- glow/src/settings.rs | 9 ++++++++ src/application.rs | 2 +- wgpu/src/settings.rs | 41 +++++++++++++++++++++++++++++++++++ wgpu/src/window/compositor.rs | 41 +---------------------------------- 4 files changed, 52 insertions(+), 41 deletions(-) diff --git a/glow/src/settings.rs b/glow/src/settings.rs index 524d91a9..8477eb57 100644 --- a/glow/src/settings.rs +++ b/glow/src/settings.rs @@ -29,3 +29,12 @@ impl Default for Settings { } } } + +impl Settings { + /// Creates new [`Settings`] using environment configuration. + /// + /// Currently, this is equivalent to calling [`Settings::default`]. + pub fn from_env() -> Self { + Self::default() + } +} diff --git a/src/application.rs b/src/application.rs index 4c6d5b7f..83ce900a 100644 --- a/src/application.rs +++ b/src/application.rs @@ -206,7 +206,7 @@ pub trait Application: Sized { } else { None }, - ..crate::renderer::Settings::default() + ..crate::renderer::Settings::from_env() }; Ok(crate::runtime::application::run::< diff --git a/wgpu/src/settings.rs b/wgpu/src/settings.rs index 26763e22..abc404dc 100644 --- a/wgpu/src/settings.rs +++ b/wgpu/src/settings.rs @@ -16,6 +16,9 @@ pub struct Settings { /// [`Backend`]: crate::Backend pub present_mode: wgpu::PresentMode, + /// The internal graphics backend to use. + pub internal_backend: wgpu::BackendBit, + /// The bytes of the font that will be used by default. /// /// If `None` is provided, a default system font will be chosen. @@ -30,14 +33,52 @@ pub struct Settings { pub antialiasing: Option, } +impl Settings { + /// Creates new [`Settings`] using environment configuration. + /// + /// Specifically: + /// + /// - The `internal_backend` can be configured using the `WGPU_BACKEND` + /// environment variable. If the variable is not set, the primary backend + /// will be used. The following values are allowed: + /// - `vulkan` + /// - `metal` + /// - `dx12` + /// - `dx11` + /// - `gl` + /// - `webgpu` + pub fn from_env() -> Self { + Settings { + internal_backend: backend_from_env() + .unwrap_or(wgpu::BackendBit::PRIMARY), + ..Self::default() + } + } +} + impl Default for Settings { fn default() -> Settings { Settings { format: wgpu::TextureFormat::Bgra8UnormSrgb, present_mode: wgpu::PresentMode::Mailbox, + internal_backend: wgpu::BackendBit::PRIMARY, default_font: None, default_text_size: 20, antialiasing: None, } } } + +fn backend_from_env() -> Option { + std::env::var("WGPU_BACKEND").ok().map(|backend| { + match backend.to_lowercase().as_str() { + "vulkan" => wgpu::BackendBit::VULKAN, + "metal" => wgpu::BackendBit::METAL, + "dx12" => wgpu::BackendBit::DX12, + "dx11" => wgpu::BackendBit::DX11, + "gl" => wgpu::BackendBit::GL, + "webgpu" => wgpu::BackendBit::BROWSER_WEBGPU, + other => panic!("Unknown backend: {}", other), + } + }) +} diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 3d785f71..fdd648e8 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -15,35 +15,6 @@ pub struct Compositor { local_pool: futures::executor::LocalPool, } -#[derive(Clone)] -pub enum WgpuBackend { - Auto, - Vulkan, - Metal, - Dx12, - Dx11, - Gl, - BrowserWgpu, -} - -impl WgpuBackend { - fn from_env() -> Self { - if let Ok(backend) = std::env::var("WGPU_BACKEND") { - match backend.to_lowercase().as_str() { - "vulkan" => WgpuBackend::Vulkan, - "metal" => WgpuBackend::Metal, - "dx12" => WgpuBackend::Dx12, - "dx11" => WgpuBackend::Dx11, - "gl" => WgpuBackend::Gl, - "webgpu" => WgpuBackend::BrowserWgpu, - other => panic!("Unknown backend: {}", other), - } - } else { - WgpuBackend::Auto - } - } -} - impl Compositor { const CHUNK_SIZE: u64 = 10 * 1024; @@ -51,17 +22,7 @@ impl Compositor { /// /// Returns `None` if no compatible graphics adapter could be found. pub async fn request(settings: Settings) -> Option { - let backend = match WgpuBackend::from_env() { - WgpuBackend::Auto => wgpu::BackendBit::PRIMARY, - WgpuBackend::Vulkan => wgpu::BackendBit::VULKAN, - WgpuBackend::Metal => wgpu::BackendBit::METAL, - WgpuBackend::Dx12 => wgpu::BackendBit::DX12, - WgpuBackend::Dx11 => wgpu::BackendBit::DX11, - WgpuBackend::Gl => wgpu::BackendBit::GL, - WgpuBackend::BrowserWgpu => wgpu::BackendBit::BROWSER_WEBGPU, - }; - - let instance = wgpu::Instance::new(backend); + let instance = wgpu::Instance::new(settings.internal_backend); let adapter = instance .request_adapter(&wgpu::RequestAdapterOptions {