diff --git a/level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl b/level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl index cb8ae4959c..23dfa256a9 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl @@ -436,6 +436,13 @@ ze_result_t CommandListCoreFamilyImmediate::appendPageFaultCopy(N template ze_result_t CommandListCoreFamilyImmediate::appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phWaitEvents) { + bool allSignaled = true; + for (auto i = 0u; i < numEvents; i++) { + allSignaled &= (!this->dcFlushSupport && Event::fromHandle(phWaitEvents[i])->isAlreadyCompleted()); + } + if (allSignaled) { + return ZE_RESULT_SUCCESS; + } if (this->isFlushTaskSubmissionEnabled) { checkAvailableSpace(); } diff --git a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h index 5fb9355741..ad9cff3322 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h +++ b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h @@ -505,6 +505,7 @@ class MockCommandListImmediateHw : public WhiteBox<::L0::CommandListCoreFamilyIm using BaseClass = WhiteBox<::L0::CommandListCoreFamilyImmediate>; MockCommandListImmediateHw() : BaseClass() {} using BaseClass::applyMemoryRangesBarrier; + using BaseClass::dcFlushSupport; using BaseClass::dependenciesPresent; using BaseClass::isFlushTaskSubmissionEnabled; using BaseClass::isSyncModeQueue; diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_wait_on_events.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_wait_on_events.cpp index 18c0b695c3..900e21b1a5 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_wait_on_events.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_wait_on_events.cpp @@ -545,5 +545,31 @@ HWTEST2_F(MultTileCommandListAppendWaitOnEvent, EXPECT_EQ(2u, semaphoreWaitsFound); } +HWTEST2_F(CommandListAppendWaitOnEvent, givenImmediateCommandListWhenAppendWaitOnNotSignaledEventThenWait, IsAtLeastSkl) { + MockCommandListImmediateHw cmdList; + cmdList.initialize(device, NEO::EngineGroupType::RenderCompute, 0u); + cmdList.csr = device->getNEODevice()->getInternalEngine().commandStreamReceiver; + + ze_event_handle_t eventHandle = event->toHandle(); + + EXPECT_FALSE(cmdList.dependenciesPresent); + EXPECT_EQ(ZE_RESULT_SUCCESS, cmdList.appendWaitOnEvents(1, &eventHandle)); + EXPECT_TRUE(cmdList.dependenciesPresent); +} + +HWTEST2_F(CommandListAppendWaitOnEvent, givenImmediateCommandListWhenAppendWaitOnAlreadySignaledEventThenDontWait, IsAtLeastSkl) { + MockCommandListImmediateHw cmdList; + cmdList.initialize(device, NEO::EngineGroupType::RenderCompute, 0u); + cmdList.csr = device->getNEODevice()->getInternalEngine().commandStreamReceiver; + cmdList.dcFlushSupport = false; + event->hostSignal(); + EXPECT_EQ(ZE_RESULT_SUCCESS, event->queryStatus()); + ze_event_handle_t eventHandle = event->toHandle(); + + EXPECT_FALSE(cmdList.dependenciesPresent); + EXPECT_EQ(ZE_RESULT_SUCCESS, cmdList.appendWaitOnEvents(1, &eventHandle)); + EXPECT_FALSE(cmdList.dependenciesPresent); +} + } // namespace ult } // namespace L0 diff --git a/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdlist_xe_hpc_core.cpp b/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdlist_xe_hpc_core.cpp index 998bb51264..22bb9ee682 100644 --- a/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdlist_xe_hpc_core.cpp +++ b/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdlist_xe_hpc_core.cpp @@ -1124,8 +1124,17 @@ HWTEST2_F(AppendMemoryLockedCopyTest, givenImmediateCommandListWhenAppendWaitOnE cmdList.csr = device->getNEODevice()->getInternalEngine().commandStreamReceiver; EXPECT_FALSE(cmdList.dependenciesPresent); - - cmdList.appendWaitOnEvents(0, nullptr); + ze_event_pool_desc_t eventPoolDesc = {}; + eventPoolDesc.count = 1; + eventPoolDesc.flags = ZE_EVENT_POOL_FLAG_KERNEL_TIMESTAMP; + ze_event_desc_t eventDesc = {}; + eventDesc.index = 0; + ze_result_t returnValue = ZE_RESULT_SUCCESS; + auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + EXPECT_EQ(ZE_RESULT_SUCCESS, returnValue); + auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); + auto eventHandle = event->toHandle(); + cmdList.appendWaitOnEvents(1, &eventHandle); EXPECT_TRUE(cmdList.dependenciesPresent);