@@ -97,6 +97,19 @@ mod dxgi;
9797mod internal;
9898mod 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 ) ]
101114pub ( crate ) struct ViewInfo {
102115 resource : * mut d3d11:: ID3D11Resource ,
@@ -117,7 +130,7 @@ impl fmt::Debug for ViewInfo {
117130pub 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
123136unsafe 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
448451pub 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 {}
463467unsafe 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