mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
Zebin: Add support for new buffer_address arg type
This change adds support for new "buffer_address" arg type, which adds buffer address information for stateful-only argument. This will prevent from generating stateless version of a kernel argument if all its accesses are to be promoted to the stateful ones. - Change default value of accessedUsingStatelessAddressingMode flag. Signed-off-by: Kacper Nowak <kacper.nowak@intel.com> Related-To: NEO-7048
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
9bcab12496
commit
de75e51228
@@ -5007,6 +5007,55 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeBufferOffsetWhenOffset
|
||||
EXPECT_EQ(8, arg.bufferOffset);
|
||||
}
|
||||
|
||||
TEST(PopulateArgDescriptorCrossthreadPayload, givenPureStatefulArgWithBufferAddressWhenThereIsNoStatelessAccessThenPopulatesKernelDescriptorAndArgIsPureStateful) {
|
||||
NEO::ConstStringRef zeinfo = R"===(
|
||||
kernels:
|
||||
- name : some_kernel
|
||||
execution_env:
|
||||
simd_size: 32
|
||||
payload_arguments:
|
||||
- arg_type: arg_bypointer
|
||||
offset: 0
|
||||
size: 0
|
||||
arg_index: 0
|
||||
addrmode: stateful
|
||||
addrspace: global
|
||||
access_type: readwrite
|
||||
- arg_type: buffer_address
|
||||
offset: 32
|
||||
arg_index: 0
|
||||
binding_table_indices:
|
||||
- bti_value: 0
|
||||
arg_index: 0
|
||||
)===";
|
||||
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[0]->kernelDescriptor.payloadMappings.explicitArgs.size());
|
||||
|
||||
const auto &arg = programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.explicitArgs[0].as<ArgDescPointer>();
|
||||
EXPECT_EQ(32, arg.stateless);
|
||||
EXPECT_FALSE(arg.accessedUsingStatelessAddressingMode);
|
||||
EXPECT_TRUE(arg.isPureStateful());
|
||||
}
|
||||
|
||||
TEST(PopulateArgDescriptorCrossthreadPayload, GivenNoArgsThenPopulatesKernelDescriptor) {
|
||||
NEO::ConstStringRef zeinfo = R"===(
|
||||
kernels:
|
||||
|
||||
@@ -861,7 +861,7 @@ TEST(KernelDescriptorFromPatchtokens, GivenKernelWithPointerArgumentAndMetadataT
|
||||
NEO::populateKernelDescriptor(dst, kernelTokens, sizeof(void *));
|
||||
EXPECT_TRUE(dst.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTPointer>());
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bufferOffset));
|
||||
EXPECT_FALSE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful()));
|
||||
EXPECT_FALSE(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful());
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesImages);
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesSamplers);
|
||||
}
|
||||
@@ -874,7 +874,7 @@ TEST(KernelDescriptorFromPatchtokens, GivenKernelWithPointerArgumentAndMetadataT
|
||||
NEO::populateKernelDescriptor(dst, kernelTokens, sizeof(void *));
|
||||
EXPECT_TRUE(dst.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTPointer>());
|
||||
EXPECT_EQ(bufferOffset.Offset, dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bufferOffset);
|
||||
EXPECT_FALSE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful()));
|
||||
EXPECT_FALSE(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful());
|
||||
kernelTokens.tokens.kernelArgs[0].metadata.buffer.bufferOffset = nullptr;
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesImages);
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesSamplers);
|
||||
@@ -886,7 +886,7 @@ TEST(KernelDescriptorFromPatchtokens, GivenKernelWithPointerArgumentAndMetadataT
|
||||
NEO::populateKernelDescriptor(dst, kernelTokens, sizeof(void *));
|
||||
EXPECT_TRUE(dst.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTPointer>());
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bufferOffset));
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful()));
|
||||
EXPECT_TRUE(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful());
|
||||
kernelTokens.tokens.kernelArgs[0].metadata.buffer.pureStateful = nullptr;
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesImages);
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesSamplers);
|
||||
@@ -1029,7 +1029,7 @@ TEST(KernelDescriptorFromPatchtokens, GivenKernelWithSlmArgumentAndMetadataThenK
|
||||
NEO::populateKernelDescriptor(dst, kernelTokens, sizeof(void *));
|
||||
EXPECT_TRUE(dst.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTPointer>());
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bufferOffset));
|
||||
EXPECT_FALSE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful()));
|
||||
EXPECT_FALSE(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful());
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesImages);
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesSamplers);
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bindful));
|
||||
@@ -1052,7 +1052,7 @@ TEST(KernelDescriptorFromPatchtokens, GivenKernelWithSlmArgumentAndMetadataThenK
|
||||
NEO::populateKernelDescriptor(dst, kernelTokens, sizeof(void *));
|
||||
EXPECT_TRUE(dst.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTPointer>());
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bufferOffset));
|
||||
EXPECT_FALSE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful()));
|
||||
EXPECT_FALSE(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().isPureStateful());
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesImages);
|
||||
EXPECT_FALSE(dst.kernelAttributes.flags.usesSamplers);
|
||||
EXPECT_TRUE(NEO::isUndefinedOffset(dst.payloadMappings.explicitArgs[0].as<NEO::ArgDescPointer>().bindful));
|
||||
|
||||
Reference in New Issue
Block a user