Skip to content

Commit b697d75

Browse files
Correct dimension order in local ids generated for implicit args
when local ids are generated by HW, use same dim order for runtime generation move common logic to separated file Related-To: NEO-5081 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent ca5a816 commit b697d75

File tree

15 files changed

+282
-35
lines changed

15 files changed

+282
-35
lines changed

level_zero/core/source/kernel/kernel_imp.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,19 +1028,17 @@ void KernelImp::patchImplicitArgs(void *&pOut) const {
10281028
if (!pImplicitArgs) {
10291029
return;
10301030
}
1031-
const NEO::KernelDescriptor &kernelDescriptor = kernelImmData->getDescriptor();
1031+
const auto &kernelAttributes = kernelImmData->getDescriptor().kernelAttributes;
10321032
auto grfSize = this->module->getDevice()->getHwInfo().capabilityTable.grfSize;
1033+
auto dimensionOrder = NEO::ImplicitArgsHelper::getDimensionOrderForLocalIds(kernelAttributes.workgroupDimensionsOrder, kernelRequiresGenerationOfLocalIdsByRuntime, requiredWorkgroupOrder);
1034+
10331035
NEO::generateLocalIDs(
10341036
pOut,
1035-
static_cast<uint16_t>(kernelDescriptor.kernelAttributes.simdSize),
1037+
static_cast<uint16_t>(kernelAttributes.simdSize),
10361038
std::array<uint16_t, 3>{{static_cast<uint16_t>(groupSize[0]),
10371039
static_cast<uint16_t>(groupSize[1]),
10381040
static_cast<uint16_t>(groupSize[2])}},
1039-
std::array<uint8_t, 3>{{
1040-
kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[0],
1041-
kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[1],
1042-
kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[2],
1043-
}},
1041+
dimensionOrder,
10441042
false, grfSize);
10451043
auto sizeForLocalIdsProgramming = getSizeForImplicitArgsPatching() - sizeof(NEO::ImplicitArgs);
10461044
pOut = ptrOffset(pOut, sizeForLocalIdsProgramming);

level_zero/core/test/unit_tests/fixtures/module_fixture.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ struct ModuleImmutableDataFixture : public DeviceFixture {
122122
using KernelImp::crossThreadDataSize;
123123
using KernelImp::kernelArgHandlers;
124124
using KernelImp::kernelHasIndirectAccess;
125+
using KernelImp::kernelRequiresGenerationOfLocalIdsByRuntime;
125126
using KernelImp::privateMemoryGraphicsAllocation;
127+
using KernelImp::requiredWorkgroupOrder;
126128

127129
MockKernel(MockModule *mockModule) : WhiteBox<L0::KernelImp>(mockModule) {
128130
}

level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_2.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,85 @@ HWTEST_F(CmdlistAppendLaunchKernelTests, givenKernelWithImplicitArgsWhenAppendLa
998998

999999
alignedFree(expectedLocalIds);
10001000
}
1001+
HWTEST_F(CmdlistAppendLaunchKernelTests, givenKernelWithImplicitArgsAndHwGeneratedLocalIdsWhenAppendLaunchKernelThenImplicitArgsLocalIdsRespectWalkOrder) {
1002+
std::unique_ptr<MockImmutableData> mockKernelImmData = std::make_unique<MockImmutableData>(0u);
1003+
auto kernelDescriptor = mockKernelImmData->kernelDescriptor;
1004+
kernelDescriptor->kernelAttributes.flags.requiresImplicitArgs = true;
1005+
auto simd = kernelDescriptor->kernelAttributes.simdSize;
1006+
kernelDescriptor->kernelAttributes.workgroupDimensionsOrder[0] = 2;
1007+
kernelDescriptor->kernelAttributes.workgroupDimensionsOrder[1] = 1;
1008+
kernelDescriptor->kernelAttributes.workgroupDimensionsOrder[2] = 0;
1009+
createModuleFromBinary(0u, false, mockKernelImmData.get());
1010+
1011+
auto kernel = std::make_unique<MockKernel>(module.get());
1012+
1013+
ze_kernel_desc_t kernelDesc{ZE_STRUCTURE_TYPE_KERNEL_DESC};
1014+
kernel->initialize(&kernelDesc);
1015+
kernel->kernelRequiresGenerationOfLocalIdsByRuntime = false;
1016+
kernel->requiredWorkgroupOrder = 2; // walk order 1 0 2
1017+
1018+
EXPECT_TRUE(kernel->getKernelDescriptor().kernelAttributes.flags.requiresImplicitArgs);
1019+
ASSERT_NE(nullptr, kernel->getImplicitArgs());
1020+
1021+
kernel->setGroupSize(4, 5, 6);
1022+
kernel->setGroupCount(3, 2, 1);
1023+
kernel->setGlobalOffsetExp(1, 2, 3);
1024+
kernel->patchGlobalOffset();
1025+
1026+
ze_result_t result{};
1027+
std::unique_ptr<L0::CommandList> commandList(CommandList::create(productFamily, device, NEO::EngineGroupType::RenderCompute, 0u, result));
1028+
1029+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
1030+
1031+
auto indirectHeap = commandList->commandContainer.getIndirectHeap(NEO::HeapType::INDIRECT_OBJECT);
1032+
memset(indirectHeap->getSpace(0), 0, kernel->getSizeForImplicitArgsPatching());
1033+
1034+
ze_group_count_t groupCount{3, 2, 1};
1035+
result = commandList->appendLaunchKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr);
1036+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
1037+
1038+
auto sizeCrossThreadData = kernel->getCrossThreadDataSize();
1039+
auto sizePerThreadDataForWholeGroup = kernel->getPerThreadDataSizeForWholeThreadGroup();
1040+
EXPECT_EQ(indirectHeap->getUsed(), sizeCrossThreadData + sizePerThreadDataForWholeGroup + kernel->getSizeForImplicitArgsPatching());
1041+
1042+
ImplicitArgs expectedImplicitArgs{sizeof(ImplicitArgs)};
1043+
expectedImplicitArgs.numWorkDim = 3;
1044+
expectedImplicitArgs.simdWidth = simd;
1045+
expectedImplicitArgs.localSizeX = 4;
1046+
expectedImplicitArgs.localSizeY = 5;
1047+
expectedImplicitArgs.localSizeZ = 6;
1048+
expectedImplicitArgs.globalSizeX = 12;
1049+
expectedImplicitArgs.globalSizeY = 10;
1050+
expectedImplicitArgs.globalSizeZ = 6;
1051+
expectedImplicitArgs.globalOffsetX = 1;
1052+
expectedImplicitArgs.globalOffsetY = 2;
1053+
expectedImplicitArgs.globalOffsetZ = 3;
1054+
expectedImplicitArgs.groupCountX = 3;
1055+
expectedImplicitArgs.groupCountY = 2;
1056+
expectedImplicitArgs.groupCountZ = 1;
1057+
expectedImplicitArgs.localIdTablePtr = indirectHeap->getGraphicsAllocation()->getGpuAddress();
1058+
expectedImplicitArgs.printfBufferPtr = kernel->getPrintfBufferAllocation()->getGpuAddress();
1059+
1060+
auto sizeForImplicitArgPatching = kernel->getSizeForImplicitArgsPatching();
1061+
1062+
EXPECT_LT(0u, sizeForImplicitArgPatching);
1063+
1064+
auto localIdsProgrammingSize = sizeForImplicitArgPatching - sizeof(ImplicitArgs);
1065+
1066+
auto expectedLocalIds = alignedMalloc(localIdsProgrammingSize, 64);
1067+
memset(expectedLocalIds, 0, localIdsProgrammingSize);
1068+
constexpr uint32_t grfSize = sizeof(typename FamilyType::GRF);
1069+
NEO::generateLocalIDs(expectedLocalIds, simd,
1070+
std::array<uint16_t, 3>{{4, 5, 6}},
1071+
std::array<uint8_t, 3>{{1, 0, 2}},
1072+
false, grfSize);
1073+
1074+
EXPECT_EQ(0, memcmp(expectedLocalIds, indirectHeap->getCpuBase(), localIdsProgrammingSize));
1075+
auto pImplicitArgs = reinterpret_cast<ImplicitArgs *>(ptrOffset(indirectHeap->getCpuBase(), localIdsProgrammingSize));
1076+
EXPECT_EQ(0, memcmp(&expectedImplicitArgs, pImplicitArgs, sizeof(ImplicitArgs)));
1077+
1078+
alignedFree(expectedLocalIds);
1079+
}
10011080
HWTEST_F(CmdlistAppendLaunchKernelTests, givenKernelWithoutImplicitArgsWhenAppendLaunchKernelThenImplicitArgsAreNotSentToIndirectHeap) {
10021081
std::unique_ptr<MockImmutableData> mockKernelImmData = std::make_unique<MockImmutableData>(0u);
10031082
auto kernelDescriptor = mockKernelImmData->kernelDescriptor;

opencl/source/helpers/hardware_commands_helper_base.inl

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,28 @@ size_t HardwareCommandsHelper<GfxFamily>::sendIndirectState(
219219
auto pImplicitArgs = kernel.getImplicitArgs();
220220
if (pImplicitArgs) {
221221
constexpr uint32_t grfSize = sizeof(typename GfxFamily::GRF);
222+
const auto &kernelAttributes = kernelInfo.kernelDescriptor.kernelAttributes;
223+
uint32_t requiredWalkOrder = 0u;
224+
auto generationOfLocalIdsByRuntime = EncodeDispatchKernel<GfxFamily>::isRuntimeLocalIdsGenerationRequired(
225+
3,
226+
localWorkSize,
227+
std::array<uint8_t, 3>{
228+
{kernelAttributes.workgroupWalkOrder[0],
229+
kernelAttributes.workgroupWalkOrder[1],
230+
kernelAttributes.workgroupWalkOrder[2]}},
231+
kernelAttributes.flags.requiresWorkgroupWalkOrder,
232+
requiredWalkOrder,
233+
simd);
234+
235+
auto dimensionOrder = ImplicitArgsHelper::getDimensionOrderForLocalIds(kernelAttributes.workgroupDimensionsOrder, generationOfLocalIdsByRuntime, requiredWalkOrder);
236+
222237
auto offsetLocalIds = sendPerThreadData(
223238
ioh,
224239
simd,
225240
grfSize,
226241
3u, // all channels for implicit args
227242
std::array<uint16_t, 3>{{static_cast<uint16_t>(localWorkSize[0]), static_cast<uint16_t>(localWorkSize[1]), static_cast<uint16_t>(localWorkSize[2])}},
228-
{{kernelInfo.kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[0],
229-
kernelInfo.kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[1],
230-
kernelInfo.kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[2]}},
243+
dimensionOrder,
231244
kernel.usesOnlyImages());
232245

233246
pImplicitArgs->localIdTablePtr = offsetLocalIds + ioh.getGraphicsAllocation()->getGpuAddress();

opencl/test/unit_test/helpers/hardware_commands_helper_tests.cpp

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1261,7 +1261,9 @@ HWTEST_F(HardwareCommandsImplicitArgsTests, givenKernelWithImplicitArgsWhenSendi
12611261
pDevice->getMemoryManager()->freeGraphicsMemory(indirectHeapAllocation);
12621262
}
12631263

1264-
HWTEST_F(HardwareCommandsImplicitArgsTests, givenKernelWithImplicitArgsWhenSendingIndirectStateThenLocalIdsAreGeneratedAndCorrectlyProgrammedInCrossThreadData) {
1264+
HWTEST_F(HardwareCommandsImplicitArgsTests, givenKernelWithImplicitArgsAndRuntimeLocalIdsGenerationWhenSendingIndirectStateThenLocalIdsAreGeneratedAndCorrectlyProgrammedInCrossThreadData) {
1265+
DebugManagerStateRestore restorer;
1266+
DebugManager.flags.EnableHwGenerationLocalIds.set(0);
12651267
auto pKernelInfo = std::make_unique<MockKernelInfo>();
12661268
uint32_t simd = 32;
12671269
pKernelInfo->kernelDescriptor.kernelAttributes.simdSize = simd;
@@ -1330,6 +1332,74 @@ HWTEST_F(HardwareCommandsImplicitArgsTests, givenKernelWithImplicitArgsWhenSendi
13301332
EXPECT_EQ(ioh.getGraphicsAllocation()->getGpuAddress(), pImplicitArgs->localIdTablePtr);
13311333
}
13321334

1335+
HWCMDTEST_F(IGFX_XE_HP_CORE, HardwareCommandsImplicitArgsTests, givenKernelWithImplicitArgsAndHwLocalIdsGenerationWhenSendingIndirectStateThenLocalIdsAreGeneratedAndCorrectlyProgrammedInCrossThreadData) {
1336+
auto pKernelInfo = std::make_unique<MockKernelInfo>();
1337+
uint32_t simd = 32;
1338+
pKernelInfo->kernelDescriptor.kernelAttributes.simdSize = simd;
1339+
pKernelInfo->kernelDescriptor.kernelAttributes.flags.requiresImplicitArgs = true;
1340+
pKernelInfo->kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[0] = 2;
1341+
pKernelInfo->kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[1] = 1;
1342+
pKernelInfo->kernelDescriptor.kernelAttributes.workgroupDimensionsOrder[2] = 0;
1343+
1344+
MockContext context(pClDevice);
1345+
CommandQueueHw<FamilyType> cmdQ(&context, pClDevice, 0, false);
1346+
MockProgram program(&context, false, toClDeviceVector(*pClDevice));
1347+
1348+
MockKernel kernel(&program, *pKernelInfo, *pClDevice);
1349+
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
1350+
1351+
const size_t localWorkSizeX = 2;
1352+
const size_t localWorkSizeY = 3;
1353+
const size_t localWorkSizeZ = 4;
1354+
const size_t localWorkSizes[3]{localWorkSizeX, localWorkSizeY, localWorkSizeZ};
1355+
std::array<uint8_t, 3> expectedDimOrder = {0, 2, 1};
1356+
1357+
auto &commandStream = cmdQ.getCS(1024);
1358+
auto pWalkerCmd = reinterpret_cast<typename FamilyType::WALKER_TYPE *>(commandStream.getSpace(0));
1359+
1360+
auto &dsh = cmdQ.getIndirectHeap(IndirectHeap::Type::DYNAMIC_STATE, 8192);
1361+
auto &ioh = cmdQ.getIndirectHeap(IndirectHeap::Type::INDIRECT_OBJECT, 8192);
1362+
auto &ssh = cmdQ.getIndirectHeap(IndirectHeap::Type::SURFACE_STATE, 8192);
1363+
1364+
dsh.align(EncodeStates<FamilyType>::alignInterfaceDescriptorData);
1365+
auto interfaceDescriptor = reinterpret_cast<typename FamilyType::INTERFACE_DESCRIPTOR_DATA *>(dsh.getSpace(0));
1366+
uint32_t interfaceDescriptorIndex = 0u;
1367+
1368+
HardwareCommandsHelper<FamilyType>::sendIndirectState(
1369+
commandStream,
1370+
dsh,
1371+
ioh,
1372+
ssh,
1373+
kernel,
1374+
0u,
1375+
simd,
1376+
localWorkSizes,
1377+
0u,
1378+
interfaceDescriptorIndex,
1379+
pDevice->getPreemptionMode(),
1380+
pWalkerCmd,
1381+
interfaceDescriptor,
1382+
false,
1383+
*pDevice);
1384+
1385+
constexpr uint32_t grfSize = sizeof(typename FamilyType::GRF);
1386+
size_t localWorkSize = localWorkSizeX * localWorkSizeY * localWorkSizeZ;
1387+
size_t expectedIohSize = PerThreadDataHelper::getPerThreadDataSizeTotal(simd, grfSize, 3u, localWorkSize);
1388+
ASSERT_LE(expectedIohSize, ioh.getUsed());
1389+
1390+
auto expectedLocalIds = alignedMalloc(expectedIohSize, 64);
1391+
generateLocalIDs(expectedLocalIds, simd,
1392+
std::array<uint16_t, 3>{{localWorkSizeX, localWorkSizeY, localWorkSizeZ}},
1393+
expectedDimOrder,
1394+
false, grfSize);
1395+
1396+
EXPECT_EQ(0, memcmp(expectedLocalIds, ioh.getCpuBase(), expectedIohSize));
1397+
alignedFree(expectedLocalIds);
1398+
1399+
auto pImplicitArgs = reinterpret_cast<ImplicitArgs *>(ptrOffset(ioh.getCpuBase(), alignUp(expectedIohSize, MemoryConstants::cacheLineSize)));
1400+
EXPECT_EQ(ioh.getGraphicsAllocation()->getGpuAddress(), pImplicitArgs->localIdTablePtr);
1401+
}
1402+
13331403
using HardwareCommandsTestXeHpAndLater = HardwareCommandsTest;
13341404

13351405
HWCMDTEST_F(IGFX_XE_HP_CORE, HardwareCommandsTestXeHpAndLater, givenIndirectHeapNotAllocatedFromInternalPoolWhenSendCrossThreadDataIsCalledThenOffsetZeroIsReturned) {

shared/source/command_container/command_encoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct EncodeDispatchKernel {
6464
static void *getInterfaceDescriptor(CommandContainer &container, uint32_t &iddOffset);
6565

6666
static bool isRuntimeLocalIdsGenerationRequired(uint32_t activeChannels,
67-
size_t *lws,
67+
const size_t *lws,
6868
std::array<uint8_t, 3> walkOrder,
6969
bool requireInputWalkOrder,
7070
uint32_t &requiredWalkOrder,

shared/source/command_container/command_encoder_bdw_and_later.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ void EncodeMediaInterfaceDescriptorLoad<Family>::encode(CommandContainer &contai
263263

264264
template <typename Family>
265265
inline bool EncodeDispatchKernel<Family>::isRuntimeLocalIdsGenerationRequired(uint32_t activeChannels,
266-
size_t *lws,
266+
const size_t *lws,
267267
std::array<uint8_t, 3> walkOrder,
268268
bool requireInputWalkOrder,
269269
uint32_t &requiredWalkOrder,

shared/source/command_container/command_encoder_xehp_and_later.inl

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "shared/source/helpers/basic_math.h"
2020
#include "shared/source/helpers/constants.h"
2121
#include "shared/source/helpers/hw_helper.h"
22+
#include "shared/source/helpers/hw_walk_order.h"
2223
#include "shared/source/helpers/pipe_control_args.h"
2324
#include "shared/source/helpers/pipeline_select_helper.h"
2425
#include "shared/source/helpers/ray_tracing_helper.h"
@@ -298,7 +299,7 @@ inline void EncodeDispatchKernel<Family>::encodeAdditionalWalkerFields(const Har
298299

299300
template <typename Family>
300301
bool EncodeDispatchKernel<Family>::isRuntimeLocalIdsGenerationRequired(uint32_t activeChannels,
301-
size_t *lws,
302+
const size_t *lws,
302303
std::array<uint8_t, 3> walkOrder,
303304
bool requireInputWalkOrder,
304305
uint32_t &requiredWalkOrder,
@@ -324,18 +325,6 @@ bool EncodeDispatchKernel<Family>::isRuntimeLocalIdsGenerationRequired(uint32_t
324325
return true;
325326
}
326327

327-
//make sure table below matches Hardware Spec
328-
constexpr uint32_t walkOrderPossibilties = 6u;
329-
constexpr uint8_t X = 0;
330-
constexpr uint8_t Y = 1;
331-
constexpr uint8_t Z = 2;
332-
constexpr uint8_t possibleWalkOrders[walkOrderPossibilties][3] = {{X, Y, Z}, // 0 1 2
333-
{X, Z, Y}, // 0 2 1
334-
{Y, X, Z}, // 1 0 2
335-
{Z, X, Y}, // 1 2 0
336-
{Y, Z, X}, // 2 0 1
337-
{Z, Y, X}}; // 2 1 0
338-
339328
//check if we need to follow kernel requirements
340329
if (requireInputWalkOrder) {
341330
for (uint32_t dimension = 0; dimension < activeChannels - 1; dimension++) {
@@ -345,24 +334,24 @@ bool EncodeDispatchKernel<Family>::isRuntimeLocalIdsGenerationRequired(uint32_t
345334
}
346335

347336
auto index = 0u;
348-
while (index < walkOrderPossibilties) {
349-
if (walkOrder[0] == possibleWalkOrders[index][0] &&
350-
walkOrder[1] == possibleWalkOrders[index][1]) {
337+
while (index < HwWalkOrderHelper::walkOrderPossibilties) {
338+
if (walkOrder[0] == HwWalkOrderHelper::compatibleDimensionOrders[index][0] &&
339+
walkOrder[1] == HwWalkOrderHelper::compatibleDimensionOrders[index][1]) {
351340
break;
352341
};
353342
index++;
354343
}
355-
DEBUG_BREAK_IF(index >= walkOrderPossibilties);
344+
DEBUG_BREAK_IF(index >= HwWalkOrderHelper::walkOrderPossibilties);
356345

357346
requiredWalkOrder = index;
358347
return false;
359348
}
360349

361350
//kernel doesn't specify any walk order requirements, check if we have any compatible
362-
for (uint32_t walkOrder = 0; walkOrder < walkOrderPossibilties; walkOrder++) {
351+
for (uint32_t walkOrder = 0; walkOrder < HwWalkOrderHelper::walkOrderPossibilties; walkOrder++) {
363352
bool allDimensionsCompatible = true;
364353
for (uint32_t dimension = 0; dimension < activeChannels - 1; dimension++) {
365-
if (!Math::isPow2<size_t>(lws[possibleWalkOrders[walkOrder][dimension]])) {
354+
if (!Math::isPow2<size_t>(lws[HwWalkOrderHelper::compatibleDimensionOrders[walkOrder][dimension]])) {
366355
allDimensionsCompatible = false;
367356
break;
368357
}

shared/source/helpers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ set(NEO_CORE_HELPERS
7474
${CMAKE_CURRENT_SOURCE_DIR}/hw_info.cpp
7575
${CMAKE_CURRENT_SOURCE_DIR}/hw_info.h
7676
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}hw_info_extended.cpp
77+
${CMAKE_CURRENT_SOURCE_DIR}/hw_walk_order.h
7778
${CMAKE_CURRENT_SOURCE_DIR}/interlocked_max.h
7879
${CMAKE_CURRENT_SOURCE_DIR}/kernel_helpers.cpp
7980
${CMAKE_CURRENT_SOURCE_DIR}/kernel_helpers.h
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (C) 2022 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#pragma once
9+
10+
#include <array>
11+
#include <cstdint>
12+
13+
namespace NEO {
14+
namespace HwWalkOrderHelper {
15+
//make sure table below matches Hardware Spec
16+
constexpr uint32_t walkOrderPossibilties = 6u;
17+
constexpr uint8_t X = 0;
18+
constexpr uint8_t Y = 1;
19+
constexpr uint8_t Z = 2;
20+
constexpr std::array<uint8_t, 3> compatibleDimensionOrders[walkOrderPossibilties] = {{X, Y, Z}, // 0 1 2
21+
{X, Z, Y}, // 0 2 1
22+
{Y, X, Z}, // 1 0 2
23+
{Z, X, Y}, // 1 2 0
24+
{Y, Z, X}, // 2 0 1
25+
{Z, Y, X}}; // 2 1 0
26+
} // namespace HwWalkOrderHelper
27+
} // namespace NEO

0 commit comments

Comments
 (0)