Skip to content

Commit af36a90

Browse files
committed
Refactor Init to delay Library Load
Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
1 parent 26dcdb5 commit af36a90

13 files changed

Lines changed: 2824 additions & 1876 deletions

scripts/templates/ldrddi.cpp.mako

Lines changed: 78 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ using namespace loader_driver_ddi;
2222

2323
namespace 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
{

scripts/templates/ldrddi.h.mako

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ from templates import helper as th
2020

2121
namespace loader
2222
{
23+
///////////////////////////////////////////////////////////////////////////////
24+
// Forward declaration for driver_t so this header can reference loader::driver_t*
25+
// without requiring inclusion of ze_loader_internal.h (which includes this file).
26+
struct driver_t;
2327
///////////////////////////////////////////////////////////////////////////////
2428
%for obj in th.extract_objs(specs, r"handle"):
2529
%if 'class' in obj:
@@ -32,6 +36,8 @@ namespace loader
3236

3337
%endif
3438
%endfor
39+
__${x}dlllocal ze_result_t ${X}_APICALL
40+
${n}loaderInitDriverDDITables(loader::driver_t *driver);
3541
}
3642

3743
namespace loader_driver_ddi
@@ -57,6 +63,8 @@ extern "C" {
5763
%for tbl in th.get_pfntables(specs, meta, n, tags):
5864
__${x}dlllocal void ${X}_APICALL
5965
${tbl['export']['name']}Legacy();
66+
__${x}dlllocal ze_result_t ${X}_APICALL
67+
${tbl['export']['name']}FromDriver(loader::driver_t *driver);
6068
%endfor
6169

6270
#if defined(__cplusplus)

scripts/templates/ze_loader_internal.h.mako

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ namespace loader
6969
bool legacyInitAttempted = false;
7070
bool driverDDIHandleSupportQueried = false;
7171
ze_driver_handle_t zerDriverHandle = nullptr;
72+
ze_api_version_t versionRequested = ZE_API_VERSION_CURRENT;
7273
};
7374

7475
using driver_vector_t = std::vector< driver_t >;
@@ -97,6 +98,7 @@ namespace loader
9798
std::unordered_map<ze_sampler_object_t *, ze_sampler_handle_t> sampler_handle_map;
9899
ze_api_version_t version = ZE_API_VERSION_CURRENT;
99100
ze_api_version_t configured_version = ZE_API_VERSION_CURRENT;
101+
ze_api_version_t ddi_init_version = ZE_API_VERSION_CURRENT;
100102

101103
driver_vector_t allDrivers;
102104
driver_vector_t zeDrivers;
@@ -129,6 +131,7 @@ namespace loader
129131
std::atomic<bool> sortingInProgress = {false};
130132
std::mutex sortMutex;
131133
bool instrumentationEnabled = false;
134+
bool pciOrderingRequested = false;
132135
dditable_t tracing_dditable = {};
133136
std::shared_ptr<Logger> zel_logger;
134137
ze_driver_handle_t defaultZerDriverHandle = nullptr;

0 commit comments

Comments
 (0)