Skip to content

Commit 166ec25

Browse files
committed
Convert the remaining instances of CreateDevice
1 parent 282701d commit 166ec25

File tree

2 files changed

+54
-50
lines changed

2 files changed

+54
-50
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Change Log
22

3-
### backend-dx12-0.4.1, backend-dx11-0.4.1 (01-11-2019)
3+
### backend-dx12-0.4.1, backend-dx11-0.4.2 (01-11-2019)
44
- switch to explicit linking of "d3d12.dll", "d3d11.dll" and "dxgi.dll"
55

66
## hal-0.4.0 (23-10-2019)

src/backend/dx11/src/lib.rs

Lines changed: 53 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,19 @@ mod dxgi;
9797
mod internal;
9898
mod shader;
9999

100+
type CreateFun = extern "system" fn(
101+
*mut IDXGIAdapter,
102+
UINT,
103+
HMODULE,
104+
UINT,
105+
*const UINT,
106+
UINT,
107+
UINT,
108+
*mut *mut d3d11::ID3D11Device,
109+
*mut UINT,
110+
*mut *mut d3d11::ID3D11DeviceContext,
111+
) -> winerror::HRESULT;
112+
100113
#[derive(Clone)]
101114
pub(crate) struct ViewInfo {
102115
resource: *mut d3d11::ID3D11Resource,
@@ -117,7 +130,7 @@ impl fmt::Debug for ViewInfo {
117130
pub struct Instance {
118131
pub(crate) factory: ComPtr<IDXGIFactory>,
119132
pub(crate) dxgi_version: dxgi::DxgiVersion,
120-
library: libloading::Library,
133+
library: Arc<libloading::Library>,
121134
}
122135

123136
unsafe impl Send for Instance {}
@@ -258,8 +271,10 @@ impl hal::Instance<Backend> for Instance {
258271
match dxgi::get_dxgi_factory() {
259272
Ok((factory, dxgi_version)) => {
260273
info!("DXGI version: {:?}", dxgi_version);
261-
let library = libloading::Library::new("d3d11.dll")
262-
.map_err(|_| hal::UnsupportedBackend)?;
274+
let library = Arc::new(
275+
libloading::Library::new("d3d11.dll")
276+
.map_err(|_| hal::UnsupportedBackend)?
277+
);
263278
Ok(Instance {
264279
factory,
265280
dxgi_version,
@@ -274,23 +289,10 @@ impl hal::Instance<Backend> for Instance {
274289
}
275290

276291
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-
290292
let mut adapters = Vec::new();
291293
let mut idx = 0;
292294

293-
let func: libloading::Symbol<Fun> = match unsafe {
295+
let func: libloading::Symbol<CreateFun> = match unsafe {
294296
self.library.get(b"D3D11CreateDevice")
295297
} {
296298
Ok(func) => func,
@@ -309,7 +311,7 @@ impl hal::Instance<Backend> for Instance {
309311

310312
// TODO: move into function?
311313
let (device, feature_level) = {
312-
let feature_level = get_feature_level(adapter.as_raw());
314+
let feature_level = get_feature_level(&func, adapter.as_raw());
313315

314316
let mut device = ptr::null_mut();
315317
let hr = func(
@@ -410,6 +412,7 @@ impl hal::Instance<Backend> for Instance {
410412

411413
let physical_device = PhysicalDevice {
412414
adapter,
415+
library: Arc::clone(&self.library),
413416
features,
414417
limits,
415418
memory_properties,
@@ -447,6 +450,7 @@ impl hal::Instance<Backend> for Instance {
447450

448451
pub struct PhysicalDevice {
449452
adapter: ComPtr<IDXGIAdapter>,
453+
library: Arc<libloading::Library>,
450454
features: hal::Features,
451455
limits: hal::Limits,
452456
memory_properties: adapter::MemoryProperties,
@@ -463,7 +467,7 @@ unsafe impl Send for PhysicalDevice {}
463467
unsafe impl Sync for PhysicalDevice {}
464468

465469
// TODO: does the adapter we get earlier matter for feature level?
466-
fn get_feature_level(adapter: *mut IDXGIAdapter) -> d3dcommon::D3D_FEATURE_LEVEL {
470+
fn get_feature_level(func: &CreateFun, adapter: *mut IDXGIAdapter) -> d3dcommon::D3D_FEATURE_LEVEL {
467471
let requested_feature_levels = [
468472
d3dcommon::D3D_FEATURE_LEVEL_11_1,
469473
d3dcommon::D3D_FEATURE_LEVEL_11_0,
@@ -475,40 +479,36 @@ fn get_feature_level(adapter: *mut IDXGIAdapter) -> d3dcommon::D3D_FEATURE_LEVEL
475479
];
476480

477481
let mut feature_level = d3dcommon::D3D_FEATURE_LEVEL_9_1;
478-
let hr = unsafe {
479-
d3d11::D3D11CreateDevice(
480-
adapter,
481-
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
482-
ptr::null_mut(),
483-
0,
484-
requested_feature_levels[..].as_ptr(),
485-
requested_feature_levels.len() as _,
486-
d3d11::D3D11_SDK_VERSION,
487-
ptr::null_mut(),
488-
&mut feature_level as *mut _,
489-
ptr::null_mut(),
490-
)
491-
};
482+
let hr = func(
483+
adapter,
484+
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
485+
ptr::null_mut(),
486+
0,
487+
requested_feature_levels[..].as_ptr(),
488+
requested_feature_levels.len() as _,
489+
d3d11::D3D11_SDK_VERSION,
490+
ptr::null_mut(),
491+
&mut feature_level as *mut _,
492+
ptr::null_mut(),
493+
);
492494

493495
if !winerror::SUCCEEDED(hr) {
494496
// if there is no 11.1 runtime installed, requesting
495497
// `D3D_FEATURE_LEVEL_11_1` will return E_INVALIDARG so we just retry
496498
// without that
497499
if hr == winerror::E_INVALIDARG {
498-
let hr = unsafe {
499-
d3d11::D3D11CreateDevice(
500-
adapter,
501-
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
502-
ptr::null_mut(),
503-
0,
504-
requested_feature_levels[1 ..].as_ptr(),
505-
(requested_feature_levels.len() - 1) as _,
506-
d3d11::D3D11_SDK_VERSION,
507-
ptr::null_mut(),
508-
&mut feature_level as *mut _,
509-
ptr::null_mut(),
510-
)
511-
};
500+
let hr = func(
501+
adapter,
502+
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
503+
ptr::null_mut(),
504+
0,
505+
requested_feature_levels[1 ..].as_ptr(),
506+
(requested_feature_levels.len() - 1) as _,
507+
d3d11::D3D11_SDK_VERSION,
508+
ptr::null_mut(),
509+
&mut feature_level as *mut _,
510+
ptr::null_mut(),
511+
);
512512

513513
if !winerror::SUCCEEDED(hr) {
514514
// TODO: device might not support any feature levels?
@@ -527,12 +527,16 @@ impl adapter::PhysicalDevice<Backend> for PhysicalDevice {
527527
families: &[(&QueueFamily, &[queue::QueuePriority])],
528528
requested_features: hal::Features,
529529
) -> Result<adapter::Gpu<Backend>, hal::device::CreationError> {
530+
let func: libloading::Symbol<CreateFun> = self.library
531+
.get(b"D3D11CreateDevice")
532+
.unwrap();
533+
530534
let (device, cxt) = {
531535
if !self.features().contains(requested_features) {
532536
return Err(hal::device::CreationError::MissingFeature);
533537
}
534538

535-
let feature_level = get_feature_level(self.adapter.as_raw());
539+
let feature_level = get_feature_level(&func, self.adapter.as_raw());
536540
let mut returned_level = d3dcommon::D3D_FEATURE_LEVEL_9_1;
537541

538542
#[cfg(debug_assertions)]
@@ -543,7 +547,7 @@ impl adapter::PhysicalDevice<Backend> for PhysicalDevice {
543547
// TODO: request debug device only on debug config?
544548
let mut device = ptr::null_mut();
545549
let mut cxt = ptr::null_mut();
546-
let hr = d3d11::D3D11CreateDevice(
550+
let hr = func(
547551
self.adapter.as_raw() as *mut _,
548552
d3dcommon::D3D_DRIVER_TYPE_UNKNOWN,
549553
ptr::null_mut(),

0 commit comments

Comments
 (0)