diff --git a/level_zero/api/driver_experimental/public/zex_event.cpp b/level_zero/api/driver_experimental/public/zex_event.cpp index 2c106cfcaf..0706394424 100644 --- a/level_zero/api/driver_experimental/public/zex_event.cpp +++ b/level_zero/api/driver_experimental/public/zex_event.cpp @@ -43,8 +43,8 @@ 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) { - constexpr uint32_t counterBasedFlags = (ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE | ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_NON_IMMEDIATE); +zexCounterBasedEventCreate2(ze_context_handle_t hContext, ze_device_handle_t hDevice, const zex_counter_based_event_desc_t *desc, ze_event_handle_t *phEvent) { + constexpr uint32_t counterBasedFlags = (ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE); auto device = Device::fromHandle(toInternalType(hDevice)); @@ -53,35 +53,52 @@ zexCounterBasedEventCreate(ze_context_handle_t hContext, ze_device_handle_t hDev } EventDescriptor eventDescriptor = { - nullptr, // eventPoolAllocation - desc->pNext, // extensions - 0, // totalEventSize - EventPacketsCount::maxKernelSplit, // maxKernelCount - 0, // maxPacketsCount - counterBasedFlags, // counterBasedFlags - 0, // index - 0, // signalScope - 0, // waitScope - false, // timestampPool - false, // kerneMappedTsPoolFlag - false, // importedIpcPool - false, // ipcPool + nullptr, // eventPoolAllocation + desc->pNext, // extensions + 0, // totalEventSize + EventPacketsCount::maxKernelSplit, // maxKernelCount + 0, // maxPacketsCount + desc->flags & counterBasedFlags, // counterBasedFlags + 0, // index + desc->signalScope, // signalScope + desc->waitScope, // waitScope + !!(desc->flags & ZEX_COUNTER_BASED_EVENT_FLAG_KERNEL_TIMESTAMP), // timestampPool + !!(desc->flags & ZEX_COUNTER_BASED_EVENT_FLAG_KERNEL_MAPPED_TIMESTAMP), // kerneMappedTsPoolFlag + false, // importedIpcPool + !!(desc->flags & ZEX_COUNTER_BASED_EVENT_FLAG_IPC), // ipcPool }; + ze_result_t result = ZE_RESULT_SUCCESS; + *phEvent = Event::create(eventDescriptor, device, result); + + return result; +} + +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) { + constexpr uint32_t counterBasedFlags = ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE; + + if (!desc) { + return ZE_RESULT_ERROR_INVALID_ARGUMENT; + } + zex_counter_based_event_external_sync_alloc_properties_t externalSyncAllocProperties = {ZEX_STRUCTURE_COUTER_BASED_EVENT_EXTERNAL_SYNC_ALLOC_PROPERTIES}; // NOLINT(clang-analyzer-optin.core.EnumCastOutOfRange), NEO-12901 externalSyncAllocProperties.completionValue = completionValue; externalSyncAllocProperties.deviceAddress = deviceAddress; externalSyncAllocProperties.hostAddress = hostAddress; - if (externalSyncAllocProperties.deviceAddress && externalSyncAllocProperties.hostAddress) { + zex_counter_based_event_desc_t counterBasedDesc = {ZEX_STRUCTURE_COUTER_BASED_EVENT_DESC}; // NOLINT(clang-analyzer-optin.core.EnumCastOutOfRange), NEO-12901 + counterBasedDesc.flags = counterBasedFlags; + counterBasedDesc.signalScope = desc->signal; + counterBasedDesc.waitScope = desc->wait; + counterBasedDesc.pNext = desc->pNext; + + if (deviceAddress && hostAddress) { externalSyncAllocProperties.pNext = desc->pNext; - eventDescriptor.extensions = &externalSyncAllocProperties; + counterBasedDesc.pNext = &externalSyncAllocProperties; } - ze_result_t result = ZE_RESULT_SUCCESS; - *phEvent = Event::create(eventDescriptor, device, result); - - return result; + return zexCounterBasedEventCreate2(hContext, hDevice, &counterBasedDesc, phEvent); } ZE_APIEXPORT ze_result_t ZE_APICALL zexIntelAllocateNetworkInterrupt(ze_context_handle_t hContext, uint32_t &networkInterruptId) { diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp index b5484dc003..0fb832800d 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp @@ -4625,6 +4625,74 @@ HWTEST2_F(InOrderCmdListTests, givenCorrectInputParamsWhenCreatingCbEventThenRet context->freeMem(hostAddress); } +HWTEST2_F(InOrderCmdListTests, givenCorrectInputParamsWhenCreatingCbEvent2ThenReturnSuccess, MatchAny) { + uint64_t counterValue = 2; + + auto hostAddress = reinterpret_cast(allocHostMem(sizeof(uint64_t))); + + *hostAddress = counterValue; + uint64_t *gpuAddress = ptrOffset(&counterValue, 64); + + zex_counter_based_event_external_sync_alloc_properties_t externalSyncAllocProperties = {ZEX_STRUCTURE_COUTER_BASED_EVENT_EXTERNAL_SYNC_ALLOC_PROPERTIES}; // NOLINT(clang-analyzer-optin.core.EnumCastOutOfRange), NEO-12901 + externalSyncAllocProperties.completionValue = counterValue; + externalSyncAllocProperties.deviceAddress = gpuAddress; + externalSyncAllocProperties.hostAddress = hostAddress; + + zex_counter_based_event_desc_t counterBasedDesc = {ZEX_STRUCTURE_COUTER_BASED_EVENT_DESC}; // NOLINT(clang-analyzer-optin.core.EnumCastOutOfRange), NEO-12901 + counterBasedDesc.flags = ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE; + counterBasedDesc.pNext = &externalSyncAllocProperties; + ze_event_handle_t handle = nullptr; + + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, nullptr)); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, device, nullptr, &handle)); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, nullptr, &counterBasedDesc, &handle)); + externalSyncAllocProperties.hostAddress = &counterValue; + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, &handle)); + + externalSyncAllocProperties.hostAddress = nullptr; + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, &handle)); + + externalSyncAllocProperties.hostAddress = hostAddress; + externalSyncAllocProperties.deviceAddress = nullptr; + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, &handle)); + + externalSyncAllocProperties.hostAddress = nullptr; + externalSyncAllocProperties.deviceAddress = nullptr; + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, &handle)); + + counterBasedDesc.pNext = nullptr; + EXPECT_EQ(ZE_RESULT_SUCCESS, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, &handle)); + auto eventObj = Event::fromHandle(handle); + EXPECT_EQ(nullptr, eventObj->getInOrderExecInfo()); + zeEventDestroy(handle); + + counterBasedDesc.pNext = &externalSyncAllocProperties; + externalSyncAllocProperties.hostAddress = hostAddress; + externalSyncAllocProperties.deviceAddress = gpuAddress; + + EXPECT_EQ(ZE_RESULT_SUCCESS, zexCounterBasedEventCreate2(context, device, &counterBasedDesc, &handle)); + + eventObj = Event::fromHandle(handle); + + ASSERT_NE(nullptr, eventObj); + ASSERT_NE(nullptr, eventObj->getInOrderExecInfo().get()); + + EXPECT_EQ(counterValue, eventObj->getInOrderExecInfo()->getCounterValue()); + EXPECT_EQ(hostAddress, eventObj->getInOrderExecInfo()->getBaseHostAddress()); + EXPECT_EQ(castToUint64(gpuAddress), eventObj->getInOrderExecInfo()->getBaseDeviceAddress()); + + uint64_t addresss = 0; + uint64_t value = 0; + zexEventGetDeviceAddress(handle, &value, &addresss); + + EXPECT_EQ(addresss, eventObj->getInOrderExecInfo()->getBaseDeviceAddress()); + EXPECT_EQ(value, counterValue); + + zeEventDestroy(handle); + + context->freeMem(hostAddress); +} + HWTEST2_F(InOrderCmdListTests, givenStandaloneEventWhenCallingSynchronizeThenReturnCorrectValue, MatchAny) { uint64_t counterValue = 2; auto hostAddress = reinterpret_cast(allocHostMem(sizeof(uint64_t)));