Skip to content

Commit

Permalink
Merge #3492
Browse files Browse the repository at this point in the history
3492: Determine GPU type on DX11 when possible r=kvark a=Diggsey

Cherry pick #3490 to master

Co-authored-by: Diggory Blake <diggsey@googlemail.com>
  • Loading branch information
bors[bot] and Diggsey committed Nov 30, 2020
2 parents 1d14789 + 7d0b3de commit 1c6a7e8
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 41 deletions.
107 changes: 69 additions & 38 deletions src/backend/dx11/src/dxgi.rs
Expand Up @@ -6,7 +6,7 @@ use winapi::{
guiddef::{GUID, REFIID},
winerror,
},
um::unknwnbase::IUnknown,
um::{d3d11, unknwnbase::IUnknown},
Interface,
};

Expand Down Expand Up @@ -140,30 +140,71 @@ fn enum_adapters1(
}
}

fn get_adapter_desc(adapter: *mut dxgi::IDXGIAdapter, version: DxgiVersion) -> AdapterInfo {
fn build_adapter_info(
description: &[u16],
vendor_id: u32,
device_id: u32,
flags: u32,
video_mem: usize,
device: &ComPtr<d3d11::ID3D11Device>,
) -> AdapterInfo {
let mut features_options2: d3d11::D3D11_FEATURE_DATA_D3D11_OPTIONS2 = unsafe { mem::zeroed() };
let discovered_gpu_type = winerror::SUCCEEDED(unsafe {
device.CheckFeatureSupport(
d3d11::D3D11_FEATURE_D3D11_OPTIONS2,
&mut features_options2 as *mut _ as *mut _,
mem::size_of::<d3d11::D3D11_FEATURE_DATA_D3D11_OPTIONS2>() as _,
)
});

let device_name = {
let len = description.iter().take_while(|&&c| c != 0).count();
let name = <OsString as OsStringExt>::from_wide(&description[..len]);
name.to_string_lossy().into_owned()
};

AdapterInfo {
name: device_name,
vendor: vendor_id as usize,
device: device_id as usize,
device_type: if (flags & dxgi::DXGI_ADAPTER_FLAG_SOFTWARE) != 0 {
DeviceType::VirtualGpu
} else if discovered_gpu_type {
if features_options2.UnifiedMemoryArchitecture == 1 {
DeviceType::IntegratedGpu
} else {
DeviceType::DiscreteGpu
}
} else if video_mem <= 512_000_000 {
DeviceType::IntegratedGpu
} else {
DeviceType::DiscreteGpu
},
}
}

pub(crate) fn get_adapter_desc(
adapter: &ComPtr<dxgi::IDXGIAdapter>,
device: &ComPtr<d3d11::ID3D11Device>,
version: DxgiVersion,
) -> AdapterInfo {
let adapter = adapter.as_raw();

match version {
DxgiVersion::Dxgi1_0 => {
let mut desc: dxgi::DXGI_ADAPTER_DESC1 = unsafe { mem::zeroed() };
unsafe {
(*(adapter as *mut dxgi::IDXGIAdapter1)).GetDesc1(&mut desc);
}

let device_name = {
let len = desc.Description.iter().take_while(|&&c| c != 0).count();
let name = <OsString as OsStringExt>::from_wide(&desc.Description[..len]);
name.to_string_lossy().into_owned()
};

AdapterInfo {
name: device_name,
vendor: desc.VendorId as usize,
device: desc.DeviceId as usize,
device_type: if (desc.Flags & dxgi::DXGI_ADAPTER_FLAG_SOFTWARE) != 0 {
DeviceType::VirtualGpu
} else {
DeviceType::DiscreteGpu
},
}
build_adapter_info(
&desc.Description,
desc.VendorId,
desc.DeviceId,
desc.Flags,
desc.DedicatedVideoMemory,
device,
)
}
DxgiVersion::Dxgi1_2
| DxgiVersion::Dxgi1_3
Expand All @@ -174,22 +215,14 @@ fn get_adapter_desc(adapter: *mut dxgi::IDXGIAdapter, version: DxgiVersion) -> A
(*(adapter as *mut dxgi1_2::IDXGIAdapter2)).GetDesc2(&mut desc);
}

let device_name = {
let len = desc.Description.iter().take_while(|&&c| c != 0).count();
let name = <OsString as OsStringExt>::from_wide(&desc.Description[..len]);
name.to_string_lossy().into_owned()
};

AdapterInfo {
name: device_name,
vendor: desc.VendorId as usize,
device: desc.DeviceId as usize,
device_type: if (desc.Flags & dxgi::DXGI_ADAPTER_FLAG_SOFTWARE) != 0 {
DeviceType::VirtualGpu
} else {
DeviceType::DiscreteGpu
},
}
build_adapter_info(
&desc.Description,
desc.VendorId,
desc.DeviceId,
desc.Flags,
desc.DedicatedVideoMemory,
device,
)
}
}
}
Expand All @@ -198,7 +231,7 @@ pub(crate) fn get_adapter(
idx: u32,
factory: *mut dxgi::IDXGIFactory,
version: DxgiVersion,
) -> Result<(ComPtr<dxgi::IDXGIAdapter>, AdapterInfo), winerror::HRESULT> {
) -> Result<ComPtr<dxgi::IDXGIAdapter>, winerror::HRESULT> {
let adapter = match version {
DxgiVersion::Dxgi1_0
| DxgiVersion::Dxgi1_2
Expand All @@ -207,7 +240,5 @@ pub(crate) fn get_adapter(
| DxgiVersion::Dxgi1_5 => enum_adapters1(idx, factory)?,
};

let desc = get_adapter_desc(adapter.as_raw(), version);

Ok((adapter, desc))
Ok(adapter)
}
5 changes: 2 additions & 3 deletions src/backend/dx11/src/lib.rs
Expand Up @@ -458,9 +458,7 @@ impl hal::Instance<Backend> for Instance {
}
};

while let Ok((adapter, info)) =
dxgi::get_adapter(idx, self.factory.as_raw(), self.dxgi_version)
{
while let Ok(adapter) = dxgi::get_adapter(idx, self.factory.as_raw(), self.dxgi_version) {
idx += 1;

use hal::memory::Properties;
Expand Down Expand Up @@ -526,6 +524,7 @@ impl hal::Instance<Backend> for Instance {
],
};

let info = dxgi::get_adapter_desc(&adapter, &device, self.dxgi_version);
let limits = get_limits(feature_level);
let features = get_features(device.clone(), feature_level);
let format_properties = get_format_properties(device.clone());
Expand Down

0 comments on commit 1c6a7e8

Please sign in to comment.