From a7d1952cef0e5ba4134ab431b6bce53cbb28abb7 Mon Sep 17 00:00:00 2001 From: Aravind Gopalakrishnan Date: Tue, 1 Sep 2020 22:15:47 -0700 Subject: [PATCH] Allow reset for event of timestamp type Change-Id: Ibca2029344a918d9f51b61fe7aac706b1e4abbe0 Signed-off-by: Aravind Gopalakrishnan --- level_zero/core/source/cmdlist/cmdlist_hw.inl | 11 ++- .../test_cmdlist_append_event_reset.cpp | 81 +++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 8dc7a77728..e8fc3cd5bb 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -168,15 +168,22 @@ template ze_result_t CommandListCoreFamily::appendEventReset(ze_event_handle_t hEvent) { using POST_SYNC_OPERATION = typename GfxFamily::PIPE_CONTROL::POST_SYNC_OPERATION; auto event = Event::fromHandle(hEvent); + + uint64_t baseAddr = event->getGpuAddress(); + size_t eventOffset = 0; + if (event->isTimestampEvent) { + eventOffset = offsetof(KernelTimestampEvent, contextEnd); + } commandContainer.addToResidencyContainer(&event->getAllocation()); if (isCopyOnly()) { NEO::EncodeMiFlushDW::programMiFlushDw(*commandContainer.getCommandStream(), event->getGpuAddress(), Event::STATE_CLEARED, false, true); } else { - NEO::PipeControlArgs args(true); + NEO::PipeControlArgs args; + args.dcFlushEnable = (!event->signalScope) ? false : true; NEO::MemorySynchronizationCommands::addPipeControlAndProgramPostSyncOperation( *commandContainer.getCommandStream(), POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA, - event->getGpuAddress(), + ptrOffset(baseAddr, eventOffset), Event::STATE_CLEARED, commandContainer.getDevice()->getHardwareInfo(), args); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_event_reset.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_event_reset.cpp index 3bdf94b70b..cda80239d8 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_event_reset.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_event_reset.cpp @@ -117,5 +117,86 @@ HWTEST2_F(CommandListAppendEventReset, givenImmediateCmdlistWhenAppendingEventRe ASSERT_EQ(ZE_RESULT_SUCCESS, result); commandList->cmdQImmediate = nullptr; } + +HWTEST2_F(CommandListAppendEventReset, givenTimestampEventUsedInResetThenPipeControlAppendedCorrectly, SklPlusMatcher) { + using GfxFamily = typename NEO::GfxFamilyMapper::GfxFamily; + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using POST_SYNC_OPERATION = typename PIPE_CONTROL::POST_SYNC_OPERATION; + auto &commandContainer = commandList->commandContainer; + + 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; + auto eventPool = std::unique_ptr(L0::EventPool::create(driverHandle.get(), 0, nullptr, &eventPoolDesc)); + auto event = std::unique_ptr(L0::Event::create(eventPool.get(), &eventDesc, device)); + + commandList->appendEventReset(event->toHandle()); + auto contextOffset = offsetof(KernelTimestampEvent, contextEnd); + auto baseAddr = event->getGpuAddress(); + auto gpuAddress = ptrOffset(baseAddr, contextOffset); + + GenCmdList cmdList; + ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer( + cmdList, ptrOffset(commandContainer.getCommandStream()->getCpuBase(), 0), commandContainer.getCommandStream()->getUsed())); + + auto itorPC = findAll(cmdList.begin(), cmdList.end()); + ASSERT_NE(0u, itorPC.size()); + bool postSyncFound = false; + for (auto it : itorPC) { + auto cmd = genCmdCast(*it); + if (cmd->getPostSyncOperation() == POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA) { + EXPECT_EQ(cmd->getImmediateData(), Event::STATE_CLEARED); + EXPECT_TRUE(cmd->getCommandStreamerStallEnable()); + EXPECT_EQ(cmd->getAddressHigh(), gpuAddress >> 32u); + EXPECT_EQ(cmd->getAddress(), uint32_t(gpuAddress)); + EXPECT_FALSE(cmd->getDcFlushEnable()); + postSyncFound = true; + } + } + ASSERT_TRUE(postSyncFound); +} + +HWTEST2_F(CommandListAppendEventReset, givenEventWithHostScopeUsedInResetThenPipeControlWithDcFlushAppended, SklPlusMatcher) { + using GfxFamily = typename NEO::GfxFamilyMapper::GfxFamily; + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using POST_SYNC_OPERATION = typename PIPE_CONTROL::POST_SYNC_OPERATION; + auto &commandContainer = commandList->commandContainer; + + ze_event_pool_desc_t eventPoolDesc = {}; + eventPoolDesc.count = 1; + + ze_event_desc_t eventDesc = {}; + eventDesc.index = 0; + eventDesc.signal = ZE_EVENT_SCOPE_FLAG_HOST; + + auto eventPool = std::unique_ptr(L0::EventPool::create(driverHandle.get(), 0, nullptr, &eventPoolDesc)); + auto event = std::unique_ptr(L0::Event::create(eventPool.get(), &eventDesc, device)); + + commandList->appendEventReset(event->toHandle()); + auto gpuAddress = event->getGpuAddress(); + + GenCmdList cmdList; + ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer( + cmdList, ptrOffset(commandContainer.getCommandStream()->getCpuBase(), 0), commandContainer.getCommandStream()->getUsed())); + + auto itorPC = findAll(cmdList.begin(), cmdList.end()); + ASSERT_NE(0u, itorPC.size()); + bool postSyncFound = false; + for (auto it : itorPC) { + auto cmd = genCmdCast(*it); + if (cmd->getPostSyncOperation() == POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA) { + EXPECT_EQ(cmd->getImmediateData(), Event::STATE_CLEARED); + EXPECT_TRUE(cmd->getCommandStreamerStallEnable()); + EXPECT_EQ(cmd->getAddressHigh(), gpuAddress >> 32u); + EXPECT_EQ(cmd->getAddress(), uint32_t(gpuAddress)); + EXPECT_TRUE(cmd->getDcFlushEnable()); + postSyncFound = true; + } + } + ASSERT_TRUE(postSyncFound); +} } // namespace ult } // namespace L0 \ No newline at end of file