Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# Level zero loader changelog
## v1.26.3
* fix handling of optional DDI tables missing or incorrect
## v1.26.2
* fix: fix Driver Search Paths for all Linux Distros
## v1.26.1
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ if(MSVC AND (MSVC_VERSION LESS 1900))
endif()

# This project follows semantic versioning (https://semver.org/)
project(level-zero VERSION 1.26.2)
project(level-zero VERSION 1.26.3)
include(GNUInstallDirs)

find_package(Git)
Expand Down
4 changes: 2 additions & 2 deletions PRODUCT_GUID.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
1.26.2
cf85b8de-e9c1-4d88-9f18-7164098e1c1e
1.26.3
d1ed32f4-2b7d-4718-9f86-69cbae2c1836
30 changes: 29 additions & 1 deletion scripts/templates/ldrddi.cpp.mako
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,42 @@ using namespace loader_driver_ddi;

namespace loader
{
///////////////////////////////////////////////////////////////////////////////
/// @brief Initialize all DDI tables for a driver by calling *FromDriver functions
///
/// @details This function can fail in the following scenarios:
/// - driver->initStatus is already set to a failure code (from a previous
/// required DDI initialization failure). Each *FromDriver call first checks
/// driver->initStatus and returns it immediately if it's already a failure.
/// - A required DDI table's getTable call into the driver returns a failure,
/// which updates driver->initStatus and is propagated back
///
/// Note: If GET_FUNCTION_PTR returns null (function not found in driver),
/// it only fails if driver->initStatus was already a failure. Otherwise,
/// driver->initStatus is returned (which would be SUCCESS).
///
/// Note: Optional DDI tables (when namespace != "zer") are ignored if they
/// fail, and this function continues to attempt loading remaining tables.
/// Only required DDI table failures cause this function to fail and return
/// immediately.
///
/// @returns
/// - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
/// - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
__${x}dlllocal ze_result_t ${X}_APICALL
${n}loaderInitDriverDDITables(loader::driver_t *driver) {
ze_result_t result = ZE_RESULT_SUCCESS;
%for tbl in th.get_pfntables(specs, meta, n, tags):
%if tbl['optional'] == True and namespace != "zer":
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
${tbl['export']['name']}FromDriver(driver);
result = ZE_RESULT_SUCCESS;
%else:
result = ${tbl['export']['name']}FromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
%endif
%endfor
return result;
}
Expand Down Expand Up @@ -556,7 +584,7 @@ ${tbl['export']['name']}FromDriver(loader::driver_t *driver)
%else:
return driver->initStatus;
%endif
%if tbl['experimental'] is False and namespace != "zer": #//Experimental Tables may not be implemented in driver
%if tbl['experimental'] is False and namespace != "zer" and tbl['optional'] != True: #//Experimental Tables may not be implemented in driver
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.${n}.${tbl['name']});
if(getTableResult == ZE_RESULT_SUCCESS) {
loader::context->configured_version = loader::context->ddi_init_version;
Expand Down
125 changes: 63 additions & 62 deletions source/loader/ze_ldrddi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,45 +13,61 @@ using namespace loader_driver_ddi;

namespace loader
{
///////////////////////////////////////////////////////////////////////////////
/// @brief Initialize all DDI tables for a driver by calling *FromDriver functions
///
/// @details This function can fail in the following scenarios:
/// - driver->initStatus is already set to a failure code (from a previous
/// required DDI initialization failure). Each *FromDriver call first checks
/// driver->initStatus and returns it immediately if it's already a failure.
/// - A required DDI table's getTable call into the driver returns a failure,
/// which updates driver->initStatus and is propagated back
///
/// Note: If GET_FUNCTION_PTR returns null (function not found in driver),
/// it only fails if driver->initStatus was already a failure. Otherwise,
/// driver->initStatus is returned (which would be SUCCESS).
///
/// Note: Optional DDI tables (when namespace != "zer") are ignored if they
/// fail, and this function continues to attempt loading remaining tables.
/// Only required DDI table failures cause this function to fail and return
/// immediately.
///
/// @returns
/// - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
/// - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
__zedlllocal ze_result_t ZE_APICALL
zeloaderInitDriverDDITables(loader::driver_t *driver) {
ze_result_t result = ZE_RESULT_SUCCESS;
result = zeGetGlobalProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetRTASBuilderProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetRTASBuilderExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetRTASParallelOperationProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetRTASParallelOperationExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetRTASBuilderProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetRTASBuilderExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetRTASParallelOperationProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetRTASParallelOperationExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetDriverProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetDriverExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetDriverExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetDeviceProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetDeviceExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetDeviceExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetContextProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
Expand All @@ -64,18 +80,16 @@ namespace loader
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetCommandListExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetCommandListExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetEventProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetEventExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetEventExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetEventPoolProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
Expand All @@ -88,26 +102,23 @@ namespace loader
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetImageExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetImageExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetKernelProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetKernelExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetKernelExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetMemProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetMemExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetMemExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
result = zeGetModuleProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
Expand All @@ -128,14 +139,12 @@ namespace loader
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetFabricEdgeExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
result = zeGetFabricVertexExpProcAddrTableFromDriver(driver);
if (result != ZE_RESULT_SUCCESS) {
return result;
}
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetFabricEdgeExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
zeGetFabricVertexExpProcAddrTableFromDriver(driver);
result = ZE_RESULT_SUCCESS;
return result;
}
///////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -7819,11 +7828,7 @@ zeGetRTASBuilderProcAddrTableFromDriver(loader::driver_t *driver)
GET_FUNCTION_PTR( driver->handle, "zeGetRTASBuilderProcAddrTable") );
if(!getTable)
return driver->initStatus;
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASBuilder);
if(getTableResult == ZE_RESULT_SUCCESS) {
loader::context->configured_version = loader::context->ddi_init_version;
} else
driver->initStatus = getTableResult;
result = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASBuilder);
return result;
}
///////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -7867,11 +7872,7 @@ zeGetRTASParallelOperationProcAddrTableFromDriver(loader::driver_t *driver)
GET_FUNCTION_PTR( driver->handle, "zeGetRTASParallelOperationProcAddrTable") );
if(!getTable)
return driver->initStatus;
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASParallelOperation);
if(getTableResult == ZE_RESULT_SUCCESS) {
loader::context->configured_version = loader::context->ddi_init_version;
} else
driver->initStatus = getTableResult;
result = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASParallelOperation);
return result;
}
///////////////////////////////////////////////////////////////////////////////
Expand Down
22 changes: 22 additions & 0 deletions source/loader/zer_ldrddi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,28 @@ using namespace loader_driver_ddi;

namespace loader
{
///////////////////////////////////////////////////////////////////////////////
/// @brief Initialize all DDI tables for a driver by calling *FromDriver functions
///
/// @details This function can fail in the following scenarios:
/// - driver->initStatus is already set to a failure code (from a previous
/// required DDI initialization failure). Each *FromDriver call first checks
/// driver->initStatus and returns it immediately if it's already a failure.
/// - A required DDI table's getTable call into the driver returns a failure,
/// which updates driver->initStatus and is propagated back
///
/// Note: If GET_FUNCTION_PTR returns null (function not found in driver),
/// it only fails if driver->initStatus was already a failure. Otherwise,
/// driver->initStatus is returned (which would be SUCCESS).
///
/// Note: Optional DDI tables (when namespace != "zer") are ignored if they
/// fail, and this function continues to attempt loading remaining tables.
/// Only required DDI table failures cause this function to fail and return
/// immediately.
///
/// @returns
/// - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
/// - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
__zedlllocal ze_result_t ZE_APICALL
zerloaderInitDriverDDITables(loader::driver_t *driver) {
ze_result_t result = ZE_RESULT_SUCCESS;
Expand Down
Loading
Loading