From ad967d3b95f7c57bc914eca70fa2c5db960cf197 Mon Sep 17 00:00:00 2001 From: Connor Fitzgerald Date: Tue, 17 Oct 2023 23:18:31 -0400 Subject: [PATCH 1/7] Skip integrated warp --- wgpu-hal/src/auxil/dxgi/conv.rs | 8 ++++++++ wgpu-hal/src/auxil/dxgi/factory.rs | 15 +++++++++++++++ wgpu-hal/src/dx12/adapter.rs | 7 +------ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/wgpu-hal/src/auxil/dxgi/conv.rs b/wgpu-hal/src/auxil/dxgi/conv.rs index 3798f7ea0a..f3f4a18317 100644 --- a/wgpu-hal/src/auxil/dxgi/conv.rs +++ b/wgpu-hal/src/auxil/dxgi/conv.rs @@ -1,5 +1,13 @@ +use std::{ffi::OsString, os::windows::ffi::OsStringExt}; use winapi::shared::dxgiformat; +// Helper to convert DXGI adapter name to a normal string +pub fn map_adapter_name(name: [u16; 128]) -> String { + let len = name.iter().take_while(|&&c| c != 0).count(); + let name = OsString::from_wide(&name[..len]); + name.to_string_lossy().into_owned() +} + pub fn map_texture_format_failable(format: wgt::TextureFormat) -> Option { use wgt::TextureFormat as Tf; use winapi::shared::dxgiformat::*; diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index 1e0847d2c4..2cf0a11032 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -55,6 +55,21 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Adapter3 diff --git a/wgpu-hal/src/dx12/adapter.rs b/wgpu-hal/src/dx12/adapter.rs index f291e0808d..23bd25e6aa 100644 --- a/wgpu-hal/src/dx12/adapter.rs +++ b/wgpu-hal/src/dx12/adapter.rs @@ -102,12 +102,7 @@ impl super::Adapter { adapter.unwrap_adapter2().GetDesc2(&mut desc); } - let device_name = { - use std::{ffi::OsString, os::windows::ffi::OsStringExt}; - let len = desc.Description.iter().take_while(|&&c| c != 0).count(); - let name = OsString::from_wide(&desc.Description[..len]); - name.to_string_lossy().into_owned() - }; + let device_name = auxil::dxgi::conv::map_adapter_name(desc.Description); let mut features_architecture: d3d12_ty::D3D12_FEATURE_DATA_ARCHITECTURE = unsafe { mem::zeroed() }; From 2d75a561e809c59635d41255bf50cdade82afd64 Mon Sep 17 00:00:00 2001 From: Connor Fitzgerald Date: Tue, 17 Oct 2023 23:25:30 -0400 Subject: [PATCH 2/7] Zeroed --- wgpu-hal/src/auxil/dxgi/factory.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index 2cf0a11032..9d49cd0d11 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -55,7 +55,7 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Date: Tue, 17 Oct 2023 23:27:23 -0400 Subject: [PATCH 3/7] Filter didn't work --- wgpu-hal/src/auxil/dxgi/factory.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index 9d49cd0d11..6c748e761f 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -63,7 +63,7 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Date: Tue, 17 Oct 2023 23:40:01 -0400 Subject: [PATCH 4/7] What --- wgpu-hal/src/auxil/dxgi/factory.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index 6c748e761f..468d19be12 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -63,8 +63,11 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Date: Wed, 18 Oct 2023 00:13:55 -0400 Subject: [PATCH 5/7] Whoops --- wgpu-hal/src/auxil/dxgi/factory.rs | 41 ++++++++++++++++++------------ 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index 468d19be12..8af2e7ed2c 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -14,6 +14,25 @@ pub enum DxgiFactoryType { Factory6, } +fn filter_adapter(adapter: &dxgi::IDXGIAdapter1) -> bool { + let mut desc = unsafe { std::mem::zeroed() }; + unsafe { adapter.GetDesc1(&mut desc) }; + + // If run completely headless, windows will show two different WARP adapters, one + // which is lying about being an integrated card. This is so that programs + // that ignore software adapters will actually run on headless/gpu-less machines. + // + // We don't want that and discorage that kind of filtering anyway, so we skip the integrated WARP. + if desc.VendorId == 5140 && (desc.Flags & dxgi::DXGI_ADAPTER_FLAG_SOFTWARE) == 0 { + let adapter_name = super::conv::map_adapter_name(desc.Description); + if adapter_name.contains("Microsoft Basic Render Driver") { + return false; + } + } + + true +} + pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec { let mut adapters = Vec::with_capacity(8); @@ -39,6 +58,10 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Vec Date: Wed, 18 Oct 2023 00:16:45 -0400 Subject: [PATCH 6/7] I'm a professional software engineer --- wgpu-hal/src/auxil/dxgi/factory.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index 8af2e7ed2c..fa168c8202 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -78,7 +78,7 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Date: Wed, 18 Oct 2023 00:23:40 -0400 Subject: [PATCH 7/7] Better names --- wgpu-hal/src/auxil/dxgi/factory.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wgpu-hal/src/auxil/dxgi/factory.rs b/wgpu-hal/src/auxil/dxgi/factory.rs index fa168c8202..86d632678c 100644 --- a/wgpu-hal/src/auxil/dxgi/factory.rs +++ b/wgpu-hal/src/auxil/dxgi/factory.rs @@ -14,7 +14,7 @@ pub enum DxgiFactoryType { Factory6, } -fn filter_adapter(adapter: &dxgi::IDXGIAdapter1) -> bool { +fn should_keep_adapter(adapter: &dxgi::IDXGIAdapter1) -> bool { let mut desc = unsafe { std::mem::zeroed() }; unsafe { adapter.GetDesc1(&mut desc) }; @@ -58,7 +58,7 @@ pub fn enumerate_adapters(factory: d3d12::DxgiFactory) -> Vec Vec