mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d: Handle single fence waits in d3d12_device_SetEventOnMultipleFenceCompletion().
By forwarding to ID3D12Fence_SetEventOnCompletion().
This commit is contained in:
Notes:
Henri Verbeet
2025-05-06 19:05:21 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1476
@@ -4905,12 +4905,21 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_SetEventOnMultipleFenceCompletion(
|
||||
ID3D12Fence *const *fences, const UINT64 *values, UINT fence_count,
|
||||
D3D12_MULTIPLE_FENCE_WAIT_FLAGS flags, HANDLE event)
|
||||
{
|
||||
FIXME("iface %p, fences %p, values %p, fence_count %u, flags %#x, event %p stub!\n",
|
||||
FIXME("iface %p, fences %p, values %p, fence_count %u, flags %#x, event %p partial stub!\n",
|
||||
iface, fences, values, fence_count, flags, event);
|
||||
|
||||
if (flags & ~D3D12_MULTIPLE_FENCE_WAIT_FLAG_ANY)
|
||||
{
|
||||
FIXME("Unhandled flags %#x.\n", flags & ~D3D12_MULTIPLE_FENCE_WAIT_FLAG_ANY);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
if (!fence_count)
|
||||
return E_INVALIDARG;
|
||||
|
||||
if (fence_count == 1)
|
||||
return ID3D12Fence_SetEventOnCompletion(fences[0], values[0], event);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@@ -38915,7 +38915,7 @@ static void multi_fence_event_wait_main(void *ctx)
|
||||
|
||||
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(data->device,
|
||||
data->fences, data->values, data->fence_count, data->flags, NULL);
|
||||
if (vkd3d_test_platform_is_windows())
|
||||
if (vkd3d_test_platform_is_windows() || data->fence_count == 1)
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
|
||||
signal_event(data->completed);
|
||||
@@ -38983,16 +38983,16 @@ static void test_multi_fence_event(void)
|
||||
fence_values[0] = 1;
|
||||
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
|
||||
fence_values, 1, D3D12_MULTIPLE_FENCE_WAIT_FLAG_ALL, event);
|
||||
todo ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ret = wait_event(event, 0);
|
||||
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
|
||||
hr = ID3D12Fence_Signal(fences[0], 1);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ret = wait_event(event, 0);
|
||||
todo ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
|
||||
ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
|
||||
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
|
||||
fence_values, 1, D3D12_MULTIPLE_FENCE_WAIT_FLAG_ALL, NULL);
|
||||
todo ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
|
||||
fence_values[0] = 2;
|
||||
thread_data.fence_count = 1;
|
||||
@@ -39000,11 +39000,8 @@ static void test_multi_fence_event(void)
|
||||
ok(thread, "Failed to create thread.\n");
|
||||
ret = wait_event(thread_data.started, INFINITE);
|
||||
ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
|
||||
if (vkd3d_test_platform_is_windows())
|
||||
{
|
||||
ret = wait_event(thread_data.completed, 0);
|
||||
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
|
||||
}
|
||||
hr = ID3D12Fence_Signal(fences[0], 2);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ret = wait_event(thread_data.completed, INFINITE);
|
||||
@@ -39014,16 +39011,16 @@ static void test_multi_fence_event(void)
|
||||
fence_values[0] = 4;
|
||||
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
|
||||
fence_values, 1, D3D12_MULTIPLE_FENCE_WAIT_FLAG_ANY, event);
|
||||
todo ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ret = wait_event(event, 0);
|
||||
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
|
||||
hr = ID3D12Fence_Signal(fences[0], 4);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ret = wait_event(event, 0);
|
||||
todo ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
|
||||
ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
|
||||
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
|
||||
fence_values, 1, D3D12_MULTIPLE_FENCE_WAIT_FLAG_ANY, NULL);
|
||||
todo ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
|
||||
fence_values[0] = 8;
|
||||
thread_data.flags = D3D12_MULTIPLE_FENCE_WAIT_FLAG_ANY;
|
||||
@@ -39031,11 +39028,8 @@ static void test_multi_fence_event(void)
|
||||
ok(thread, "Failed to create thread.\n");
|
||||
ret = wait_event(thread_data.started, INFINITE);
|
||||
ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
|
||||
if (vkd3d_test_platform_is_windows())
|
||||
{
|
||||
ret = wait_event(thread_data.completed, 0);
|
||||
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
|
||||
}
|
||||
hr = ID3D12Fence_Signal(fences[0], 8);
|
||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||
ret = wait_event(thread_data.completed, INFINITE);
|
||||
|
Reference in New Issue
Block a user