diff --git a/level_zero/api/driver_experimental/public/zex_event.cpp b/level_zero/api/driver_experimental/public/zex_event.cpp index 3cca057474..d2b6d092d0 100644 --- a/level_zero/api/driver_experimental/public/zex_event.cpp +++ b/level_zero/api/driver_experimental/public/zex_event.cpp @@ -22,12 +22,22 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zexEventGetDeviceAddress(ze_event_handle_t event, uint64_t *completionValue, uint64_t *address) { auto eventObj = Event::fromHandle(event); - if (!eventObj || !eventObj->isCounterBased() || !eventObj->getInOrderExecInfo() || !completionValue || !address) { + if (!eventObj || !completionValue || !address) { return ZE_RESULT_ERROR_INVALID_ARGUMENT; } - *completionValue = eventObj->getInOrderExecSignalValueWithSubmissionCounter(); - *address = eventObj->getInOrderExecInfo()->getBaseDeviceAddress() + eventObj->getInOrderAllocationOffset(); + if (eventObj->isCounterBased()) { + if (!eventObj->getInOrderExecInfo()) { + return ZE_RESULT_ERROR_INVALID_ARGUMENT; + } + *completionValue = eventObj->getInOrderExecSignalValueWithSubmissionCounter(); + *address = eventObj->getInOrderExecInfo()->getBaseDeviceAddress() + eventObj->getInOrderAllocationOffset(); + } else if (eventObj->isEventTimestampFlagSet()) { + return ZE_RESULT_ERROR_INVALID_ARGUMENT; + } else { + *completionValue = Event::State::STATE_SIGNALED; + *address = eventObj->getCompletionFieldGpuAddress(eventObj->peekEventPool()->getDevice()); + } return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/source/event/event.h b/level_zero/core/source/event/event.h index be193c1dab..028efd2937 100644 --- a/level_zero/core/source/event/event.h +++ b/level_zero/core/source/event/event.h @@ -121,6 +121,7 @@ struct Event : _ze_event_handle_t { MOCKABLE_VIRTUAL NEO::GraphicsAllocation *getPoolAllocation(Device *device) const; void setEventPool(EventPool *eventPool) { this->eventPool = eventPool; } + EventPool *peekEventPool() { return this->eventPool; } MOCKABLE_VIRTUAL uint64_t getGpuAddress(Device *device) const; virtual uint32_t getPacketsInUse() const = 0; 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 f745e48e61..9e023df6bc 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 @@ -3961,7 +3961,7 @@ HWTEST2_F(InOrderCmdListTests, givenProfilingEventWhenDoingCpuCopyThenSetProfili context->freeMem(deviceAlloc); } -HWTEST2_F(InOrderCmdListTests, givenIncorrectInputParamsWhenAskingForEventAddressAndValueThenReturnError, IsAtLeastSkl) { +HWTEST2_F(InOrderCmdListTests, givenEventCreatedFromPoolWhenItIsQueriedForAddressItReturnsProperAddressFromPool, IsAtLeastSkl) { auto eventPool = createEvents(1, false); uint64_t counterValue = 0; uint64_t address = 0; @@ -3973,6 +3973,17 @@ HWTEST2_F(InOrderCmdListTests, givenIncorrectInputParamsWhenAskingForEventAddres EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexEventGetDeviceAddress(nullptr, &counterValue, &address)); events[0]->makeCounterBasedImplicitlyDisabled(); + EXPECT_EQ(ZE_RESULT_SUCCESS, zexEventGetDeviceAddress(eventHandle, &counterValue, &address)); + EXPECT_EQ(Event::State::STATE_SIGNALED, counterValue); + EXPECT_EQ(address, events[0]->getCompletionFieldGpuAddress(events[0]->peekEventPool()->getDevice())); +} +HWTEST2_F(InOrderCmdListTests, givenEventCreatedFromPoolWithTimestampsWhenQueriedForAddressErrorIsReturned, IsAtLeastSkl) { + auto eventPool = createEvents(1, true); + uint64_t counterValue = 0; + uint64_t address = 0; + + auto eventHandle = events[0]->toHandle(); + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, zexEventGetDeviceAddress(eventHandle, &counterValue, &address)); }