mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-30 09:58:55 +08:00
feature: add hostFunctions data layout
Related-To: NEO-14577 Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
c2a9efa8c0
commit
d20c9264e5
75
shared/test/unit_test/command_stream/host_function_tests.cpp
Normal file
75
shared/test/unit_test/command_stream/host_function_tests.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (C) 2025 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include "shared/source/command_stream/host_function.h"
|
||||
#include "shared/test/common/cmd_parse/hw_parse.h"
|
||||
#include "shared/test/common/fixtures/device_fixture.h"
|
||||
#include "shared/test/common/test_macros/hw_test.h"
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
using namespace NEO;
|
||||
|
||||
using HostFunctionTests = Test<DeviceFixture>;
|
||||
|
||||
HWTEST_F(HostFunctionTests, givenHostFunctionDataStoredWhenProgramHostFunctionIsCalledThenMiStoresAndSemaphoreWaitAreProgrammedCorrectlyInCorrectOrder) {
|
||||
using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM;
|
||||
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
|
||||
constexpr auto size = 1024u;
|
||||
std::byte buff[size] = {};
|
||||
LinearStream stream(buff, size);
|
||||
|
||||
uint64_t userHostFunctionStored = 10u;
|
||||
uint64_t userDataStored = 20u;
|
||||
uint32_t tagStored = 0;
|
||||
|
||||
HostFunctionData hostFunctionData{
|
||||
.entry = &userHostFunctionStored,
|
||||
.userData = &userDataStored,
|
||||
.internalTag = &tagStored};
|
||||
|
||||
uint64_t userCallback = 0xAAAA'0000ull;
|
||||
uint64_t userCallbackData = 0xBBBB'000ull;
|
||||
|
||||
HostFunctionHelper::programHostFunction<FamilyType>(stream, hostFunctionData, userCallback, userCallbackData);
|
||||
|
||||
HardwareParse hwParser;
|
||||
hwParser.parseCommands<FamilyType>(stream, 0);
|
||||
|
||||
auto miStores = findAll<MI_STORE_DATA_IMM *>(hwParser.cmdList.begin(), hwParser.cmdList.end());
|
||||
EXPECT_EQ(3u, miStores.size());
|
||||
|
||||
auto miWait = findAll<MI_SEMAPHORE_WAIT *>(hwParser.cmdList.begin(), hwParser.cmdList.end());
|
||||
EXPECT_EQ(1u, miWait.size());
|
||||
|
||||
// program callback address
|
||||
auto miStoreUserHostFunction = genCmdCast<MI_STORE_DATA_IMM *>(*miStores[0]);
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&userHostFunctionStored), miStoreUserHostFunction->getAddress());
|
||||
EXPECT_EQ(getLowPart(userCallback), miStoreUserHostFunction->getDataDword0());
|
||||
EXPECT_EQ(getHighPart(userCallback), miStoreUserHostFunction->getDataDword1());
|
||||
EXPECT_TRUE(miStoreUserHostFunction->getStoreQword());
|
||||
|
||||
// program callback data
|
||||
auto miStoreUserData = genCmdCast<MI_STORE_DATA_IMM *>(*miStores[1]);
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&userDataStored), miStoreUserData->getAddress());
|
||||
EXPECT_EQ(getLowPart(userCallbackData), miStoreUserData->getDataDword0());
|
||||
EXPECT_EQ(getHighPart(userCallbackData), miStoreUserData->getDataDword1());
|
||||
EXPECT_TRUE(miStoreUserData->getStoreQword());
|
||||
|
||||
// signal pending job
|
||||
auto miStoreSignalTag = genCmdCast<MI_STORE_DATA_IMM *>(*miStores[2]);
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&tagStored), miStoreSignalTag->getAddress());
|
||||
EXPECT_EQ(static_cast<uint32_t>(HostFunctionTagStatus::pending), miStoreSignalTag->getDataDword0());
|
||||
EXPECT_FALSE(miStoreSignalTag->getStoreQword());
|
||||
|
||||
// wait for completion
|
||||
auto miWaitTag = genCmdCast<MI_SEMAPHORE_WAIT *>(*miWait[0]);
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&tagStored), miWaitTag->getSemaphoreGraphicsAddress());
|
||||
EXPECT_EQ(static_cast<uint32_t>(HostFunctionTagStatus::completed), miWaitTag->getSemaphoreDataDword());
|
||||
EXPECT_EQ(MI_SEMAPHORE_WAIT::COMPARE_OPERATION_SAD_EQUAL_SDD, miWaitTag->getCompareOperation());
|
||||
EXPECT_EQ(MI_SEMAPHORE_WAIT::WAIT_MODE_POLLING_MODE, miWaitTag->getWaitMode());
|
||||
}
|
||||
Reference in New Issue
Block a user