@@ -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+ }
0 commit comments