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:
@@ -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))
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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)) {
|
||||
|
Reference in New Issue
Block a user