@@ -22,6 +22,17 @@ using namespace loader_driver_ddi;
2222
2323namespace loader
2424{
25+ __${ x} dlllocal ze_result_t ${ X} _APICALL
26+ ${ n} loaderInitDriverDDITables(loader::driver_t *driver) {
27+ ze_result_t result = ZE_RESULT_SUCCESS;
28+ % for tbl in th.get_pfntables(specs, meta, n, tags):
29+ result = ${ tbl[' export' ][' name' ]} FromDriver(driver);
30+ if (result != ZE_RESULT_SUCCESS) {
31+ return result;
32+ }
33+ %endfor
34+ return result;
35+ }
2536 % for obj in th.extract_objs(specs, r " function" ):
2637 <%
2738 ret_type = obj[' return_type' ]
@@ -65,6 +76,14 @@ namespace loader
6576 if(drv.initStatus != ZE_RESULT_SUCCESS)
6677 continue;
6778 %endif
79+ if (!drv.handle) {
80+ % if namespace != " zes" :
81+ bool sysmanInit = false;
82+ % else :
83+ bool sysmanInit = true;
84+ %endif
85+ loader::context->init_driver( drv, flags, nullptr, nullptr, nullptr, sysmanInit );
86+ }
6887 % if re.match(r " Init" , obj[' name' ]) and namespace == " zes" :
6988 if (!drv.dditable.${ n} .${ th.get_table_name(n, tags, obj)} .${ th.make_pfn_name(n, tags, obj)} ) {
7089 drv.initSysManStatus = ZE_RESULT_ERROR_UNINITIALIZED;
@@ -90,6 +109,13 @@ namespace loader
90109
91110 % elif re.match(r " \w + DriverGet$ " , th.make_func_name(n, tags, obj)) or re.match(r " \w + InitDrivers$ " , th.make_func_name(n, tags, obj)):
92111 uint32_t total_driver_handle_count = 0;
112+ % if re.match(r " \w + InitDrivers$ " , th.make_func_name(n, tags, obj)):
113+ for( auto& drv : loader::context->zeDrivers ) {
114+ if (!drv.handle) {
115+ loader::context->init_driver( drv, 0, desc, nullptr, nullptr, false );
116+ }
117+ }
118+ %endif
93119
94120 {
95121 std::lock_guard<std::mutex > lock(loader::context->sortMutex);
@@ -499,6 +525,52 @@ ${tbl['export']['name']}Legacy()
499525
500526%endfor
501527
528+ % for tbl in th.get_pfntables(specs, meta, n, tags):
529+ ///////////////////////////////////////////////////////////////////////////////
530+ /// @brief Exported function for filling application's ${ tbl[' name' ]} table
531+ /// with current process' addresses
532+ ///
533+ /// @returns
534+ /// - ::${ X} _RESULT_SUCCESS
535+ /// - ::${ X} _RESULT_ERROR_UNINITIALIZED
536+ /// - ::${ X} _RESULT_ERROR_INVALID_NULL_POINTER
537+ /// - ::${ X} _RESULT_ERROR_UNSUPPORTED_VERSION
538+ __${ x} dlllocal ${ x} _result_t ${ X} _APICALL
539+ ${ tbl[' export' ][' name' ]} FromDriver(loader::driver_t *driver)
540+ {
541+ ${ x} _result_t result = ${ X} _RESULT_SUCCESS;
542+ if(driver->initStatus != ZE_RESULT_SUCCESS)
543+ return driver->initStatus;
544+ auto getTable = reinterpret_cast<${ tbl[' pfn' ]} >(
545+ GET_FUNCTION_PTR( driver->handle, "${ tbl[' export' ][' name' ]} ") );
546+ if(!getTable)
547+ % if th.isNewProcTable(tbl[' export' ][' name' ]) is True and namespace != " zer" :
548+ {
549+ //It is valid to not have this proc addr table
550+ return ${ X} _RESULT_SUCCESS;
551+ }
552+ % else :
553+ return driver->initStatus;
554+ %endif
555+ % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
556+ auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.${ n} .${ tbl[' name' ]} );
557+ if(getTableResult == ZE_RESULT_SUCCESS) {
558+ loader::context->configured_version = loader::context->ddi_init_version;
559+ } else
560+ driver->initStatus = getTableResult;
561+ % if namespace != " zes" :
562+ % if tbl[' name' ] == " Global" and namespace != " zer" :
563+ if (driver->dditable.ze.Global.pfnInitDrivers) {
564+ loader::context->initDriversSupport = true;
565+ }
566+ %endif
567+ %endif
568+ % else :
569+ result = getTable( loader::context->ddi_init_version, &driver->dditable.${ n} .${ tbl[' name' ]} );
570+ %endif
571+ return result;
572+ }
573+ %endfor
502574% for tbl in th.get_pfntables(specs, meta, n, tags):
503575///////////////////////////////////////////////////////////////////////////////
504576/// @brief Exported function for filling application's ${ tbl[' name' ]} table
@@ -530,63 +602,17 @@ ${tbl['export']['name']}(
530602 if( loader::context->version < version )
531603 return ${ X} _RESULT_ERROR_UNSUPPORTED_VERSION;
532604
533- ${ x } _result_t result = ${ X } _RESULT_SUCCESS ;
605+ loader::context->ddi_init_version = version ;
534606
535- % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
536- bool atLeastOneDriverValid = false;
537- %endif
538- // Load the device-driver DDI tables
539- % if namespace != " zes" :
540- for( auto& drv : loader::context->zeDrivers )
541- % else :
542- for( auto& drv : *loader::context->sysmanInstanceDrivers )
543- %endif
544- {
545- if(drv.initStatus != ZE_RESULT_SUCCESS)
546- continue;
547- auto getTable = reinterpret_cast<${ tbl[' pfn' ]} >(
548- GET_FUNCTION_PTR( drv.handle, "${ tbl[' export' ][' name' ]} ") );
549- if(!getTable)
550- % if th.isNewProcTable(tbl[' export' ][' name' ]) is True and namespace != " zer" :
551- {
552- atLeastOneDriverValid = true;
553- //It is valid to not have this proc addr table
554- continue;
555- }
556- % else :
557- continue;
558- %endif
559- % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
560- auto getTableResult = getTable( version, &drv.dditable.${ n} .${ tbl[' name' ]} );
561- if(getTableResult == ZE_RESULT_SUCCESS) {
562- atLeastOneDriverValid = true;
563- loader::context->configured_version = version;
564- } else
565- drv.initStatus = getTableResult;
566- % if namespace != " zes" :
567- % if tbl[' name' ] == " Global" and namespace != " zer" :
568- if (drv.dditable.ze.Global.pfnInitDrivers) {
569- loader::context->initDriversSupport = true;
570- }
571- %endif
572- %endif
573- % else :
574- result = getTable( version, &drv.dditable.${ n} .${ tbl[' name' ]} );
575- %endif
576- }
577-
578- % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
579- if(!atLeastOneDriverValid)
580- result = ${ X} _RESULT_ERROR_UNINITIALIZED;
581- else
582- result = ${ X} _RESULT_SUCCESS;
583- %endif
607+ ${ x} _result_t result = ${ X} _RESULT_SUCCESS;
584608
585609 if( ${ X} _RESULT_SUCCESS == result )
586610 {
587- % if namespace != " zes" :
611+ % if tbl[' name' ] == " Global" :
612+ if( true )
613+ % elif namespace != " zes" :
588614 if( ( loader::context->zeDrivers.size() > 1 ) || loader::context->forceIntercept )
589- % else :
615+ % elif namespace == " zes " :
590616 if( ( loader::context->sysmanInstanceDrivers->size() > 1 ) || loader::context->forceIntercept )
591617 %endif
592618 {
0 commit comments