From 50df7f430e0e2422f6977ca7b2df22398582c68e Mon Sep 17 00:00:00 2001 From: Kacper Nowak Date: Mon, 21 Nov 2022 13:26:29 +0000 Subject: [PATCH] feat(zebin): Support for is_pipe ptr argument attribute Pipe qualifier must be set (known) on kernel initialization in order to properly chose kernel arg handler. A new attribute is_pipe has been introduced; this commit adds support for it. Signed-off-by: Kacper Nowak --- .../device_binary_format/elf/zebin_elf.h | 2 + .../device_binary_format/zebin_decoder.cpp | 5 +++ .../zebin_decoder_tests.cpp | 44 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/shared/source/device_binary_format/elf/zebin_elf.h b/shared/source/device_binary_format/elf/zebin_elf.h index abd0a4001b..62cef9c227 100644 --- a/shared/source/device_binary_format/elf/zebin_elf.h +++ b/shared/source/device_binary_format/elf/zebin_elf.h @@ -197,6 +197,7 @@ constexpr ConstStringRef samplerType("sampler_type"); constexpr ConstStringRef addrMode("sampler_desc_addrmode"); constexpr ConstStringRef filterMode("sampler_desc_filtermode"); constexpr ConstStringRef normalized("sampler_desc_normalized"); +constexpr ConstStringRef isPipe("is_pipe"); namespace ArgType { constexpr ConstStringRef localSize("local_size"); @@ -686,6 +687,7 @@ struct PayloadArgumentBaseT { ImageType imageType = ImageTypeUnknown; bool imageTransformable = false; SamplerType samplerType = SamplerTypeUnknown; + bool isPipe = false; }; } // namespace PayloadArgument diff --git a/shared/source/device_binary_format/zebin_decoder.cpp b/shared/source/device_binary_format/zebin_decoder.cpp index 59701f74d8..b9f8d5f803 100644 --- a/shared/source/device_binary_format/zebin_decoder.cpp +++ b/shared/source/device_binary_format/zebin_decoder.cpp @@ -585,6 +585,8 @@ DecodeError readZeInfoPayloadArguments(const NEO::Yaml::YamlParser &parser, cons validPayload &= readZeInfoValueChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.imageTransformable, context, outErrReason); } else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::samplerType == key) { validPayload &= readZeInfoEnumChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.samplerType, context, outErrReason); + } else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::isPipe == key) { + validPayload &= readZeInfoValueChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.isPipe, context, outErrReason); } else { outWarning.append("DeviceBinaryFormat::Zebin::" + NEO::Elf::SectionsNamesZebin::zeInfo.str() + " : Unknown entry \"" + key.str() + "\" for payload argument in context of " + context.str() + "\n"); } @@ -868,6 +870,9 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type argTraits.argByValSize = sizeof(void *); if (dst.payloadMappings.explicitArgs[src.argIndex].is()) { dst.payloadMappings.explicitArgs[src.argIndex].as().accessedUsingStatelessAddressingMode = false; + if (src.isPipe) { + argTraits.typeQualifiers.pipeQual = true; + } } switch (src.addrmode) { default: diff --git a/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp b/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp index 65d0dad266..be57631816 100644 --- a/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp +++ b/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp @@ -4305,6 +4305,50 @@ kernels: EXPECT_TRUE(kernelDescriptor.kernelAttributes.hasIndirectStatelessAccess); } +TEST(PopulateKernelDescriptor, givenPipeKernelArgumentWhenPopulatingKernelDescriptorThenProperTypeQualifierIsSet) { + NEO::ConstStringRef zeinfo = R"===( +kernels: + - name : some_kernel + execution_env: + simd_size: 8 + payload_arguments: + - arg_type: arg_bypointer + offset: 40 + size: 8 + arg_index: 0 + addrmode: stateless + addrspace: global + access_type: readwrite + is_pipe: true +)==="; + NEO::ProgramInfo programInfo; + ZebinTestData::ValidEmptyProgram zebin; + zebin.appendSection(NEO::Elf::SHT_PROGBITS, NEO::Elf::SectionsNamesZebin::textPrefix.str() + "some_kernel", {}); + std::string errors, warnings; + auto elf = NEO::Elf::decodeElf(zebin.storage, errors, warnings); + ASSERT_NE(nullptr, elf.elfFileHeader) << errors << " " << warnings; + + NEO::Yaml::YamlParser parser; + bool parseSuccess = parser.parse(zeinfo, errors, warnings); + ASSERT_TRUE(parseSuccess) << errors << " " << warnings; + + NEO::ZebinSections zebinSections; + auto extractErr = NEO::extractZebinSections(elf, zebinSections, errors, warnings); + ASSERT_EQ(NEO::DecodeError::Success, extractErr) << errors << " " << warnings; + + auto &kernelNode = *parser.createChildrenRange(*parser.findNodeWithKeyDfs("kernels")).begin(); + auto err = NEO::populateKernelDescriptor(programInfo, elf, zebinSections, parser, kernelNode, errors, warnings); + EXPECT_EQ(NEO::DecodeError::Success, err); + EXPECT_TRUE(errors.empty()) << errors; + EXPECT_TRUE(warnings.empty()) << warnings; + ASSERT_EQ(1U, programInfo.kernelInfos.size()); + + const auto &argTraits = programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.explicitArgs[0].getTraits(); + KernelArgMetadata::TypeQualifiers expectedQual = {}; + expectedQual.pipeQual = true; + EXPECT_EQ(expectedQual.packed, argTraits.typeQualifiers.packed); +} + TEST(PopulateArgDescriptorPerThreadPayload, GivenArgTypeLocalIdWhenOffsetIsNonZeroThenFail) { NEO::ConstStringRef zeinfo = R"===( kernels: