From 28ba9d86ebb30173c910303b1ceb38e101a8a4a1 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Mon, 29 Nov 2021 13:06:28 -0500 Subject: [PATCH] hal/vk: check for optimus in addition to NV adapter --- wgpu-hal/src/vulkan/instance.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wgpu-hal/src/vulkan/instance.rs b/wgpu-hal/src/vulkan/instance.rs index d5fbe02877..1b0a9a6995 100644 --- a/wgpu-hal/src/vulkan/instance.rs +++ b/wgpu-hal/src/vulkan/instance.rs @@ -590,6 +590,8 @@ impl crate::Instance for super::Instance { } unsafe fn enumerate_adapters(&self) -> Vec> { + use crate::auxil::db; + let raw_devices = match self.shared.raw.enumerate_physical_devices() { Ok(devices) => devices, Err(err) => { @@ -604,8 +606,11 @@ impl crate::Instance for super::Instance { .collect::>(); // Detect if it's an Intel + NVidia configuration with Optimus - if cfg!(target_os = "linux") && self.shared.has_nv_optimus { - use crate::auxil::db; + let has_nvidia_dgpu = exposed_adapters.iter().any(|exposed| { + exposed.info.device_type == wgt::DeviceType::DiscreteGpu + && exposed.info.vendor == db::nvidia::VENDOR as usize + }); + if cfg!(target_os = "linux") && has_nvidia_dgpu && self.shared.has_nv_optimus { for exposed in exposed_adapters.iter_mut() { if exposed.info.device_type == wgt::DeviceType::IntegratedGpu && exposed.info.vendor == db::intel::VENDOR as usize