@@ -400,6 +400,112 @@ namespace loader
400400 }
401401 return res;
402402 }
403+ <<<<<<< HEAD
404+ =======
405+
406+ // Reset pCount to 0 when calling the driver init function from the driver's ddi table.
407+ pCount = 0 ;
408+ res = driver.dditable .ze .Global .pfnInitDrivers (&pCount, nullptr , desc);
409+ // Verify that this driver successfully init in the call above.
410+ if (res != ZE_RESULT_SUCCESS ) {
411+ if (debugTraceEnabled) {
412+ std::string message = " init driver (driver ddi) " + driver.name + " zeInitDrivers(" + loader::to_string (desc) + " ) returning " ;
413+ debug_trace_message (message, loader::to_string (res));
414+ }
415+ return res;
416+ }
417+ driverHandles.resize (pCount);
418+ // Use the driver's init function to query the driver handles and read the properties.
419+ res = driver.dditable .ze .Global .pfnInitDrivers (&pCount, driverHandles.data (), desc);
420+ // Verify that this driver successfully init in the call above.
421+ if (res != ZE_RESULT_SUCCESS ) {
422+ if (debugTraceEnabled) {
423+ std::string message = " init driver (driver ddi) " + driver.name + " zeInitDrivers(" + loader::to_string (desc) + " ) returning " ;
424+ debug_trace_message (message, loader::to_string (res));
425+ }
426+ return res;
427+ }
428+ }
429+
430+ for (auto handle : driverHandles) {
431+ ze_driver_ddi_handles_ext_properties_t driverDdiHandlesExtProperties = {};
432+ driverDdiHandlesExtProperties.stype = ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES ;
433+ driverDdiHandlesExtProperties.pNext = nullptr ;
434+ ze_driver_properties_t properties = {};
435+ properties.stype = ZE_STRUCTURE_TYPE_DRIVER_PROPERTIES ;
436+ properties.pNext = &driverDdiHandlesExtProperties;
437+ ze_result_t res = driver.dditable .ze .Driver .pfnGetProperties (handle, &properties);
438+ if (res != ZE_RESULT_SUCCESS ) {
439+ if (debugTraceEnabled) {
440+ std::string message = " init driver " + driver.name + " failed, zeDriverGetProperties returned " ;
441+ debug_trace_message (message, loader::to_string (res));
442+ }
443+ return res;
444+ }
445+ driver.properties = properties;
446+ driver.driverSupportsDDIHandles = driverDdiHandlesExtProperties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED ;
447+ uint32_t deviceCount = 0 ;
448+ res = driver.dditable .ze .Device .pfnGet ( handle, &deviceCount, nullptr );
449+ if ( ZE_RESULT_SUCCESS != res ) {
450+ if (debugTraceEnabled) {
451+ std::string message = " init driver " + driver.name + " failed, zeDeviceGet returned " ;
452+ debug_trace_message (message, loader::to_string (res));
453+ }
454+ return res;
455+ }
456+ if (deviceCount == 0 ) {
457+ if (debugTraceEnabled) {
458+ std::string message = " init driver " + driver.name + " failed, zeDeviceGet returned 0 devices" ;
459+ debug_trace_message (message, " " );
460+ }
461+ return ZE_RESULT_ERROR_UNINITIALIZED ;
462+ }
463+ std::vector<ze_device_handle_t > deviceHandles (deviceCount);
464+ res = driver.dditable .ze .Device .pfnGet ( handle, &deviceCount, deviceHandles.data () );
465+ if ( ZE_RESULT_SUCCESS != res ) {
466+ if (debugTraceEnabled) {
467+ std::string message = " init driver " + driver.name + " failed, zeDeviceGet returned " ;
468+ debug_trace_message (message, loader::to_string (res));
469+ }
470+ return res;
471+ }
472+ bool integratedGPU = false ;
473+ bool discreteGPU = false ;
474+ bool other = false ;
475+ for ( auto device : deviceHandles ) {
476+ ze_device_properties_t deviceProperties = {};
477+ deviceProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES ;
478+ deviceProperties.pNext = nullptr ;
479+ res = driver.dditable .ze .Device .pfnGetProperties (device, &deviceProperties);
480+ if ( ZE_RESULT_SUCCESS != res ) {
481+ if (debugTraceEnabled) {
482+ std::string message = " init driver " + driver.name + " failed, zeDeviceGetProperties returned " ;
483+ debug_trace_message (message, loader::to_string (res));
484+ }
485+ return res;
486+ }
487+ if (deviceProperties.type == ZE_DEVICE_TYPE_GPU ) {
488+ if (deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_INTEGRATED ) {
489+ integratedGPU = true ;
490+ } else {
491+ discreteGPU = true ;
492+ }
493+ } else {
494+ other = true ;
495+ }
496+ }
497+ if (integratedGPU && discreteGPU && other) {
498+ driver.driverType = ZEL_DRIVER_TYPE_MIXED ;
499+ } else if (integratedGPU && discreteGPU) {
500+ driver.driverType = ZEL_DRIVER_TYPE_GPU ;
501+ } else if (integratedGPU) {
502+ driver.driverType = ZEL_DRIVER_TYPE_INTEGRATED_GPU ;
503+ } else if (discreteGPU) {
504+ driver.driverType = ZEL_DRIVER_TYPE_DISCRETE_GPU ;
505+ } else if (other) {
506+ driver.driverType = ZEL_DRIVER_TYPE_OTHER ;
507+ }
508+ >>>>>>> 256c0912 (Update Loader to support DDI handle extension path with sample)
403509 }
404510 return ZE_RESULT_SUCCESS ;
405511 }
0 commit comments