2017-12-21 07:45:38 +08:00
/*
2019-02-27 18:39:32 +08:00
* Copyright ( C ) 2017 - 2019 Intel Corporation
2017-12-21 07:45:38 +08:00
*
2018-09-18 15:11:08 +08:00
* SPDX - License - Identifier : MIT
2017-12-21 07:45:38 +08:00
*
*/
# include "runtime/built_ins/built_ins.h"
2018-04-18 20:59:28 +08:00
# include "runtime/built_ins/builtins_dispatch_builder.h"
2019-09-03 20:20:32 +08:00
# include "runtime/device/device.h"
2018-06-09 04:40:27 +08:00
# include "runtime/os_interface/debug_settings_manager.h"
2019-02-27 18:39:32 +08:00
2018-02-02 17:33:31 +08:00
# include "os_inc.h"
2017-12-21 07:45:38 +08:00
2019-02-27 18:39:32 +08:00
# include <cstdint>
2019-03-26 18:59:46 +08:00
namespace NEO {
2017-12-21 07:45:38 +08:00
2019-07-05 16:31:32 +08:00
const char * getBuiltinAsString ( EBuiltInOps : : Type builtin ) {
2017-12-21 07:45:38 +08:00
switch ( builtin ) {
default :
2019-07-05 16:31:32 +08:00
return getUnknownBuiltinAsString ( builtin ) ;
2018-08-07 15:22:55 +08:00
case EBuiltInOps : : AuxTranslation :
return " aux_translation.igdrcl_built_in " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyBufferToBuffer :
return " copy_buffer_to_buffer.igdrcl_built_in " ;
2019-10-10 00:20:12 +08:00
case EBuiltInOps : : CopyBufferToBufferStateless :
return " copy_buffer_to_buffer_stateless.igdrcl_built_in " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyBufferRect :
return " copy_buffer_rect.igdrcl_built_in " ;
2019-10-16 18:46:34 +08:00
case EBuiltInOps : : CopyBufferRectStateless :
return " copy_buffer_rect_stateless.igdrcl_built_in " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : FillBuffer :
return " fill_buffer.igdrcl_built_in " ;
2019-10-29 21:23:32 +08:00
case EBuiltInOps : : FillBufferStateless :
return " fill_buffer_stateless.igdrcl_built_in " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyBufferToImage3d :
return " copy_buffer_to_image3d.igdrcl_built_in " ;
2019-11-14 22:25:38 +08:00
case EBuiltInOps : : CopyBufferToImage3dStateless :
return " copy_buffer_to_image3d_stateless.igdrcl_built_in " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyImage3dToBuffer :
return " copy_image3d_to_buffer.igdrcl_built_in " ;
case EBuiltInOps : : CopyImageToImage1d :
return " copy_image_to_image1d.igdrcl_built_in " ;
case EBuiltInOps : : CopyImageToImage2d :
return " copy_image_to_image2d.igdrcl_built_in " ;
case EBuiltInOps : : CopyImageToImage3d :
return " copy_image_to_image3d.igdrcl_built_in " ;
case EBuiltInOps : : FillImage1d :
return " fill_image1d.igdrcl_built_in " ;
case EBuiltInOps : : FillImage2d :
return " fill_image2d.igdrcl_built_in " ;
case EBuiltInOps : : FillImage3d :
return " fill_image3d.igdrcl_built_in " ;
case EBuiltInOps : : VmeBlockMotionEstimateIntel :
return " vme_block_motion_estimate_intel.igdrcl_built_in " ;
case EBuiltInOps : : VmeBlockAdvancedMotionEstimateCheckIntel :
return " vme_block_advanced_motion_estimate_check_intel.igdrcl_built_in " ;
case EBuiltInOps : : VmeBlockAdvancedMotionEstimateBidirectionalCheckIntel :
return " vme_block_advanced_motion_estimate_bidirectional_check_intel " ;
case EBuiltInOps : : Scheduler :
return " scheduler.igdrcl_built_in " ;
} ;
}
BuiltinResourceT createBuiltinResource ( const char * ptr , size_t size ) {
return BuiltinResourceT ( ptr , ptr + size ) ;
}
BuiltinResourceT createBuiltinResource ( const BuiltinResourceT & r ) {
return BuiltinResourceT ( r ) ;
}
2019-07-05 16:31:32 +08:00
std : : string createBuiltinResourceName ( EBuiltInOps : : Type builtin , const std : : string & extension ,
2017-12-21 07:45:38 +08:00
const std : : string & platformName , uint32_t deviceRevId ) {
std : : string ret ;
if ( platformName . size ( ) > 0 ) {
ret = platformName ;
ret + = " _ " + std : : to_string ( deviceRevId ) ;
ret + = " _ " ;
}
ret + = getBuiltinAsString ( builtin ) ;
if ( extension . size ( ) > 0 ) {
ret + = extension ;
}
return ret ;
}
std : : string joinPath ( const std : : string & lhs , const std : : string & rhs ) {
if ( lhs . size ( ) = = 0 ) {
return rhs ;
}
if ( rhs . size ( ) = = 0 ) {
return lhs ;
}
if ( * lhs . rbegin ( ) = = PATH_SEPARATOR ) {
return lhs + rhs ;
}
return lhs + PATH_SEPARATOR + rhs ;
}
std : : string getDriverInstallationPath ( ) {
return " " ;
}
BuiltinResourceT Storage : : load ( const std : : string & resourceName ) {
return loadImpl ( joinPath ( rootPath , resourceName ) ) ;
}
BuiltinResourceT FileStorage : : loadImpl ( const std : : string & fullResourceName ) {
BuiltinResourceT ret ;
std : : ifstream f { fullResourceName , std : : ios : : in | std : : ios : : binary | std : : ios : : ate } ;
auto end = f . tellg ( ) ;
f . seekg ( 0 , std : : ios : : beg ) ;
auto beg = f . tellg ( ) ;
auto s = end - beg ;
ret . resize ( static_cast < size_t > ( s ) ) ;
f . read ( ret . data ( ) , s ) ;
return ret ;
}
const BuiltinResourceT * EmbeddedStorageRegistry : : get ( const std : : string & name ) const {
auto it = resources . find ( name ) ;
if ( resources . end ( ) = = it ) {
return nullptr ;
}
return & it - > second ;
}
BuiltinResourceT EmbeddedStorage : : loadImpl ( const std : : string & fullResourceName ) {
auto * constResource = EmbeddedStorageRegistry : : getInstance ( ) . get ( fullResourceName ) ;
if ( constResource = = nullptr ) {
BuiltinResourceT ret ;
return ret ;
}
return createBuiltinResource ( * constResource ) ;
}
BuiltinsLib : : BuiltinsLib ( ) {
allStorages . push_back ( std : : unique_ptr < Storage > ( new EmbeddedStorage ( " " ) ) ) ;
allStorages . push_back ( std : : unique_ptr < Storage > ( new FileStorage ( getDriverInstallationPath ( ) ) ) ) ;
}
2019-07-05 16:31:32 +08:00
BuiltinCode BuiltinsLib : : getBuiltinCode ( EBuiltInOps : : Type builtin , BuiltinCode : : ECodeType requestedCodeType , Device & device ) {
2017-12-21 07:45:38 +08:00
std : : lock_guard < std : : mutex > lockRaii { mutex } ;
BuiltinResourceT bc ;
BuiltinCode : : ECodeType usedCodetType = BuiltinCode : : ECodeType : : INVALID ;
2018-06-09 04:40:27 +08:00
2017-12-21 07:45:38 +08:00
if ( requestedCodeType = = BuiltinCode : : ECodeType : : Any ) {
2018-06-09 04:40:27 +08:00
uint32_t codeType = static_cast < uint32_t > ( BuiltinCode : : ECodeType : : Binary ) ;
if ( DebugManager . flags . RebuildPrecompiledKernels . get ( ) ) {
codeType = static_cast < uint32_t > ( BuiltinCode : : ECodeType : : Source ) ;
}
for ( uint32_t e = static_cast < uint32_t > ( BuiltinCode : : ECodeType : : COUNT ) ;
2017-12-21 07:45:38 +08:00
codeType ! = e ; + + codeType ) {
bc = getBuiltinResource ( builtin , static_cast < BuiltinCode : : ECodeType > ( codeType ) , device ) ;
if ( bc . size ( ) > 0 ) {
usedCodetType = static_cast < BuiltinCode : : ECodeType > ( codeType ) ;
break ;
}
}
} else {
bc = getBuiltinResource ( builtin , requestedCodeType , device ) ;
usedCodetType = requestedCodeType ;
}
BuiltinCode ret ;
std : : swap ( ret . resource , bc ) ;
ret . type = usedCodetType ;
ret . targetDevice = & device ;
return ret ;
}
std : : unique_ptr < Program > BuiltinsLib : : createProgramFromCode ( const BuiltinCode & bc , Context & context , Device & device ) {
std : : unique_ptr < Program > ret ;
const char * data = bc . resource . data ( ) ;
size_t dataLen = bc . resource . size ( ) ;
cl_int err = 0 ;
switch ( bc . type ) {
default :
break ;
case BuiltinCode : : ECodeType : : Source :
case BuiltinCode : : ECodeType : : Intermediate :
2018-05-28 22:16:06 +08:00
ret . reset ( Program : : create ( data , & context , device , true , & err ) ) ;
2017-12-21 07:45:38 +08:00
break ;
case BuiltinCode : : ECodeType : : Binary :
2018-08-14 16:56:42 +08:00
ret . reset ( Program : : createFromGenBinary ( * device . getExecutionEnvironment ( ) , & context , data , dataLen , true , nullptr ) ) ;
2017-12-21 07:45:38 +08:00
break ;
}
return ret ;
}
2019-07-05 16:31:32 +08:00
BuiltinResourceT BuiltinsLib : : getBuiltinResource ( EBuiltInOps : : Type builtin , BuiltinCode : : ECodeType requestedCodeType , Device & device ) {
2017-12-21 07:45:38 +08:00
BuiltinResourceT bc ;
std : : string resourceNameGeneric = createBuiltinResourceName ( builtin , BuiltinCode : : getExtension ( requestedCodeType ) ) ;
2019-08-26 21:36:24 +08:00
std : : string resourceNameForPlatformType = createBuiltinResourceName ( builtin , BuiltinCode : : getExtension ( requestedCodeType ) , getFamilyNameWithType ( device . getHardwareInfo ( ) ) ) ;
std : : string resourceNameForPlatformTypeAndStepping = createBuiltinResourceName ( builtin , BuiltinCode : : getExtension ( requestedCodeType ) , getFamilyNameWithType ( device . getHardwareInfo ( ) ) ,
2019-05-08 22:00:24 +08:00
device . getHardwareInfo ( ) . platform . usRevId ) ;
2017-12-21 07:45:38 +08:00
2018-04-18 00:11:50 +08:00
for ( auto & rn : { resourceNameForPlatformTypeAndStepping , resourceNameForPlatformType , resourceNameGeneric } ) { // first look for dedicated version, only fallback to generic one
2017-12-21 07:45:38 +08:00
for ( auto & s : allStorages ) {
bc = s . get ( ) - > load ( rn ) ;
if ( bc . size ( ) ! = 0 ) {
return bc ;
}
}
}
return bc ;
}
2019-03-26 18:59:46 +08:00
} // namespace NEO