@@ -302,6 +302,66 @@ TEST_F(CommandContainerTest, givenCmdContainerWithAllocsListWhenAllocateAndReset
302302 allocList.freeAllGraphicsAllocations (pDevice);
303303}
304304
305+ HWTEST_F (CommandContainerTest, givenCmdContainerAndHandleFenceWithAllocsListWhenAllocateAndResetThenCmdBufferAllocIsReused) {
306+ AllocationsList allocList;
307+ auto cmdContainer = std::make_unique<CommandContainer>();
308+ cmdContainer->setHandleFenceCompletionRequired ();
309+ cmdContainer->initialize (pDevice, &allocList, true , HeapSize::defaultHeapSize, false );
310+ auto &cmdBufferAllocs = cmdContainer->getCmdBufferAllocations ();
311+ auto memoryManager = static_cast <MockMemoryManager *>(pDevice->getMemoryManager ());
312+ auto csr = reinterpret_cast <UltCommandStreamReceiver<FamilyType> *>(memoryManager->getRegisteredEngines (0u )[0 ].commandStreamReceiver );
313+ csr->directSubmissionAvailable = true ;
314+ csr->callFlushTagUpdate = false ;
315+ EXPECT_EQ (memoryManager->handleFenceCompletionCalled , 0u );
316+ EXPECT_EQ (cmdBufferAllocs.size (), 1u );
317+ EXPECT_TRUE (allocList.peekIsEmpty ());
318+
319+ cmdContainer->allocateNextCommandBuffer ();
320+ EXPECT_EQ (cmdBufferAllocs.size (), 2u );
321+
322+ auto cmdBuffer0 = cmdBufferAllocs[0 ];
323+ auto cmdBuffer1 = cmdBufferAllocs[1 ];
324+
325+ cmdContainer->reset ();
326+ EXPECT_EQ (memoryManager->handleFenceCompletionCalled , 1u );
327+ EXPECT_EQ (cmdBufferAllocs.size (), 1u );
328+ EXPECT_EQ (cmdBufferAllocs[0 ], cmdBuffer0);
329+ EXPECT_FALSE (allocList.peekIsEmpty ());
330+ EXPECT_FALSE (csr->stopDirectSubmissionCalled );
331+ EXPECT_FALSE (csr->stopDirectSubmissionCalledBlocking );
332+
333+ cmdContainer->allocateNextCommandBuffer ();
334+ EXPECT_EQ (cmdBufferAllocs.size (), 2u );
335+ cmdContainer->reset ();
336+ EXPECT_EQ (memoryManager->handleFenceCompletionCalled , 2u );
337+ EXPECT_EQ (cmdBufferAllocs.size (), 1u );
338+ EXPECT_EQ (cmdBufferAllocs[0 ], cmdBuffer0);
339+ EXPECT_FALSE (allocList.peekIsEmpty ());
340+ EXPECT_FALSE (csr->stopDirectSubmissionCalled );
341+ EXPECT_FALSE (csr->stopDirectSubmissionCalledBlocking );
342+
343+ cmdContainer->allocateNextCommandBuffer ();
344+ EXPECT_EQ (cmdBufferAllocs.size (), 2u );
345+ EXPECT_EQ (cmdBufferAllocs[0 ], cmdBuffer0);
346+ EXPECT_EQ (cmdBufferAllocs[1 ], cmdBuffer1);
347+ EXPECT_TRUE (allocList.peekIsEmpty ());
348+ EXPECT_FALSE (csr->stopDirectSubmissionCalled );
349+ EXPECT_FALSE (csr->stopDirectSubmissionCalledBlocking );
350+ cmdBuffer1->updateTaskCount (1u , 0u );
351+
352+ cmdContainer.reset ();
353+
354+ EXPECT_FALSE (csr->stopDirectSubmissionCalled );
355+ EXPECT_FALSE (csr->stopDirectSubmissionCalledBlocking );
356+ csr = reinterpret_cast <UltCommandStreamReceiver<FamilyType> *>(memoryManager->getRegisteredEngines (0u )[1 ].commandStreamReceiver );
357+ EXPECT_FALSE (csr->stopDirectSubmissionCalled );
358+ EXPECT_FALSE (csr->stopDirectSubmissionCalledBlocking );
359+ EXPECT_EQ (memoryManager->handleFenceCompletionCalled , 3u );
360+ EXPECT_FALSE (allocList.peekIsEmpty ());
361+ cmdBuffer1->releaseUsageInOsContext (0u );
362+ allocList.freeAllGraphicsAllocations (pDevice);
363+ }
364+
305365TEST_F (CommandContainerTest, givenReusableAllocationsAndRemoveUserFenceInCmdlistResetAndDestroyFlagWhenAllocateAndResetThenHandleFenceCompletionIsCalled) {
306366 DebugManagerStateRestore restore;
307367 debugManager.flags .RemoveUserFenceInCmdlistResetAndDestroy .set (0 );
@@ -315,14 +375,21 @@ TEST_F(CommandContainerTest, givenReusableAllocationsAndRemoveUserFenceInCmdlist
315375 EXPECT_EQ (cmdBufferAllocs.size (), 1u );
316376 cmdContainer->allocateNextCommandBuffer ();
317377 EXPECT_EQ (cmdBufferAllocs.size (), 2u );
378+
318379 cmdContainer->reset ();
319380 EXPECT_EQ (1u , memoryManager->handleFenceCompletionCalled );
320381 cmdContainer->allocateNextCommandBuffer ();
321382 EXPECT_EQ (cmdBufferAllocs.size (), 2u );
383+
384+ cmdBufferAllocs[1 ]->updateTaskCount (2u , 0u );
322385 cmdContainer->reset ();
323386 EXPECT_EQ (2u , memoryManager->handleFenceCompletionCalled );
324387 cmdContainer->allocateNextCommandBuffer ();
325388 EXPECT_EQ (cmdBufferAllocs.size (), 2u );
389+ EXPECT_FALSE (cmdBufferAllocs[1 ]->isUsedByOsContext (0u ));
390+
391+ cmdBufferAllocs[0 ]->updateTaskCount (5u , 0u );
392+ cmdBufferAllocs[1 ]->updateTaskCount (5u , 0u );
326393 cmdContainer.reset ();
327394 EXPECT_EQ (4u , memoryManager->handleFenceCompletionCalled );
328395 allocList.freeAllGraphicsAllocations (pDevice);
@@ -341,14 +408,21 @@ TEST_F(CommandContainerTest, givenReusableAllocationsAndRemoveUserFenceInCmdlist
341408 EXPECT_EQ (cmdBufferAllocs.size (), 1u );
342409 cmdContainer->allocateNextCommandBuffer ();
343410 EXPECT_EQ (cmdBufferAllocs.size (), 2u );
411+
344412 cmdContainer->reset ();
345413 EXPECT_EQ (0u , memoryManager->handleFenceCompletionCalled );
346414 cmdContainer->allocateNextCommandBuffer ();
347415 EXPECT_EQ (cmdBufferAllocs.size (), 2u );
416+
417+ cmdBufferAllocs[1 ]->updateTaskCount (2u , 0u );
348418 cmdContainer->reset ();
349419 EXPECT_EQ (0u , memoryManager->handleFenceCompletionCalled );
350420 cmdContainer->allocateNextCommandBuffer ();
351421 EXPECT_EQ (cmdBufferAllocs.size (), 2u );
422+ EXPECT_FALSE (cmdBufferAllocs[1 ]->isUsedByOsContext (0u ));
423+
424+ cmdBufferAllocs[0 ]->updateTaskCount (5u , 0u );
425+ cmdBufferAllocs[1 ]->updateTaskCount (5u , 0u );
352426 cmdContainer.reset ();
353427 EXPECT_EQ (0u , memoryManager->handleFenceCompletionCalled );
354428 allocList.freeAllGraphicsAllocations (pDevice);
0 commit comments