feat(zebin): support isPtr for struct elems

Add support in zeInfo for "is_ptr" payload argument describing if field
of structure (argument passed by value) is a pointer.

Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
This commit is contained in:
Krystian Chmielewski
2022-11-28 09:47:42 +00:00
committed by Compute-Runtime-Automation
parent 914939c377
commit ad6237478f
4 changed files with 27 additions and 0 deletions

View File

@@ -199,6 +199,7 @@ constexpr ConstStringRef addrMode("sampler_desc_addrmode");
constexpr ConstStringRef filterMode("sampler_desc_filtermode");
constexpr ConstStringRef normalized("sampler_desc_normalized");
constexpr ConstStringRef isPipe("is_pipe");
constexpr ConstStringRef isPtr("is_ptr");
namespace ArgType {
constexpr ConstStringRef localSize("local_size");
@@ -692,6 +693,7 @@ struct PayloadArgumentBaseT {
bool imageTransformable = false;
SamplerType samplerType = SamplerTypeUnknown;
bool isPipe = false;
bool isPtr = false;
};
} // namespace PayloadArgument

View File

@@ -589,6 +589,8 @@ DecodeError readZeInfoPayloadArguments(const NEO::Yaml::YamlParser &parser, cons
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 if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::isPtr == key) {
validPayload &= readZeInfoValueChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.isPtr, 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");
}
@@ -918,6 +920,7 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
auto &argAsValue = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescValue>(true);
ArgDescValue::Element valueElement;
valueElement.sourceOffset = 0;
valueElement.isPtr = src.isPtr;
if (src.sourceOffset != -1) {
valueElement.sourceOffset = src.sourceOffset;
} else if (argAsValue.elements.empty() == false) {

View File

@@ -84,6 +84,7 @@ struct ArgDescValue final {
CrossThreadDataOffset offset = undefined<CrossThreadDataOffset>;
uint16_t size = 0U;
uint16_t sourceOffset = 0U;
bool isPtr = false;
};
StackVec<Element, 1> elements;
};

View File

@@ -2176,6 +2176,7 @@ kernels:
offset : 24
size : 4
arg_index : 2
is_ptr : true
...
)===";
@@ -2208,6 +2209,7 @@ kernels:
EXPECT_EQ(NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeArgByvalue, args[1].argType);
EXPECT_EQ(24, args[1].offset);
EXPECT_EQ(4, args[1].size);
EXPECT_TRUE(args[1].isPtr);
}
TEST(ReadZeInfoPayloadArguments, GivenUnknownEntryThenEmmitsWarning) {
@@ -5511,6 +5513,25 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeBufferOffsetWhenSizeIs
}
}
TEST(PopulateArgDescriptor, GivenValueArgWithPointerMemberThenItIsProperlyPopulated) {
NEO::KernelDescriptor kernelDescriptor;
kernelDescriptor.payloadMappings.explicitArgs.resize(1);
NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::PayloadArgumentBaseT valueArg;
valueArg.argType = NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeArgByvalue;
valueArg.argIndex = 0;
valueArg.offset = 8;
valueArg.size = 8;
valueArg.isPtr = true;
std::string errors, warnings;
uint32_t crossThreadDataSize = 0U;
auto retVal = NEO::populateArgDescriptor(valueArg, kernelDescriptor, crossThreadDataSize, errors, warnings);
EXPECT_EQ(NEO::DecodeError::Success, retVal);
EXPECT_TRUE(warnings.empty());
EXPECT_TRUE(errors.empty());
EXPECT_TRUE(kernelDescriptor.payloadMappings.explicitArgs[0].as<ArgDescValue>().elements[0].isPtr);
}
TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeWorkDimensionsWhenSizeIsValidThenPopulatesKernelDescriptor) {
NEO::ConstStringRef zeinfo = R"===(
kernels: