vkd3d: Support releasing semaphores from a D3D12 fence.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-08-26 12:10:51 +02:00 committed by Hans-Kristian Arntzen
parent 68a035c605
commit fef30f5037
2 changed files with 44 additions and 7 deletions

View File

@ -564,6 +564,26 @@ static void d3d12_fence_dec_ref(struct d3d12_fence *fence)
}
}
HRESULT d3d12_fence_signal_event(struct d3d12_fence *fence, HANDLE event, enum vkd3d_waiting_event_type type)
{
switch (type)
{
case VKD3D_WAITING_EVENT_TYPE_EVENT:
return fence->device->signal_event(event);
case VKD3D_WAITING_EVENT_TYPE_SEMAPHORE:
#ifdef _WIN32
return ReleaseSemaphore(event, 1, NULL) ? S_OK : E_FAIL;
#else
ERR("Semaphores not supported on this platform.\n");
return E_NOTIMPL;
#endif
}
ERR("Unhandled waiting event type %u.\n", type);
return E_INVALIDARG;
}
static void d3d12_fence_signal_external_events_locked(struct d3d12_fence *fence)
{
bool signal_null_event_cond = false;
@ -578,7 +598,7 @@ static void d3d12_fence_signal_external_events_locked(struct d3d12_fence *fence)
{
if (current->event)
{
if (FAILED(hr = fence->device->signal_event(current->event)))
if (FAILED(hr = d3d12_fence_signal_event(fence, current->event, current->type)))
ERR("Failed to signal event, hr #%x.\n", hr);
}
else
@ -869,17 +889,14 @@ static UINT64 STDMETHODCALLTYPE d3d12_fence_GetCompletedValue(d3d12_fence_iface
return completed_value;
}
static HRESULT STDMETHODCALLTYPE d3d12_fence_SetEventOnCompletion(d3d12_fence_iface *iface,
UINT64 value, HANDLE event)
HRESULT d3d12_fence_set_event_on_completion(struct d3d12_fence *fence,
UINT64 value, HANDLE event, enum vkd3d_waiting_event_type type)
{
struct d3d12_fence *fence = impl_from_ID3D12Fence(iface);
unsigned int i;
HRESULT hr;
bool latch;
int rc;
TRACE("iface %p, value %#"PRIx64", event %p.\n", iface, value, event);
if ((rc = pthread_mutex_lock(&fence->mutex)))
{
ERR("Failed to lock mutex, error %d.\n", rc);
@ -890,7 +907,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_fence_SetEventOnCompletion(d3d12_fence_if
{
if (event)
{
if (FAILED(hr = fence->device->signal_event(event)))
if (FAILED(hr = d3d12_fence_signal_event(fence, event, type)))
{
ERR("Failed to signal event, hr #%x.\n", hr);
pthread_mutex_unlock(&fence->mutex);
@ -924,6 +941,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_fence_SetEventOnCompletion(d3d12_fence_if
fence->events[fence->event_count].value = value;
fence->events[fence->event_count].event = event;
fence->events[fence->event_count].type = type;
fence->events[fence->event_count].latch = &latch;
++fence->event_count;
@ -942,6 +960,16 @@ static HRESULT STDMETHODCALLTYPE d3d12_fence_SetEventOnCompletion(d3d12_fence_if
return S_OK;
}
static HRESULT STDMETHODCALLTYPE d3d12_fence_SetEventOnCompletion(d3d12_fence_iface *iface,
UINT64 value, HANDLE event)
{
struct d3d12_fence *fence = impl_from_ID3D12Fence(iface);
TRACE("iface %p, value %#"PRIx64", event %p.\n", iface, value, event);
return d3d12_fence_set_event_on_completion(fence, value, event, VKD3D_WAITING_EVENT_TYPE_EVENT);
}
static HRESULT STDMETHODCALLTYPE d3d12_fence_Signal(d3d12_fence_iface *iface, UINT64 value)
{
struct d3d12_fence *fence = impl_from_ID3D12Fence(iface);

View File

@ -527,6 +527,12 @@ struct d3d12_fence_value
const struct vkd3d_queue *signalling_queue;
};
enum vkd3d_waiting_event_type
{
VKD3D_WAITING_EVENT_TYPE_EVENT,
VKD3D_WAITING_EVENT_TYPE_SEMAPHORE,
};
struct d3d12_fence
{
d3d12_fence_iface ID3D12Fence_iface;
@ -553,6 +559,7 @@ struct d3d12_fence
{
uint64_t value;
HANDLE event;
enum vkd3d_waiting_event_type type;
bool *latch;
} *events;
size_t events_size;
@ -565,6 +572,8 @@ struct d3d12_fence
HRESULT d3d12_fence_create(struct d3d12_device *device,
uint64_t initial_value, D3D12_FENCE_FLAGS flags, struct d3d12_fence **fence);
HRESULT d3d12_fence_set_event_on_completion(struct d3d12_fence *fence,
UINT64 value, HANDLE event, enum vkd3d_waiting_event_type type);
enum vkd3d_allocation_flag
{