Skip to content
Draft
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
91 changes: 56 additions & 35 deletions scripts/templates/ldrddi.cpp.mako
Original file line number Diff line number Diff line change
Expand Up @@ -252,48 +252,69 @@ namespace loader
if (drv.zerddiInitResult == ZE_RESULT_SUCCESS)
drv.zerDriverHandle = phDrivers[ driver_index ];
if (drv.driverDDIHandleSupportQueried == false) {
uint32_t extensionCount = 0;
ze_result_t res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, nullptr);
if (res != ZE_RESULT_SUCCESS) {
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " failed zeDriverGetExtensionProperties query, returned ";
loader::context->debug_trace_message(message, loader::to_string(res));
}
return res;
}
std::vector<ze_driver_extension_properties_t> extensionProperties(extensionCount);
res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, extensionProperties.data());
if (res != ZE_RESULT_SUCCESS) {
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " failed zeDriverGetExtensionProperties query, returned ";
loader::context->debug_trace_message(message, loader::to_string(res));
}
return res;
}
if (extensionCount > 0) {
for (uint32_t extIndex = 0; extIndex < extensionCount; extIndex++) {
if (strcmp(extensionProperties[extIndex].name, ZE_DRIVER_DDI_HANDLES_EXT_NAME) == 0 && (!(extensionProperties[extIndex].version >= ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_1))) {
// Driver supports DDI Handles but not the required version for ZER APIs so set the driverHandle to nullptr
drv.zerDriverHandle = nullptr;
drv.zerDriverDDISupported = false;
break;
// Drivers reporting API version 1.17 or newer are required to support the Driver DDI
// Handles extension (ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES) at version 1.1,
// so the zeDriverGetExtensionProperties check can be skipped for them.
bool ddiHandlesExtImplied = false;
if (drv.dditable.ze.Driver.pfnGetApiVersion) {
ze_api_version_t driverApiVersion = ZE_API_VERSION_FORCE_UINT32;
ze_result_t versionRes = drv.dditable.ze.Driver.pfnGetApiVersion(phDrivers[ driver_index ], &driverApiVersion);
if (versionRes == ZE_RESULT_SUCCESS && driverApiVersion >= ZE_MAKE_VERSION(1, 17)) {
ddiHandlesExtImplied = true;
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " reports API version >= 1.17, assuming Driver DDI Handles Ext v1.1 support";
loader::context->debug_trace_message(message, "");
}
}
}
ze_result_t res = ZE_RESULT_SUCCESS;
drv.properties = {};
drv.properties.stype = ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES;
drv.properties.pNext = nullptr;
ze_driver_properties_t driverProperties = {};
driverProperties.stype = ZE_STRUCTURE_TYPE_DRIVER_PROPERTIES;
driverProperties.pNext = nullptr;
driverProperties.pNext = &drv.properties;
res = drv.dditable.ze.Driver.pfnGetProperties(${obj['params'][1]['name']}[ driver_index ], &driverProperties);
if (res != ZE_RESULT_SUCCESS) {
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " failed zeDriverGetProperties query, returned ";
loader::context->debug_trace_message(message, loader::to_string(res));
if (ddiHandlesExtImplied) {
// API version >= 1.17 implies Driver DDI Handles Ext v1.1 support, so the
// properties query can be skipped and the supported flag assumed (superset).
drv.properties.flags = ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED;
} else {
uint32_t extensionCount = 0;
res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, nullptr);
if (res != ZE_RESULT_SUCCESS) {
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " failed zeDriverGetExtensionProperties query, returned ";
loader::context->debug_trace_message(message, loader::to_string(res));
}
return res;
}
std::vector<ze_driver_extension_properties_t> extensionProperties(extensionCount);
res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, extensionProperties.data());
if (res != ZE_RESULT_SUCCESS) {
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " failed zeDriverGetExtensionProperties query, returned ";
loader::context->debug_trace_message(message, loader::to_string(res));
}
return res;
}
if (extensionCount > 0) {
for (uint32_t extIndex = 0; extIndex < extensionCount; extIndex++) {
if (strcmp(extensionProperties[extIndex].name, ZE_DRIVER_DDI_HANDLES_EXT_NAME) == 0 && (!(extensionProperties[extIndex].version >= ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_1))) {
// Driver supports DDI Handles but not the required version for ZER APIs so set the driverHandle to nullptr
drv.zerDriverHandle = nullptr;
drv.zerDriverDDISupported = false;
break;
}
}
}
ze_driver_properties_t driverProperties = {};
driverProperties.stype = ZE_STRUCTURE_TYPE_DRIVER_PROPERTIES;
driverProperties.pNext = &drv.properties;
res = drv.dditable.ze.Driver.pfnGetProperties(${obj['params'][1]['name']}[ driver_index ], &driverProperties);
if (res != ZE_RESULT_SUCCESS) {
if (loader::context->debugTraceEnabled) {
std::string message = drv.name + " failed zeDriverGetProperties query, returned ";
loader::context->debug_trace_message(message, loader::to_string(res));
}
return res;
}
return res;
}
drv.driverDDIHandleSupportQueried = true;
}
Expand Down
11 changes: 11 additions & 0 deletions source/drivers/null/ze_null.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@ namespace driver
#endif
std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID);
ddiExtensionSupported = (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3");

// Drivers reporting API version >= 1.17 are required by the spec to support the Driver
// DDI Handles extension at version 1.1, and the loader relies on that contract to skip
// the extension-property query for them. When this test driver is configured to simulate
// a driver that does NOT provide DDI Handles ext v1.1 (the extension is disabled, or only
// v1.0 is advertised), it must report a pre-1.17 API version so the loader exercises the
// legacy extension-property detection path instead of assuming support.
auto ddi_version_env = getenv_string( "ZEL_TEST_DDI_HANDLES_EXT_VERSION" );
if (!ddiExtensionSupported || ddi_version_env == "1_0") {
version = ZE_API_VERSION_1_16;
}

zesDdiTable.Driver.pfnGet = [](
uint32_t* pCount,
Expand Down
Loading
Loading