diff --git a/level_zero/core/source/cmdlist/cmdlist_imp.cpp b/level_zero/core/source/cmdlist/cmdlist_imp.cpp index 74c4c65b45..6b653e5a7f 100644 --- a/level_zero/core/source/cmdlist/cmdlist_imp.cpp +++ b/level_zero/core/source/cmdlist/cmdlist_imp.cpp @@ -119,6 +119,8 @@ CommandList *CommandList::create(uint32_t productFamily, Device *device, NEO::En if (returnValue != ZE_RESULT_SUCCESS) { commandList->destroy(); commandList = nullptr; + } else { + commandList->getCmdContainer().setHandleFenceCompletionRequired(); } } diff --git a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp index bbf25a574a..2548078786 100644 --- a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_1.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -1907,6 +1907,7 @@ HWTEST_F(ExecuteCommandListTests, givenDirectSubmissionEnabledWhenExecutingCmdLi EXPECT_NE(0u, bbStart->getBatchBufferStartAddress()); } + static_cast *>(csr)->directSubmissionAvailable = false; commandQueue->destroy(); } @@ -1954,6 +1955,7 @@ HWTEST_F(ExecuteCommandListTests, givenDirectSubmissionEnabledAndDebugFlagSetWhe } } + static_cast *>(csr)->directSubmissionAvailable = false; commandQueue->destroy(); } diff --git a/shared/source/command_container/cmdcontainer.cpp b/shared/source/command_container/cmdcontainer.cpp index 2066086ad6..9d82693fac 100644 --- a/shared/source/command_container/cmdcontainer.cpp +++ b/shared/source/command_container/cmdcontainer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 Intel Corporation + * Copyright (C) 2019-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -298,6 +298,12 @@ void CommandContainer::handleCmdBufferAllocations(size_t startIndex) { if (this->reusableAllocationList) { if (isHandleFenceCompletionRequired) { + for (auto &engine : this->device->getMemoryManager()->getRegisteredEngines(cmdBufferAllocations[i]->getRootDeviceIndex())) { + if (cmdBufferAllocations[i]->isUsedByOsContext(engine.osContext->getContextId())) { + auto lock = engine.commandStreamReceiver->obtainUniqueOwnership(); + engine.commandStreamReceiver->stopDirectSubmission(false); + } + } this->device->getMemoryManager()->handleFenceCompletion(cmdBufferAllocations[i]); } diff --git a/shared/source/command_container/cmdcontainer.h b/shared/source/command_container/cmdcontainer.h index c252b77e5d..7a80305c0f 100644 --- a/shared/source/command_container/cmdcontainer.h +++ b/shared/source/command_container/cmdcontainer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 Intel Corporation + * Copyright (C) 2019-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -202,6 +202,9 @@ class CommandContainer : public NonCopyableOrMovableClass { return this->alignedPrimarySize; } void endAlignedPrimaryBuffer(); + void setHandleFenceCompletionRequired() { + this->isHandleFenceCompletionRequired = true; + } protected: size_t getAlignedCmdBufferSize() const; 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 48c8f65e73..77664b9fb6 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 Intel Corporation + * Copyright (C) 2019-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -1470,10 +1470,12 @@ inline size_t CommandStreamReceiverHw::getCmdSizeForPrologue() const template inline void CommandStreamReceiverHw::stopDirectSubmission(bool blocking) { - if (EngineHelpers::isBcs(this->osContext->getEngineType())) { - this->blitterDirectSubmission->stopRingBuffer(blocking); - } else { - this->directSubmission->stopRingBuffer(blocking); + if (this->isAnyDirectSubmissionEnabled()) { + if (EngineHelpers::isBcs(this->osContext->getEngineType())) { + this->blitterDirectSubmission->stopRingBuffer(blocking); + } else { + this->directSubmission->stopRingBuffer(blocking); + } } } diff --git a/shared/test/unit_test/command_container/command_container_tests.cpp b/shared/test/unit_test/command_container/command_container_tests.cpp index 0f954d710c..cea6cb93ea 100644 --- a/shared/test/unit_test/command_container/command_container_tests.cpp +++ b/shared/test/unit_test/command_container/command_container_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 Intel Corporation + * Copyright (C) 2019-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -302,6 +302,52 @@ TEST_F(CommandContainerTest, givenCmdContainerWithAllocsListWhenAllocateAndReset allocList.freeAllGraphicsAllocations(pDevice); } +HWTEST_F(CommandContainerTest, givenCmdContainerAndHandleFenceWithAllocsListWhenAllocateAndResetThenCmdBufferAllocIsReused) { + AllocationsList allocList; + auto cmdContainer = std::make_unique(); + cmdContainer->setHandleFenceCompletionRequired(); + cmdContainer->initialize(pDevice, &allocList, true, HeapSize::defaultHeapSize, false); + auto &cmdBufferAllocs = cmdContainer->getCmdBufferAllocations(); + auto memoryManager = static_cast(pDevice->getMemoryManager()); + EXPECT_EQ(memoryManager->handleFenceCompletionCalled, 0u); + EXPECT_EQ(cmdBufferAllocs.size(), 1u); + EXPECT_TRUE(allocList.peekIsEmpty()); + + cmdContainer->allocateNextCommandBuffer(); + EXPECT_EQ(cmdBufferAllocs.size(), 2u); + + auto cmdBuffer0 = cmdBufferAllocs[0]; + auto cmdBuffer1 = cmdBufferAllocs[1]; + + cmdContainer->reset(); + EXPECT_EQ(memoryManager->handleFenceCompletionCalled, 1u); + EXPECT_EQ(cmdBufferAllocs.size(), 1u); + EXPECT_EQ(cmdBufferAllocs[0], cmdBuffer0); + EXPECT_FALSE(allocList.peekIsEmpty()); + + cmdContainer->allocateNextCommandBuffer(); + EXPECT_EQ(cmdBufferAllocs.size(), 2u); + EXPECT_EQ(cmdBufferAllocs[0], cmdBuffer0); + EXPECT_EQ(cmdBufferAllocs[1], cmdBuffer1); + EXPECT_TRUE(allocList.peekIsEmpty()); + auto csr = reinterpret_cast *>(memoryManager->getRegisteredEngines(0u)[0].commandStreamReceiver); + EXPECT_FALSE(csr->stopDirectSubmissionCalled); + EXPECT_FALSE(csr->stopDirectSubmissionCalledBlocking); + cmdBuffer1->updateTaskCount(1u, 0u); + + cmdContainer.reset(); + + EXPECT_TRUE(csr->stopDirectSubmissionCalled); + EXPECT_FALSE(csr->stopDirectSubmissionCalledBlocking); + csr = reinterpret_cast *>(memoryManager->getRegisteredEngines(0u)[1].commandStreamReceiver); + EXPECT_FALSE(csr->stopDirectSubmissionCalled); + EXPECT_FALSE(csr->stopDirectSubmissionCalledBlocking); + EXPECT_EQ(memoryManager->handleFenceCompletionCalled, 3u); + EXPECT_FALSE(allocList.peekIsEmpty()); + cmdBuffer1->releaseUsageInOsContext(0u); + allocList.freeAllGraphicsAllocations(pDevice); +} + TEST_F(CommandContainerTest, givenReusableAllocationsAndRemoveUserFenceInCmdlistResetAndDestroyFlagWhenAllocateAndResetThenHandleFenceCompletionIsCalled) { DebugManagerStateRestore restore; debugManager.flags.RemoveUserFenceInCmdlistResetAndDestroy.set(0); diff --git a/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp b/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp index fa91249379..e9e4a159b4 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -63,7 +63,25 @@ HWTEST_F(DirectSubmissionTest, whenDebugCacheFlushDisabledNotSetThenExpectCpuCac EXPECT_EQ(expectedPtrVal, CpuIntrinsicsTests::lastClFlushedPtr); } +HWTEST_F(DirectSubmissionTest, givenDirectSubmissionDisabledWhenStopThenRingIsNotStopped) { + VariableBackup backup(&ultHwConfig); + ultHwConfig.csrBaseCallDirectSubmissionAvailable = true; + MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); + auto &csr = pDevice->getUltCommandStreamReceiver(); + + bool ret = directSubmission.initialize(true, false); + EXPECT_TRUE(ret); + EXPECT_TRUE(directSubmission.ringStart); + + csr.stopDirectSubmission(false); + EXPECT_TRUE(directSubmission.ringStart); + + csr.directSubmission.release(); +} + HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenStopThenRingIsNotStarted) { + VariableBackup backup(&ultHwConfig); + ultHwConfig.csrBaseCallDirectSubmissionAvailable = true; MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); auto &csr = pDevice->getUltCommandStreamReceiver(); csr.directSubmission.reset(&directSubmission); @@ -79,6 +97,8 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenStopThenRingIsNotStarted } HWTEST_F(DirectSubmissionTest, givenBlitterDirectSubmissionWhenStopThenRingIsNotStarted) { + VariableBackup backup(&ultHwConfig); + ultHwConfig.csrBaseCallBlitterDirectSubmissionAvailable = true; MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); auto &csr = pDevice->getUltCommandStreamReceiver(); std::unique_ptr osContext(OsContext::create(pDevice->getExecutionEnvironment()->rootDeviceEnvironments[0]->osInterface.get(), pDevice->getRootDeviceIndex(), 0,