@@ -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,12 @@ namespace loader
6576 if(drv.initStatus != ZE_RESULT_SUCCESS)
6677 continue;
6778 %endif
79+ if (!drv.handle || !drv.ddiInitialized) {
80+ auto res = loader::context->init_driver( drv, flags, nullptr );
81+ if (res != ZE_RESULT_SUCCESS) {
82+ continue;
83+ }
84+ }
6885 % if re.match(r " Init" , obj[' name' ]) and namespace == " zes" :
6986 if (!drv.dditable.${ n} .${ th.get_table_name(n, tags, obj)} .${ th.make_pfn_name(n, tags, obj)} ) {
7087 drv.initSysManStatus = ZE_RESULT_ERROR_UNINITIALIZED;
@@ -90,6 +107,13 @@ namespace loader
90107
91108 % 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)):
92109 uint32_t total_driver_handle_count = 0;
110+ % if re.match(r " \w + InitDrivers$ " , th.make_func_name(n, tags, obj)):
111+ for( auto& drv : loader::context->zeDrivers ) {
112+ if (!drv.handle || !drv.ddiInitialized) {
113+ loader::context->init_driver( drv, 0, desc);
114+ }
115+ }
116+ %endif
93117
94118 {
95119 std::lock_guard<std::mutex > lock(loader::context->sortMutex);
@@ -122,15 +146,16 @@ namespace loader
122146 %endif
123147 {
124148 % if not (re.match(r " \w + InitDrivers$ " , th.make_func_name(n, tags, obj))) and namespace != " zes" :
125- if(drv.initStatus != ZE_RESULT_SUCCESS)
149+ if(drv.initStatus != ZE_RESULT_SUCCESS || !drv.ddiInitialized )
126150 continue;
127151 % elif namespace == " zes" :
128- if(drv.initStatus != ZE_RESULT_SUCCESS || drv.initSysManStatus != ZE_RESULT_SUCCESS)
152+ if(drv.initStatus != ZE_RESULT_SUCCESS || drv.initSysManStatus != ZE_RESULT_SUCCESS || !drv.ddiInitialized )
129153 continue;
130154 % else :
131155 if (!drv.dditable.${ n} .${ th.get_table_name(n, tags, obj)} .${ th.make_pfn_name(n, tags, obj)} ) {
132156 % if re.match(r " \w + InitDrivers$ " , th.make_func_name(n, tags, obj)):
133157 drv.initDriversStatus = ${ X} _RESULT_ERROR_UNINITIALIZED;
158+ result = ${ X} _RESULT_ERROR_UNINITIALIZED;
134159 % else :
135160 drv.initStatus = ${ X} _RESULT_ERROR_UNINITIALIZED;
136161 %endif
@@ -179,7 +204,8 @@ namespace loader
179204 for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
180205 uint32_t driver_index = total_driver_handle_count + i;
181206 % if namespace != " zes" :
182- drv.zerDriverHandle = phDrivers[ driver_index ];
207+ if (drv.zerddiInitResult == ZE_RESULT_SUCCESS)
208+ drv.zerDriverHandle = phDrivers[ driver_index ];
183209 if (drv.driverDDIHandleSupportQueried == false) {
184210 uint32_t extensionCount = 0;
185211 ze_result_t res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, nullptr);
@@ -503,6 +529,52 @@ ${tbl['export']['name']}Legacy()
503529
504530%endfor
505531
532+ % for tbl in th.get_pfntables(specs, meta, n, tags):
533+ ///////////////////////////////////////////////////////////////////////////////
534+ /// @brief Exported function for filling application's ${ tbl[' name' ]} table
535+ /// with current process' addresses
536+ ///
537+ /// @returns
538+ /// - ::${ X} _RESULT_SUCCESS
539+ /// - ::${ X} _RESULT_ERROR_UNINITIALIZED
540+ /// - ::${ X} _RESULT_ERROR_INVALID_NULL_POINTER
541+ /// - ::${ X} _RESULT_ERROR_UNSUPPORTED_VERSION
542+ __${ x} dlllocal ${ x} _result_t ${ X} _APICALL
543+ ${ tbl[' export' ][' name' ]} FromDriver(loader::driver_t *driver)
544+ {
545+ ${ x} _result_t result = ${ X} _RESULT_SUCCESS;
546+ if(driver->initStatus != ZE_RESULT_SUCCESS)
547+ return driver->initStatus;
548+ auto getTable = reinterpret_cast<${ tbl[' pfn' ]} >(
549+ GET_FUNCTION_PTR( driver->handle, "${ tbl[' export' ][' name' ]} ") );
550+ if(!getTable)
551+ % if th.isNewProcTable(tbl[' export' ][' name' ]) is True and namespace != " zer" :
552+ {
553+ //It is valid to not have this proc addr table
554+ return ${ X} _RESULT_SUCCESS;
555+ }
556+ % else :
557+ return driver->initStatus;
558+ %endif
559+ % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
560+ auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.${ n} .${ tbl[' name' ]} );
561+ if(getTableResult == ZE_RESULT_SUCCESS) {
562+ loader::context->configured_version = loader::context->ddi_init_version;
563+ } else
564+ driver->initStatus = getTableResult;
565+ % if namespace != " zes" :
566+ % if tbl[' name' ] == " Global" and namespace != " zer" :
567+ if (driver->dditable.ze.Global.pfnInitDrivers) {
568+ loader::context->initDriversSupport = true;
569+ }
570+ %endif
571+ %endif
572+ % else :
573+ result = getTable( loader::context->ddi_init_version, &driver->dditable.${ n} .${ tbl[' name' ]} );
574+ %endif
575+ return result;
576+ }
577+ %endfor
506578% for tbl in th.get_pfntables(specs, meta, n, tags):
507579///////////////////////////////////////////////////////////////////////////////
508580/// @brief Exported function for filling application's ${ tbl[' name' ]} table
@@ -534,63 +606,26 @@ ${tbl['export']['name']}(
534606 if( loader::context->version < version )
535607 return ${ X} _RESULT_ERROR_UNSUPPORTED_VERSION;
536608
609+ loader::context->ddi_init_version = version;
610+
537611 ${ x} _result_t result = ${ X} _RESULT_SUCCESS;
538612
539- % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
540- bool atLeastOneDriverValid = false;
541- %endif
542- // Load the device-driver DDI tables
543613 % if namespace != " zes" :
544- for( auto& drv : loader::context->zeDrivers )
614+ auto driverCount = loader::context->zeDrivers.size();
615+ auto firstDriver = &loader::context->zeDrivers[0];
545616 % else :
546- for( auto& drv : *loader::context->sysmanInstanceDrivers )
617+ auto driverCount = loader::context->sysmanInstanceDrivers->size();
618+ auto firstDriver = &loader::context->sysmanInstanceDrivers->at(0);
547619 %endif
548- {
549- if(drv.initStatus != ZE_RESULT_SUCCESS)
550- continue;
551- auto getTable = reinterpret_cast<${ tbl[' pfn' ]} >(
552- GET_FUNCTION_PTR( drv.handle, "${ tbl[' export' ][' name' ]} ") );
553- if(!getTable)
554- % if th.isNewProcTable(tbl[' export' ][' name' ]) is True and namespace != " zer" :
555- {
556- atLeastOneDriverValid = true;
557- //It is valid to not have this proc addr table
558- continue;
559- }
560- % else :
561- continue;
562- %endif
563- % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
564- auto getTableResult = getTable( version, &drv.dditable.${ n} .${ tbl[' name' ]} );
565- if(getTableResult == ZE_RESULT_SUCCESS) {
566- atLeastOneDriverValid = true;
567- loader::context->configured_version = version;
568- } else
569- drv.initStatus = getTableResult;
570- % if namespace != " zes" :
571- % if tbl[' name' ] == " Global" and namespace != " zer" :
572- if (drv.dditable.ze.Global.pfnInitDrivers) {
573- loader::context->initDriversSupport = true;
574- }
575- %endif
576- %endif
577- % else :
578- result = getTable( version, &drv.dditable.${ n} .${ tbl[' name' ]} );
579- %endif
620+ if (driverCount == 1 && firstDriver && !loader::context->forceIntercept) {
621+ result = ${ tbl[' export' ][' name' ]} FromDriver(firstDriver);
580622 }
581623
582- % if tbl[' experimental' ] is False and namespace != " zer" : # //Experimental Tables may not be implemented in driver
583- if(!atLeastOneDriverValid)
584- result = ${ X} _RESULT_ERROR_UNINITIALIZED;
585- else
586- result = ${ X} _RESULT_SUCCESS;
587- %endif
588-
589624 if( ${ X} _RESULT_SUCCESS == result )
590625 {
591626 % if namespace != " zes" :
592627 if( ( loader::context->zeDrivers.size() > 1 ) || loader::context->forceIntercept )
593- % else :
628+ % elif namespace == " zes " :
594629 if( ( loader::context->sysmanInstanceDrivers->size() > 1 ) || loader::context->forceIntercept )
595630 %endif
596631 {
0 commit comments