From 05fe740374c47a9b9bcd885cc9dafba82193dbab Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Fri, 17 Nov 2023 18:29:45 -0500 Subject: [PATCH] d3d12: Implement fence_get_win32_handle to get HANDLE from d3d12_fence Reviewed-by: Jesse Natalie Part-of: --- src/gallium/drivers/d3d12/d3d12_screen.cpp | 25 ++++++++++++++++++- src/gallium/drivers/d3d12/d3d12_video_dec.cpp | 2 +- src/gallium/drivers/d3d12/d3d12_video_enc.cpp | 2 +- .../drivers/d3d12/d3d12_video_proc.cpp | 2 +- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index df506ab7039..33826c08d92 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -1268,6 +1268,26 @@ d3d12_screen_get_fd(struct pipe_screen *pscreen) 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 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.interop_query_device_info = d3d12_interop_query_device_info; 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( UTIL_DL_PREFIX @@ -1570,7 +1593,7 @@ d3d12_init_screen(struct d3d12_screen *screen, IUnknown *adapter) 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; if (!d3d12_init_residency(screen)) diff --git a/src/gallium/drivers/d3d12/d3d12_video_dec.cpp b/src/gallium/drivers/d3d12/d3d12_video_dec.cpp index f6becbc5dc2..1df738454cc 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_dec.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_dec.cpp @@ -833,7 +833,7 @@ d3d12_video_decoder_create_command_objects(const struct d3d12_screen *pD3D12Scre 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)) { debug_printf( "[d3d12_video_decoder] d3d12_video_decoder_create_command_objects - Call to CreateFence failed with HR %x\n", diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp index 655ab61a7b8..1eb4514cf7b 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp @@ -1506,7 +1506,7 @@ d3d12_video_encoder_create_command_objects(struct d3d12_video_encoder *pD3D12Enc 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)) { debug_printf( "[d3d12_video_encoder] d3d12_video_encoder_create_command_objects - Call to CreateFence failed with HR %x\n", diff --git a/src/gallium/drivers/d3d12/d3d12_video_proc.cpp b/src/gallium/drivers/d3d12/d3d12_video_proc.cpp index 24614aada1a..3fe8aecbf12 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_proc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_proc.cpp @@ -659,7 +659,7 @@ d3d12_video_processor_create_command_objects(struct d3d12_video_processor *pD3D1 } hr = pD3D12Proc->m_pD3D12Screen->dev->CreateFence(0, - D3D12_FENCE_FLAG_NONE, + D3D12_FENCE_FLAG_SHARED, IID_PPV_ARGS(&pD3D12Proc->m_spFence)); if (FAILED(hr)) {