mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-26 07:00:17 +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
@@ -178,6 +178,7 @@ static constexpr ConstStringRef enqueuedLocalSize("enqueued_local_size");
|
||||
static constexpr ConstStringRef privateBaseStateless("private_base_stateless");
|
||||
static constexpr ConstStringRef argByvalue("arg_byvalue");
|
||||
static constexpr ConstStringRef argBypointer("arg_bypointer");
|
||||
static constexpr ConstStringRef bufferAddress("buffer_address");
|
||||
static constexpr ConstStringRef bufferOffset("buffer_offset");
|
||||
static constexpr ConstStringRef printfBuffer("printf_buffer");
|
||||
static constexpr ConstStringRef workDimensions("work_dimensions");
|
||||
@@ -377,6 +378,7 @@ enum ArgType : uint8_t {
|
||||
ArgTypePrivateBaseStateless,
|
||||
ArgTypeArgByvalue,
|
||||
ArgTypeArgBypointer,
|
||||
ArgTypeBufferAddress,
|
||||
ArgTypeBufferOffset,
|
||||
ArgTypePrintfBuffer,
|
||||
ArgTypeWorkDimensions,
|
||||
|
||||
@@ -376,6 +376,8 @@ bool readEnumChecked(const Yaml::Token *token, NEO::Elf::ZebinKernelMetadata::Ty
|
||||
out = ArgTypeT::ArgTypeArgByvalue;
|
||||
} else if (tokenValue == PayloadArgument::ArgType::argBypointer) {
|
||||
out = ArgTypeT::ArgTypeArgBypointer;
|
||||
} else if (tokenValue == PayloadArgument::ArgType::bufferAddress) {
|
||||
out = ArgTypeT::ArgTypeBufferAddress;
|
||||
} else if (tokenValue == PayloadArgument::ArgType::bufferOffset) {
|
||||
out = ArgTypeT::ArgTypeBufferOffset;
|
||||
} else if (tokenValue == PayloadArgument::ArgType::printfBuffer) {
|
||||
@@ -824,14 +826,14 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
|
||||
}
|
||||
|
||||
argTraits.argByValSize = sizeof(void *);
|
||||
if (dst.payloadMappings.explicitArgs[src.argIndex].is<NEO::ArgDescriptor::ArgTPointer>()) {
|
||||
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescPointer>().accessedUsingStatelessAddressingMode = false;
|
||||
}
|
||||
switch (src.addrmode) {
|
||||
default:
|
||||
outErrReason.append("Invalid or missing memory addressing mode for arg idx : " + std::to_string(src.argIndex) + " in context of : " + dst.kernelMetadata.kernelName + ".\n");
|
||||
return DecodeError::InvalidBinary;
|
||||
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::MemoryAddressingModeStateful:
|
||||
if (dst.payloadMappings.explicitArgs[src.argIndex].is<NEO::ArgDescriptor::ArgTPointer>()) {
|
||||
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescPointer>(true).accessedUsingStatelessAddressingMode = false;
|
||||
}
|
||||
break;
|
||||
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::MemoryAddressingModeStateless:
|
||||
if (false == dst.payloadMappings.explicitArgs[src.argIndex].is<NEO::ArgDescriptor::ArgTPointer>()) {
|
||||
@@ -840,6 +842,7 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
|
||||
}
|
||||
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescPointer>(false).stateless = src.offset;
|
||||
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescPointer>(false).pointerSize = src.size;
|
||||
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescPointer>(false).accessedUsingStatelessAddressingMode = true;
|
||||
break;
|
||||
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::MemoryAddressingModeBindless:
|
||||
if (dst.payloadMappings.explicitArgs[src.argIndex].is<NEO::ArgDescriptor::ArgTPointer>()) {
|
||||
@@ -917,6 +920,11 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
|
||||
break;
|
||||
}
|
||||
|
||||
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeBufferAddress: {
|
||||
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescPointer>(true).stateless = src.offset;
|
||||
break;
|
||||
}
|
||||
|
||||
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeBufferOffset: {
|
||||
if (4 != src.size) {
|
||||
outErrReason.append("DeviceBinaryFormat::Zebin : Invalid size for argument of type " + NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::ArgType::bufferOffset.str() + " in context of : " + dst.kernelMetadata.kernelName + ". Expected 4. Got : " + std::to_string(src.size) + "\n");
|
||||
|
||||
Reference in New Issue
Block a user