Skip to content

Commit a36f7f3

Browse files
bors[bot]kvark
andauthored
Merge #3076
3076: [0.4/dx11] explicit library loading r=kvark a=kvark Supposedly fixes 32bit windows mingw CI: https://treeherder.mozilla.org/logviewer.html#/jobs?job_id=274334639&repo=try&lineNumber=88036 Similar to #3068 but for dx11 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 <[email protected]>
2 parents 56de6d8 + 282701d commit a36f7f3

File tree

4 files changed

+66
-29
lines changed

4 files changed

+66
-29
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Change Log
22

3-
### backend-dx12-0.4.1 (01-11-2019)
4-
- switch to explicit linking of "d3d12.dll" and "dxgi.dll"
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"
55

66
## hal-0.4.0 (23-10-2019)
77
- all strongly typed HAL wrappers are 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"
@@ -22,6 +22,7 @@ gfx-hal = { path = "../../hal", version = "0.4" }
2222
auxil = { path = "../../auxil/auxil", version = "0.1", package = "gfx-auxil" }
2323
range-alloc = { path = "../../auxil/range-alloc", version = "0.1" }
2424
bitflags = "1"
25+
libloading = "0.5"
2526
log = { version = "0.4" }
2627
smallvec = "0.6"
2728
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,6 +1,6 @@
11
use hal::adapter::{AdapterInfo, DeviceType};
22

3-
use winapi::shared::guiddef::GUID;
3+
use winapi::shared::guiddef::{GUID, REFIID};
44
use winapi::shared::{dxgi, dxgi1_2, dxgi1_3, dxgi1_4, dxgi1_5, winerror};
55
use winapi::um::unknwnbase::IUnknown;
66
use winapi::Interface;
@@ -67,10 +67,14 @@ pub(crate) enum DxgiVersion {
6767
Dxgi1_5,
6868
}
6969

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

73-
let hr = unsafe { dxgi::CreateDXGIFactory1(guid, &mut factory as *mut *mut _ as *mut *mut _) };
77+
let hr = func(guid, &mut factory as *mut *mut _ as *mut *mut _);
7478

7579
if winerror::SUCCEEDED(hr) {
7680
Ok(unsafe { ComPtr::from_raw(factory as *mut _) })
@@ -81,29 +85,35 @@ fn create_dxgi_factory1(guid: &GUID) -> Result<ComPtr<dxgi::IDXGIFactory>, winer
8185

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

89-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_4::IDXGIFactory4::uuidof()) {
99+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_4::IDXGIFactory4::uuidof()) {
90100
return Ok((factory, DxgiVersion::Dxgi1_4));
91101
}
92102

93-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_3::IDXGIFactory3::uuidof()) {
103+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_3::IDXGIFactory3::uuidof()) {
94104
return Ok((factory, DxgiVersion::Dxgi1_3));
95105
}
96106

97-
if let Ok(factory) = create_dxgi_factory1(&dxgi1_2::IDXGIFactory2::uuidof()) {
107+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi1_2::IDXGIFactory2::uuidof()) {
98108
return Ok((factory, DxgiVersion::Dxgi1_2));
99109
}
100110

101-
if let Ok(factory) = create_dxgi_factory1(&dxgi::IDXGIFactory1::uuidof()) {
111+
if let Ok(factory) = create_dxgi_factory1(&func, &dxgi::IDXGIFactory1::uuidof()) {
102112
return Ok((factory, DxgiVersion::Dxgi1_0));
103113
}
104114

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

src/backend/dx11/src/lib.rs

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ extern crate auxil;
55
extern crate range_alloc;
66
#[macro_use]
77
extern crate bitflags;
8+
extern crate libloading;
89
#[macro_use]
910
extern crate log;
1011
extern crate parking_lot;
@@ -39,7 +40,7 @@ use hal::{
3940
use range_alloc::RangeAllocator;
4041

4142
use winapi::shared::dxgi::{IDXGIAdapter, IDXGIFactory, IDXGISwapChain};
42-
use winapi::shared::minwindef::{FALSE, UINT};
43+
use winapi::shared::minwindef::{FALSE, UINT, HMODULE};
4344
use winapi::shared::windef::{HWND, RECT};
4445
use winapi::shared::{dxgiformat, winerror};
4546
use winapi::um::winuser::GetClientRect;
@@ -116,6 +117,7 @@ impl fmt::Debug for ViewInfo {
116117
pub struct Instance {
117118
pub(crate) factory: ComPtr<IDXGIFactory>,
118119
pub(crate) dxgi_version: dxgi::DxgiVersion,
120+
library: libloading::Library,
119121
}
120122

121123
unsafe impl Send for Instance {}
@@ -256,9 +258,12 @@ impl hal::Instance<Backend> for Instance {
256258
match dxgi::get_dxgi_factory() {
257259
Ok((factory, dxgi_version)) => {
258260
info!("DXGI version: {:?}", dxgi_version);
261+
let library = libloading::Library::new("d3d11.dll")
262+
.map_err(|_| hal::UnsupportedBackend)?;
259263
Ok(Instance {
260264
factory,
261265
dxgi_version,
266+
library,
262267
})
263268
}
264269
Err(hr) => {
@@ -269,9 +274,32 @@ impl hal::Instance<Backend> for Instance {
269274
}
270275

271276
fn enumerate_adapters(&self) -> Vec<adapter::Adapter<Backend>> {
277+
type Fun = extern "system" fn(
278+
*mut IDXGIAdapter,
279+
UINT,
280+
HMODULE,
281+
UINT,
282+
*const UINT,
283+
UINT,
284+
UINT,
285+
*mut *mut d3d11::ID3D11Device,
286+
*mut UINT,
287+
*mut *mut d3d11::ID3D11DeviceContext,
288+
) -> winerror::HRESULT;
289+
272290
let mut adapters = Vec::new();
273291
let mut idx = 0;
274292

293+
let func: libloading::Symbol<Fun> = match unsafe {
294+
self.library.get(b"D3D11CreateDevice")
295+
} {
296+
Ok(func) => func,
297+
Err(e) => {
298+
error!("Unable to get device creation function: {:?}", e);
299+
return Vec::new();
300+
}
301+
};
302+
275303
while let Ok((adapter, info)) =
276304
dxgi::get_adapter(idx, self.factory.as_raw(), self.dxgi_version)
277305
{
@@ -284,20 +312,18 @@ impl hal::Instance<Backend> for Instance {
284312
let feature_level = get_feature_level(adapter.as_raw());
285313

286314
let mut device = ptr::null_mut();
287-
let hr = unsafe {
288-
d3d11::D3D11CreateDevice(
289-
adapter.as_raw() as *mut _,
290-
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
291-
ptr::null_mut(),
292-
0,
293-
[feature_level].as_ptr(),
294-
1,
295-
d3d11::D3D11_SDK_VERSION,
296-
&mut device as *mut *mut _ as *mut *mut _,
297-
ptr::null_mut(),
298-
ptr::null_mut(),
299-
)
300-
};
315+
let hr = func(
316+
adapter.as_raw() as *mut _,
317+
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
318+
ptr::null_mut(),
319+
0,
320+
[feature_level].as_ptr(),
321+
1,
322+
d3d11::D3D11_SDK_VERSION,
323+
&mut device as *mut *mut _ as *mut *mut _,
324+
ptr::null_mut(),
325+
ptr::null_mut(),
326+
);
301327

302328
if !winerror::SUCCEEDED(hr) {
303329
continue;
@@ -547,7 +573,7 @@ impl adapter::PhysicalDevice<Backend> for PhysicalDevice {
547573
// TODO: deferred context => 1 cxt/queue?
548574
let queue_groups = families
549575
.into_iter()
550-
.map(|&(family, prio)| {
576+
.map(|&(_family, prio)| {
551577
assert_eq!(prio.len(), 1);
552578
let mut group = queue::QueueGroup::new(queue::QueueFamilyId(0));
553579

@@ -711,7 +737,7 @@ impl window::Surface<Backend> for Surface {
711737
true
712738
}
713739

714-
fn capabilities(&self, physical_device: &PhysicalDevice) -> window::SurfaceCapabilities {
740+
fn capabilities(&self, _physical_device: &PhysicalDevice) -> window::SurfaceCapabilities {
715741
let current_extent = unsafe {
716742
let mut rect: RECT = mem::zeroed();
717743
assert_ne!(

0 commit comments

Comments
 (0)