vkd3d: Handle multiple fence NULL event waits in d3d12_device_SetEventOnMultipleFenceCompletion().

This commit is contained in:
Henri Verbeet
2025-04-29 21:03:26 +02:00
parent 3fabac3f70
commit cb4b5641ea
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
4 changed files with 45 additions and 48 deletions

View File

@@ -38915,8 +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() || data->fence_count == 1)
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(hr == S_OK, "Got hr %#x.\n", hr);
signal_event(data->completed);
}
@@ -39050,7 +39049,7 @@ static void test_multi_fence_event(void)
ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
fence_values, 3, 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);
ret = wait_event(event, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
@@ -39060,7 +39059,7 @@ static void test_multi_fence_event(void)
ok(ret == WAIT_OBJECT_0, "Got ret %#x.\n", ret);
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
fence_values, 3, 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);
ret = wait_event(event, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
@@ -39100,25 +39099,16 @@ 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);
}
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Fence_Signal(fences[1], 41);
ok(hr == S_OK, "Got hr %#x.\n", hr);
if (vkd3d_test_platform_is_windows())
{
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
}
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Fence_Signal(fences[0], 40);
ok(hr == S_OK, "Got hr %#x.\n", hr);
if (vkd3d_test_platform_is_windows())
{
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
}
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Fence_Signal(fences[2], 42);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = wait_event(thread_data.completed, INFINITE);
@@ -39154,11 +39144,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);
}
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Fence_Signal(fences[1], 57);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = wait_event(thread_data.completed, INFINITE);
@@ -39189,11 +39176,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);
}
ret = wait_event(thread_data.completed, 0);
ok(ret == WAIT_TIMEOUT, "Got ret %#x.\n", ret);
hr = ID3D12Fence_Signal(fences[1], 67);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = wait_event(thread_data.completed, INFINITE);
@@ -39211,7 +39195,7 @@ static void test_multi_fence_event(void)
hr = ID3D12Device1_SetEventOnMultipleFenceCompletion(device1, fences,
fence_values, 3, 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);
destroy_event(thread_data.completed);
destroy_event(thread_data.started);