diff --git a/level_zero/core/source/event/event.cpp b/level_zero/core/source/event/event.cpp index 57b8de5827..0bc1b10098 100644 --- a/level_zero/core/source/event/event.cpp +++ b/level_zero/core/source/event/event.cpp @@ -42,9 +42,7 @@ template Event *Event::create(EventPool *, const ze_event_desc_t *, De ze_result_t EventPool::initialize(DriverHandle *driver, Context *context, uint32_t numDevices, ze_device_handle_t *deviceHandles) { this->context = static_cast(context); - bool ipcPool = eventPoolFlags & ZE_EVENT_POOL_FLAG_IPC; - - if (ipcPool && counterBased) { + if (isIpcPoolFlagSet() && counterBased) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } @@ -114,7 +112,7 @@ ze_result_t EventPool::initialize(DriverHandle *driver, Context *context, uint32 if (graphicsAllocation) { eventPoolAllocations->addAllocation(graphicsAllocation); allocatedMemory = true; - if (ipcPool) { + if (isIpcPoolFlagSet()) { uint64_t handle = 0; this->isShareableEventMemory = (graphicsAllocation->peekInternalHandle(memoryManager, handle) == 0); } @@ -127,7 +125,7 @@ ze_result_t EventPool::initialize(DriverHandle *driver, Context *context, uint32 eventPoolPtr = driver->getMemoryManager()->createMultiGraphicsAllocationInSystemMemoryPool(rootDeviceIndices, allocationProperties, *eventPoolAllocations); - if (ipcPool) { + if (isIpcPoolFlagSet()) { this->isShareableEventMemory = eventPoolAllocations->getDefaultGraphicsAllocation()->isShareableHostMemory; } allocatedMemory = (nullptr != eventPoolPtr); @@ -207,6 +205,8 @@ void EventPool::setupDescriptorFlags(const ze_event_pool_desc_t *desc) { eventPoolFlags |= ZE_EVENT_POOL_FLAG_KERNEL_TIMESTAMP; } + this->isIpcPoolFlag = !!(eventPoolFlags & ZE_EVENT_POOL_FLAG_IPC); + auto pNext = reinterpret_cast(desc->pNext); if (pNext && pNext->stype == ZE_STRUCTURE_TYPE_COUNTER_BASED_EVENT_POOL_EXP_DESC) { diff --git a/level_zero/core/source/event/event.h b/level_zero/core/source/event/event.h index 7a4de48d6f..30bc4825b2 100644 --- a/level_zero/core/source/event/event.h +++ b/level_zero/core/source/event/event.h @@ -365,6 +365,7 @@ struct EventPool : _ze_event_pool_handle_t { } bool isCounterBased() const { return counterBased; } + bool isIpcPoolFlagSet() const { return isIpcPoolFlag; } protected: EventPool() = default; @@ -390,6 +391,7 @@ struct EventPool : _ze_event_pool_handle_t { bool isDeviceEventPoolAllocation = false; bool isHostVisibleEventPoolAllocation = false; bool isImportedIpcPool = false; + bool isIpcPoolFlag = false; bool isShareableEventMemory = false; bool isImplicitScalingCapable = false; bool counterBased = false; diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index e230743796..6a32f3e84e 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -50,6 +50,9 @@ Event *Event::create(EventPool *eventPool, const ze_event_desc_t *desc, Device * event->maxKernelCount = eventPool->getMaxKernelCount(); event->maxPacketCount = eventPool->getEventMaxPackets(); event->isFromIpcPool = eventPool->getImportedIpcPool(); + if (event->isFromIpcPool || eventPool->isIpcPoolFlagSet()) { + event->disableImplicitCounterBasedMode(); + } event->kernelEventCompletionData = std::make_unique[]>(event->maxKernelCount); diff --git a/level_zero/core/test/unit_tests/mocks/mock_event.h b/level_zero/core/test/unit_tests/mocks/mock_event.h index 01f1522411..24233decf7 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_event.h +++ b/level_zero/core/test/unit_tests/mocks/mock_event.h @@ -60,7 +60,9 @@ struct WhiteBox<::L0::EventPool> : public ::L0::EventPool { using BaseClass::isDeviceEventPoolAllocation; using BaseClass::isHostVisibleEventPoolAllocation; using BaseClass::isImportedIpcPool; + using BaseClass::isIpcPoolFlag; using BaseClass::isShareableEventMemory; + using BaseClass::numEvents; }; using EventPool = WhiteBox<::L0::EventPool>; 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 8f131cad22..cf6d99af51 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 @@ -40,6 +40,7 @@ #include "level_zero/core/test/unit_tests/fixtures/multi_tile_fixture.h" #include "level_zero/core/test/unit_tests/mocks/mock_cmdlist.h" #include "level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h" +#include "level_zero/core/test/unit_tests/mocks/mock_event.h" #include "level_zero/core/test/unit_tests/mocks/mock_kernel.h" #include "level_zero/core/test/unit_tests/mocks/mock_module.h" #include "level_zero/core/test/unit_tests/sources/helper/ze_object_utils.h" @@ -106,9 +107,9 @@ HWCMDTEST_F(IGFX_GEN8_CORE, CommandListAppendLaunchKernel, givenEventsWhenAppend ze_event_desc_t eventDesc = {}; eventDesc.index = 0; - auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + 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 event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); ze_group_count_t groupCount{1, 1, 1}; CmdListKernelLaunchParams launchParams = {}; @@ -289,9 +290,9 @@ HWTEST2_F(CommandListAppendLaunchKernel, givenNonemptyAllocPrintfBufferKernelWhe ze_event_desc_t eventDesc = {}; eventDesc.index = 0; - auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); - auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); + auto event = std::unique_ptr(L0::Event::create(eventPool.get(), &eventDesc, device)); ze_group_count_t groupCount{1, 1, 1}; auto result = commandList->appendLaunchKernelIndirect(kernel.toHandle(), groupCount, event->toHandle(), 0, nullptr, false); @@ -316,9 +317,9 @@ HWTEST2_F(CommandListAppendLaunchKernel, givenEmptyAllocPrintfBufferKernelWhenAp ze_event_desc_t eventDesc = {}; eventDesc.index = 0; - auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); - auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); + auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); ze_group_count_t groupCount{1, 1, 1}; auto result = commandList->appendLaunchKernelIndirect(kernel.toHandle(), groupCount, event->toHandle(), 0, nullptr, false); @@ -343,11 +344,11 @@ HWTEST2_F(CommandListAppendLaunchKernel, givenNonemptyAllocPrintfBufferKernelWhe ze_event_desc_t eventDesc = {}; eventDesc.index = 0; - auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); CmdListKernelLaunchParams launchParams = {}; launchParams.isCooperative = false; - auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); + auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); ze_group_count_t groupCount{1, 1, 1}; @@ -375,11 +376,11 @@ HWTEST2_F(CommandListAppendLaunchKernel, givenEmptyAllocPrintfBufferKernelWhenAp ze_event_desc_t eventDesc = {}; eventDesc.index = 0; - auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); + auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); CmdListKernelLaunchParams launchParams = {}; launchParams.isCooperative = false; - auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); + auto event = std::unique_ptr(Event::create(eventPool.get(), &eventDesc, device)); ze_group_count_t groupCount{1, 1, 1}; @@ -670,8 +671,8 @@ HWTEST_F(CommandListAppendLaunchKernel, givenInvalidKernelWhenAppendingThenRetur } struct InOrderCmdListTests : public CommandListAppendLaunchKernel { - struct MockEvent : public EventImp { - using EventImp::counterBasedMode; + struct FixtureMockEvent : public EventImp { + using EventImp::Event::counterBasedMode; using EventImp::maxPacketCount; using EventImp::inOrderExecInfo; using EventImp::inOrderExecSignalValue; @@ -719,7 +720,7 @@ struct InOrderCmdListTests : public CommandListAppendLaunchKernel { for (uint32_t i = 0; i < numEvents; i++) { eventDesc.index = i; - events.emplace_back(DestroyableZeUniquePtr(static_cast(Event::create(eventPool.get(), &eventDesc, device)))); + events.emplace_back(DestroyableZeUniquePtr(static_cast(Event::create(eventPool.get(), &eventDesc, device)))); EXPECT_EQ(Event::CounterBasedMode::ExplicitlyEnabled, events.back()->counterBasedMode); EXPECT_TRUE(events.back()->isCounterBased()); } @@ -815,7 +816,7 @@ struct InOrderCmdListTests : public CommandListAppendLaunchKernel { std::unique_ptr mockCopyOsContext; uint32_t createdCmdLists = 0; - std::vector> events; + std::vector> events; std::vector>> mockCmdQs; ze_result_t returnValue = ZE_RESULT_SUCCESS; ze_group_count_t groupCount = {3, 2, 1}; @@ -913,7 +914,7 @@ HWTEST2_F(InOrderCmdListTests, givenNotSignaledInOrderEventWhenAddedToWaitListTh eventDesc.signal = ZE_EVENT_SCOPE_FLAG_HOST; eventDesc.index = 0; - auto event = std::unique_ptr(static_cast(Event::create(eventPool.get(), &eventDesc, device))); + auto event = std::unique_ptr(static_cast(Event::create(eventPool.get(), &eventDesc, device))); EXPECT_TRUE(event->isCounterBased()); auto handle = event->toHandle(); @@ -937,6 +938,27 @@ HWTEST2_F(InOrderCmdListTests, givenIpcAndCounterBasedEventPoolFlagsWhenCreating EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, returnValue); } +HWTEST2_F(InOrderCmdListTests, givenIpcPoolEventWhenTryingToImplicitlyConverToCounterBasedEventThenDisallow, IsAtLeastSkl) { + ze_event_pool_desc_t eventPoolDesc = {}; + eventPoolDesc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE; + eventPoolDesc.count = 1; + + auto eventPoolForExport = std::unique_ptr>(static_cast *>(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue))); + auto eventPoolImported = std::unique_ptr>(static_cast *>(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue))); + + eventPoolForExport->isIpcPoolFlag = true; + eventPoolImported->isImportedIpcPool = true; + + ze_event_desc_t eventDesc = {}; + eventDesc.signal = ZE_EVENT_SCOPE_FLAG_HOST; + + DestroyableZeUniquePtr event0(static_cast(Event::create(eventPoolForExport.get(), &eventDesc, device))); + EXPECT_EQ(Event::CounterBasedMode::ImplicitlyDisabled, event0->counterBasedMode); + + DestroyableZeUniquePtr event1(static_cast(Event::create(eventPoolImported.get(), &eventDesc, device))); + EXPECT_EQ(Event::CounterBasedMode::ImplicitlyDisabled, event1->counterBasedMode); +} + HWTEST2_F(InOrderCmdListTests, givenNotSignaledInOrderWhenWhenCallingQueryStatusThenReturnNotReady, IsAtLeastSkl) { auto eventPool = createEvents(1, false); events[0]->enableCounterBasedMode(true);