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