diff --git a/level_zero/core/source/cmdlist/cmdlist.h b/level_zero/core/source/cmdlist/cmdlist.h index 1b375a5c68..63f4eafe3f 100644 --- a/level_zero/core/source/cmdlist/cmdlist.h +++ b/level_zero/core/source/cmdlist/cmdlist.h @@ -163,7 +163,7 @@ struct CommandList : _ze_command_list_handle_t { uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents, bool relaxedOrderingDispatch) = 0; virtual ze_result_t appendMemoryPrefetch(const void *ptr, size_t count) = 0; virtual ze_result_t appendSignalEvent(ze_event_handle_t hEvent) = 0; - virtual ze_result_t appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool signalInOrderCompletion) = 0; + virtual ze_result_t appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool apiRequest) = 0; virtual ze_result_t appendWriteGlobalTimestamp(uint64_t *dstptr, ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) = 0; virtual ze_result_t appendMemoryCopyFromContext(void *dstptr, ze_context_handle_t hContextSrc, diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.h b/level_zero/core/source/cmdlist/cmdlist_hw.h index f5ce590e7f..4bc1332512 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.h +++ b/level_zero/core/source/cmdlist/cmdlist_hw.h @@ -170,7 +170,7 @@ struct CommandListCoreFamily : public CommandListImp { ze_result_t hostSynchronize(uint64_t timeout) override; ze_result_t appendSignalEvent(ze_event_handle_t hEvent) override; - ze_result_t appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool signalInOrderCompletion) override; + ze_result_t appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool apiRequest) override; void appendWaitOnInOrderDependency(std::shared_ptr &inOrderExecInfo, uint64_t waitValue, uint32_t offset, bool relaxedOrderingAllowed, bool implicitDependency); void appendSignalInOrderDependencyCounter(Event *signalEvent); void handleInOrderDependencyCounter(Event *signalEvent, bool nonWalkerInOrderCmdsChaining); diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index a5ff79a5c5..4506f2e526 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -153,6 +153,15 @@ ze_result_t CommandListCoreFamily::reset() { template void CommandListCoreFamily::handleInOrderDependencyCounter(Event *signalEvent, bool nonWalkerInOrderCmdsChaining) { + if (!isInOrderExecutionEnabled()) { + if (signalEvent && signalEvent->getInOrderExecInfo().get()) { + UNRECOVERABLE_IF(signalEvent->isCounterBased()); + signalEvent->unsetInOrderExecInfo(); // unset temporary asignment from previous append calls + } + + return; + } + if (!isQwordInOrderCounter() && ((inOrderExecInfo->getCounterValue() + 1) == std::numeric_limits::max())) { CommandListCoreFamily::appendWaitOnInOrderDependency(inOrderExecInfo, inOrderExecInfo->getCounterValue() + 1, inOrderAllocationOffset, false, true); @@ -172,8 +181,12 @@ void CommandListCoreFamily::handleInOrderDependencyCounter(Event this->commandContainer.addToResidencyContainer(&inOrderExecInfo->getDeviceCounterAllocation()); - if (signalEvent && signalEvent->isCounterBased()) { - signalEvent->updateInOrderExecState(inOrderExecInfo, inOrderExecInfo->getCounterValue(), this->inOrderAllocationOffset); + if (signalEvent) { + if (signalEvent->isCounterBased() || nonWalkerInOrderCmdsChaining) { + signalEvent->updateInOrderExecState(inOrderExecInfo, inOrderExecInfo->getCounterValue(), this->inOrderAllocationOffset); + } else { + signalEvent->unsetInOrderExecInfo(); + } } this->latestOperationRequiredNonWalkerInOrderCmdsChaining = nonWalkerInOrderCmdsChaining; @@ -367,7 +380,7 @@ ze_result_t CommandListCoreFamily::appendLaunchKernel(ze_kernel_h auto res = appendLaunchKernelWithParams(Kernel::fromHandle(kernelHandle), threadGroupDimensions, event, launchParams); - if (isInOrderExecutionEnabled() && !launchParams.skipInOrderNonWalkerSignaling) { + if (!launchParams.skipInOrderNonWalkerSignaling) { handleInOrderDependencyCounter(event, isInOrderNonWalkerSignalingRequired(event)); } @@ -412,9 +425,8 @@ ze_result_t CommandListCoreFamily::appendLaunchCooperativeKernel( event, launchParams); addToMappedEventList(event); - if (this->isInOrderExecutionEnabled()) { - handleInOrderDependencyCounter(event, isInOrderNonWalkerSignalingRequired(event)); - } + handleInOrderDependencyCounter(event, isInOrderNonWalkerSignalingRequired(event)); + return ret; } @@ -454,9 +466,7 @@ ze_result_t CommandListCoreFamily::appendLaunchKernelIndirect(ze_ addToMappedEventList(event); appendSignalEventPostWalker(event, false); - if (isInOrderExecutionEnabled()) { - handleInOrderDependencyCounter(event, isInOrderNonWalkerSignalingRequired(event)); - } + handleInOrderDependencyCounter(event, isInOrderNonWalkerSignalingRequired(event)); return ret; } @@ -553,8 +563,8 @@ ze_result_t CommandListCoreFamily::appendEventReset(ze_event_hand if (this->isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(event); - handleInOrderDependencyCounter(event, false); } + handleInOrderDependencyCounter(event, false); if (NEO::debugManager.flags.EnableSWTags.get()) { neoDevice->getRootDeviceEnvironment().tagsManager->insertTag( @@ -596,8 +606,8 @@ ze_result_t CommandListCoreFamily::appendMemoryRangesBarrier(uint if (this->isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(signalEvent); - handleInOrderDependencyCounter(signalEvent, false); } + handleInOrderDependencyCounter(signalEvent, false); return ZE_RESULT_SUCCESS; } @@ -1528,6 +1538,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopy(void *dstptr, bool nonWalkerInOrderCmdChaining = !isCopyOnly() && isInOrderNonWalkerSignalingRequired(signalEvent) && !emitPipeControl; handleInOrderDependencyCounter(signalEvent, nonWalkerInOrderCmdChaining); } + } else { + handleInOrderDependencyCounter(signalEvent, false); } if (NEO::debugManager.flags.EnableSWTags.get()) { @@ -1626,6 +1638,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopyRegion(void *d bool nonWalkerInOrderCmdChaining = !isCopyOnly() && isInOrderNonWalkerSignalingRequired(signalEvent); handleInOrderDependencyCounter(signalEvent, nonWalkerInOrderCmdChaining); } + } else { + handleInOrderDependencyCounter(signalEvent, false); } if (NEO::debugManager.flags.EnableSWTags.get()) { @@ -2068,8 +2082,8 @@ ze_result_t CommandListCoreFamily::appendMemoryFill(void *ptr, appendEventForProfilingAllWalkers(signalEvent, false, singlePipeControlPacket); addFlushRequiredCommand(hostPointerNeedsFlush, signalEvent); + bool nonWalkerInOrderCmdChaining = false; if (this->isInOrderExecutionEnabled()) { - bool nonWalkerInOrderCmdChaining = false; if (launchParams.isKernelSplitOperation) { if (!signalEvent) { NEO::PipeControlArgs args; @@ -2079,9 +2093,8 @@ ze_result_t CommandListCoreFamily::appendMemoryFill(void *ptr, } else { nonWalkerInOrderCmdChaining = isInOrderNonWalkerSignalingRequired(signalEvent); } - - handleInOrderDependencyCounter(signalEvent, nonWalkerInOrderCmdChaining); } + handleInOrderDependencyCounter(signalEvent, nonWalkerInOrderCmdChaining); if (NEO::debugManager.flags.EnableSWTags.get()) { neoDevice->getRootDeviceEnvironment().tagsManager->insertTag( @@ -2147,8 +2160,8 @@ ze_result_t CommandListCoreFamily::appendBlitFill(void *ptr, if (isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(signalEvent); - handleInOrderDependencyCounter(signalEvent, false); } + handleInOrderDependencyCounter(signalEvent, false); } return ZE_RESULT_SUCCESS; } @@ -2379,8 +2392,8 @@ ze_result_t CommandListCoreFamily::appendSignalEvent(ze_event_han if (this->isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(event); - handleInOrderDependencyCounter(event, false); } + handleInOrderDependencyCounter(event, false); if (NEO::debugManager.flags.EnableSWTags.get()) { neoDevice->getRootDeviceEnvironment().tagsManager->insertTag( @@ -2442,17 +2455,15 @@ void CommandListCoreFamily::appendWaitOnInOrderDependency(std::sh template bool CommandListCoreFamily::canSkipInOrderEventWait(const Event &event) const { if (isInOrderExecutionEnabled()) { - return ((this->cmdListType == TYPE_IMMEDIATE && event.getLatestUsedCmdQueue() == this->cmdQImmediate) || // 1. Immediate CmdList can skip "regular Events" from the same CmdList - (event.getInOrderExecDataAllocation() == &inOrderExecInfo->getDeviceCounterAllocation())); // 2. Both Immediate and Regular CmdLists can skip "in-order Events" from the same CmdList + return ((this->cmdListType == TYPE_IMMEDIATE && event.getLatestUsedCmdQueue() == this->cmdQImmediate) || // 1. Immediate CmdList can skip "regular Events" from the same CmdList + (event.isCounterBased() && event.getInOrderExecDataAllocation() == &inOrderExecInfo->getDeviceCounterAllocation())); // 2. Both Immediate and Regular CmdLists can skip "CounterBased Events" from the same CmdList } return false; } template -ze_result_t CommandListCoreFamily::appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool signalInOrderCompletion) { - signalInOrderCompletion &= this->isInOrderExecutionEnabled(); - +ze_result_t CommandListCoreFamily::appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool apiRequest) { NEO::Device *neoDevice = device->getNEODevice(); uint32_t callId = 0; if (NEO::debugManager.flags.EnableSWTags.get()) { @@ -2464,7 +2475,7 @@ ze_result_t CommandListCoreFamily::appendWaitOnEvents(uint32_t nu callId = neoDevice->getRootDeviceEnvironment().tagsManager->currentCallCount; } - if (signalInOrderCompletion) { + if (this->isInOrderExecutionEnabled() && apiRequest) { handleInOrderImplicitDependencies(false); } @@ -2521,8 +2532,10 @@ ze_result_t CommandListCoreFamily::appendWaitOnEvents(uint32_t nu commandContainer.addToResidencyContainer(this->csr->getTagAllocation()); } - if (signalInOrderCompletion) { - appendSignalInOrderDependencyCounter(nullptr); + if (apiRequest) { + if (this->isInOrderExecutionEnabled()) { + appendSignalInOrderDependencyCounter(nullptr); + } handleInOrderDependencyCounter(nullptr, false); } @@ -2697,8 +2710,8 @@ ze_result_t CommandListCoreFamily::appendWriteGlobalTimestamp( if (this->isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(signalEvent); - handleInOrderDependencyCounter(signalEvent, false); } + handleInOrderDependencyCounter(signalEvent, false); addToMappedEventList(signalEvent); @@ -3210,8 +3223,8 @@ ze_result_t CommandListCoreFamily::appendBarrier(ze_event_handle_ if (isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(signalEvent); - handleInOrderDependencyCounter(signalEvent, false); } + handleInOrderDependencyCounter(signalEvent, false); return ZE_RESULT_SUCCESS; } @@ -3375,8 +3388,8 @@ ze_result_t CommandListCoreFamily::appendWaitOnMemory(void *desc, if (this->isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(signalEvent); - handleInOrderDependencyCounter(signalEvent, false); } + handleInOrderDependencyCounter(signalEvent, false); return ZE_RESULT_SUCCESS; } @@ -3423,8 +3436,8 @@ ze_result_t CommandListCoreFamily::appendWriteToMemory(void *desc if (this->isInOrderExecutionEnabled()) { appendSignalInOrderDependencyCounter(nullptr); - handleInOrderDependencyCounter(nullptr, false); } + handleInOrderDependencyCounter(nullptr, false); return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h b/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h index 9f1969b83d..1c248fb313 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h +++ b/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h @@ -99,7 +99,7 @@ struct CommandListCoreFamilyImmediate : public CommandListCoreFamily::appendLaunchKernel( hSignalEvent, numWaitEvents, phWaitEvents, launchParams, relaxedOrderingDispatch); - if (isInOrderExecutionEnabled() && launchParams.skipInOrderNonWalkerSignaling) { - // skip only in base appendLaunchKernel() + if (launchParams.skipInOrderNonWalkerSignaling) { auto event = Event::fromHandle(hSignalEvent); - handleInOrderNonWalkerSignaling(event, stallingCmdsForRelaxedOrdering, relaxedOrderingDispatch, ret); + if (isInOrderExecutionEnabled()) { + // Skip only in base appendLaunchKernel(). Handle remaining operations here. + handleInOrderNonWalkerSignaling(event, stallingCmdsForRelaxedOrdering, relaxedOrderingDispatch, ret); + } CommandListCoreFamily::handleInOrderDependencyCounter(event, true); } @@ -706,7 +708,7 @@ ze_result_t CommandListCoreFamilyImmediate::appendPageFaultCopy(N } template -ze_result_t CommandListCoreFamilyImmediate::appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phWaitEvents, bool relaxedOrderingAllowed, bool trackDependencies, bool signalInOrderCompletion) { +ze_result_t CommandListCoreFamilyImmediate::appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phWaitEvents, bool relaxedOrderingAllowed, bool trackDependencies, bool apiRequest) { bool allSignaled = true; for (auto i = 0u; i < numEvents; i++) { allSignaled &= (!this->dcFlushSupport && Event::fromHandle(phWaitEvents[i])->isAlreadyCompleted()); @@ -716,7 +718,7 @@ ze_result_t CommandListCoreFamilyImmediate::appendWaitOnEvents(ui } checkAvailableSpace(numEvents, false, commonImmediateCommandSize); - auto ret = CommandListCoreFamily::appendWaitOnEvents(numEvents, phWaitEvents, relaxedOrderingAllowed, trackDependencies, signalInOrderCompletion); + auto ret = CommandListCoreFamily::appendWaitOnEvents(numEvents, phWaitEvents, relaxedOrderingAllowed, trackDependencies, apiRequest); this->dependenciesPresent = true; return flushImmediate(ret, true, true, false, false, nullptr); } @@ -1043,7 +1045,10 @@ ze_result_t CommandListCoreFamilyImmediate::performCpuMemcpy(cons if (hSignalEvent) { signalEvent = Event::fromHandle(hSignalEvent); } - this->handleCounterBasedEventOperations(signalEvent); + + if (!this->handleCounterBasedEventOperations(signalEvent)) { + return ZE_RESULT_ERROR_INVALID_ARGUMENT; + } const void *cpuMemcpySrcPtr = srcLockPointer ? srcLockPointer : cpuMemCopyInfo.srcPtr; void *cpuMemcpyDstPtr = dstLockPointer ? dstLockPointer : cpuMemCopyInfo.dstPtr; diff --git a/level_zero/core/source/device/bcs_split.h b/level_zero/core/source/device/bcs_split.h index 6fc802ad57..f4d2914e3e 100644 --- a/level_zero/core/source/device/bcs_split.h +++ b/level_zero/core/source/device/bcs_split.h @@ -137,8 +137,8 @@ struct BcsSplit { if (cmdList->isInOrderExecutionEnabled()) { cmdList->appendSignalInOrderDependencyCounter(signalEvent); - cmdList->handleInOrderDependencyCounter(signalEvent, false); } + cmdList->handleInOrderDependencyCounter(signalEvent, false); return result; } diff --git a/level_zero/core/source/event/event.cpp b/level_zero/core/source/event/event.cpp index f4fba8b03b..0b07a98bd3 100644 --- a/level_zero/core/source/event/event.cpp +++ b/level_zero/core/source/event/event.cpp @@ -367,8 +367,7 @@ void Event::disableImplicitCounterBasedMode() { if (counterBasedMode == CounterBasedMode::ImplicitlyEnabled || counterBasedMode == CounterBasedMode::InitiallyDisabled) { counterBasedMode = CounterBasedMode::ImplicitlyDisabled; - inOrderExecInfo.reset(); - inOrderExecSignalValue = 0; + unsetInOrderExecInfo(); } } @@ -461,4 +460,10 @@ void Event::setReferenceTs(uint64_t currentCpuTimeStamp) { NEO::GraphicsAllocation *Event::getInOrderExecDataAllocation() const { return inOrderExecInfo.get() ? &inOrderExecInfo->getDeviceCounterAllocation() : nullptr; } +void Event::unsetInOrderExecInfo() { + inOrderExecInfo.reset(); + inOrderAllocationOffset = 0; + inOrderExecSignalValue = 0; +} + } // namespace L0 diff --git a/level_zero/core/source/event/event.h b/level_zero/core/source/event/event.h index 329ce6c7ab..a72917d01e 100644 --- a/level_zero/core/source/event/event.h +++ b/level_zero/core/source/event/event.h @@ -257,6 +257,7 @@ struct Event : _ze_event_handle_t { std::shared_ptr &getInOrderExecInfo() { return inOrderExecInfo; } void enableKmdWaitMode() { kmdWaitMode = true; } bool isKmdWaitModeEnabled() const { return kmdWaitMode; } + void unsetInOrderExecInfo(); protected: Event(EventPool *eventPool, int index, Device *device) : device(device), eventPool(eventPool), index(index) {} diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index 45e1ea0a16..0bfa9fd00f 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -194,6 +194,12 @@ void EventImp::handleSuccessfulHostSynchronization() { } this->setIsCompleted(); unsetCmdQueue(); + + if (!isCounterBased()) { + // Temporary assignment. If in-order CmdList required to use Event allocation for HW commands chaining, we need to wait for the counter. + // After successful host synchronization, we can unset CL counter. + unsetInOrderExecInfo(); + } for (auto &csr : csrs) { csr->getInternalAllocationStorage()->cleanAllocationList(csr->peekTaskCount(), NEO::AllocationUsage::TEMPORARY_ALLOCATION); } @@ -289,7 +295,7 @@ ze_result_t EventImp::queryStatus() { return ZE_RESULT_SUCCESS; } - if (isCounterBased()) { + if (isCounterBased() || this->inOrderExecInfo.get()) { return queryCounterBasedEventStatus(); } else { return queryStatusEventPackets(); @@ -517,11 +523,6 @@ ze_result_t EventImp::reset() { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } - if (this->counterBasedMode == CounterBasedMode::ImplicitlyEnabled) { - inOrderExecInfo.reset(); - inOrderExecSignalValue = 0; - } - if (NEO::debugManager.flags.SynchronizeEventBeforeReset.get() != -1) { if (NEO::debugManager.flags.SynchronizeEventBeforeReset.get() == 2 && queryStatus() != ZE_RESULT_SUCCESS) { printf("\nzeEventHostReset: Event %p not ready. Calling zeEventHostSynchronize.", this); @@ -530,6 +531,7 @@ ze_result_t EventImp::reset() { hostSynchronize(std::numeric_limits::max()); } + unsetInOrderExecInfo(); unsetCmdQueue(); this->resetCompletionStatus(); this->resetDeviceCompletionData(false); 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 48e3420347..1da693cb1d 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h +++ b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h @@ -422,7 +422,7 @@ struct MockCommandList : public CommandList { ADDMETHOD_NOBASE(appendWaitOnEvents, ze_result_t, ZE_RESULT_SUCCESS, (uint32_t numEvents, - ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool signalInOrderCompletion)); + ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool apiRequest)); ADDMETHOD_NOBASE(appendWriteGlobalTimestamp, ze_result_t, ZE_RESULT_SUCCESS, (uint64_t * dstptr, diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp index d7c04d36ab..eba58c6a41 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_3.cpp @@ -1109,18 +1109,99 @@ HWTEST2_F(InOrderCmdListTests, givenInOrderEventWhenAppendEventResetCalledThenRe EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, immCmdList->appendEventReset(events[0]->toHandle())); } -HWTEST2_F(InOrderCmdListTests, givenInOrderModeWheUsingRegularEventThenDontSetInOrderParams, IsAtLeastSkl) { +HWTEST2_F(InOrderCmdListTests, givenRegularEventWithTemporaryInOrderDataAssignmentWhenCallingSynchronizeOrResetThenUnset, IsAtLeastSkl) { auto immCmdList = createImmCmdList(); + auto hostAddress = static_cast(immCmdList->inOrderExecInfo->getDeviceCounterAllocation().getUnderlyingBuffer()); + + auto eventPool = createEvents(1, false); + events[0]->makeCounterBasedInitiallyDisabled(); + + auto nonWalkerSignallingSupported = immCmdList->isInOrderNonWalkerSignalingRequired(events[0].get()); + + immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); + + EXPECT_EQ(nonWalkerSignallingSupported, events[0]->inOrderExecInfo.get() != nullptr); + + EXPECT_EQ(ZE_RESULT_NOT_READY, events[0]->hostSynchronize(1)); + EXPECT_EQ(nonWalkerSignallingSupported, events[0]->inOrderExecInfo.get() != nullptr); + + if (nonWalkerSignallingSupported) { + *hostAddress = 1; + } else { + *reinterpret_cast(events[0]->getCompletionFieldHostAddress()) = Event::STATE_SIGNALED; + } + + EXPECT_EQ(ZE_RESULT_SUCCESS, events[0]->hostSynchronize(1)); + EXPECT_EQ(events[0]->inOrderExecInfo.get(), nullptr); + + immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); + EXPECT_EQ(nonWalkerSignallingSupported, events[0]->inOrderExecInfo.get() != nullptr); + + EXPECT_EQ(ZE_RESULT_SUCCESS, events[0]->reset()); + EXPECT_EQ(events[0]->inOrderExecInfo.get(), nullptr); +} + +HWTEST2_F(InOrderCmdListTests, givenInOrderModeWheUsingRegularEventThenSetInOrderParamsOnlyWhenChainingIsRequired, IsAtLeastSkl) { + uint32_t counterOffset = 64; + + auto immCmdList = createImmCmdList(); + immCmdList->inOrderAllocationOffset = counterOffset; + auto eventPool = createEvents(1, false); events[0]->makeCounterBasedInitiallyDisabled(); immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); + EXPECT_FALSE(events[0]->isCounterBased()); + + if (immCmdList->isInOrderNonWalkerSignalingRequired(events[0].get())) { + EXPECT_EQ(events[0]->inOrderExecSignalValue, 1u); + EXPECT_NE(events[0]->inOrderExecInfo.get(), nullptr); + EXPECT_EQ(events[0]->inOrderAllocationOffset, counterOffset); + } else { + EXPECT_EQ(events[0]->inOrderExecSignalValue, 0u); + EXPECT_EQ(events[0]->inOrderExecInfo.get(), nullptr); + EXPECT_EQ(events[0]->inOrderAllocationOffset, 0u); + } + + auto copyImmCmdList = createCopyOnlyImmCmdList(); + + uint32_t copyData = 0; + void *deviceAlloc = nullptr; + ze_device_mem_alloc_desc_t deviceDesc = {}; + auto result = context->allocDeviceMem(device->toHandle(), &deviceDesc, 128, 128, &deviceAlloc); + ASSERT_EQ(result, ZE_RESULT_SUCCESS); + + copyImmCmdList->appendMemoryCopy(deviceAlloc, ©Data, 1, events[0]->toHandle(), 0, nullptr, false, false); EXPECT_FALSE(events[0]->isCounterBased()); EXPECT_EQ(events[0]->inOrderExecSignalValue, 0u); EXPECT_EQ(events[0]->inOrderExecInfo.get(), nullptr); EXPECT_EQ(events[0]->inOrderAllocationOffset, 0u); + + context->freeMem(deviceAlloc); +} + +HWTEST2_F(InOrderCmdListTests, givenRegularEventWithInOrderExecInfoWhenReusedOnRegularCmdListThenUnsetInOrderData, IsAtLeastSkl) { + auto immCmdList = createImmCmdList(); + + auto eventPool = createEvents(1, false); + events[0]->makeCounterBasedInitiallyDisabled(); + + auto nonWalkerSignallingSupported = immCmdList->isInOrderNonWalkerSignalingRequired(events[0].get()); + + EXPECT_TRUE(immCmdList->isInOrderExecutionEnabled()); + + immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); + + EXPECT_EQ(nonWalkerSignallingSupported, events[0]->inOrderExecInfo.get() != nullptr); + + immCmdList->inOrderExecInfo.reset(); + EXPECT_FALSE(immCmdList->isInOrderExecutionEnabled()); + + immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[0]->toHandle(), 0, nullptr, launchParams, false); + + EXPECT_EQ(nullptr, events[0]->inOrderExecInfo.get()); } HWTEST2_F(InOrderCmdListTests, givenInOrderModeWhenSubmittingThenProgramSemaphoreForPreviousDispatch, IsAtLeastXeHpCore) { @@ -1735,6 +1816,9 @@ HWTEST2_F(InOrderCmdListTests, givenNonInOrderCmdListWhenPassingCounterBasedEven desc.actionFlag = ZEX_WAIT_ON_MEMORY_FLAG_NOT_EQUAL; EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, immCmdList->appendWaitOnMemory(reinterpret_cast(&desc), copyData, 1, eventHandle, false)); + immCmdList->copyThroughLockedPtrEnabled = true; + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, immCmdList->appendMemoryCopy(alloc, ©Data, 1, eventHandle, 0, nullptr, false, false)); + context->freeMem(alloc); }