diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index a11e0233a6..feec90de83 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -646,7 +646,7 @@ CompletionStamp CommandStreamReceiverHw::flushTask( BatchBuffer batchBuffer{streamToSubmit.getGraphicsAllocation(), startOffset, chainedBatchBufferStartOffset, taskStartAddress, chainedBatchBuffer, dispatchFlags.lowPriority, dispatchFlags.throttle, dispatchFlags.sliceCount, streamToSubmit.getUsed(), &streamToSubmit, bbEndLocation, this->getNumClients(), (submitCSR || dispatchFlags.hasStallingCmds || hasStallingCmdsOnTaskStream), - dispatchFlags.hasRelaxedOrderingDependencies, dispatchFlags.blocking}; + dispatchFlags.hasRelaxedOrderingDependencies, hasStallingCmdsOnTaskStream}; updateStreamTaskCount(streamToSubmit, taskCount + 1); @@ -658,7 +658,7 @@ CompletionStamp CommandStreamReceiverHw::flushTask( CompletionStamp completionStamp = {CompletionStamp::getTaskCountFromSubmissionStatusError(submissionStatus)}; return completionStamp; } - if (dispatchFlags.blocking || dispatchFlags.dcFlush || dispatchFlags.guardCommandBufferWithPipeControl) { + if (hasStallingCmdsOnTaskStream) { this->latestFlushedTaskCount = this->taskCount + 1; } } else { diff --git a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp index e85f1f559e..8a8acf6b4f 100644 --- a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp +++ b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp @@ -4583,3 +4583,79 @@ HWTEST_F(CommandStreamReceiverHwTest, GivenDirtyFlagForContextInBindlessHelperWh EXPECT_FALSE(bindlessHeapsHelperPtr->getStateDirtyForContext(commandStreamReceiver.getOsContext().getContextId())); } + +HWTEST_F(CommandStreamReceiverHwTest, GivenFlushIsBlockingWhenFlushTaskCalledThenExpectMonitorFenceFlagTrue) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + commandStreamReceiver.recordFlusheBatchBuffer = true; + + commandStreamReceiver.taskCount = 5; + flushTaskFlags.blocking = true; + commandStreamReceiver.flushTask(commandStream, + 0, + &dsh, + &ioh, + nullptr, + taskLevel, + flushTaskFlags, + *pDevice); + + EXPECT_TRUE(commandStreamReceiver.latestFlushedBatchBuffer.dispatchMonitorFence); + EXPECT_EQ(6u, commandStreamReceiver.peekLatestFlushedTaskCount()); +} + +HWTEST_F(CommandStreamReceiverHwTest, GivenFlushIsDcFlushWhenFlushTaskCalledThenExpectMonitorFenceFlagTrue) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + commandStreamReceiver.recordFlusheBatchBuffer = true; + + commandStreamReceiver.taskCount = 11; + flushTaskFlags.dcFlush = true; + commandStreamReceiver.flushTask(commandStream, + 0, + &dsh, + &ioh, + nullptr, + taskLevel, + flushTaskFlags, + *pDevice); + + EXPECT_TRUE(commandStreamReceiver.latestFlushedBatchBuffer.dispatchMonitorFence); + EXPECT_EQ(12u, commandStreamReceiver.peekLatestFlushedTaskCount()); +} + +HWTEST_F(CommandStreamReceiverHwTest, GivenFlushGuardBufferWithPipeControlWhenFlushTaskCalledThenExpectMonitorFenceFlagTrue) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + commandStreamReceiver.recordFlusheBatchBuffer = true; + + commandStreamReceiver.taskCount = 17; + flushTaskFlags.guardCommandBufferWithPipeControl = true; + commandStreamReceiver.flushTask(commandStream, + 0, + &dsh, + &ioh, + nullptr, + taskLevel, + flushTaskFlags, + *pDevice); + + EXPECT_TRUE(commandStreamReceiver.latestFlushedBatchBuffer.dispatchMonitorFence); + EXPECT_EQ(18u, commandStreamReceiver.peekLatestFlushedTaskCount()); +} + +HWTEST_F(CommandStreamReceiverHwTest, GivenFlushHeapStorageRequiresRecyclingTagWhenFlushTaskCalledThenExpectMonitorFenceFlagTrue) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + commandStreamReceiver.recordFlusheBatchBuffer = true; + + commandStreamReceiver.taskCount = 23; + commandStreamReceiver.heapStorageRequiresRecyclingTag = true; + commandStreamReceiver.flushTask(commandStream, + 0, + &dsh, + &ioh, + nullptr, + taskLevel, + flushTaskFlags, + *pDevice); + + EXPECT_TRUE(commandStreamReceiver.latestFlushedBatchBuffer.dispatchMonitorFence); + EXPECT_EQ(24u, commandStreamReceiver.peekLatestFlushedTaskCount()); +}