2020-07-30 13:18:54 +02:00
/*
2024-01-10 17:46:32 +00:00
* Copyright ( C ) 2023 - 2024 Intel Corporation
2020-07-30 13:18:54 +02:00
*
* SPDX - License - Identifier : MIT
*
*/
2023-02-16 15:09:51 +00:00
# include "shared/source/device_binary_format/zebin/zeinfo_decoder.h"
2020-07-30 13:18:54 +02:00
2023-01-02 16:19:30 +00:00
# include "shared/source/compiler_interface/external_functions.h"
2020-07-30 13:18:54 +02:00
# include "shared/source/debug_settings/debug_settings_manager.h"
2024-01-18 13:23:34 +00:00
# include "shared/source/device_binary_format/zebin/zebin_elf.h"
2023-02-16 15:09:51 +00:00
# include "shared/source/device_binary_format/zebin/zeinfo_enum_lookup.h"
2023-01-11 15:32:55 +00:00
# include "shared/source/helpers/aligned_memory.h"
2022-09-08 11:12:08 +00:00
# include "shared/source/helpers/basic_math.h"
2023-02-16 15:09:51 +00:00
# include "shared/source/kernel/kernel_arg_descriptor.h"
2022-08-10 16:11:49 +00:00
# include "shared/source/kernel/kernel_arg_descriptor_extended_vme.h"
2023-02-16 15:09:51 +00:00
# include "shared/source/kernel/kernel_descriptor.h"
2021-09-29 19:10:53 +00:00
# include "shared/source/program/kernel_info.h"
2020-07-30 13:18:54 +02:00
# include "shared/source/program/program_info.h"
2023-02-16 15:09:51 +00:00
# include "shared/source/utilities/const_stringref.h"
2020-07-30 13:18:54 +02:00
2023-02-16 15:09:51 +00:00
namespace NEO : : Zebin : : ZeInfo {
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
template < typename ContainerT >
bool validateCountAtMost ( const ContainerT & sectionsContainer , size_t max , std : : string & outErrReason , ConstStringRef name , ConstStringRef context ) {
if ( sectionsContainer . size ( ) < = max ) {
return true ;
}
outErrReason . append ( context . str ( ) + " : Expected at most " + std : : to_string ( max ) + " of " + name . str ( ) + " , got : " + std : : to_string ( sectionsContainer . size ( ) ) + " \n " ) ;
return false ;
}
template < typename ContainerT >
bool validateCountExactly ( const ContainerT & sectionsContainer , size_t num , std : : string & outErrReason , ConstStringRef name , ConstStringRef context ) {
if ( sectionsContainer . size ( ) = = num ) {
return true ;
}
outErrReason . append ( context . str ( ) + " : Expected exactly " + std : : to_string ( num ) + " of " + name . str ( ) + " , got : " + std : : to_string ( sectionsContainer . size ( ) ) + " \n " ) ;
return false ;
}
2023-02-16 15:09:51 +00:00
DecodeError validateZeInfoVersion ( const Types : : Version & receivedZeInfoVersion , std : : string & outErrReason , std : : string & outWarning ) {
if ( receivedZeInfoVersion . major ! = zeInfoDecoderVersion . major ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Unhandled major version : " + std : : to_string ( receivedZeInfoVersion . major ) + " , decoder is at : " + std : : to_string ( zeInfoDecoderVersion . major ) + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : unhandledBinary ;
2020-07-30 13:18:54 +02:00
}
2023-02-16 15:09:51 +00:00
if ( receivedZeInfoVersion . minor > zeInfoDecoderVersion . minor ) {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Minor version : " + std : : to_string ( receivedZeInfoVersion . minor ) + " is newer than available in decoder : " + std : : to_string ( zeInfoDecoderVersion . minor ) + " - some features may be skipped \n " ) ;
2020-07-30 13:18:54 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
void extractZeInfoSections ( const Yaml : : YamlParser & parser , ZeInfoSections & outZeInfoSections , std : : string & outWarning ) {
for ( const auto & globalScopeNd : parser . createChildrenRange ( * parser . getRoot ( ) ) ) {
auto key = parser . readKey ( globalScopeNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : kernels = = key ) {
2023-01-10 17:09:40 +00:00
outZeInfoSections . kernels . push_back ( & globalScopeNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : version = = key ) {
2023-01-10 17:09:40 +00:00
outZeInfoSections . version . push_back ( & globalScopeNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : globalHostAccessTable = = key ) {
2023-01-10 17:09:40 +00:00
outZeInfoSections . globalHostAccessTable . push_back ( & globalScopeNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : functions = = key ) {
2023-01-10 17:09:40 +00:00
outZeInfoSections . functions . push_back ( & globalScopeNd ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + parser . readKey ( globalScopeNd ) . str ( ) + " \" in global scope of .ze_info \n " ) ;
2023-01-10 17:09:40 +00:00
}
}
}
2020-07-30 13:18:54 +02:00
void extractZeInfoKernelSections ( const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & kernelNd , ZeInfoKernelSections & outZeInfoKernelSections , ConstStringRef context , std : : string & outWarning ) {
for ( const auto & kernelMetadataNd : parser . createChildrenRange ( kernelNd ) ) {
auto key = parser . readKey ( kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : name = = key ) {
2020-07-30 13:18:54 +02:00
outZeInfoKernelSections . nameNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : attributes = = key ) {
2022-09-07 13:21:53 +00:00
outZeInfoKernelSections . attributesNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : executionEnv = = key ) {
2020-07-30 13:18:54 +02:00
outZeInfoKernelSections . executionEnvNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : debugEnv = = key ) {
2021-08-30 13:59:08 +00:00
outZeInfoKernelSections . debugEnvNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : payloadArguments = = key ) {
2020-07-30 13:18:54 +02:00
outZeInfoKernelSections . payloadArgumentsNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : perThreadPayloadArguments = = key ) {
2020-07-30 13:18:54 +02:00
outZeInfoKernelSections . perThreadPayloadArgumentsNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : bindingTableIndices = = key ) {
2020-07-30 13:18:54 +02:00
outZeInfoKernelSections . bindingTableIndicesNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : perThreadMemoryBuffers = = key ) {
2020-08-30 08:50:00 +02:00
outZeInfoKernelSections . perThreadMemoryBuffersNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : experimentalProperties = = key ) {
2021-01-13 17:19:44 -08:00
outZeInfoKernelSections . experimentalPropertiesNd . push_back ( & kernelMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : inlineSamplers = = key ) {
2022-10-06 09:50:38 +00:00
outZeInfoKernelSections . inlineSamplersNd . push_back ( & kernelMetadataNd ) ;
2020-07-30 13:18:54 +02:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + parser . readKey ( kernelMetadataNd ) . str ( ) + " \" in context of : " + context . str ( ) + " \n " ) ;
2020-07-30 13:18:54 +02:00
}
}
}
2023-01-10 17:09:40 +00:00
bool validateZeInfoSectionsCount ( const ZeInfoSections & zeInfoSections , std : : string & outErrReason ) {
2023-12-13 16:09:52 +00:00
ConstStringRef context = " DeviceBinaryFormat::zebin::ZeInfo " ;
2023-01-10 17:09:40 +00:00
bool valid = validateCountExactly ( zeInfoSections . kernels , 1U , outErrReason , " kernels " , context ) ;
valid & = validateCountAtMost ( zeInfoSections . version , 1U , outErrReason , " version " , context ) ;
valid & = validateCountAtMost ( zeInfoSections . globalHostAccessTable , 1U , outErrReason , " global host access table " , context ) ;
valid & = validateCountAtMost ( zeInfoSections . functions , 1U , outErrReason , " functions " , context ) ;
return valid ;
}
2020-07-30 13:18:54 +02:00
DecodeError validateZeInfoKernelSectionsCount ( const ZeInfoKernelSections & outZeInfoKernelSections , std : : string & outErrReason , std : : string & outWarning ) {
2023-12-13 16:09:52 +00:00
ConstStringRef context = " DeviceBinaryFormat::zebin::ZeInfo::Kernel " ;
2023-02-16 15:09:51 +00:00
bool valid = validateCountExactly ( outZeInfoKernelSections . nameNd , 1U , outErrReason , Tags : : Kernel : : name , context ) ;
valid & = validateCountExactly ( outZeInfoKernelSections . executionEnvNd , 1U , outErrReason , Tags : : Kernel : : executionEnv , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . attributesNd , 1U , outErrReason , Tags : : Kernel : : attributes , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . debugEnvNd , 1U , outErrReason , Tags : : Kernel : : debugEnv , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . payloadArgumentsNd , 1U , outErrReason , Tags : : Kernel : : payloadArguments , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . perThreadPayloadArgumentsNd , 1U , outErrReason , Tags : : Kernel : : perThreadPayloadArguments , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . bindingTableIndicesNd , 1U , outErrReason , Tags : : Kernel : : bindingTableIndices , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . perThreadMemoryBuffersNd , 1U , outErrReason , Tags : : Kernel : : perThreadMemoryBuffers , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . experimentalPropertiesNd , 1U , outErrReason , Tags : : Kernel : : experimentalProperties , context ) ;
valid & = validateCountAtMost ( outZeInfoKernelSections . inlineSamplersNd , 1U , outErrReason , Tags : : Kernel : : inlineSamplers , context ) ;
2023-12-12 14:49:00 +00:00
return valid ? DecodeError : : success : DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
template < typename T >
bool readZeInfoValueChecked ( const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node , T & outValue , ConstStringRef context , std : : string & outErrReason ) {
if ( parser . readValueChecked ( node , outValue ) ) {
return true ;
}
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : could not read " + parser . readKey ( node ) . str ( ) + " from : [ " + parser . readValue ( node ) . str ( ) + " ] in context of : " + context . str ( ) + " \n " ) ;
2020-07-30 13:18:54 +02:00
return false ;
}
2023-11-23 17:09:04 +00:00
template < typename DestinationT , size_t len >
bool readZeInfoValueCollectionCheckedArr ( std : : array < DestinationT , len > & vec , const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node , ConstStringRef context , std : : string & outErrReason ) {
2021-07-26 12:09:15 +00:00
auto collectionNodes = parser . createChildrenRange ( node ) ;
size_t index = 0U ;
bool isValid = true ;
for ( const auto & elementNd : collectionNodes ) {
isValid & = readZeInfoValueChecked ( parser , elementNd , vec [ index + + ] , context , outErrReason ) ;
}
2023-11-23 17:09:04 +00:00
if ( index ! = len ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : wrong size of collection " + parser . readKey ( node ) . str ( ) + " in context of : " + context . str ( ) + " . Got : " + std : : to_string ( index ) + " expected : " + std : : to_string ( len ) + " \n " ) ;
2021-07-26 12:09:15 +00:00
isValid = false ;
}
return isValid ;
}
2023-11-23 17:09:04 +00:00
template < typename DestinationT , size_t len >
bool readZeInfoValueCollectionChecked ( DestinationT ( & vec ) [ len ] , const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node , ConstStringRef context , std : : string & outErrReason ) {
auto & array = reinterpret_cast < std : : array < DestinationT , len > & > ( vec ) ;
2022-09-07 13:21:53 +00:00
return readZeInfoValueCollectionCheckedArr ( array , parser , node , context , outErrReason ) ;
}
2022-08-09 18:46:36 +00:00
template < typename T >
bool readEnumChecked ( ConstStringRef enumString , T & outValue , ConstStringRef kernelName , std : : string & outErrReason ) {
using EnumLooker = NEO : : Zebin : : ZeInfo : : EnumLookup : : EnumLooker < T > ;
auto enumVal = EnumLooker : : members . find ( enumString ) ;
outValue = enumVal . value_or ( static_cast < T > ( 0 ) ) ;
2020-08-30 08:50:00 +02:00
2022-08-09 18:46:36 +00:00
if ( false = = enumVal . has_value ( ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Unhandled \" " + enumString . str ( ) + " \" " + EnumLooker : : name . str ( ) + " in context of " + kernelName . str ( ) + " \n " ) ;
2020-08-30 08:50:00 +02:00
}
2022-08-09 18:46:36 +00:00
return enumVal . has_value ( ) ;
2020-08-30 08:50:00 +02:00
}
2022-08-09 18:46:36 +00:00
template < typename T >
bool readZeInfoEnumChecked ( const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node , T & outValue , ConstStringRef kernelName , std : : string & outErrReason ) {
auto token = parser . getValueToken ( node ) ;
2020-08-30 08:50:00 +02:00
if ( nullptr = = token ) {
return false ;
}
auto tokenValue = token - > cstrref ( ) ;
2022-08-09 18:46:36 +00:00
return readEnumChecked ( tokenValue , outValue , kernelName , outErrReason ) ;
2020-08-30 08:50:00 +02:00
}
2023-02-16 15:09:51 +00:00
template bool readZeInfoEnumChecked < Types : : Kernel : : PayloadArgument : : ArgTypeT > ( const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node , Types : : Kernel : : PayloadArgument : : ArgTypeT & outValue , ConstStringRef kernelName , std : : string & outErrReason ) ;
2020-08-30 08:50:00 +02:00
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoGlobalHostAceessTable ( const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node ,
ZeInfoGlobalHostAccessTables & outDeviceNameToHostTable ,
ConstStringRef context ,
std : : string & outErrReason , std : : string & outWarning ) {
bool validTable = true ;
for ( const auto & globalHostAccessNameNd : parser . createChildrenRange ( node ) ) {
outDeviceNameToHostTable . resize ( outDeviceNameToHostTable . size ( ) + 1 ) ;
for ( const auto & globalHostAccessNameMemberNd : parser . createChildrenRange ( globalHostAccessNameNd ) ) {
auto & globalHostAccessMetadata = * outDeviceNameToHostTable . rbegin ( ) ;
auto key = parser . readKey ( globalHostAccessNameMemberNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : GlobalHostAccessTable : : deviceName = = key ) {
2023-01-10 17:09:40 +00:00
validTable & = readZeInfoValueChecked ( parser , globalHostAccessNameMemberNd , globalHostAccessMetadata . deviceName , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : GlobalHostAccessTable : : hostName = = key ) {
2023-01-10 17:09:40 +00:00
validTable & = readZeInfoValueChecked ( parser , globalHostAccessNameMemberNd , globalHostAccessMetadata . hostName , context , outErrReason ) ;
2020-07-30 13:18:54 +02:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" for payload argument in context of " + context . str ( ) + " \n " ) ;
2020-07-30 13:18:54 +02:00
}
}
}
2023-12-12 14:49:00 +00:00
return validTable ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
2023-11-23 17:09:04 +00:00
template < typename ElSize , size_t len >
bool setVecArgIndicesBasedOnSize ( CrossThreadDataOffset ( & vec ) [ len ] , size_t vecSize , CrossThreadDataOffset baseOffset ) {
2023-01-10 17:09:40 +00:00
switch ( vecSize ) {
default :
return false ;
case sizeof ( ElSize ) * 3 :
vec [ 2 ] = static_cast < CrossThreadDataOffset > ( baseOffset + 2 * sizeof ( ElSize ) ) ;
[[fallthrough]] ;
case sizeof ( ElSize ) * 2 :
vec [ 1 ] = static_cast < CrossThreadDataOffset > ( baseOffset + 1 * sizeof ( ElSize ) ) ;
[[fallthrough]] ;
case sizeof ( ElSize ) * 1 :
vec [ 0 ] = static_cast < CrossThreadDataOffset > ( baseOffset + 0 * sizeof ( ElSize ) ) ;
break ;
}
return true ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
void setSSHOffsetBasedOnBti ( SurfaceStateHeapOffset & sshOffset , int32_t bti , uint8_t & outNumBtEntries ) {
if ( bti = = - 1 ) {
return ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
constexpr auto surfaceStateSize = 64U ;
sshOffset = surfaceStateSize * bti ;
outNumBtEntries = std : : max < uint8_t > ( outNumBtEntries , static_cast < uint8_t > ( bti + 1 ) ) ;
2020-07-30 13:18:54 +02:00
}
2023-02-16 15:09:51 +00:00
DecodeError readZeInfoVersionFromZeInfo ( Types : : Version & dst ,
2023-01-10 17:09:40 +00:00
NEO : : Yaml : : YamlParser & yamlParser , const NEO : : Yaml : : Node & versionNd , std : : string & outErrReason , std : : string & outWarning ) {
if ( nullptr = = yamlParser . getValueToken ( versionNd ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Invalid version format - expected \' MAJOR.MINOR \' string \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2022-10-06 09:50:38 +00:00
}
2023-01-10 17:09:40 +00:00
auto versionStr = yamlParser . readValueNoQuotes ( versionNd ) ;
return populateZeInfoVersion ( dst , versionStr , outErrReason ) ;
}
2022-10-06 09:50:38 +00:00
2023-02-16 15:09:51 +00:00
DecodeError populateZeInfoVersion ( Types : : Version & dst , ConstStringRef & versionStr , std : : string & outErrReason ) {
2023-01-10 17:09:40 +00:00
StackVec < char , 32 > nullTerminated { versionStr . begin ( ) , versionStr . end ( ) } ;
nullTerminated . push_back ( ' \0 ' ) ;
auto separator = std : : find ( nullTerminated . begin ( ) , nullTerminated . end ( ) , ' . ' ) ;
if ( ( nullTerminated . end ( ) = = separator ) | | ( nullTerminated . begin ( ) = = separator ) | | ( & * nullTerminated . rbegin ( ) = = separator + 1 ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Invalid version format - expected 'MAJOR.MINOR' string, got : " + std : : string { versionStr } + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
* separator = 0 ;
dst . major = atoi ( nullTerminated . begin ( ) ) ;
dst . minor = atoi ( separator + 1 ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2022-10-06 09:50:38 +00:00
}
2023-01-10 17:09:40 +00:00
DecodeError populateExternalFunctionsMetadata ( NEO : : ProgramInfo & dst , NEO : : Yaml : : YamlParser & yamlParser , const NEO : : Yaml : : Node & functionNd , std : : string & outErrReason , std : : string & outWarning ) {
ConstStringRef functionName ;
2023-02-16 15:09:51 +00:00
Types : : Function : : ExecutionEnv : : ExecutionEnvBaseT execEnv = { } ;
2023-01-10 17:09:40 +00:00
bool isValid = true ;
for ( const auto & functionMetadataNd : yamlParser . createChildrenRange ( functionNd ) ) {
auto key = yamlParser . readKey ( functionMetadataNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Function : : name = = key ) {
2023-01-10 17:09:40 +00:00
functionName = yamlParser . readValueNoQuotes ( functionMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Function : : executionEnv = = key ) {
2023-01-10 17:09:40 +00:00
auto execEnvErr = readZeInfoExecutionEnvironment ( yamlParser , functionMetadataNd , execEnv , " external functions " , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( execEnvErr ! = DecodeError : : success ) {
2023-01-10 17:09:40 +00:00
isValid = false ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + yamlParser . readKey ( functionMetadataNd ) . str ( ) + " \" in context of : external functions \n " ) ;
2020-07-30 13:18:54 +02:00
}
}
2023-01-10 17:09:40 +00:00
if ( isValid ) {
2023-03-20 12:46:06 +00:00
NEO : : ExternalFunctionInfo extFunInfo { } ;
2023-01-10 17:09:40 +00:00
extFunInfo . functionName = functionName . str ( ) ;
extFunInfo . barrierCount = static_cast < uint8_t > ( execEnv . barrierCount ) ;
extFunInfo . numGrfRequired = static_cast < uint16_t > ( execEnv . grfCount ) ;
extFunInfo . simdSize = static_cast < uint8_t > ( execEnv . simdSize ) ;
2023-03-20 12:46:06 +00:00
extFunInfo . hasRTCalls = execEnv . hasRTCalls ;
2023-01-10 17:09:40 +00:00
dst . externalFunctions . push_back ( extFunInfo ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
} else {
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
DecodeError readKernelMiscArgumentInfos ( const NEO : : Yaml : : YamlParser & parser , const NEO : : Yaml : : Node & node , KernelMiscArgInfos & kernelMiscArgInfosVec , std : : string & outErrReason , std : : string & outWarning ) {
bool validArgInfo = true ;
for ( const auto & argInfoMemberNode : parser . createChildrenRange ( node ) ) {
kernelMiscArgInfosVec . resize ( kernelMiscArgInfosVec . size ( ) + 1 ) ;
auto & metadataExtended = * kernelMiscArgInfosVec . rbegin ( ) ;
for ( const auto & singleArgInfoMember : parser . createChildrenRange ( argInfoMemberNode ) ) {
auto key = parser . readKey ( singleArgInfoMember ) ;
2023-02-16 15:09:51 +00:00
if ( key = = Tags : : KernelMiscInfo : : ArgsInfo : : name ) {
validArgInfo & = readZeInfoValueChecked ( parser , singleArgInfoMember , metadataExtended . argName , Tags : : kernelMiscInfo , outErrReason ) ;
} else if ( key = = Tags : : KernelMiscInfo : : ArgsInfo : : accessQualifier ) {
validArgInfo & = readZeInfoValueChecked ( parser , singleArgInfoMember , metadataExtended . accessQualifier , Tags : : kernelMiscInfo , outErrReason ) ;
} else if ( key = = Tags : : KernelMiscInfo : : ArgsInfo : : addressQualifier ) {
validArgInfo & = readZeInfoValueChecked ( parser , singleArgInfoMember , metadataExtended . addressQualifier , Tags : : kernelMiscInfo , outErrReason ) ;
} else if ( key = = Tags : : KernelMiscInfo : : ArgsInfo : : index ) {
2023-01-10 17:09:40 +00:00
validArgInfo & = parser . readValueChecked ( singleArgInfoMember , metadataExtended . index ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : KernelMiscInfo : : ArgsInfo : : typeName ) {
2023-01-10 17:09:40 +00:00
metadataExtended . typeName = parser . readValueNoQuotes ( singleArgInfoMember ) . str ( ) ;
validArgInfo & = ( false = = metadataExtended . typeName . empty ( ) ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : KernelMiscInfo : : ArgsInfo : : typeQualifiers ) {
validArgInfo & = readZeInfoValueChecked ( parser , singleArgInfoMember , metadataExtended . typeQualifiers , Tags : : kernelMiscInfo , outErrReason ) ;
2020-08-30 08:50:00 +02:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin : KernelMiscInfo : Unrecognized argsInfo member " + key . str ( ) + " \n " ) ;
2020-08-30 08:50:00 +02:00
}
}
2023-01-10 17:09:40 +00:00
if ( - 1 = = metadataExtended . index ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Error : KernelMiscInfo : ArgInfo index missing (has default value -1) " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2020-08-30 08:50:00 +02:00
}
2023-12-12 14:49:00 +00:00
return validArgInfo ? DecodeError : : success : DecodeError : : invalidBinary ;
2020-08-30 08:50:00 +02:00
}
2023-01-10 17:09:40 +00:00
void populateKernelMiscInfo ( KernelDescriptor & dst , KernelMiscArgInfos & kernelMiscArgInfosVec , std : : string & outErrReason , std : : string & outWarning ) {
auto populateIfNotEmpty = [ ] ( std : : string & src , std : : string & dst , ConstStringRef context , std : : string & warnings ) {
if ( false = = src . empty ( ) ) {
dst = std : : move ( src ) ;
} else {
2023-12-13 16:09:52 +00:00
warnings . append ( " DeviceBinaryFormat::zebin : KernelMiscInfo : ArgInfo member \" " + context . str ( ) + " \" missing. Ignoring. \n " ) ;
2022-02-23 11:48:31 +00:00
}
2023-01-10 17:09:40 +00:00
} ;
dst . explicitArgsExtendedMetadata . resize ( kernelMiscArgInfosVec . size ( ) ) ;
for ( auto & srcMetadata : kernelMiscArgInfosVec ) {
ArgTypeMetadataExtended dstMetadata ;
2023-02-16 15:09:51 +00:00
populateIfNotEmpty ( srcMetadata . argName , dstMetadata . argName , Tags : : KernelMiscInfo : : ArgsInfo : : name , outWarning ) ;
populateIfNotEmpty ( srcMetadata . accessQualifier , dstMetadata . accessQualifier , Tags : : KernelMiscInfo : : ArgsInfo : : accessQualifier , outWarning ) ;
populateIfNotEmpty ( srcMetadata . addressQualifier , dstMetadata . addressQualifier , Tags : : KernelMiscInfo : : ArgsInfo : : addressQualifier , outWarning ) ;
populateIfNotEmpty ( srcMetadata . typeName , dstMetadata . type , Tags : : KernelMiscInfo : : ArgsInfo : : typeName , outWarning ) ;
populateIfNotEmpty ( srcMetadata . typeQualifiers , dstMetadata . typeQualifiers , Tags : : KernelMiscInfo : : ArgsInfo : : typeQualifiers , outWarning ) ;
2023-01-10 17:09:40 +00:00
ArgTypeTraits dstTypeTraits = { } ;
dstTypeTraits . accessQualifier = KernelArgMetadata : : parseAccessQualifier ( dstMetadata . accessQualifier ) ;
dstTypeTraits . addressQualifier = KernelArgMetadata : : parseAddressSpace ( dstMetadata . addressQualifier ) ;
dstTypeTraits . typeQualifiers = KernelArgMetadata : : parseTypeQualifiers ( dstMetadata . typeQualifiers ) ;
dst . payloadMappings . explicitArgs . at ( srcMetadata . index ) . getTraits ( ) = std : : move ( dstTypeTraits ) ;
dstMetadata . type = dstMetadata . type . substr ( 0U , dstMetadata . type . find ( " ; " ) ) ;
dst . explicitArgsExtendedMetadata . at ( srcMetadata . index ) = std : : move ( dstMetadata ) ;
2022-02-23 11:48:31 +00:00
}
}
2023-01-10 17:09:40 +00:00
DecodeError decodeAndPopulateKernelMiscInfo ( size_t kernelMiscInfoOffset , std : : vector < NEO : : KernelInfo * > & kernelInfos , ConstStringRef metadataString , std : : string & outErrReason , std : : string & outWarning ) {
if ( std : : string : : npos = = kernelMiscInfoOffset ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Position of " + Tags : : kernelMiscInfo . str ( ) + " not set - may be missing in zeInfo. \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
ConstStringRef kernelMiscInfoString ( reinterpret_cast < const char * > ( metadataString . begin ( ) + kernelMiscInfoOffset ) , metadataString . size ( ) - kernelMiscInfoOffset ) ;
NEO : : KernelInfo * kernelInfo = nullptr ;
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
NEO : : Yaml : : YamlParser parser ;
bool parseSuccess = parser . parse ( kernelMiscInfoString , outErrReason , outWarning ) ;
if ( false = = parseSuccess ) {
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2022-12-14 09:46:25 +00:00
}
2023-01-09 17:23:01 +00:00
2023-01-10 17:09:40 +00:00
auto kernelMiscInfoSectionNode = parser . createChildrenRange ( * parser . getRoot ( ) ) ;
auto validMetadata = true ;
using KernelArgsMiscInfoVec = std : : vector < std : : pair < std : : string , KernelMiscArgInfos > > ;
KernelArgsMiscInfoVec kernelArgsMiscInfoVec ;
2022-12-14 09:46:25 +00:00
2023-01-10 17:09:40 +00:00
for ( const auto & kernelMiscInfoNode : parser . createChildrenRange ( * kernelMiscInfoSectionNode . begin ( ) ) ) {
std : : string kernelName { } ;
KernelMiscArgInfos miscArgInfosVec ;
for ( const auto & kernelMiscInfoNodeMetadata : parser . createChildrenRange ( kernelMiscInfoNode ) ) {
auto key = parser . readKey ( kernelMiscInfoNodeMetadata ) ;
2023-02-16 15:09:51 +00:00
if ( key = = Tags : : KernelMiscInfo : : name ) {
validMetadata & = readZeInfoValueChecked ( parser , kernelMiscInfoNodeMetadata , kernelName , Tags : : kernelMiscInfo , outErrReason ) ;
} else if ( key = = Tags : : KernelMiscInfo : : argsInfo ) {
2023-12-12 14:49:00 +00:00
validMetadata & = ( DecodeError : : success = = readKernelMiscArgumentInfos ( parser , kernelMiscInfoNodeMetadata , miscArgInfosVec , outErrReason , outWarning ) ) ;
2023-01-10 17:09:40 +00:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin : Unrecognized entry: " + key . str ( ) + " in " + Tags : : kernelMiscInfo . str ( ) + " zeInfo's section. \n " ) ;
2023-01-10 17:09:40 +00:00
}
}
if ( kernelName . empty ( ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Error : Missing kernel name in " + Tags : : kernelMiscInfo . str ( ) + " section. \n " ) ;
2023-01-10 17:09:40 +00:00
validMetadata = false ;
}
kernelArgsMiscInfoVec . emplace_back ( std : : make_pair ( std : : move ( kernelName ) , miscArgInfosVec ) ) ;
}
if ( false = = validMetadata ) {
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
for ( auto & [ kName , miscInfos ] : kernelArgsMiscInfoVec ) {
for ( auto dstKernelInfo : kernelInfos ) {
if ( dstKernelInfo - > kernelDescriptor . kernelMetadata . kernelName = = kName ) {
kernelInfo = dstKernelInfo ;
break ;
}
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
if ( nullptr = = kernelInfo ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Error : Cannot find kernel info for kernel " + kName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
populateKernelMiscInfo ( kernelInfo - > kernelDescriptor , miscInfos , outErrReason , outWarning ) ;
2020-07-30 13:18:54 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfo ( ProgramInfo & dst , ConstStringRef zeInfo , std : : string & outErrReason , std : : string & outWarning ) {
Yaml : : YamlParser yamlParser ;
bool parseSuccess = yamlParser . parse ( zeInfo , outErrReason , outWarning ) ;
if ( false = = parseSuccess ) {
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
if ( yamlParser . empty ( ) ) {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin : Empty kernels metadata section (.ze_info) \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
ZeInfoSections zeInfoSections { } ;
extractZeInfoSections ( yamlParser , zeInfoSections , outWarning ) ;
if ( false = = validateZeInfoSectionsCount ( zeInfoSections , outErrReason ) ) {
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-08-19 13:07:34 +02:00
}
2024-01-22 15:17:44 +00:00
Types : : Version zeInfoVersion { } ;
auto zeInfoDecodeError = decodeZeInfoVersion ( yamlParser , zeInfoSections , outErrReason , outWarning , zeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoDecodeError ) {
2023-01-10 17:09:40 +00:00
return zeInfoDecodeError ;
2020-07-30 13:18:54 +02:00
}
2021-03-15 16:51:56 +01:00
2023-01-10 17:09:40 +00:00
zeInfoDecodeError = decodeZeInfoGlobalHostAccessTable ( dst , yamlParser , zeInfoSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoDecodeError ) {
2023-01-10 17:09:40 +00:00
return zeInfoDecodeError ;
2022-06-03 16:01:33 +00:00
}
2023-01-10 17:09:40 +00:00
zeInfoDecodeError = decodeZeInfoFunctions ( dst , yamlParser , zeInfoSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoDecodeError ) {
2023-01-10 17:09:40 +00:00
return zeInfoDecodeError ;
2021-03-15 16:51:56 +01:00
}
2021-03-17 15:31:36 +01:00
2024-01-22 15:17:44 +00:00
zeInfoDecodeError = decodeZeInfoKernels ( dst , yamlParser , zeInfoSections , outErrReason , outWarning , zeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoDecodeError ) {
2023-01-10 17:09:40 +00:00
return zeInfoDecodeError ;
2021-03-17 15:31:36 +01:00
}
2021-07-16 10:31:05 +00:00
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2022-10-27 10:59:05 +00:00
2024-01-22 15:17:44 +00:00
DecodeError decodeZeInfoVersion ( Yaml : : YamlParser & parser , const ZeInfoSections & zeInfoSections , std : : string & outErrReason , std : : string & outWarning , Types : : Version & srcZeInfoVersion ) {
2023-01-10 17:09:40 +00:00
if ( false = = zeInfoSections . version . empty ( ) ) {
2024-01-22 15:17:44 +00:00
auto err = readZeInfoVersionFromZeInfo ( srcZeInfoVersion , parser , * zeInfoSections . version [ 0 ] , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = err ) {
2023-01-10 17:09:40 +00:00
return err ;
2022-12-14 09:46:25 +00:00
}
2024-01-22 15:17:44 +00:00
err = validateZeInfoVersion ( srcZeInfoVersion , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = err ) {
2023-01-10 17:09:40 +00:00
return err ;
2022-12-14 09:46:25 +00:00
}
2023-01-10 17:09:40 +00:00
} else {
2024-01-22 15:17:44 +00:00
srcZeInfoVersion = zeInfoDecoderVersion ;
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : No version info provided (i.e. no " + Tags : : version . str ( ) + " entry in global scope of DeviceBinaryFormat::zebin::.ze_info) - will use decoder's default : \' " + std : : to_string ( zeInfoDecoderVersion . major ) + " . " + std : : to_string ( zeInfoDecoderVersion . minor ) + " \' \n " ) ;
2022-08-09 17:17:54 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoGlobalHostAccessTable ( ProgramInfo & dst , Yaml : : YamlParser & parser , const ZeInfoSections & zeInfoSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = zeInfoSections . globalHostAccessTable . empty ( ) ) {
ZeInfoGlobalHostAccessTables globalHostAccessMapping ;
auto zeInfoErr = readZeInfoGlobalHostAceessTable ( parser , * zeInfoSections . globalHostAccessTable [ 0 ] , globalHostAccessMapping , " globalHostAccessTable " , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoErr ) {
2023-01-10 17:09:40 +00:00
return zeInfoErr ;
}
dst . globalsDeviceToHostNameMap . reserve ( globalHostAccessMapping . size ( ) ) ;
for ( auto it = globalHostAccessMapping . begin ( ) ; it ! = globalHostAccessMapping . end ( ) ; it + + ) {
dst . globalsDeviceToHostNameMap [ it - > deviceName ] = it - > hostName ;
}
2022-10-06 09:50:38 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2022-10-06 09:50:38 +00:00
}
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoFunctions ( ProgramInfo & dst , Yaml : : YamlParser & parser , const ZeInfoSections & zeInfoSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = zeInfoSections . functions . empty ( ) ) {
for ( const auto & functionNd : parser . createChildrenRange ( * zeInfoSections . functions [ 0 ] ) ) {
auto zeInfoErr = populateExternalFunctionsMetadata ( dst , parser , functionNd , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoErr ) {
2023-01-10 17:09:40 +00:00
return zeInfoErr ;
}
}
2022-09-08 11:12:08 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2022-09-08 11:12:08 +00:00
2024-01-22 15:17:44 +00:00
DecodeError decodeZeInfoKernels ( ProgramInfo & dst , Yaml : : YamlParser & parser , const ZeInfoSections & zeInfoSections , std : : string & outErrReason , std : : string & outWarning , const Types : : Version & srcZeInfoVersion ) {
2023-01-10 17:09:40 +00:00
UNRECOVERABLE_IF ( zeInfoSections . kernels . size ( ) ! = 1U ) ;
for ( const auto & kernelNd : parser . createChildrenRange ( * zeInfoSections . kernels [ 0 ] ) ) {
auto kernelInfo = std : : make_unique < KernelInfo > ( ) ;
2024-01-22 15:17:44 +00:00
auto zeInfoErr = decodeZeInfoKernelEntry ( kernelInfo - > kernelDescriptor , parser , kernelNd , dst . grfSize , dst . minScratchSpaceSize , outErrReason , outWarning , srcZeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = zeInfoErr ) {
2023-01-10 17:09:40 +00:00
return zeInfoErr ;
2020-08-30 08:50:00 +02:00
}
2024-01-18 13:23:34 +00:00
if ( kernelInfo - > kernelDescriptor . kernelMetadata . kernelName = = Zebin : : Elf : : SectionNames : : externalFunctions ) {
dst . functionPointerWithIndirectAccessExists | = kernelInfo - > kernelDescriptor . kernelAttributes . hasIndirectStatelessAccess ;
}
2020-08-30 08:50:00 +02:00
2023-01-10 17:09:40 +00:00
dst . kernelInfos . push_back ( kernelInfo . release ( ) ) ;
2020-08-30 08:50:00 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-08-30 08:50:00 +02:00
}
2024-01-22 15:17:44 +00:00
DecodeError decodeZeInfoKernelEntry ( NEO : : KernelDescriptor & dst , NEO : : Yaml : : YamlParser & yamlParser , const NEO : : Yaml : : Node & kernelNd , uint32_t grfSize , uint32_t minScratchSpaceSize , std : : string & outErrReason , std : : string & outWarning , const Types : : Version & srcZeInfoVersion ) {
2020-07-30 13:18:54 +02:00
ZeInfoKernelSections zeInfokernelSections ;
2023-02-16 15:09:51 +00:00
extractZeInfoKernelSections ( yamlParser , kernelNd , zeInfokernelSections , " .ze_info " , outWarning ) ;
2020-07-30 13:18:54 +02:00
auto extractError = validateZeInfoKernelSectionsCount ( zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = extractError ) {
2020-07-30 13:18:54 +02:00
return extractError ;
}
2023-12-13 16:09:52 +00:00
dst . kernelAttributes . binaryFormat = DeviceBinaryFormat : : zebin ;
2023-01-10 17:09:40 +00:00
dst . kernelMetadata . kernelName = yamlParser . readValueNoQuotes ( * zeInfokernelSections . nameNd [ 0 ] ) . str ( ) ;
2020-07-30 13:18:54 +02:00
2024-01-22 15:17:44 +00:00
auto decodeError = decodeZeInfoKernelExecutionEnvironment ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning , srcZeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelUserAttributes ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2022-09-07 13:21:53 +00:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelDebugEnvironment ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2021-08-30 13:59:08 +00:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelPerThreadPayloadArguments ( dst , yamlParser , zeInfokernelSections , grfSize , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelPayloadArguments ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelInlineSamplers ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2022-10-06 09:50:38 +00:00
}
2024-01-22 15:17:44 +00:00
decodeError = decodeZeInfoKernelPerThreadMemoryBuffers ( dst , yamlParser , zeInfokernelSections , minScratchSpaceSize , outErrReason , outWarning , srcZeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2020-08-30 08:50:00 +02:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelExperimentalProperties ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2022-08-12 14:58:41 +00:00
}
2023-01-10 17:09:40 +00:00
decodeError = decodeZeInfoKernelBindingTableEntries ( dst , yamlParser , zeInfokernelSections , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeError ) {
2023-01-10 17:09:40 +00:00
return decodeError ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
if ( dst . payloadMappings . bindingTable . numEntries > 0U ) {
generateSSHWithBindingTable ( dst ) ;
2023-11-23 09:37:14 +00:00
DEBUG_BREAK_IF ( dst . kernelAttributes . numArgsStateful > dst . payloadMappings . bindingTable . numEntries ) ;
dst . kernelAttributes . numArgsStateful = std : : max ( dst . kernelAttributes . numArgsStateful , static_cast < uint16_t > ( dst . payloadMappings . bindingTable . numEntries ) ) ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
if ( dst . payloadMappings . samplerTable . numSamplers > 0U ) {
generateDSH ( dst ) ;
2021-03-19 14:58:46 +00:00
}
2020-07-30 13:18:54 +02:00
2023-11-30 08:32:25 +00:00
if ( NEO : : debugManager . flags . ZebinAppendElws . get ( ) ) {
2023-01-10 17:09:40 +00:00
dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize [ 0 ] = dst . kernelAttributes . crossThreadDataSize ;
dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize [ 1 ] = dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize [ 0 ] + 4 ;
dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize [ 2 ] = dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize [ 1 ] + 4 ;
dst . kernelAttributes . crossThreadDataSize = alignUp ( dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize [ 2 ] + 4 , 32 ) ;
2020-07-30 13:18:54 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2022-10-06 09:50:38 +00:00
2024-01-22 15:17:44 +00:00
DecodeError decodeZeInfoKernelExecutionEnvironment ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning , const Types : : Version & srcZeInfoVersion ) {
2023-01-10 17:09:40 +00:00
KernelExecutionEnvBaseT execEnv ;
auto execEnvErr = readZeInfoExecutionEnvironment ( parser , * kernelSections . executionEnvNd [ 0 ] , execEnv , dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = execEnvErr ) {
2023-01-10 17:09:40 +00:00
return execEnvErr ;
2020-08-30 08:50:00 +02:00
}
2024-01-22 15:17:44 +00:00
populateKernelExecutionEnvironment ( dst , execEnv , srcZeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2020-08-30 08:50:00 +02:00
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoExecutionEnvironment ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelExecutionEnvBaseT & outExecEnv , ConstStringRef context ,
std : : string & outErrReason , std : : string & outWarning ) {
bool validExecEnv = true ;
for ( const auto & execEnvMetadataNd : parser . createChildrenRange ( node ) ) {
auto key = parser . readKey ( execEnvMetadataNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : ExecutionEnv : : barrierCount = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . barrierCount , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : disableMidThreadPreemption = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . disableMidThreadPreemption , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : euThreadCount = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . euThreadCount , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : grfCount = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . grfCount , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : has4gbBuffers = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . has4GBBuffers , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasDpas = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasDpas , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasFenceForImageAccess = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasFenceForImageAccess , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasGlobalAtomics = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasGlobalAtomics , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasMultiScratchSpaces = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasMultiScratchSpaces , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasNoStatelessWrite = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasNoStatelessWrite , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasStackCalls = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasStackCalls , context , outErrReason ) ;
2023-03-20 12:46:06 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasRTCalls = = key ) {
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasRTCalls , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hwPreemptionMode = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hwPreemptionMode , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : inlineDataPayloadSize = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . inlineDataPayloadSize , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : offsetToSkipPerThreadDataLoad = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . offsetToSkipPerThreadDataLoad , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : offsetToSkipSetFfidGp = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . offsetToSkipSetFfidGp , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : requiredSubGroupSize = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . requiredSubGroupSize , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : requiredWorkGroupSize = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueCollectionChecked ( outExecEnv . requiredWorkGroupSize , parser , execEnvMetadataNd , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : requireDisableEUFusion = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . requireDisableEUFusion , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : simdSize = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . simdSize , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : slmSize = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . slmSize , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : subgroupIndependentForwardProgress = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . subgroupIndependentForwardProgress , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : workGroupWalkOrderDimensions = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueCollectionChecked ( outExecEnv . workgroupWalkOrderDimensions , parser , execEnvMetadataNd , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : threadSchedulingMode = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoEnumChecked ( parser , execEnvMetadataNd , outExecEnv . threadSchedulingMode , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : indirectStatelessCount = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . indirectStatelessCount , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : hasSample = = key ) {
2023-01-10 17:09:40 +00:00
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . hasSample , context , outErrReason ) ;
2024-01-22 15:17:44 +00:00
} else if ( Tags : : Kernel : : ExecutionEnv : : privateSize = = key ) {
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . privateSize , context , outErrReason ) ;
} else if ( Tags : : Kernel : : ExecutionEnv : : spillSize = = key ) {
validExecEnv & = readZeInfoValueChecked ( parser , execEnvMetadataNd , outExecEnv . spillSize , context , outErrReason ) ;
2023-01-10 17:09:40 +00:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" in context of " + context . str ( ) + " \n " ) ;
2020-07-30 13:18:54 +02:00
}
2023-01-09 17:23:01 +00:00
}
2023-01-10 17:09:40 +00:00
if ( false = = validExecEnv ) {
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
if ( ( outExecEnv . simdSize ! = 1 ) & & ( outExecEnv . simdSize ! = 8 ) & & ( outExecEnv . simdSize ! = 16 ) & & ( outExecEnv . simdSize ! = 32 ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Invalid simd size : " + std : : to_string ( outExecEnv . simdSize ) + " in context of : " + context . str ( ) + " . Expected 1, 8, 16 or 32. Got : " + std : : to_string ( outExecEnv . simdSize ) + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-07-30 13:18:54 +02:00
}
2024-01-22 15:17:44 +00:00
void populateKernelExecutionEnvironment ( KernelDescriptor & dst , const KernelExecutionEnvBaseT & execEnv , const Types : : Version & srcZeInfoVersion ) {
2023-01-10 17:09:40 +00:00
dst . entryPoints . skipPerThreadDataLoad = execEnv . offsetToSkipPerThreadDataLoad ;
dst . entryPoints . skipSetFFIDGP = execEnv . offsetToSkipSetFfidGp ;
dst . kernelAttributes . flags . passInlineData = ( execEnv . inlineDataPayloadSize ! = 0 ) ;
dst . kernelAttributes . flags . requiresDisabledMidThreadPreemption = execEnv . disableMidThreadPreemption ;
dst . kernelAttributes . flags . requiresSubgroupIndependentForwardProgress = execEnv . subgroupIndependentForwardProgress ;
dst . kernelAttributes . flags . requiresDisabledEUFusion = execEnv . requireDisableEUFusion ;
dst . kernelAttributes . flags . useGlobalAtomics = execEnv . hasGlobalAtomics ;
dst . kernelAttributes . flags . useStackCalls = execEnv . hasStackCalls ;
2023-03-20 12:46:06 +00:00
dst . kernelAttributes . flags . hasRTCalls = execEnv . hasRTCalls ;
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . flags . usesFencesForReadWriteImages = execEnv . hasFenceForImageAccess ;
dst . kernelAttributes . flags . usesSystolicPipelineSelectMode = execEnv . hasDpas ;
dst . kernelAttributes . flags . usesStatelessWrites = ( false = = execEnv . hasNoStatelessWrite ) ;
dst . kernelAttributes . flags . hasSample = execEnv . hasSample ;
dst . kernelAttributes . barrierCount = execEnv . barrierCount ;
dst . kernelAttributes . bufferAddressingMode = ( execEnv . has4GBBuffers ) ? KernelDescriptor : : Stateless : KernelDescriptor : : BindfulAndStateless ;
dst . kernelAttributes . inlineDataPayloadSize = static_cast < uint16_t > ( execEnv . inlineDataPayloadSize ) ;
dst . kernelAttributes . numGrfRequired = execEnv . grfCount ;
dst . kernelAttributes . requiredWorkgroupSize [ 0 ] = static_cast < uint16_t > ( execEnv . requiredWorkGroupSize [ 0 ] ) ;
dst . kernelAttributes . requiredWorkgroupSize [ 1 ] = static_cast < uint16_t > ( execEnv . requiredWorkGroupSize [ 1 ] ) ;
dst . kernelAttributes . requiredWorkgroupSize [ 2 ] = static_cast < uint16_t > ( execEnv . requiredWorkGroupSize [ 2 ] ) ;
dst . kernelAttributes . simdSize = execEnv . simdSize ;
dst . kernelAttributes . slmInlineSize = execEnv . slmSize ;
dst . kernelAttributes . workgroupWalkOrder [ 0 ] = static_cast < uint8_t > ( execEnv . workgroupWalkOrderDimensions [ 0 ] ) ;
dst . kernelAttributes . workgroupWalkOrder [ 1 ] = static_cast < uint8_t > ( execEnv . workgroupWalkOrderDimensions [ 1 ] ) ;
dst . kernelAttributes . workgroupWalkOrder [ 2 ] = static_cast < uint8_t > ( execEnv . workgroupWalkOrderDimensions [ 2 ] ) ;
dst . kernelAttributes . hasIndirectStatelessAccess = ( execEnv . indirectStatelessCount > 0 ) ;
dst . kernelAttributes . numThreadsRequired = static_cast < uint32_t > ( execEnv . euThreadCount ) ;
2024-01-22 15:17:44 +00:00
if ( isScratchMemoryUsageDefinedInExecutionEnvironment ( srcZeInfoVersion ) ) {
dst . kernelAttributes . privateScratchMemorySize = static_cast < uint32_t > ( execEnv . privateSize ) ;
dst . kernelAttributes . spillFillScratchMemorySize = static_cast < uint32_t > ( execEnv . spillSize ) ;
}
2023-01-10 17:09:40 +00:00
2023-02-16 15:09:51 +00:00
using ThreadSchedulingMode = Types : : Kernel : : ExecutionEnv : : ThreadSchedulingMode ;
2023-01-10 17:09:40 +00:00
switch ( execEnv . threadSchedulingMode ) {
default :
dst . kernelAttributes . threadArbitrationPolicy = ThreadArbitrationPolicy : : NotPresent ;
break ;
case ThreadSchedulingMode : : ThreadSchedulingModeAgeBased :
dst . kernelAttributes . threadArbitrationPolicy = ThreadArbitrationPolicy : : AgeBased ;
break ;
case ThreadSchedulingMode : : ThreadSchedulingModeRoundRobin :
dst . kernelAttributes . threadArbitrationPolicy = ThreadArbitrationPolicy : : RoundRobin ;
break ;
case ThreadSchedulingMode : : ThreadSchedulingModeRoundRobinStall :
dst . kernelAttributes . threadArbitrationPolicy = ThreadArbitrationPolicy : : RoundRobinAfterDependency ;
break ;
2020-10-04 19:18:49 +02:00
}
2022-07-26 14:37:45 +00:00
}
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoKernelUserAttributes ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . attributesNd . empty ( ) ) {
KernelAttributesBaseT attributes ;
auto attributeErr = readZeInfoAttributes ( parser , * kernelSections . attributesNd [ 0 ] , attributes , dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = attributeErr ) {
2023-01-10 17:09:40 +00:00
return attributeErr ;
}
populateKernelSourceAttributes ( dst , attributes ) ;
2020-10-04 19:18:49 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-10-04 19:18:49 +02:00
}
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoAttributes ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelAttributesBaseT & outAttributes , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
2023-02-16 15:09:51 +00:00
namespace AttributeTypes = Types : : Kernel : : Attributes ;
2023-01-10 17:09:40 +00:00
bool validAttributes = true ;
for ( const auto & attributesMetadataNd : parser . createChildrenRange ( node ) ) {
auto key = parser . readKey ( attributesMetadataNd ) ;
2023-02-16 15:09:51 +00:00
if ( key = = Tags : : Kernel : : Attributes : : intelReqdSubgroupSize ) {
2023-01-10 17:09:40 +00:00
outAttributes . intelReqdSubgroupSize = AttributeTypes : : Defaults : : intelReqdSubgroupSize ;
validAttributes & = readZeInfoValueChecked ( parser , attributesMetadataNd , * outAttributes . intelReqdSubgroupSize , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : Kernel : : Attributes : : intelReqdWorkgroupWalkOrder ) {
2023-01-10 17:09:40 +00:00
outAttributes . intelReqdWorkgroupWalkOrder = AttributeTypes : : Defaults : : intelReqdWorkgroupWalkOrder ;
validAttributes & = readZeInfoValueCollectionCheckedArr ( * outAttributes . intelReqdWorkgroupWalkOrder , parser , attributesMetadataNd , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : Kernel : : Attributes : : reqdWorkgroupSize ) {
2023-01-10 17:09:40 +00:00
outAttributes . reqdWorkgroupSize = AttributeTypes : : Defaults : : reqdWorkgroupSize ;
validAttributes & = readZeInfoValueCollectionCheckedArr ( * outAttributes . reqdWorkgroupSize , parser , attributesMetadataNd , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : Kernel : : Attributes : : workgroupSizeHint ) {
2023-01-10 17:09:40 +00:00
outAttributes . workgroupSizeHint = AttributeTypes : : Defaults : : workgroupSizeHint ;
validAttributes & = readZeInfoValueCollectionCheckedArr ( * outAttributes . workgroupSizeHint , parser , attributesMetadataNd , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : Kernel : : Attributes : : invalidKernel ) {
2023-01-10 17:09:40 +00:00
outAttributes . invalidKernel = parser . readValue ( attributesMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( key = = Tags : : Kernel : : Attributes : : vecTypeHint ) {
2023-01-10 17:09:40 +00:00
outAttributes . vecTypeHint = parser . readValue ( attributesMetadataNd ) ;
2023-02-16 15:09:51 +00:00
} else if ( key . contains ( Tags : : Kernel : : Attributes : : hintSuffix . data ( ) ) ) {
2023-01-10 17:09:40 +00:00
outAttributes . otherHints . push_back ( { key , parser . readValue ( attributesMetadataNd ) } ) ;
2022-02-28 17:44:06 +00:00
} else {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown attribute entry \" " + key . str ( ) + " \" in context of " + context . str ( ) + " \n " ) ;
2023-01-10 17:09:40 +00:00
validAttributes = false ;
2022-02-28 17:44:06 +00:00
}
}
2023-12-12 14:49:00 +00:00
return validAttributes ? DecodeError : : success : DecodeError : : invalidBinary ;
2022-02-28 17:44:06 +00:00
}
2022-09-07 13:21:53 +00:00
std : : string attributeToString ( const int32_t & attribute ) {
return std : : to_string ( attribute ) ;
}
std : : string attributeToString ( const std : : array < int32_t , 3 > & attribute ) {
2022-11-21 17:24:36 +00:00
return std : : to_string ( attribute [ 0 ] ) + " , " + std : : to_string ( attribute [ 1 ] ) + " , " + std : : to_string ( attribute [ 2 ] ) ;
2022-09-07 13:21:53 +00:00
}
std : : string attributeToString ( ConstStringRef attribute ) {
return attribute . str ( ) ;
}
void appendAttribute ( std : : string & dst , const std : : string & attributeName , const std : : string & attributeValue ) {
if ( dst . empty ( ) = = false ) {
dst . append ( " " ) ;
}
dst . append ( attributeName + " ( " + attributeValue + " ) " ) ;
}
template < typename T >
2023-01-10 17:09:40 +00:00
void appendAttributeIfSet ( std : : string & dst , ConstStringRef attributeName , const std : : optional < T > & attributeValue ) {
2022-09-07 13:21:53 +00:00
if ( attributeValue ) {
appendAttribute ( dst , attributeName . str ( ) , attributeToString ( * attributeValue ) ) ;
}
}
2023-01-10 17:09:40 +00:00
void populateKernelSourceAttributes ( NEO : : KernelDescriptor & dst , const KernelAttributesBaseT & attributes ) {
2023-02-16 15:09:51 +00:00
namespace AttributeTags = Tags : : Kernel : : Attributes ;
namespace AttributeTypes = Types : : Kernel : : Attributes ;
2022-09-07 13:21:53 +00:00
auto & languageAttributes = dst . kernelMetadata . kernelLanguageAttributes ;
for ( auto & hint : attributes . otherHints ) {
appendAttribute ( languageAttributes , hint . first . str ( ) , hint . second . str ( ) ) ;
}
appendAttributeIfSet ( languageAttributes , AttributeTags : : intelReqdSubgroupSize , attributes . intelReqdSubgroupSize ) ;
appendAttributeIfSet ( languageAttributes , AttributeTags : : intelReqdWorkgroupWalkOrder , attributes . intelReqdWorkgroupWalkOrder ) ;
appendAttributeIfSet ( languageAttributes , AttributeTags : : reqdWorkgroupSize , attributes . reqdWorkgroupSize ) ;
appendAttributeIfSet ( languageAttributes , AttributeTags : : workgroupSizeHint , attributes . workgroupSizeHint ) ;
appendAttributeIfSet ( languageAttributes , AttributeTags : : vecTypeHint , attributes . vecTypeHint ) ;
appendAttributeIfSet ( languageAttributes , AttributeTags : : invalidKernel , attributes . invalidKernel ) ;
2024-01-15 12:34:43 +00:00
dst . kernelAttributes . flags . isInvalid = attributes . invalidKernel . has_value ( ) ;
dst . kernelAttributes . flags . requiresWorkgroupWalkOrder = attributes . intelReqdWorkgroupWalkOrder . has_value ( ) ;
2022-11-22 08:44:42 +00:00
dst . kernelMetadata . requiredSubGroupSize = static_cast < uint8_t > ( attributes . intelReqdSubgroupSize . value_or ( 0U ) ) ;
2022-09-07 13:21:53 +00:00
}
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoKernelDebugEnvironment ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . debugEnvNd . empty ( ) ) {
KernelDebugEnvBaseT debugEnv ;
auto debugEnvErr = readZeInfoDebugEnvironment ( parser , * kernelSections . debugEnvNd [ 0 ] , debugEnv , dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = debugEnvErr ) {
2023-01-10 17:09:40 +00:00
return debugEnvErr ;
2022-11-03 14:07:05 +00:00
}
2023-01-10 17:09:40 +00:00
populateKernelDebugEnvironment ( dst , debugEnv ) ;
2022-10-11 17:06:26 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2022-10-11 17:06:26 +00:00
}
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoDebugEnvironment ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelDebugEnvBaseT & outDebugEnv , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validDebugEnv = true ;
for ( const auto & debugEnvNd : parser . createChildrenRange ( node ) ) {
auto key = parser . readKey ( debugEnvNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : DebugEnv : : debugSurfaceBTI = = key ) {
2023-01-10 17:09:40 +00:00
validDebugEnv & = readZeInfoValueChecked ( parser , debugEnvNd , outDebugEnv . debugSurfaceBTI , context , outErrReason ) ;
2022-10-11 17:06:26 +00:00
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" in context of " + context . str ( ) + " \n " ) ;
2022-10-11 17:06:26 +00:00
}
2023-01-10 17:09:40 +00:00
}
2023-12-12 14:49:00 +00:00
return validDebugEnv ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2022-10-11 17:06:26 +00:00
2023-01-10 17:09:40 +00:00
void populateKernelDebugEnvironment ( NEO : : KernelDescriptor & dst , const KernelDebugEnvBaseT & debugEnv ) {
if ( debugEnv . debugSurfaceBTI = = 0 ) {
setSSHOffsetBasedOnBti ( dst . payloadMappings . implicitArgs . systemThreadSurfaceAddress . bindful , 0U , dst . payloadMappings . bindingTable . numEntries ) ;
}
}
2022-10-11 17:06:26 +00:00
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoKernelPerThreadPayloadArguments ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , const uint32_t grfSize , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . perThreadPayloadArgumentsNd . empty ( ) ) {
KernelPerThreadPayloadArguments perThreadPayloadArguments ;
auto perThreadPayloadArgsErr = readZeInfoPerThreadPayloadArguments ( parser , * kernelSections . perThreadPayloadArgumentsNd [ 0 ] , perThreadPayloadArguments ,
dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = perThreadPayloadArgsErr ) {
2023-01-10 17:09:40 +00:00
return perThreadPayloadArgsErr ;
}
for ( const auto & arg : perThreadPayloadArguments ) {
auto decodeErr = populateKernelPerThreadPayloadArgument ( dst , arg , grfSize , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeErr ) {
2023-01-10 17:09:40 +00:00
return decodeErr ;
}
}
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2022-11-08 14:33:20 +00:00
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoPerThreadPayloadArguments ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelPerThreadPayloadArguments & outPerThreadPayloadArguments , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validPerThreadPayload = true ;
for ( const auto & perThreadPayloadArgumentNd : parser . createChildrenRange ( node ) ) {
outPerThreadPayloadArguments . resize ( outPerThreadPayloadArguments . size ( ) + 1 ) ;
auto & perThreadPayloadArgMetadata = * outPerThreadPayloadArguments . rbegin ( ) ;
ConstStringRef argTypeStr ;
for ( const auto & perThreadPayloadArgumentMemberNd : parser . createChildrenRange ( perThreadPayloadArgumentNd ) ) {
auto key = parser . readKey ( perThreadPayloadArgumentMemberNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : PerThreadPayloadArgument : : argType = = key ) {
2023-01-10 17:09:40 +00:00
argTypeStr = parser . readValue ( perThreadPayloadArgumentMemberNd ) ;
validPerThreadPayload & = readZeInfoEnumChecked ( parser , perThreadPayloadArgumentMemberNd , perThreadPayloadArgMetadata . argType , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PerThreadPayloadArgument : : size = = key ) {
2023-01-10 17:09:40 +00:00
validPerThreadPayload & = readZeInfoValueChecked ( parser , perThreadPayloadArgumentMemberNd , perThreadPayloadArgMetadata . size , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PerThreadPayloadArgument : : offset = = key ) {
2023-01-10 17:09:40 +00:00
validPerThreadPayload & = readZeInfoValueChecked ( parser , perThreadPayloadArgumentMemberNd , perThreadPayloadArgMetadata . offset , context , outErrReason ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" for per-thread payload argument in context of " + context . str ( ) + " \n " ) ;
2023-01-10 17:09:40 +00:00
}
}
if ( 0 = = perThreadPayloadArgMetadata . size ) {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Skippinig 0-size per-thread argument of type : " + argTypeStr . str ( ) + " in context of " + context . str ( ) + " \n " ) ;
2023-01-10 17:09:40 +00:00
outPerThreadPayloadArguments . pop_back ( ) ;
}
2022-10-11 17:06:26 +00:00
}
2023-01-10 17:09:40 +00:00
2023-12-12 14:49:00 +00:00
return validPerThreadPayload ? DecodeError : : success : DecodeError : : invalidBinary ;
2022-10-11 17:06:26 +00:00
}
2023-01-10 17:09:40 +00:00
DecodeError populateKernelPerThreadPayloadArgument ( KernelDescriptor & dst , const KernelPerThreadPayloadArgBaseT & src , const uint32_t grfSize , std : : string & outErrReason , std : : string & outWarning ) {
switch ( src . argType ) {
default :
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid arg type in per-thread data section in context of : " + dst . kernelMetadata . kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeLocalId : {
2023-01-10 17:09:40 +00:00
if ( src . offset ! = 0 ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid offset for argument of type " + Tags : : Kernel : : PerThreadPayloadArgument : : ArgType : : localId . str ( ) + " in context of : " + dst . kernelMetadata . kernelName + " . Expected 0. \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
using LocalIdT = uint16_t ;
uint32_t singleChannelIndicesCount = ( dst . kernelAttributes . simdSize = = 32 ? 32 : 16 ) ;
uint32_t singleChannelBytes = singleChannelIndicesCount * sizeof ( LocalIdT ) ;
UNRECOVERABLE_IF ( 0 = = grfSize ) ;
singleChannelBytes = alignUp ( singleChannelBytes , grfSize ) ;
auto tupleSize = ( src . size / singleChannelBytes ) ;
switch ( tupleSize ) {
default :
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid size for argument of type " + Tags : : Kernel : : PerThreadPayloadArgument : : ArgType : : localId . str ( ) + " in context of : " + dst . kernelMetadata . kernelName + " . For simd= " + std : : to_string ( dst . kernelAttributes . simdSize ) + " expected : " + std : : to_string ( singleChannelBytes ) + " or " + std : : to_string ( singleChannelBytes * 2 ) + " or " + std : : to_string ( singleChannelBytes * 3 ) + " . Got : " + std : : to_string ( src . size ) + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
case 1 :
case 2 :
case 3 :
dst . kernelAttributes . numLocalIdChannels = static_cast < uint8_t > ( tupleSize ) ;
break ;
}
dst . kernelAttributes . localId [ 0 ] = tupleSize > 0 ;
dst . kernelAttributes . localId [ 1 ] = tupleSize > 1 ;
dst . kernelAttributes . localId [ 2 ] = tupleSize > 2 ;
dst . kernelAttributes . perThreadDataSize = dst . kernelAttributes . simdSize ;
dst . kernelAttributes . perThreadDataSize * = sizeof ( LocalIdT ) ;
dst . kernelAttributes . perThreadDataSize = alignUp ( dst . kernelAttributes . perThreadDataSize , grfSize ) ;
dst . kernelAttributes . perThreadDataSize * = dst . kernelAttributes . numLocalIdChannels ;
break ;
2022-10-11 17:06:26 +00:00
}
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypePackedLocalIds : {
2023-01-10 17:09:40 +00:00
if ( src . offset ! = 0 ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Unhandled offset for argument of type " + Tags : : Kernel : : PerThreadPayloadArgument : : ArgType : : packedLocalIds . str ( ) + " in context of : " + dst . kernelMetadata . kernelName + " . Expected 0. \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
using LocalIdT = uint16_t ;
auto tupleSize = src . size / sizeof ( LocalIdT ) ;
switch ( tupleSize ) {
default :
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid size for argument of type " + Tags : : Kernel : : PerThreadPayloadArgument : : ArgType : : packedLocalIds . str ( ) + " in context of : " + dst . kernelMetadata . kernelName + " . Expected : " + std : : to_string ( sizeof ( LocalIdT ) ) + " or " + std : : to_string ( sizeof ( LocalIdT ) * 2 ) + " or " + std : : to_string ( sizeof ( LocalIdT ) * 3 ) + " . Got : " + std : : to_string ( src . size ) + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2022-10-11 17:06:26 +00:00
2023-01-10 17:09:40 +00:00
case 1 :
case 2 :
case 3 :
dst . kernelAttributes . numLocalIdChannels = static_cast < uint8_t > ( tupleSize ) ;
break ;
}
dst . kernelAttributes . localId [ 0 ] = tupleSize > 0 ;
dst . kernelAttributes . localId [ 1 ] = tupleSize > 1 ;
dst . kernelAttributes . localId [ 2 ] = tupleSize > 2 ;
dst . kernelAttributes . simdSize = 1 ;
dst . kernelAttributes . perThreadDataSize = dst . kernelAttributes . simdSize ;
dst . kernelAttributes . perThreadDataSize * = dst . kernelAttributes . numLocalIdChannels ;
dst . kernelAttributes . perThreadDataSize * = sizeof ( LocalIdT ) ;
break ;
}
2022-10-11 17:06:26 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2022-10-11 17:06:26 +00:00
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoKernelPayloadArguments ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . payloadArgumentsNd . empty ( ) ) {
int32_t maxArgumentIndex = - 1 ;
KernelPayloadArguments payloadArguments ;
auto payloadArgsErr = readZeInfoPayloadArguments ( parser , * kernelSections . payloadArgumentsNd [ 0 ] , payloadArguments , maxArgumentIndex ,
dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = payloadArgsErr ) {
2023-01-10 17:09:40 +00:00
return payloadArgsErr ;
}
2022-10-11 17:06:26 +00:00
2023-01-10 17:09:40 +00:00
dst . payloadMappings . explicitArgs . resize ( maxArgumentIndex + 1 ) ;
dst . kernelAttributes . numArgsToPatch = maxArgumentIndex + 1 ;
2023-05-30 16:04:08 +00:00
bool bindlessBufferAccess = false ;
bool bindlessImageAccess = false ;
bool bindfulBufferAccess = false ;
bool bindfulImageAccess = false ;
2023-01-10 17:09:40 +00:00
for ( const auto & arg : payloadArguments ) {
auto decodeErr = populateKernelPayloadArgument ( dst , arg , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeErr ) {
2023-01-10 17:09:40 +00:00
return decodeErr ;
2022-10-11 17:06:26 +00:00
}
2023-05-30 16:04:08 +00:00
2024-01-10 17:46:32 +00:00
if ( arg . argIndex = = - 1 ) {
continue ;
}
2023-12-13 16:09:52 +00:00
if ( arg . addrmode = = Types : : Kernel : : PayloadArgument : : memoryAddressingModeBindless ) {
if ( dst . payloadMappings . explicitArgs [ arg . argIndex ] . is < NEO : : ArgDescriptor : : argTPointer > ( ) ) {
2023-05-30 16:04:08 +00:00
bindlessBufferAccess = true ;
2023-12-13 16:09:52 +00:00
} else if ( dst . payloadMappings . explicitArgs [ arg . argIndex ] . is < NEO : : ArgDescriptor : : argTImage > ( ) ) {
2023-05-30 16:04:08 +00:00
bindlessImageAccess = true ;
}
2023-12-13 16:09:52 +00:00
} else if ( arg . addrmode = = Types : : Kernel : : PayloadArgument : : memoryAddressingModeStateful ) {
if ( dst . payloadMappings . explicitArgs [ arg . argIndex ] . is < NEO : : ArgDescriptor : : argTPointer > ( ) ) {
2023-05-30 16:04:08 +00:00
bindfulBufferAccess = true ;
2023-12-13 16:09:52 +00:00
} else if ( dst . payloadMappings . explicitArgs [ arg . argIndex ] . is < NEO : : ArgDescriptor : : argTImage > ( ) ) {
2023-05-30 16:04:08 +00:00
bindfulImageAccess = true ;
}
}
}
2024-01-10 17:46:32 +00:00
const auto implicitArgsVec = dst . getImplicitArgBindlessCandidatesVec ( ) ;
for ( const auto implicitArg : implicitArgsVec ) {
if ( isValidOffset ( implicitArg - > bindless ) ) {
bindlessBufferAccess = true ;
break ;
}
}
2023-05-30 16:04:08 +00:00
if ( ( bindlessBufferAccess & & bindfulBufferAccess ) | |
( bindlessImageAccess & & bindfulImageAccess ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : bindless and bindful addressing modes must not be mixed. \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-05-30 16:04:08 +00:00
}
if ( bindlessBufferAccess ) {
dst . kernelAttributes . bufferAddressingMode = KernelDescriptor : : BindlessAndStateless ;
}
if ( bindlessImageAccess ) {
dst . kernelAttributes . imageAddressingMode = KernelDescriptor : : Bindless ;
2022-10-11 17:06:26 +00:00
}
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . crossThreadDataSize = static_cast < uint16_t > ( alignUp ( dst . kernelAttributes . crossThreadDataSize , 32 ) ) ;
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
DecodeError readZeInfoPayloadArguments ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelPayloadArguments & outPayloadArguments , int32_t & outMaxPayloadArgumentIndex , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validPayload = true ;
for ( const auto & payloadArgumentNd : parser . createChildrenRange ( node ) ) {
outPayloadArguments . resize ( outPayloadArguments . size ( ) + 1 ) ;
auto & payloadArgMetadata = * outPayloadArguments . rbegin ( ) ;
for ( const auto & payloadArgumentMemberNd : parser . createChildrenRange ( payloadArgumentNd ) ) {
auto key = parser . readKey ( payloadArgumentMemberNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : PayloadArgument : : argType = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoEnumChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . argType , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : argIndex = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = parser . readValueChecked ( payloadArgumentMemberNd , payloadArgMetadata . argIndex ) ;
outMaxPayloadArgumentIndex = std : : max < int32_t > ( outMaxPayloadArgumentIndex , payloadArgMetadata . argIndex ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : offset = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . offset , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : size = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . size , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : addrmode = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoEnumChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . addrmode , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : addrspace = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoEnumChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . addrspace , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : accessType = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoEnumChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . accessType , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : samplerIndex = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = parser . readValueChecked ( payloadArgumentMemberNd , payloadArgMetadata . samplerIndex ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : sourceOffset = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . sourceOffset , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : slmArgAlignment = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . slmArgAlignment , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : imageType = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoEnumChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . imageType , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : imageTransformable = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . imageTransformable , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : samplerType = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoEnumChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . samplerType , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : isPipe = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . isPipe , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : isPtr = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . isPtr , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PayloadArgument : : btiValue = = key ) {
2023-01-10 17:09:40 +00:00
validPayload & = readZeInfoValueChecked ( parser , payloadArgumentMemberNd , payloadArgMetadata . btiValue , context , outErrReason ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" for payload argument in context of " + context . str ( ) + " \n " ) ;
2023-01-10 17:09:40 +00:00
}
2022-10-11 17:06:26 +00:00
}
}
2023-12-12 14:49:00 +00:00
return validPayload ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
DecodeError populateKernelPayloadArgument ( NEO : : KernelDescriptor & dst , const KernelPayloadArgBaseT & src , std : : string & outErrReason , std : : string & outWarning ) {
2023-02-16 15:09:51 +00:00
if ( src . offset ! = Types : : Kernel : : PayloadArgument : : Defaults : : offset ) {
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . crossThreadDataSize = std : : max < uint16_t > ( dst . kernelAttributes . crossThreadDataSize , static_cast < uint16_t > ( src . offset + src . size ) ) ;
2022-10-11 17:06:26 +00:00
}
2023-01-10 17:09:40 +00:00
auto & explicitArgs = dst . payloadMappings . explicitArgs ;
auto getVmeDescriptor = [ & src , & dst ] ( ) {
auto & argsExt = dst . payloadMappings . explicitArgsExtendedDescriptors ;
argsExt . resize ( dst . payloadMappings . explicitArgs . size ( ) ) ;
if ( argsExt [ src . argIndex ] = = nullptr ) {
argsExt [ src . argIndex ] = std : : make_unique < ArgDescVme > ( ) ;
}
return static_cast < ArgDescVme * > ( argsExt [ src . argIndex ] . get ( ) ) ;
} ;
2023-02-16 15:09:51 +00:00
const auto & kernelName = dst . kernelMetadata . kernelName ;
auto populateArgPointerStateless = [ & src ] ( auto & arg ) {
arg . stateless = src . offset ;
arg . pointerSize = src . size ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-02-16 15:09:51 +00:00
} ;
2023-11-03 09:13:28 +00:00
auto populateArgToInlineData = [ & src ] ( auto & arg ) {
arg . offset = src . offset ;
arg . pointerSize = src . size ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-11-03 09:13:28 +00:00
} ;
2023-02-16 15:09:51 +00:00
auto populateWithOffset = [ & src ] ( auto & dst ) {
dst = src . offset ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-02-16 15:09:51 +00:00
} ;
auto populateWithOffsetChecked = [ & src , & kernelName , & outErrReason ] ( auto & dst , size_t size , ConstStringRef typeName ) {
if ( size ! = static_cast < size_t > ( src . size ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid size for argument of type " + typeName . str ( ) + " in context of : " + kernelName + " . Expected 4. Got : " + std : : to_string ( src . size ) + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-02-16 15:09:51 +00:00
}
dst = src . offset ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-02-16 15:09:51 +00:00
} ;
auto populateArgVec = [ & src , & outErrReason , & kernelName ] ( auto & dst , ConstStringRef typeName ) {
if ( false = = setVecArgIndicesBasedOnSize < uint32_t > ( dst , src . size , src . offset ) ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid size for argument of type " + typeName . str ( ) + " in context of : " + kernelName + " . Expected 4 or 8 or 12. Got : " + std : : to_string ( src . size ) + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-02-16 15:09:51 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-02-16 15:09:51 +00:00
} ;
2023-01-10 17:09:40 +00:00
switch ( src . argType ) {
default :
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid arg type in cross thread data section in context of : " + kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ; // unsupported
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeArgBypointer : {
2023-01-10 17:09:40 +00:00
auto & arg = dst . payloadMappings . explicitArgs [ src . argIndex ] ;
auto & argTraits = arg . getTraits ( ) ;
switch ( src . addrspace ) {
default :
2023-12-13 16:09:52 +00:00
UNRECOVERABLE_IF ( Types : : Kernel : : PayloadArgument : : addressSpaceUnknown ! = src . addrspace ) ;
2023-01-10 17:09:40 +00:00
argTraits . addressQualifier = KernelArgMetadata : : AddrUnknown ;
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( true ) ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : addressSpaceGlobal :
2023-01-10 17:09:40 +00:00
argTraits . addressQualifier = KernelArgMetadata : : AddrGlobal ;
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( true ) ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : addressSpaceLocal :
2023-01-10 17:09:40 +00:00
argTraits . addressQualifier = KernelArgMetadata : : AddrLocal ;
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( true ) ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : addressSpaceConstant :
2023-01-10 17:09:40 +00:00
argTraits . addressQualifier = KernelArgMetadata : : AddrConstant ;
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( true ) ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : addressSpaceImage : {
2023-01-10 17:09:40 +00:00
auto & argAsImage = dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) ;
2023-12-13 16:09:52 +00:00
if ( src . imageType ! = Types : : Kernel : : PayloadArgument : : imageTypeMax ) {
2023-01-10 17:09:40 +00:00
argAsImage . imageType = static_cast < NEOImageType > ( src . imageType ) ;
}
auto & extendedInfo = dst . payloadMappings . explicitArgs [ src . argIndex ] . getExtendedTypeInfo ( ) ;
2023-12-13 16:09:52 +00:00
extendedInfo . isMediaImage = ( src . imageType = = Types : : Kernel : : PayloadArgument : : ImageType : : imageType2DMedia ) ;
extendedInfo . isMediaBlockImage = ( src . imageType = = Types : : Kernel : : PayloadArgument : : ImageType : : imageType2DMediaBlock ) ;
2023-01-10 17:09:40 +00:00
extendedInfo . isTransformable = src . imageTransformable ;
dst . kernelAttributes . flags . usesImages = true ;
} break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : addressSpaceSampler : {
2023-02-16 15:09:51 +00:00
using SamplerType = Types : : Kernel : : PayloadArgument : : SamplerType ;
2023-01-10 17:09:40 +00:00
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescSampler > ( true ) ;
auto & extendedInfo = arg . getExtendedTypeInfo ( ) ;
2023-12-13 16:09:52 +00:00
extendedInfo . isAccelerator = ( src . samplerType = = SamplerType : : samplerTypeVME ) | |
( src . samplerType = = SamplerType : : samplerTypeVE ) | |
( src . samplerType = = SamplerType : : samplerTypeVD ) ;
const bool usesVme = src . samplerType = = SamplerType : : samplerTypeVME ;
2023-01-10 17:09:40 +00:00
extendedInfo . hasVmeExtendedDescriptor = usesVme ;
dst . kernelAttributes . flags . usesVme = usesVme ;
dst . kernelAttributes . flags . usesSamplers = true ;
} break ;
}
switch ( src . accessType ) {
default :
2023-12-13 16:09:52 +00:00
UNRECOVERABLE_IF ( argTraits . accessQualifier ! = Types : : Kernel : : PayloadArgument : : accessTypeUnknown ) ;
2023-01-10 17:09:40 +00:00
argTraits . accessQualifier = KernelArgMetadata : : AccessUnknown ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : accessTypeReadonly :
2023-01-10 17:09:40 +00:00
argTraits . accessQualifier = KernelArgMetadata : : AccessReadOnly ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : accessTypeReadwrite :
2023-01-10 17:09:40 +00:00
argTraits . accessQualifier = KernelArgMetadata : : AccessReadWrite ;
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : accessTypeWriteonly :
2023-01-10 17:09:40 +00:00
argTraits . accessQualifier = KernelArgMetadata : : AccessWriteOnly ;
break ;
}
argTraits . argByValSize = sizeof ( void * ) ;
2023-12-13 16:09:52 +00:00
if ( dst . payloadMappings . explicitArgs [ src . argIndex ] . is < NEO : : ArgDescriptor : : argTPointer > ( ) ) {
2023-01-10 17:09:40 +00:00
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( ) . accessedUsingStatelessAddressingMode = false ;
if ( src . isPipe ) {
argTraits . typeQualifiers . pipeQual = true ;
}
}
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 " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : memoryAddressingModeStateful :
if ( dst . payloadMappings . explicitArgs [ src . argIndex ] . is < NEO : : ArgDescriptor : : argTSampler > ( ) ) {
2023-01-10 17:09:40 +00:00
static constexpr auto maxSamplerStateSize = 16U ;
static constexpr auto maxIndirectSamplerStateSize = 64U ;
auto & sampler = dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescSampler > ( ) ;
sampler . bindful = maxIndirectSamplerStateSize + maxSamplerStateSize * src . samplerIndex ;
dst . payloadMappings . samplerTable . numSamplers = std : : max < uint8_t > ( dst . payloadMappings . samplerTable . numSamplers , static_cast < uint8_t > ( src . samplerIndex + 1 ) ) ;
2023-11-20 11:08:17 +00:00
} else {
dst . kernelAttributes . numArgsStateful + + ;
2023-01-10 17:09:40 +00:00
}
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : memoryAddressingModeStateless :
if ( false = = dst . payloadMappings . explicitArgs [ src . argIndex ] . is < NEO : : ArgDescriptor : : argTPointer > ( ) ) {
2023-02-16 15:09:51 +00:00
outErrReason . append ( " Invalid or missing memory addressing " + Tags : : Kernel : : PayloadArgument : : MemoryAddressingMode : : stateless . str ( ) + " for arg idx : " + std : : to_string ( src . argIndex ) + " in context of : " + dst . kernelMetadata . kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
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 ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : memoryAddressingModeBindless :
if ( dst . payloadMappings . explicitArgs [ src . argIndex ] . is < NEO : : ArgDescriptor : : argTPointer > ( ) ) {
2023-01-10 17:09:40 +00:00
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( false ) . bindless = src . offset ;
2023-12-13 16:09:52 +00:00
} else if ( dst . payloadMappings . explicitArgs [ src . argIndex ] . is < NEO : : ArgDescriptor : : argTImage > ( ) ) {
2023-01-10 17:09:40 +00:00
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescImage > ( false ) . bindless = src . offset ;
} else {
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescSampler > ( false ) . bindless = src . offset ;
}
2023-06-07 14:52:08 +00:00
dst . kernelAttributes . numArgsStateful + + ;
2023-01-10 17:09:40 +00:00
break ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : PayloadArgument : : memoryAddressingModeSharedLocalMemory :
2023-01-10 17:09:40 +00:00
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( false ) . slmOffset = src . offset ;
dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( false ) . requiredSlmAlignment = src . slmArgAlignment ;
break ;
}
2023-02-16 15:09:51 +00:00
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeArgByvalue : {
2023-01-10 17:09:40 +00:00
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 ) {
outErrReason . append ( " Missing source offset value for element in argByValue \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
valueElement . offset = src . offset ;
valueElement . size = src . size ;
argAsValue . elements . push_back ( valueElement ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeBufferAddress :
2023-02-16 15:09:51 +00:00
return populateArgPointerStateless ( dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( true ) ) ;
2023-02-16 15:09:51 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeBufferOffset :
2023-02-16 15:09:51 +00:00
return populateWithOffsetChecked ( dst . payloadMappings . explicitArgs [ src . argIndex ] . as < ArgDescPointer > ( true ) . bufferOffset , 4U , Tags : : Kernel : : PayloadArgument : : ArgType : : bufferOffset ) ;
2023-02-16 15:09:51 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeLocalSize :
2023-02-16 15:09:51 +00:00
return populateArgVec ( dst . payloadMappings . dispatchTraits . localWorkSize , Tags : : Kernel : : PayloadArgument : : ArgType : : localSize ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeGlobalIdOffset :
2023-02-16 15:09:51 +00:00
return populateArgVec ( dst . payloadMappings . dispatchTraits . globalWorkOffset , Tags : : Kernel : : PayloadArgument : : ArgType : : globalIdOffset ) ;
2023-02-16 15:09:51 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeGroupCount :
2023-02-16 15:09:51 +00:00
return populateArgVec ( dst . payloadMappings . dispatchTraits . numWorkGroups , Tags : : Kernel : : PayloadArgument : : ArgType : : groupCount ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeGlobalSize :
2023-02-16 15:09:51 +00:00
return populateArgVec ( dst . payloadMappings . dispatchTraits . globalWorkSize , Tags : : Kernel : : PayloadArgument : : ArgType : : globalSize ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeEnqueuedLocalSize :
2023-02-16 15:09:51 +00:00
return populateArgVec ( dst . payloadMappings . dispatchTraits . enqueuedLocalWorkSize , Tags : : Kernel : : PayloadArgument : : ArgType : : enqueuedLocalSize ) ;
2023-02-16 15:09:51 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeWorkDimensions :
2023-02-16 15:09:51 +00:00
return populateWithOffsetChecked ( dst . payloadMappings . dispatchTraits . workDim , 4U , Tags : : Kernel : : PayloadArgument : : ArgType : : workDimensions ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypePrivateBaseStateless :
2023-02-16 15:09:51 +00:00
return populateArgPointerStateless ( dst . payloadMappings . implicitArgs . privateMemoryAddress ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeScratchPointer :
2023-11-03 09:13:28 +00:00
return populateArgToInlineData ( dst . payloadMappings . implicitArgs . scratchPointerAddress ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeIndirectDataPointer :
2023-11-03 09:13:28 +00:00
return populateArgToInlineData ( dst . payloadMappings . implicitArgs . indirectDataPointerAddress ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypePrintfBuffer :
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . flags . usesPrintf = true ;
2023-02-16 15:09:51 +00:00
return populateArgPointerStateless ( dst . payloadMappings . implicitArgs . printfSurfaceAddress ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeAssertBuffer :
2023-03-17 09:01:10 +00:00
dst . kernelAttributes . flags . usesAssert = true ;
return populateArgPointerStateless ( dst . payloadMappings . implicitArgs . assertBufferAddress ) ;
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeSyncBuffer :
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . flags . usesSyncBuffer = true ;
2023-02-16 15:09:51 +00:00
return populateArgPointerStateless ( dst . payloadMappings . implicitArgs . syncBufferAddress ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImplicitArgBuffer :
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . flags . requiresImplicitArgs = true ;
2023-02-16 15:09:51 +00:00
return populateWithOffset ( dst . payloadMappings . implicitArgs . implicitArgsBuffer ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeRtGlobalBuffer :
2023-02-16 15:09:51 +00:00
dst . kernelAttributes . flags . hasRTCalls = true ;
return populateArgPointerStateless ( dst . payloadMappings . implicitArgs . rtDispatchGlobals ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeDataConstBuffer :
2024-01-10 17:46:32 +00:00
if ( src . addrmode = = Types : : Kernel : : PayloadArgument : : memoryAddressingModeBindless ) {
dst . payloadMappings . implicitArgs . globalConstantsSurfaceAddress . bindless = src . offset ;
dst . kernelAttributes . numArgsStateful + + ;
} else {
if ( src . offset ! = Types : : Kernel : : PayloadArgument : : Defaults : : offset ) {
populateArgPointerStateless ( dst . payloadMappings . implicitArgs . globalConstantsSurfaceAddress ) ;
}
setSSHOffsetBasedOnBti ( dst . payloadMappings . implicitArgs . globalConstantsSurfaceAddress . bindful , src . btiValue , dst . payloadMappings . bindingTable . numEntries ) ;
2023-02-16 15:09:51 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeDataGlobalBuffer :
2024-01-10 17:46:32 +00:00
if ( src . addrmode = = Types : : Kernel : : PayloadArgument : : memoryAddressingModeBindless ) {
dst . payloadMappings . implicitArgs . globalVariablesSurfaceAddress . bindless = src . offset ;
dst . kernelAttributes . numArgsStateful + + ;
} else {
if ( src . offset ! = Types : : Kernel : : PayloadArgument : : Defaults : : offset ) {
populateArgPointerStateless ( dst . payloadMappings . implicitArgs . globalVariablesSurfaceAddress ) ;
}
setSSHOffsetBasedOnBti ( dst . payloadMappings . implicitArgs . globalVariablesSurfaceAddress . bindful , src . btiValue , dst . payloadMappings . bindingTable . numEntries ) ;
2023-02-16 15:09:51 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageHeight :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . imgHeight ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageWidth :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . imgWidth ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageDepth :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . imgDepth ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageChannelDataType :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . channelDataType ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageChannelOrder :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . channelOrder ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageArraySize :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . arraySize ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageNumSamples :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . numSamples ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageMipLevels :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . numMipLevels ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageFlatBaseOffset :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . flatBaseOffset ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageFlatWidth :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . flatWidth ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageFlatHeight :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . flatHeight ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeImageFlatPitch :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescImage > ( true ) . metadataPayload . flatPitch ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeSamplerAddrMode :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescSampler > ( true ) . metadataPayload . samplerAddressingMode ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeSamplerNormCoords :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescSampler > ( true ) . metadataPayload . samplerNormalizedCoords ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeSamplerSnapWa :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( explicitArgs [ src . argIndex ] . as < ArgDescSampler > ( true ) . metadataPayload . samplerSnapWa ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeVmeMbBlockType :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( getVmeDescriptor ( ) - > mbBlockType ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeVmeSubpixelMode :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( getVmeDescriptor ( ) - > subpixelMode ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeVmeSadAdjustMode :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( getVmeDescriptor ( ) - > sadAdjustMode ) ;
2023-01-10 17:09:40 +00:00
2023-12-13 16:09:52 +00:00
case Types : : Kernel : : argTypeVmeSearchPathType :
2023-02-16 15:09:51 +00:00
return populateWithOffset ( getVmeDescriptor ( ) - > searchPathType ) ;
2023-12-18 18:25:00 +00:00
case Types : : Kernel : : argTypeRegionGroupSize :
return populateArgVec ( dst . payloadMappings . dispatchTraits . regionGroupSize , Tags : : Kernel : : PayloadArgument : : ArgType : : regionGroupSize ) ;
case Types : : Kernel : : argTypeRegionGroupDimension :
return populateWithOffsetChecked ( dst . payloadMappings . dispatchTraits . regionGroupDimension , sizeof ( int32_t ) , Tags : : Kernel : : PayloadArgument : : ArgType : : regionGroupDimension ) ;
case Types : : Kernel : : argTypeRegionGroupWgCount :
return populateWithOffsetChecked ( dst . payloadMappings . dispatchTraits . regionGroupWgCount , sizeof ( int32_t ) , Tags : : Kernel : : PayloadArgument : : ArgType : : regionGroupWgCount ) ;
2023-01-10 17:09:40 +00:00
}
2023-02-16 15:09:51 +00:00
UNREACHABLE ( ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
DecodeError decodeZeInfoKernelInlineSamplers ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . inlineSamplersNd . empty ( ) ) {
KernelInlineSamplers inlineSamplers { } ;
auto decodeErr = readZeInfoInlineSamplers ( parser , * kernelSections . inlineSamplersNd [ 0 ] , inlineSamplers ,
dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeErr ) {
2023-01-10 17:09:40 +00:00
return decodeErr ;
}
for ( const auto & inlineSampler : inlineSamplers ) {
auto decodeErr = populateKernelInlineSampler ( dst , inlineSampler , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeErr ) {
2023-01-10 17:09:40 +00:00
return decodeErr ;
}
}
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
DecodeError readZeInfoInlineSamplers ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelInlineSamplers & outInlineSamplers , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validInlineSamplers = true ;
for ( const auto & inlineSamplerNd : parser . createChildrenRange ( node ) ) {
outInlineSamplers . resize ( outInlineSamplers . size ( ) + 1 ) ;
auto & inlineSampler = * outInlineSamplers . rbegin ( ) ;
for ( const auto & inlineSamplerMemberNd : parser . createChildrenRange ( inlineSamplerNd ) ) {
2023-02-16 15:09:51 +00:00
namespace Tags = Tags : : Kernel : : InlineSamplers ;
2023-01-10 17:09:40 +00:00
auto key = parser . readKey ( inlineSamplerMemberNd ) ;
if ( Tags : : samplerIndex = = key ) {
validInlineSamplers & = readZeInfoValueChecked ( parser , inlineSamplerMemberNd , inlineSampler . samplerIndex , context , outErrReason ) ;
} else if ( Tags : : addrMode = = key ) {
validInlineSamplers & = readZeInfoEnumChecked ( parser , inlineSamplerMemberNd , inlineSampler . addrMode , context , outErrReason ) ;
} else if ( Tags : : filterMode = = key ) {
validInlineSamplers & = readZeInfoEnumChecked ( parser , inlineSamplerMemberNd , inlineSampler . filterMode , context , outErrReason ) ;
} else if ( Tags : : normalized = = key ) {
validInlineSamplers & = readZeInfoValueChecked ( parser , inlineSamplerMemberNd , inlineSampler . normalized , context , outErrReason ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" for inline sampler in context of " + context . str ( ) + " \n " ) ;
2022-10-11 17:06:26 +00:00
}
}
2020-07-30 13:18:54 +02:00
}
2023-12-12 14:49:00 +00:00
return validInlineSamplers ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
DecodeError populateKernelInlineSampler ( KernelDescriptor & dst , const KernelInlineSamplerBaseT & src , std : : string & outErrReason , std : : string & outWarning ) {
NEO : : KernelDescriptor : : InlineSampler inlineSampler = { } ;
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
if ( src . samplerIndex = = - 1 ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid inline sampler index (must be >= 0) in context of : " + dst . kernelMetadata . kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
inlineSampler . samplerIndex = src . samplerIndex ;
2020-07-30 13:18:54 +02:00
2023-02-16 15:09:51 +00:00
using AddrModeZeInfo = Types : : Kernel : : InlineSamplers : : AddrModeT ;
2023-01-10 17:09:40 +00:00
using AddrModeDescriptor = NEO : : KernelDescriptor : : InlineSampler : : AddrMode ;
2023-12-13 16:09:52 +00:00
constexpr LookupArray < AddrModeZeInfo , AddrModeDescriptor , 5 > addrModes ( { { { AddrModeZeInfo : : none , AddrModeDescriptor : : none } ,
{ AddrModeZeInfo : : repeat , AddrModeDescriptor : : repeat } ,
{ AddrModeZeInfo : : clampEdge , AddrModeDescriptor : : clampEdge } ,
{ AddrModeZeInfo : : clampBorder , AddrModeDescriptor : : clampBorder } ,
{ AddrModeZeInfo : : mirror , AddrModeDescriptor : : mirror } } } ) ;
2023-01-10 17:09:40 +00:00
auto addrMode = addrModes . find ( src . addrMode ) ;
if ( addrMode . has_value ( ) = = false ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid inline sampler addressing mode in context of : " + dst . kernelMetadata . kernelName + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2021-11-02 15:29:09 +00:00
}
2023-01-10 17:09:40 +00:00
inlineSampler . addrMode = * addrMode ;
2021-11-02 15:29:09 +00:00
2023-02-16 15:09:51 +00:00
using FilterModeZeInfo = Types : : Kernel : : InlineSamplers : : FilterModeT ;
2023-01-10 17:09:40 +00:00
using FilterModeDescriptor = NEO : : KernelDescriptor : : InlineSampler : : FilterMode ;
2023-12-13 16:09:52 +00:00
constexpr LookupArray < FilterModeZeInfo , FilterModeDescriptor , 2 > filterModes ( { { { FilterModeZeInfo : : nearest , FilterModeDescriptor : : nearest } ,
{ FilterModeZeInfo : : linear , FilterModeDescriptor : : linear } } } ) ;
2023-01-10 17:09:40 +00:00
auto filterMode = filterModes . find ( src . filterMode ) ;
if ( filterMode . has_value ( ) = = false ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid inline sampler filterMode mode in context of : " + dst . kernelMetadata . kernelName + " \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
inlineSampler . filterMode = * filterMode ;
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
inlineSampler . isNormalized = src . normalized ;
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
dst . payloadMappings . samplerTable . numSamplers = std : : max < uint8_t > ( dst . payloadMappings . samplerTable . numSamplers , static_cast < uint8_t > ( inlineSampler . samplerIndex + 1 ) ) ;
dst . inlineSamplers . push_back ( inlineSampler ) ;
2022-10-11 17:06:26 +00:00
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2023-01-09 17:23:01 +00:00
2024-01-22 15:17:44 +00:00
DecodeError decodeZeInfoKernelPerThreadMemoryBuffers ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , const uint32_t minScratchSpaceSize , std : : string & outErrReason , std : : string & outWarning , const Types : : Version & srcZeInfoVersion ) {
2023-01-10 17:09:40 +00:00
if ( false = = kernelSections . perThreadMemoryBuffersNd . empty ( ) ) {
KernelPerThreadMemoryBuffers perThreadMemoryBuffers { } ;
auto perThreadMemoryBuffersErr = readZeInfoPerThreadMemoryBuffers ( parser , * kernelSections . perThreadMemoryBuffersNd [ 0 ] , perThreadMemoryBuffers ,
dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = perThreadMemoryBuffersErr ) {
2023-01-10 17:09:40 +00:00
return perThreadMemoryBuffersErr ;
}
for ( const auto & memBuff : perThreadMemoryBuffers ) {
2024-01-22 15:17:44 +00:00
auto decodeErr = populateKernelPerThreadMemoryBuffer ( dst , memBuff , minScratchSpaceSize , outErrReason , outWarning , srcZeInfoVersion ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = decodeErr ) {
2023-01-10 17:09:40 +00:00
return decodeErr ;
}
}
2023-01-09 17:23:01 +00:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2023-01-09 17:23:01 +00:00
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoPerThreadMemoryBuffers ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelPerThreadMemoryBuffers & outPerThreadMemoryBuffers , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validBuffer = true ;
for ( const auto & perThreadMemoryBufferNd : parser . createChildrenRange ( node ) ) {
outPerThreadMemoryBuffers . resize ( outPerThreadMemoryBuffers . size ( ) + 1 ) ;
auto & perThreadMemoryBufferMetadata = * outPerThreadMemoryBuffers . rbegin ( ) ;
for ( const auto & perThreadMemoryBufferMemberNd : parser . createChildrenRange ( perThreadMemoryBufferNd ) ) {
auto key = parser . readKey ( perThreadMemoryBufferMemberNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : PerThreadMemoryBuffer : : allocationType = = key ) {
2023-01-10 17:09:40 +00:00
validBuffer & = readZeInfoEnumChecked ( parser , perThreadMemoryBufferMemberNd , perThreadMemoryBufferMetadata . allocationType , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PerThreadMemoryBuffer : : memoryUsage = = key ) {
2023-01-10 17:09:40 +00:00
validBuffer & = readZeInfoEnumChecked ( parser , perThreadMemoryBufferMemberNd , perThreadMemoryBufferMetadata . memoryUsage , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PerThreadMemoryBuffer : : size = = key ) {
2023-01-10 17:09:40 +00:00
validBuffer & = readZeInfoValueChecked ( parser , perThreadMemoryBufferMemberNd , perThreadMemoryBufferMetadata . size , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PerThreadMemoryBuffer : : isSimtThread = = key ) {
2023-01-10 17:09:40 +00:00
validBuffer & = readZeInfoValueChecked ( parser , perThreadMemoryBufferMemberNd , perThreadMemoryBufferMetadata . isSimtThread , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : PerThreadMemoryBuffer : : slot = = key ) {
2023-01-10 17:09:40 +00:00
validBuffer & = readZeInfoValueChecked ( parser , perThreadMemoryBufferMemberNd , perThreadMemoryBufferMetadata . slot , context , outErrReason ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" for per-thread memory buffer in context of " + context . str ( ) + " \n " ) ;
2023-01-09 17:23:01 +00:00
}
}
2022-10-11 17:06:26 +00:00
}
2023-12-12 14:49:00 +00:00
return validBuffer ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-09 17:23:01 +00:00
}
2024-01-22 15:17:44 +00:00
DecodeError populateKernelPerThreadMemoryBuffer ( KernelDescriptor & dst , const KernelPerThreadMemoryBufferBaseT & src , const uint32_t minScratchSpaceSize , std : : string & outErrReason , std : : string & outWarning , const Types : : Version & srcZeInfoVersion ) {
2023-02-16 15:09:51 +00:00
using namespace Types : : Kernel : : PerThreadMemoryBuffer ;
using namespace Tags : : Kernel : : PerThreadMemoryBuffer : : AllocationType ;
using namespace Tags : : Kernel : : PerThreadMemoryBuffer : : MemoryUsage ;
2023-01-10 17:09:40 +00:00
if ( src . size < = 0 ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid per-thread memory buffer allocation size (size must be greater than 0) in context of : " + dst . kernelMetadata . kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
auto size = src . size ;
if ( src . isSimtThread ) {
size * = dst . kernelAttributes . simdSize ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
switch ( src . allocationType ) {
default :
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid per-thread memory buffer allocation type in context of : " + dst . kernelMetadata . kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
case AllocationTypeGlobal :
if ( MemoryUsagePrivateSpace ! = src . memoryUsage ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid per-thread memory buffer memory usage type for " + global . str ( ) + " allocation type in context of : " + dst . kernelMetadata . kernelName + " . Expected : " + privateSpace . str ( ) + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
dst . kernelAttributes . perHwThreadPrivateMemorySize = size ;
break ;
case AllocationTypeScratch :
2024-01-22 15:17:44 +00:00
if ( src . slot > 1 ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid scratch buffer slot " + std : : to_string ( src . slot ) + " in context of : " + dst . kernelMetadata . kernelName + " . Expected 0 or 1. \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2024-01-22 15:17:44 +00:00
if ( ! isScratchMemoryUsageDefinedInExecutionEnvironment ( srcZeInfoVersion ) ) {
if ( src . slot = = 0 ) {
dst . kernelAttributes . spillFillScratchMemorySize = src . size ;
} else { // slot 1
dst . kernelAttributes . privateScratchMemorySize = src . size ;
}
}
2023-01-10 17:09:40 +00:00
if ( 0 ! = dst . kernelAttributes . perThreadScratchSize [ src . slot ] ) {
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin : Invalid duplicated scratch buffer entry " + std : : to_string ( src . slot ) + " in context of : " + dst . kernelMetadata . kernelName + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2020-07-30 13:18:54 +02:00
}
2023-03-09 10:10:12 +00:00
uint32_t scratchSpaceSize = std : : max ( static_cast < uint32_t > ( src . size ) , minScratchSpaceSize ) ;
2023-01-10 17:09:40 +00:00
scratchSpaceSize = Math : : isPow2 ( scratchSpaceSize ) ? scratchSpaceSize : Math : : nextPowerOfTwo ( scratchSpaceSize ) ;
dst . kernelAttributes . perThreadScratchSize [ src . slot ] = scratchSpaceSize ;
break ;
2020-07-30 13:18:54 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoKernelExperimentalProperties ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . experimentalPropertiesNd . empty ( ) ) {
KernelExperimentalPropertiesBaseT experimentalProperties { } ;
auto experimentalPropertiesErr = readZeInfoExperimentalProperties ( parser , * kernelSections . experimentalPropertiesNd [ 0 ] , experimentalProperties ,
dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = experimentalPropertiesErr ) {
2023-01-10 17:09:40 +00:00
return experimentalPropertiesErr ;
}
populateKernelExperimentalProperties ( dst , experimentalProperties ) ;
2020-10-04 19:18:49 +02:00
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
DecodeError readZeInfoExperimentalProperties ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelExperimentalPropertiesBaseT & outExperimentalProperties , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validExperimentalProperty = true ;
for ( const auto & experimentalPropertyNd : parser . createChildrenRange ( node ) ) {
for ( const auto & experimentalPropertyMemberNd : parser . createChildrenRange ( experimentalPropertyNd ) ) {
auto key = parser . readKey ( experimentalPropertyMemberNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : ExperimentalProperties : : hasNonKernelArgLoad = = key ) {
2023-01-10 17:09:40 +00:00
validExperimentalProperty & = readZeInfoValueChecked ( parser , experimentalPropertyMemberNd ,
outExperimentalProperties . hasNonKernelArgLoad , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExperimentalProperties : : hasNonKernelArgStore = = key ) {
2023-01-10 17:09:40 +00:00
validExperimentalProperty & = readZeInfoValueChecked ( parser , experimentalPropertyMemberNd ,
outExperimentalProperties . hasNonKernelArgStore , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : ExperimentalProperties : : hasNonKernelArgAtomic = = key ) {
2023-01-10 17:09:40 +00:00
validExperimentalProperty & = readZeInfoValueChecked ( parser , experimentalPropertyMemberNd ,
outExperimentalProperties . hasNonKernelArgAtomic , context , outErrReason ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" in context of " + context . str ( ) + " \n " ) ;
2023-01-10 17:09:40 +00:00
validExperimentalProperty = false ;
}
2020-10-04 19:18:49 +02:00
}
}
2023-12-12 14:49:00 +00:00
return validExperimentalProperty ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2020-10-04 19:18:49 +02:00
2023-01-10 17:09:40 +00:00
void populateKernelExperimentalProperties ( KernelDescriptor & dst , const KernelExperimentalPropertiesBaseT & experimentalProperties ) {
dst . kernelAttributes . hasNonKernelArgLoad = experimentalProperties . hasNonKernelArgLoad ;
dst . kernelAttributes . hasNonKernelArgStore = experimentalProperties . hasNonKernelArgStore ;
dst . kernelAttributes . hasNonKernelArgAtomic = experimentalProperties . hasNonKernelArgAtomic ;
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
DecodeError decodeZeInfoKernelBindingTableEntries ( KernelDescriptor & dst , Yaml : : YamlParser & parser , const ZeInfoKernelSections & kernelSections , std : : string & outErrReason , std : : string & outWarning ) {
if ( false = = kernelSections . bindingTableIndicesNd . empty ( ) ) {
KernelBindingTableEntries bindingTableIndices ;
auto error = readZeInfoBindingTableIndices ( parser , * kernelSections . bindingTableIndicesNd [ 0 ] , bindingTableIndices ,
dst . kernelMetadata . kernelName , outErrReason , outWarning ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = error ) {
2023-01-10 17:09:40 +00:00
return error ;
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
error = populateKernelBindingTableIndicies ( dst , bindingTableIndices , outErrReason ) ;
2023-12-12 14:49:00 +00:00
if ( DecodeError : : success ! = error ) {
2023-01-10 17:09:40 +00:00
return error ;
2020-07-30 13:18:54 +02:00
}
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2023-01-10 17:09:40 +00:00
}
2020-07-30 13:18:54 +02:00
2023-01-10 17:09:40 +00:00
DecodeError readZeInfoBindingTableIndices ( const Yaml : : YamlParser & parser , const Yaml : : Node & node , KernelBindingTableEntries & outBindingTableIndices , ConstStringRef context , std : : string & outErrReason , std : : string & outWarning ) {
bool validBindingTableEntries = true ;
for ( const auto & bindingTableIndexNd : parser . createChildrenRange ( node ) ) {
outBindingTableIndices . resize ( outBindingTableIndices . size ( ) + 1 ) ;
auto & bindingTableIndexMetadata = * outBindingTableIndices . rbegin ( ) ;
for ( const auto & bindingTableIndexMemberNd : parser . createChildrenRange ( bindingTableIndexNd ) ) {
auto key = parser . readKey ( bindingTableIndexMemberNd ) ;
2023-02-16 15:09:51 +00:00
if ( Tags : : Kernel : : BindingTableIndex : : argIndex = = key ) {
2023-01-10 17:09:40 +00:00
validBindingTableEntries & = readZeInfoValueChecked ( parser , bindingTableIndexMemberNd , bindingTableIndexMetadata . argIndex , context , outErrReason ) ;
2023-02-16 15:09:51 +00:00
} else if ( Tags : : Kernel : : BindingTableIndex : : btiValue = = key ) {
2023-01-10 17:09:40 +00:00
validBindingTableEntries & = readZeInfoValueChecked ( parser , bindingTableIndexMemberNd , bindingTableIndexMetadata . btiValue , context , outErrReason ) ;
} else {
2023-12-13 16:09:52 +00:00
outWarning . append ( " DeviceBinaryFormat::zebin::.ze_info : Unknown entry \" " + key . str ( ) + " \" for binding table index in context of " + context . str ( ) + " \n " ) ;
2023-01-10 17:09:40 +00:00
}
2022-02-23 11:48:31 +00:00
}
}
2023-12-12 14:49:00 +00:00
return validBindingTableEntries ? DecodeError : : success : DecodeError : : invalidBinary ;
2023-01-10 17:09:40 +00:00
}
2022-02-28 17:44:06 +00:00
2023-01-10 17:09:40 +00:00
DecodeError populateKernelBindingTableIndicies ( KernelDescriptor & dst , const KernelBindingTableEntries & btEntries , std : : string & outErrReason ) {
for ( auto & btEntry : btEntries ) {
auto & explicitArg = dst . payloadMappings . explicitArgs [ btEntry . argIndex ] ;
switch ( explicitArg . type ) {
default :
2023-12-13 16:09:52 +00:00
outErrReason . append ( " DeviceBinaryFormat::zebin::.ze_info : Invalid binding table entry for non-pointer and non-image argument idx : " + std : : to_string ( btEntry . argIndex ) + " . \n " ) ;
2023-12-12 14:49:00 +00:00
return DecodeError : : invalidBinary ;
2023-12-13 16:09:52 +00:00
case ArgDescriptor : : argTImage : {
2023-01-10 17:09:40 +00:00
setSSHOffsetBasedOnBti ( explicitArg . as < ArgDescImage > ( ) . bindful , btEntry . btiValue , dst . payloadMappings . bindingTable . numEntries ) ;
break ;
}
2023-12-13 16:09:52 +00:00
case ArgDescriptor : : argTPointer : {
2023-01-10 17:09:40 +00:00
setSSHOffsetBasedOnBti ( explicitArg . as < ArgDescPointer > ( ) . bindful , btEntry . btiValue , dst . payloadMappings . bindingTable . numEntries ) ;
break ;
}
2022-02-28 17:44:06 +00:00
}
}
2023-12-12 14:49:00 +00:00
return DecodeError : : success ;
2020-07-30 13:18:54 +02:00
}
2023-01-10 17:09:40 +00:00
void generateSSHWithBindingTable ( KernelDescriptor & dst ) {
static constexpr auto surfaceStateSize = 64U ;
static constexpr auto btiSize = sizeof ( int ) ;
auto & bindingTable = dst . payloadMappings . bindingTable ;
bindingTable . tableOffset = bindingTable . numEntries * surfaceStateSize ;
size_t sshSize = bindingTable . tableOffset + bindingTable . numEntries * btiSize ;
dst . generatedSsh . resize ( alignUp ( sshSize , surfaceStateSize ) , 0U ) ;
auto bindingTableIt = reinterpret_cast < int * > ( dst . generatedSsh . data ( ) + bindingTable . tableOffset ) ;
for ( int i = 0 ; i < bindingTable . numEntries ; + + i ) {
* bindingTableIt = i * surfaceStateSize ;
+ + bindingTableIt ;
2022-10-25 16:03:15 +00:00
}
}
2023-01-10 17:09:40 +00:00
void generateDSH ( KernelDescriptor & dst ) {
constexpr auto samplerStateSize = 16U ;
constexpr auto borderColorStateSize = 64U ;
dst . kernelAttributes . flags . usesSamplers = true ;
auto & samplerTable = dst . payloadMappings . samplerTable ;
samplerTable . borderColor = 0U ;
samplerTable . tableOffset = borderColorStateSize ;
size_t dshSize = borderColorStateSize + samplerTable . numSamplers * samplerStateSize ;
dst . generatedDsh . resize ( alignUp ( dshSize , borderColorStateSize ) , 0U ) ;
2022-10-25 16:03:15 +00:00
}
2023-02-16 15:09:51 +00:00
} // namespace NEO::Zebin::ZeInfo