mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 10:40:11 +01:00
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:
parent
e3e22ce882
commit
416f10fc3f
3 changed files with 50 additions and 0 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue