d3d12: Implement fence_get_win32_handle to get HANDLE from d3d12_fence

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26456>
This commit is contained in:
Sil Vilerino
2023-11-17 18:29:45 -05:00
committed by Marge Bot
parent 942791b937
commit 05fe740374
4 changed files with 27 additions and 4 deletions

View File

@@ -1268,6 +1268,26 @@ d3d12_screen_get_fd(struct pipe_screen *pscreen)
return -1; return -1;
} }
#ifdef _WIN32
static void* d3d12_fence_get_win32_handle(struct pipe_screen *pscreen,
struct pipe_fence_handle *fence_handle,
uint64_t *fence_value)
{
struct d3d12_screen *screen = d3d12_screen(pscreen);
struct d3d12_fence* fence = (struct d3d12_fence*) fence_handle;
HANDLE shared_handle = nullptr;
screen->dev->CreateSharedHandle(fence->cmdqueue_fence,
NULL,
GENERIC_ALL,
NULL,
&shared_handle);
if(shared_handle)
*fence_value = fence->value;
return (void*) shared_handle;
}
#endif
bool bool
d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LUID *adapter_luid) d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LUID *adapter_luid)
{ {
@@ -1311,6 +1331,9 @@ d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LU
screen->base.set_fence_timeline_value = d3d12_set_fence_timeline_value; screen->base.set_fence_timeline_value = d3d12_set_fence_timeline_value;
screen->base.interop_query_device_info = d3d12_interop_query_device_info; screen->base.interop_query_device_info = d3d12_interop_query_device_info;
screen->base.interop_export_object = d3d12_interop_export_object; screen->base.interop_export_object = d3d12_interop_export_object;
#ifdef _WIN32
screen->base.fence_get_win32_handle = d3d12_fence_get_win32_handle;
#endif
screen->d3d12_mod = util_dl_open( screen->d3d12_mod = util_dl_open(
UTIL_DL_PREFIX UTIL_DL_PREFIX
@@ -1570,7 +1593,7 @@ d3d12_init_screen(struct d3d12_screen *screen, IUnknown *adapter)
return false; return false;
} }
if (FAILED(screen->dev->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&screen->fence)))) if (FAILED(screen->dev->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&screen->fence))))
return false; return false;
if (!d3d12_init_residency(screen)) if (!d3d12_init_residency(screen))

View File

@@ -833,7 +833,7 @@ d3d12_video_decoder_create_command_objects(const struct d3d12_screen *pD3D12Scre
return false; return false;
} }
hr = pD3D12Screen->dev->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pD3D12Dec->m_spFence)); hr = pD3D12Screen->dev->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&pD3D12Dec->m_spFence));
if (FAILED(hr)) { if (FAILED(hr)) {
debug_printf( debug_printf(
"[d3d12_video_decoder] d3d12_video_decoder_create_command_objects - Call to CreateFence failed with HR %x\n", "[d3d12_video_decoder] d3d12_video_decoder_create_command_objects - Call to CreateFence failed with HR %x\n",

View File

@@ -1506,7 +1506,7 @@ d3d12_video_encoder_create_command_objects(struct d3d12_video_encoder *pD3D12Enc
return false; return false;
} }
hr = pD3D12Enc->m_pD3D12Screen->dev->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pD3D12Enc->m_spFence)); hr = pD3D12Enc->m_pD3D12Screen->dev->CreateFence(0, D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&pD3D12Enc->m_spFence));
if (FAILED(hr)) { if (FAILED(hr)) {
debug_printf( debug_printf(
"[d3d12_video_encoder] d3d12_video_encoder_create_command_objects - Call to CreateFence failed with HR %x\n", "[d3d12_video_encoder] d3d12_video_encoder_create_command_objects - Call to CreateFence failed with HR %x\n",

View File

@@ -659,7 +659,7 @@ d3d12_video_processor_create_command_objects(struct d3d12_video_processor *pD3D1
} }
hr = pD3D12Proc->m_pD3D12Screen->dev->CreateFence(0, hr = pD3D12Proc->m_pD3D12Screen->dev->CreateFence(0,
D3D12_FENCE_FLAG_NONE, D3D12_FENCE_FLAG_SHARED,
IID_PPV_ARGS(&pD3D12Proc->m_spFence)); IID_PPV_ARGS(&pD3D12Proc->m_spFence));
if (FAILED(hr)) { if (FAILED(hr)) {