Skip to content

Commit 4c50a9e

Browse files
jchodorCompute-Runtime-Automation
authored andcommitted
Zebin - Improving binding table generation
Allowing N:1 kernel_arg:bti mappings Signed-off-by: Jaroslaw Chodor <[email protected]>
1 parent 6a54bde commit 4c50a9e

File tree

4 files changed

+22
-7
lines changed

4 files changed

+22
-7
lines changed

shared/source/device_binary_format/zebin_decoder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -878,10 +878,14 @@ NEO::DecodeError populateKernelDescriptor(NEO::ProgramInfo &dst, NEO::Elf::Elf<N
878878

879879
auto generatedBindingTablePos = kernelDescriptor.generatedHeaps.size();
880880
kernelDescriptor.generatedHeaps.resize(generatedBindingTablePos + numEntries * btiSize, 0U);
881+
881882
auto bindingTableIt = reinterpret_cast<int *>(kernelDescriptor.generatedHeaps.data() + generatedBindingTablePos);
882-
for (auto &bti : bindingTableIndices) {
883-
*bindingTableIt = bti.btiValue * 64U;
883+
for (int i = 0; i < numEntries; ++i) {
884+
*bindingTableIt = i * maxSurfaceStateSize;
884885
++bindingTableIt;
886+
}
887+
888+
for (auto &bti : bindingTableIndices) {
885889
auto &explicitArg = kernelDescriptor.payloadMappings.explicitArgs[bti.argIndex];
886890
switch (explicitArg.type) {
887891
default:

shared/source/kernel/kernel_arg_descriptor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020 Intel Corporation
2+
* Copyright (C) 2020-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -282,7 +282,7 @@ inline bool patchPointer(ArrayRef<uint8_t> buffer, const ArgDescPointer &arg, ui
282282
if (arg.pointerSize == 8) {
283283
return patchNonPointer(buffer, arg.stateless, static_cast<uint64_t>(value));
284284
} else {
285-
UNRECOVERABLE_IF(arg.pointerSize != 4);
285+
UNRECOVERABLE_IF((arg.pointerSize != 4) && isValidOffset(arg.stateless));
286286
return patchNonPointer(buffer, arg.stateless, static_cast<uint32_t>(value));
287287
}
288288
}

shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,8 +2362,8 @@ TEST(PopulateKernelDescriptor, GivenValidBindingTableEntriesThenGeneratesSsh) {
23622362
EXPECT_EQ(512U, programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.bindingTable.tableOffset);
23632363
ASSERT_EQ(576U, programInfo.kernelInfos[0]->heapInfo.SurfaceStateHeapSize);
23642364
ASSERT_NE(nullptr, programInfo.kernelInfos[0]->heapInfo.pSsh);
2365-
EXPECT_EQ(128U, reinterpret_cast<const uint32_t *>(ptrOffset(programInfo.kernelInfos[0]->heapInfo.pSsh, 512U))[0]);
2366-
EXPECT_EQ(448U, reinterpret_cast<const uint32_t *>(ptrOffset(programInfo.kernelInfos[0]->heapInfo.pSsh, 512U))[1]);
2365+
EXPECT_EQ(128U, reinterpret_cast<const uint32_t *>(ptrOffset(programInfo.kernelInfos[0]->heapInfo.pSsh, 512U))[2]);
2366+
EXPECT_EQ(448U, reinterpret_cast<const uint32_t *>(ptrOffset(programInfo.kernelInfos[0]->heapInfo.pSsh, 512U))[7]);
23672367
}
23682368

23692369
TEST(PopulateKernelDescriptor, GivenBtiEntryForWrongArgTypeThenFail) {

shared/test/unit_test/kernel/kernel_arg_descriptor_tests.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020 Intel Corporation
2+
* Copyright (C) 2020-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -486,9 +486,20 @@ TEST(PatchPointer, GivenUnhandledPointerSizeThenAborts) {
486486
NEO::ArgDescPointer ptrArg;
487487
uintptr_t ptrValue = reinterpret_cast<uintptr_t>(&ptrArg);
488488
ptrArg.pointerSize = 5;
489+
ptrArg.stateless = 0U;
489490
EXPECT_THROW(patchPointer(buffer, ptrArg, ptrValue), std::exception);
490491
}
491492

493+
TEST(PatchPointer, GivenUnhandledPointerSizeWhenStatelessOffsetIsUndefinedThenIgnoresPointerSize) {
494+
alignas(8) uint8_t buffer[64];
495+
memset(buffer, 3, sizeof(buffer));
496+
NEO::ArgDescPointer ptrArg;
497+
uintptr_t ptrValue = reinterpret_cast<uintptr_t>(&ptrArg);
498+
ptrArg.pointerSize = 5;
499+
ptrArg.stateless = NEO::undefined<NEO::CrossThreadDataOffset>;
500+
EXPECT_NO_THROW(patchPointer(buffer, ptrArg, ptrValue));
501+
}
502+
492503
TEST(PatchPointer, Given32bitPointerSizeThenPatchesOnly32bits) {
493504
alignas(8) uint8_t buffer[64];
494505
memset(buffer, 3, sizeof(buffer));

0 commit comments

Comments
 (0)