From d8f8b70dd728ca5424d89d89b17193eaae4f963a Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Fri, 12 Jan 2024 10:26:36 +0000 Subject: [PATCH] feature: initial support of zexCounterBasedEventCreate Related-To: NEO-8145 Signed-off-by: Dunajski, Bartosz --- .../driver_experimental/public/zex_event.cpp | 25 ++++++++++++++++++- level_zero/core/source/event/event_impl.inl | 4 ++- .../sources/cmdlist/test_in_order_cmdlist.cpp | 21 ++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/level_zero/api/driver_experimental/public/zex_event.cpp b/level_zero/api/driver_experimental/public/zex_event.cpp index 16df239201..00394ce68a 100644 --- a/level_zero/api/driver_experimental/public/zex_event.cpp +++ b/level_zero/api/driver_experimental/public/zex_event.cpp @@ -9,6 +9,7 @@ #include "shared/source/memory_manager/graphics_allocation.h" +#include "level_zero/core/source/device/device.h" #include "level_zero/core/source/event/event.h" namespace L0 { @@ -36,7 +37,29 @@ zexEventGetDeviceAddress(ze_event_handle_t event, uint64_t *completionValue, uin ZE_APIEXPORT ze_result_t ZE_APICALL zexCounterBasedEventCreate(ze_context_handle_t hContext, ze_device_handle_t hDevice, uint64_t *deviceAddress, uint64_t *hostAddress, uint64_t completionValue, const ze_event_desc_t *desc, ze_event_handle_t *phEvent) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + constexpr uint32_t counterBasedFlags = (ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE | ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_NON_IMMEDIATE); + + constexpr EventDescriptor eventDescriptor = { + nullptr, // eventPoolAllocation + 0, // totalEventSize + EventPacketsCount::maxKernelSplit, // maxKernelCount + 0, // maxPacketsCount + counterBasedFlags, // counterBasedFlags + false, // timestampPool + false, // kerneMappedTsPoolFlag + false, // importedIpcPool + false, // ipcPool + }; + + auto device = Device::fromHandle(hDevice); + + if (!hDevice || !deviceAddress || !hostAddress || !desc || !phEvent) { + return ZE_RESULT_ERROR_INVALID_ARGUMENT; + } + + *phEvent = Event::create(eventDescriptor, desc, device); + + return ZE_RESULT_SUCCESS; } } // namespace L0 diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index 17552a0053..bce07e47a0 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -422,7 +422,9 @@ void EventImp::copyDataToEventAlloc(void *dstHostAddr, uint64_t dstGpu template ze_result_t EventImp::hostEventSetValue(TagSizeT eventVal) { - UNRECOVERABLE_IF(hostAddress == nullptr); + if (!hostAddress) { + return ZE_RESULT_ERROR_INVALID_NULL_POINTER; + } if (isEventTimestampFlagSet()) { return hostEventSetValueTimestamps(eventVal); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp index 2299d67522..bfb1221f5c 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp @@ -3527,6 +3527,27 @@ HWTEST2_F(InOrderCmdListTests, givenIncorrectInputParamsWhenAskingForEventAddres EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexEventGetDeviceAddress(eventHandle, &counterValue, &address)); } +HWTEST2_F(InOrderCmdListTests, givenCorrectInputParamsWhenCreatingCbEventThenReturnSuccess, IsAtLeastSkl) { + uint64_t counterValue = 0; + uint64_t *hostAddress = &counterValue; + uint64_t *gpuAddress = &counterValue; + + ze_event_desc_t eventDesc = {}; + ze_event_handle_t handle = nullptr; + + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate(context, device, gpuAddress, hostAddress, counterValue, &eventDesc, nullptr)); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate(context, device, gpuAddress, hostAddress, counterValue, nullptr, &handle)); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate(context, device, gpuAddress, nullptr, counterValue, &eventDesc, &handle)); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate(context, device, nullptr, hostAddress, counterValue, &eventDesc, &handle)); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate(context, nullptr, gpuAddress, hostAddress, counterValue, &eventDesc, &handle)); + + EXPECT_EQ(ZE_RESULT_SUCCESS, zexCounterBasedEventCreate(context, device, gpuAddress, hostAddress, counterValue, &eventDesc, &handle)); + + ASSERT_NE(nullptr, Event::fromHandle(handle)); + + zeEventDestroy(handle); +} + HWTEST2_F(InOrderCmdListTests, givenCounterBasedEventWhenAskingForEventAddressAndValueThenReturnCorrectValues, IsAtLeastSkl) { auto eventPool = createEvents(1, false); uint64_t counterValue = -1;