Skip to content

Commit 7956879

Browse files
committed
tests: Test fence rewind with dependent waits.
1 parent 35bdee1 commit 7956879

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

tests/d3d12_sync.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2261,3 +2261,72 @@ void test_fence_signal_availability_shared(void)
22612261
{
22622262
test_fence_signal_availability(true);
22632263
}
2264+
2265+
void test_fence_rewind_dependent_wait(void)
2266+
{
2267+
struct test_context_desc desc;
2268+
struct test_context context;
2269+
ID3D12CommandQueue *queue;
2270+
ID3D12Device *device;
2271+
ID3D12Fence *fence1, *fence2;
2272+
UINT run = 0, wakeup = 0;
2273+
HANDLE event;
2274+
HRESULT hr;
2275+
BOOL ret;
2276+
2277+
memset(&desc, 0, sizeof(desc));
2278+
desc.no_pipeline = TRUE;
2279+
if (!init_test_context(&context, &desc))
2280+
return;
2281+
device = context.device;
2282+
queue = context.queue;
2283+
2284+
for (run = 0; run < 100 && !wakeup; run++)
2285+
{
2286+
hr = ID3D12Device_CreateFence(device, 0, D3D12_FENCE_FLAG_NONE,
2287+
&IID_ID3D12Fence, (void **)&fence1);
2288+
ok(hr == S_OK, "Failed to create fence, hr %#lx.\n", hr);
2289+
hr = ID3D12Device_CreateFence(device, 0, D3D12_FENCE_FLAG_NONE,
2290+
&IID_ID3D12Fence, (void **)&fence2);
2291+
ok(hr == S_OK, "Failed to create fence, hr %#lx.\n", hr);
2292+
2293+
hr = ID3D12CommandQueue_Signal(queue, fence1, 2);
2294+
ok(hr == S_OK, "Failed to queue fence signal, hr %#lx.\n", hr);
2295+
hr = ID3D12CommandQueue_Signal(queue, fence2, 1);
2296+
ok(hr == S_OK, "Failed to queue fence signal, hr %#lx.\n", hr);
2297+
2298+
hr = ID3D12CommandQueue_Wait(queue, fence2, 1);
2299+
ok(hr == S_OK, "Failed to queue fence wait, hr %#lx.\n", hr);
2300+
hr = ID3D12CommandQueue_Signal(queue, fence1, 1);
2301+
ok(hr == S_OK, "Failed to queue fence signal, hr %#lx.\n", hr);
2302+
hr = ID3D12CommandQueue_Signal(queue, fence2, 2);
2303+
ok(hr == S_OK, "Failed to queue fence signal, hr %#lx.\n", hr);
2304+
2305+
hr = ID3D12CommandQueue_Wait(queue, fence1, 2);
2306+
ok(hr == S_OK, "Failed to queue fence wait, hr %#lx.\n", hr);
2307+
hr = ID3D12CommandQueue_Wait(queue, fence2, 2);
2308+
ok(hr == S_OK, "Failed to queue fence wait, hr %#lx.\n", hr);
2309+
hr = ID3D12CommandQueue_Signal(queue, fence2, 3);
2310+
ok(hr == S_OK, "Failed to queue fence signal, hr %#lx.\n", hr);
2311+
2312+
event = CreateEventA(NULL, TRUE, FALSE, NULL);
2313+
hr = ID3D12Fence_SetEventOnCompletion(fence2, 3, event);
2314+
ret = WaitForSingleObject(event, 100);
2315+
if (ret != WAIT_TIMEOUT) wakeup++;
2316+
2317+
hr = ID3D12Fence_Signal(fence1, 2);
2318+
ok(hr == S_OK, "Failed to signal fence, hr %#lx.\n", hr);
2319+
ret = WaitForSingleObject(event, 5000);
2320+
ok(!ret, "got ret %#x\n", ret);
2321+
2322+
CloseHandle(event);
2323+
2324+
wait_queue_idle(device, queue);
2325+
2326+
ID3D12Fence_Release(fence1);
2327+
ID3D12Fence_Release(fence2);
2328+
}
2329+
todo ok(wakeup == 0, "got %u wakeup after %u runs\n", wakeup, run);
2330+
2331+
destroy_test_context(&context);
2332+
}

tests/d3d12_tests.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ decl_test(test_fence_pending_signal_cpu_rewind_shared);
6969
decl_test(test_fence_ping_pong_deadlock_stress_shared);
7070
decl_test(test_fence_signal_order_deadlock_stress_shared);
7171
decl_test(test_fence_signal_availability_shared);
72+
decl_test(test_fence_rewind_dependent_wait);
7273
decl_test(test_clear_depth_stencil_view);
7374
decl_test(test_clear_render_target_view);
7475
decl_test(test_clear_render_target_view_extreme_values);

0 commit comments

Comments
 (0)