Skip to content

Commit 484ec4b

Browse files
bors[bot]kvark
andauthored
Merge #3077
3077: [dx11] explicit library loading r=kvark a=kvark Sibling of #3076 but for `master`. PR checklist: - [ ] `make` succeeds (on *nix) - [ ] `make reftests` succeeds - [x] tested examples with the following backends: dx11 - [ ] `rustfmt` run on changed code Co-authored-by: Dzmitry Malyshau <dmalyshau@mozilla.com>
2 parents a7840f0 + f32b4c4 commit 484ec4b

File tree

4 files changed

+66
-27
lines changed

4 files changed

+66
-27
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Change Log
22

3+
### backend-dx12-0.4.1, backend-dx11-0.4.1 (01-11-2019)
4+
- switch to explicit linking of "d3d12.dll", "d3d11.dll" and "dxgi.dll"
5+
36
## hal-0.4.0 (23-10-2019)
47
- all strongly typed HAL wrappers are removed
58
- all use of `failure` is removed

src/backend/dx11/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "gfx-backend-dx11"
3-
version = "0.4.0"
3+
version = "0.4.1"
44
description = "DirectX-11 API backend for gfx-rs"
55
homepage = "https://github.com/gfx-rs/gfx"
66
repository = "https://github.com/gfx-rs/gfx"
@@ -23,6 +23,7 @@ auxil = { path = "../../auxil/auxil", version = "0.2", package = "gfx-auxil", fe
2323
hal = { path = "../../hal", version = "0.4", package = "gfx-hal" }
2424
range-alloc = { path = "../../auxil/range-alloc", version = "0.1" }
2525
bitflags = "1"
26+
libloading = "0.5"
2627
log = { version = "0.4" }
2728
smallvec = "0.6"
2829
spirv_cross = { version = "0.16", features = ["hlsl"] }

src/backend/dx11/src/dxgi.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use hal::adapter::{AdapterInfo, DeviceType};
22

33
use winapi::{
4-
shared::{dxgi, dxgi1_2, dxgi1_3, dxgi1_4, dxgi1_5, guiddef::GUID, winerror},
4+
shared::{dxgi, dxgi1_2, dxgi1_3, dxgi1_4, dxgi1_5, guiddef::{GUID, REFIID}, winerror},
55
um::unknwnbase::IUnknown,
66
Interface,
77
};
@@ -65,10 +65,14 @@ pub(crate) enum DxgiVersion {
6565
Dxgi1_5,
6666
}
6767

68-
fn create_dxgi_factory1(guid: &GUID) -> Result<ComPtr<dxgi::IDXGIFactory>, winerror::HRESULT> {
68+
type DxgiFun = extern "system" fn(REFIID, *mut *mut winapi::ctypes::c_void) -> winerror::HRESULT;
69+
70+
fn create_dxgi_factory1(
71+
func: &DxgiFun, guid: &GUID
72+
) -> Result<ComPtr<dxgi::IDXGIFactory>, winerror::HRESULT> {
6973
let mut factory: *mut IUnknown = ptr::null_mut();
7074

71-
let hr = unsafe { dxgi::CreateDXGIFactory1(guid, &mut factory as *mut *mut _ as *mut *mut _) };
75+
let hr = func(guid, &mut factory as *mut *mut _ as *mut *mut _);
7276

7377
if winerror::SUCCEEDED(hr) {
7478
Ok(unsafe { ComPtr::from_raw(factory as *mut _) })
@@ -79,29 +83,35 @@ fn create_dxgi_factory1(guid: &GUID) -> Result<ComPtr<dxgi::IDXGIFactory>, winer
7983

8084
pub(crate) fn get_dxgi_factory(
8185
) -> Result<(ComPtr<dxgi::IDXGIFactory>, DxgiVersion), winerror::HRESULT> {
86+
let library = libloading::Library::new("dxgi.dll")
87+
.map_err(|_| -1)?;
88+
let func: libloading::Symbol<DxgiFun> = unsafe {
89+
library.get(b"CreateDXGIFactory1")
90+
}.map_err(|_| -1)?;
91+
8292
// TODO: do we even need `create_dxgi_factory2`?
83-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_5::IDXGIFactory5::uuidof()) {
93+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_5::IDXGIFactory5::uuidof()) {
8494
return Ok((factory, DxgiVersion::Dxgi1_5));
8595
}
8696

87-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_4::IDXGIFactory4::uuidof()) {
97+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_4::IDXGIFactory4::uuidof()) {
8898
return Ok((factory, DxgiVersion::Dxgi1_4));
8999
}
90100

91-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_3::IDXGIFactory3::uuidof()) {
101+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_3::IDXGIFactory3::uuidof()) {
92102
return Ok((factory, DxgiVersion::Dxgi1_3));
93103
}
94104

95-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_2::IDXGIFactory2::uuidof()) {
105+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_2::IDXGIFactory2::uuidof()) {
96106
return Ok((factory, DxgiVersion::Dxgi1_2));
97107
}
98108

99-
if let Ok(factory) = create_dxgi_factory1(&dxgi::IDXGIFactory1::uuidof()) {
109+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi::IDXGIFactory1::uuidof()) {
100110
return Ok((factory, DxgiVersion::Dxgi1_0));
101111
}
102112

103113
// TODO: any reason why above would fail and this wouldnt?
104-
match create_dxgi_factory1(&dxgi::IDXGIFactory::uuidof()) {
114+
match create_dxgi_factory1(&func, &dxgi::IDXGIFactory::uuidof()) {
105115
Ok(factory) => Ok((factory, DxgiVersion::Dxgi1_0)),
106116
Err(hr) => Err(hr),
107117
}

src/backend/dx11/src/lib.rs

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use winapi::{
3535
shared::{
3636
dxgi::{IDXGIAdapter, IDXGIFactory, IDXGISwapChain},
3737
dxgiformat,
38-
minwindef::{FALSE, UINT},
38+
minwindef::{FALSE, UINT, HMODULE},
3939
windef::{HWND, RECT},
4040
winerror,
4141
},
@@ -105,6 +105,7 @@ impl fmt::Debug for ViewInfo {
105105
pub struct Instance {
106106
pub(crate) factory: ComPtr<IDXGIFactory>,
107107
pub(crate) dxgi_version: dxgi::DxgiVersion,
108+
library: libloading::Library,
108109
}
109110

110111
unsafe impl Send for Instance {}
@@ -245,9 +246,12 @@ impl hal::Instance<Backend> for Instance {
245246
match dxgi::get_dxgi_factory() {
246247
Ok((factory, dxgi_version)) => {
247248
info!("DXGI version: {:?}", dxgi_version);
249+
let library = libloading::Library::new("d3d11.dll")
250+
.map_err(|_| hal::UnsupportedBackend)?;
248251
Ok(Instance {
249252
factory,
250253
dxgi_version,
254+
library,
251255
})
252256
}
253257
Err(hr) => {
@@ -258,9 +262,32 @@ impl hal::Instance<Backend> for Instance {
258262
}
259263

260264
fn enumerate_adapters(&self) -> Vec<adapter::Adapter<Backend>> {
265+
type Fun = extern "system" fn(
266+
*mut IDXGIAdapter,
267+
UINT,
268+
HMODULE,
269+
UINT,
270+
*const UINT,
271+
UINT,
272+
UINT,
273+
*mut *mut d3d11::ID3D11Device,
274+
*mut UINT,
275+
*mut *mut d3d11::ID3D11DeviceContext,
276+
) -> winerror::HRESULT;
277+
261278
let mut adapters = Vec::new();
262279
let mut idx = 0;
263280

281+
let func: libloading::Symbol<Fun> = match unsafe {
282+
self.library.get(b"D3D11CreateDevice")
283+
} {
284+
Ok(func) => func,
285+
Err(e) => {
286+
error!("Unable to get device creation function: {:?}", e);
287+
return Vec::new();
288+
}
289+
};
290+
264291
while let Ok((adapter, info)) =
265292
dxgi::get_adapter(idx, self.factory.as_raw(), self.dxgi_version)
266293
{
@@ -273,20 +300,18 @@ impl hal::Instance<Backend> for Instance {
273300
let feature_level = get_feature_level(adapter.as_raw());
274301

275302
let mut device = ptr::null_mut();
276-
let hr = unsafe {
277-
d3d11::D3D11CreateDevice(
278-
adapter.as_raw() as *mut _,
279-
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
280-
ptr::null_mut(),
281-
0,
282-
[feature_level].as_ptr(),
283-
1,
284-
d3d11::D3D11_SDK_VERSION,
285-
&mut device as *mut *mut _ as *mut *mut _,
286-
ptr::null_mut(),
287-
ptr::null_mut(),
288-
)
289-
};
303+
let hr = func(
304+
adapter.as_raw() as *mut _,
305+
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
306+
ptr::null_mut(),
307+
0,
308+
[feature_level].as_ptr(),
309+
1,
310+
d3d11::D3D11_SDK_VERSION,
311+
&mut device as *mut *mut _ as *mut *mut _,
312+
ptr::null_mut(),
313+
ptr::null_mut(),
314+
);
290315

291316
if !winerror::SUCCEEDED(hr) {
292317
continue;
@@ -536,7 +561,7 @@ impl adapter::PhysicalDevice<Backend> for PhysicalDevice {
536561
// TODO: deferred context => 1 cxt/queue?
537562
let queue_groups = families
538563
.into_iter()
539-
.map(|&(family, prio)| {
564+
.map(|&(_family, prio)| {
540565
assert_eq!(prio.len(), 1);
541566
let mut group = queue::QueueGroup::new(queue::QueueFamilyId(0));
542567

@@ -700,7 +725,7 @@ impl window::Surface<Backend> for Surface {
700725
true
701726
}
702727

703-
fn capabilities(&self, physical_device: &PhysicalDevice) -> window::SurfaceCapabilities {
728+
fn capabilities(&self, _physical_device: &PhysicalDevice) -> window::SurfaceCapabilities {
704729
let current_extent = unsafe {
705730
let mut rect: RECT = mem::zeroed();
706731
assert_ne!(

0 commit comments

Comments
 (0)