d3d12: Support importing fences / timeline semaphores

Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Reviewed-by: Giancarlo Devich <gdevich@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17446>
This commit is contained in:
Jesse Natalie 2022-07-09 20:58:13 -07:00 committed by Marge Bot
parent e3e22ce882
commit 416f10fc3f
3 changed files with 50 additions and 0 deletions

View file

@ -28,6 +28,8 @@
#include "util/u_memory.h"
#include <dxguids/dxguids.h>
constexpr uint64_t NsPerMs = 1000000;
constexpr uint64_t MaxTimeoutInNs = (uint64_t)UINT_MAX * NsPerMs;
@ -111,6 +113,34 @@ fail:
return NULL;
}
struct d3d12_fence *
d3d12_open_fence(struct d3d12_screen *screen, HANDLE handle, const void *name)
{
struct d3d12_fence *ret = CALLOC_STRUCT(d3d12_fence);
if (!ret) {
debug_printf("CALLOC_STRUCT failed\n");
return NULL;
}
HANDLE handle_to_close = nullptr;
assert(!!handle ^ !!name);
if (name) {
screen->dev->OpenSharedHandleByName((LPCWSTR)name, GENERIC_ALL, &handle_to_close);
handle = handle_to_close;
}
screen->dev->OpenSharedHandle(handle, IID_PPV_ARGS(&ret->cmdqueue_fence));
if (!ret->cmdqueue_fence) {
free(ret);
return NULL;
}
/* A new value will be assigned later */
ret->value = 0;
pipe_reference_init(&ret->reference, 1);
return ret;
}
void
d3d12_fence_reference(struct d3d12_fence **ptr, struct d3d12_fence *fence)
{

View file

@ -49,6 +49,9 @@ d3d12_fence(struct pipe_fence_handle *pfence)
struct d3d12_fence *
d3d12_create_fence(struct d3d12_screen *screen);
struct d3d12_fence *
d3d12_open_fence(struct d3d12_screen *screen, HANDLE handle, const void *name);
void
d3d12_fence_reference(struct d3d12_fence **ptr, struct d3d12_fence *fence);

View file

@ -1120,6 +1120,21 @@ d3d12_get_node_mask(struct pipe_screen *pscreen)
return 1;
}
static void
d3d12_create_fence_win32(struct pipe_screen *pscreen, struct pipe_fence_handle **pfence, void *handle, const void *name, enum pipe_fd_type type)
{
d3d12_fence_reference((struct d3d12_fence **)pfence,
type == PIPE_FD_TYPE_TIMELINE_SEMAPHORE ?
d3d12_open_fence(d3d12_screen(pscreen), handle, name) :
nullptr);
}
static void
d3d12_set_fence_timeline_value(struct pipe_screen *pscreen, struct pipe_fence_handle *pfence, uint64_t value)
{
d3d12_fence(pfence)->value = value;
}
void
d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LUID *adapter_luid)
{
@ -1145,6 +1160,8 @@ d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LU
screen->base.get_device_uuid = d3d12_get_device_uuid;
screen->base.get_driver_uuid = d3d12_get_driver_uuid;
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;
}
bool