mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 08:40:11 +01:00
d3d12: Store the d3d12 module reference on the screen
Reviewed-by: Sil Vilerino <sivileri@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18305>
This commit is contained in:
parent
ff102db76c
commit
cb9a58c103
5 changed files with 31 additions and 31 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue