@@ -2261,3 +2261,73 @@ 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 %#x.\n" , (int )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 %#x.\n" , (int )hr );
2292+
2293+ hr = ID3D12CommandQueue_Signal (queue , fence1 , 2 );
2294+ ok (hr == S_OK , "Failed to queue fence signal, hr %#x.\n" , (int )hr );
2295+ hr = ID3D12CommandQueue_Signal (queue , fence2 , 1 );
2296+ ok (hr == S_OK , "Failed to queue fence signal, hr %#x.\n" , (int )hr );
2297+
2298+ hr = ID3D12CommandQueue_Wait (queue , fence2 , 1 );
2299+ ok (hr == S_OK , "Failed to queue fence wait, hr %#x.\n" , (int )hr );
2300+ hr = ID3D12CommandQueue_Signal (queue , fence1 , 1 );
2301+ ok (hr == S_OK , "Failed to queue fence signal, hr %#x.\n" , (int )hr );
2302+ hr = ID3D12CommandQueue_Signal (queue , fence2 , 2 );
2303+ ok (hr == S_OK , "Failed to queue fence signal, hr %#x.\n" , (int )hr );
2304+
2305+ hr = ID3D12CommandQueue_Wait (queue , fence1 , 2 );
2306+ ok (hr == S_OK , "Failed to queue fence wait, hr %#x.\n" , (int )hr );
2307+ hr = ID3D12CommandQueue_Wait (queue , fence2 , 2 );
2308+ ok (hr == S_OK , "Failed to queue fence wait, hr %#x.\n" , (int )hr );
2309+ hr = ID3D12CommandQueue_Signal (queue , fence2 , 3 );
2310+ ok (hr == S_OK , "Failed to queue fence signal, hr %#x.\n" , (int )hr );
2311+
2312+ event = create_event ();
2313+ hr = ID3D12Fence_SetEventOnCompletion (fence2 , 3 , event );
2314+ ok (hr == S_OK , "Failed to queue event signal, hr %#x.\n" , (int )hr );
2315+ ret = wait_event (event , 100 );
2316+ if (ret != WAIT_TIMEOUT ) wakeup ++ ;
2317+
2318+ hr = ID3D12Fence_Signal (fence1 , 2 );
2319+ ok (hr == S_OK , "Failed to signal fence, hr %#x.\n" , (int )hr );
2320+ if (ret ) ret = wait_event (event , 5000 );
2321+ ok (!ret , "got ret %#x\n" , ret );
2322+
2323+ destroy_event (event );
2324+
2325+ wait_queue_idle (device , queue );
2326+
2327+ ID3D12Fence_Release (fence1 );
2328+ ID3D12Fence_Release (fence2 );
2329+ }
2330+ todo ok (wakeup == 0 , "got %u wakeup after %u runs\n" , wakeup , run );
2331+
2332+ destroy_test_context (& context );
2333+ }
0 commit comments