diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index 83b1a41b89a..2f44e9303aa 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -2543,13 +2543,8 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) d3d12_compute_transform_cache_init(ctx); d3d12_context_state_table_init(ctx); - util_dl_library *d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); - if (!d3d12_mod) { - debug_printf("D3D12: failed to load D3D12.DLL\n"); - return NULL; - } ctx->D3D12SerializeVersionedRootSignature = - (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)util_dl_get_proc_address(d3d12_mod, "D3D12SerializeVersionedRootSignature"); + (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)util_dl_get_proc_address(screen->d3d12_mod, "D3D12SerializeVersionedRootSignature"); ctx->submit_id = (uint64_t)p_atomic_add_return(&screen->ctx_count, 1) << 32ull; diff --git a/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp b/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp index 9e39258ffe0..1867ceded2b 100644 --- a/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp @@ -232,7 +232,10 @@ d3d12_create_dxcore_screen(struct sw_winsys *winsys, LUID *adapter_luid) if (!screen) return nullptr; - d3d12_init_screen_base(&screen->base, winsys, adapter_luid); + if (!d3d12_init_screen_base(&screen->base, winsys, adapter_luid)) { + d3d12_destroy_screen(&screen->base); + return nullptr; + } screen->base.base.destroy = d3d12_destroy_dxcore_screen; screen->base.init = d3d12_init_dxcore_screen; screen->base.deinit = d3d12_deinit_dxcore_screen; diff --git a/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp b/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp index 01577ee6f0f..da25eb017c6 100644 --- a/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp @@ -203,7 +203,10 @@ d3d12_create_dxgi_screen(struct sw_winsys *winsys, LUID *adapter_luid) if (!screen) return nullptr; - d3d12_init_screen_base(&screen->base, winsys, adapter_luid); + if (!d3d12_init_screen_base(&screen->base, winsys, adapter_luid)) { + d3d12_destroy_screen(&screen->base); + return nullptr; + } screen->base.base.destroy = d3d12_destroy_dxgi_screen; screen->base.init = d3d12_init_dxgi_screen; screen->base.deinit = d3d12_deinit_dxgi_screen; diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index bb9a1b245d9..ab92f80c579 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -728,6 +728,7 @@ d3d12_destroy_screen(struct d3d12_screen *screen) slab_destroy_parent(&screen->transfer_pool); mtx_destroy(&screen->submit_mutex); mtx_destroy(&screen->descriptor_pool_mutex); + util_dl_close(screen->d3d12_mod); glsl_type_singleton_decref(); FREE(screen); } @@ -779,17 +780,11 @@ d3d12_flush_frontbuffer(struct pipe_screen * pscreen, } static ID3D12Debug * -get_debug_interface() +get_debug_interface(util_dl_library *d3d12_mod) { typedef HRESULT(WINAPI *PFN_D3D12_GET_DEBUG_INTERFACE)(REFIID riid, void **ppFactory); PFN_D3D12_GET_DEBUG_INTERFACE D3D12GetDebugInterface; - util_dl_library *d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); - if (!d3d12_mod) { - debug_printf("D3D12: failed to load D3D12.DLL\n"); - return NULL; - } - D3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)util_dl_get_proc_address(d3d12_mod, "D3D12GetDebugInterface"); if (!D3D12GetDebugInterface) { debug_printf("D3D12: failed to load D3D12GetDebugInterface from D3D12.DLL\n"); @@ -806,9 +801,9 @@ get_debug_interface() } static void -enable_d3d12_debug_layer() +enable_d3d12_debug_layer(util_dl_library *d3d12_mod) { - ID3D12Debug *debug = get_debug_interface(); + ID3D12Debug *debug = get_debug_interface(d3d12_mod); if (debug) { debug->EnableDebugLayer(); debug->Release(); @@ -816,9 +811,9 @@ enable_d3d12_debug_layer() } static void -enable_gpu_validation() +enable_gpu_validation(util_dl_library *d3d12_mod) { - ID3D12Debug *debug = get_debug_interface(); + ID3D12Debug *debug = get_debug_interface(d3d12_mod); ID3D12Debug3 *debug3; if (debug) { if (SUCCEEDED(debug->QueryInterface(IID_PPV_ARGS(&debug3)))) { @@ -830,19 +825,13 @@ enable_gpu_validation() } static ID3D12Device3 * -create_device(IUnknown *adapter) +create_device(util_dl_library *d3d12_mod, IUnknown *adapter) { typedef HRESULT(WINAPI *PFN_D3D12CREATEDEVICE)(IUnknown*, D3D_FEATURE_LEVEL, REFIID, void**); typedef HRESULT(WINAPI *PFN_D3D12ENABLEEXPERIMENTALFEATURES)(UINT, const IID*, void*, UINT*); PFN_D3D12CREATEDEVICE D3D12CreateDevice; PFN_D3D12ENABLEEXPERIMENTALFEATURES D3D12EnableExperimentalFeatures; - util_dl_library *d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); - if (!d3d12_mod) { - debug_printf("D3D12: failed to load D3D12.DLL\n"); - return NULL; - } - #ifdef _WIN32 if (d3d12_debug & D3D12_DEBUG_EXPERIMENTAL) #endif @@ -1123,7 +1112,7 @@ d3d12_set_fence_timeline_value(struct pipe_screen *pscreen, struct pipe_fence_ha d3d12_fence(pfence)->value = value; } -void +bool d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LUID *adapter_luid) { glsl_type_singleton_init_or_ref(); @@ -1154,6 +1143,13 @@ d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LU screen->base.get_device_node_mask = d3d12_get_node_mask; screen->base.create_fence_win32 = d3d12_create_fence_win32; screen->base.set_fence_timeline_value = d3d12_set_fence_timeline_value; + + screen->d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); + if (!screen->d3d12_mod) { + debug_printf("D3D12: failed to load D3D12.DLL\n"); + return false; + } + return true; } bool @@ -1164,12 +1160,13 @@ d3d12_init_screen(struct d3d12_screen *screen, IUnknown *adapter) #ifndef DEBUG if (d3d12_debug & D3D12_DEBUG_DEBUG_LAYER) #endif - enable_d3d12_debug_layer(); + enable_d3d12_debug_layer(screen->d3d12_mod); if (d3d12_debug & D3D12_DEBUG_GPU_VALIDATOR) - enable_gpu_validation(); + enable_gpu_validation(screen->d3d12_mod); + + screen->dev = create_device(screen->d3d12_mod, adapter); - screen->dev = create_device(adapter); if (!screen->dev) { debug_printf("D3D12: failed to create device\n"); diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h b/src/gallium/drivers/d3d12/d3d12_screen.h index 20b6486f258..7d2dad93155 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.h +++ b/src/gallium/drivers/d3d12/d3d12_screen.h @@ -34,6 +34,7 @@ #include "d3d12_common.h" struct pb_manager; +struct util_dl_library; enum resource_dimension { @@ -63,6 +64,7 @@ struct d3d12_screen { char driver_uuid[PIPE_UUID_SIZE]; char device_uuid[PIPE_UUID_SIZE]; + util_dl_library *d3d12_mod; ID3D12Device3 *dev; ID3D12CommandQueue *cmdqueue; bool (*init)(struct d3d12_screen *screen); @@ -156,7 +158,7 @@ d3d12_dxcore_screen(struct d3d12_screen *screen) return (struct d3d12_dxcore_screen *)screen; } -void +bool d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LUID *adapter_luid); bool