From ab8dcf91bdcad6c8d0a39802f2823e65aafa8f0a Mon Sep 17 00:00:00 2001
From: Downtime <yrainbxqc@gmail.com>
Date: Sun, 21 Mar 2021 11:42:25 +0800
Subject: Support choosing `wgpu` backend using env var

---
 wgpu/src/window/compositor.rs | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

(limited to 'wgpu/src/window')

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<Self> {
-        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 {
-- 
cgit