Skip to content

Commit 7f2769f

Browse files
committed
Update Loader to support DDI handle extension path with sample
Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
1 parent 2ff9704 commit 7f2769f

9 files changed

Lines changed: 175 additions & 21 deletions

File tree

samples/zello_world/zello_world.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,9 @@ int main( int argc, char *argv[] )
131131

132132
for( uint32_t driver = 0; driver < driverCount; ++driver )
133133
{
134+
std::cout << "Driver # " << driver << "\n";
134135
pDriver = drivers[driver];
135136
pDevice = findDevice( pDriver, type );
136-
if( pDevice )
137-
{
138-
break;
139-
}
140137
}
141138
}
142139

scripts/templates/ldrddi.cpp.mako

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,10 @@ namespace loader
138138
{
139139
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
140140
uint32_t driver_index = total_driver_handle_count + i;
141-
${obj['params'][1]['name']}[ driver_index ] = reinterpret_cast<${n}_driver_handle_t>(
142-
context->${n}_driver_factory.getInstance( ${obj['params'][1]['name']}[ driver_index ], &drv.dditable ) );
141+
if (!drv.driverSupportsDDIHandles) {
142+
${obj['params'][1]['name']}[ driver_index ] = reinterpret_cast<${n}_driver_handle_t>(
143+
context->${n}_driver_factory.getInstance( ${obj['params'][1]['name']}[ driver_index ], &drv.dditable ) );
144+
}
143145
}
144146
}
145147
catch( std::bad_alloc& )

source/drivers/null/ze_null.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ namespace driver
1414
{
1515
//////////////////////////////////////////////////////////////////////////
1616
context_t context;
17+
ze_dditable_driver_t pCore;
18+
zet_dditable_driver_t pTools;
19+
zes_dditable_driver_t pSysman;
1720

1821
//////////////////////////////////////////////////////////////////////////
1922
context_t::context_t()
@@ -63,12 +66,17 @@ namespace driver
6366
ze_driver_handle_t,
6467
ze_driver_properties_t* pDriverProperties )
6568
{
66-
ze_driver_properties_t driverProperties = {};
67-
driverProperties.stype = ZE_STRUCTURE_TYPE_DRIVER_PROPERTIES;
68-
//driverProperties.uuid
69-
driverProperties.driverVersion = 0;
69+
auto pNext = reinterpret_cast<ze_base_properties_t *>(pDriverProperties->pNext);
70+
while (pNext) {
71+
if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES) {
72+
ze_driver_ddi_handles_ext_properties_t *pDdiHandlesExtProperties = reinterpret_cast<ze_driver_ddi_handles_ext_properties_t *>(pNext);
73+
pDdiHandlesExtProperties->flags = ze_driver_ddi_handle_ext_flag_t::ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED;
74+
context.ddiExtensionRequested = true;
75+
}
76+
pNext = reinterpret_cast<ze_base_properties_t *>(pNext->pNext);
77+
}
78+
pDriverProperties->driverVersion = 0;
7079

71-
*pDriverProperties = driverProperties;
7280
return ZE_RESULT_SUCCESS;
7381
};
7482

@@ -367,6 +375,20 @@ namespace driver
367375
if( pRawData ) *pRawData = 0;
368376
return ZE_RESULT_SUCCESS;
369377
};
378+
pCore.Driver = &zeDdiTable.Driver;
379+
pCore.Device = &zeDdiTable.Device;
380+
pCore.Mem = &zeDdiTable.Mem;
381+
pCore.isValidFlag = 1;
382+
pCore.version = ZE_API_VERSION_CURRENT;
383+
pTools.MetricGroup = &zetDdiTable.MetricGroup;
384+
pTools.Metric = &zetDdiTable.Metric;
385+
pTools.MetricQuery = &zetDdiTable.MetricQuery;
386+
pTools.MetricStreamer = &zetDdiTable.MetricStreamer;
387+
pTools.isValidFlag = 1;
388+
pTools.version = ZE_API_VERSION_CURRENT;
389+
pSysman.Driver = &zesDdiTable.Driver;
390+
pSysman.isValidFlag = 1;
391+
pSysman.version = ZE_API_VERSION_CURRENT;
370392
}
371393
} // namespace driver
372394

source/drivers/null/ze_null.h

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,20 @@
1414
#include "zet_ddi.h"
1515
#include "zes_ddi.h"
1616
#include "ze_util.h"
17+
#include "ze_ddi_common.h"
1718

1819
namespace driver
1920
{
21+
extern ze_dditable_driver_t pCore;
22+
extern zet_dditable_driver_t pTools;
23+
extern zes_dditable_driver_t pSysman;
24+
struct __zedlllocal BaseNullHandle : ze_handle_t {
25+
BaseNullHandle() {
26+
pCore = &driver::pCore;
27+
pTools = &driver::pTools;
28+
pSysman = &driver::pSysman;
29+
}
30+
};
2031
///////////////////////////////////////////////////////////////////////////////
2132
class __zedlllocal context_t
2233
{
@@ -26,13 +37,24 @@ namespace driver
2637
ze_dditable_t zeDdiTable = {};
2738
zet_dditable_t zetDdiTable = {};
2839
zes_dditable_t zesDdiTable = {};
40+
std::vector<BaseNullHandle*> globalBaseNullHandle;
41+
bool ddiExtensionRequested = false;
2942
context_t();
30-
~context_t() = default;
43+
~context_t() {
44+
for (auto handle : globalBaseNullHandle) {
45+
delete handle;
46+
}
47+
}
3148

3249
void* get( void )
3350
{
3451
static uint64_t count = 0x80800000;
35-
return reinterpret_cast<void*>( ++count );
52+
if (ddiExtensionRequested) {
53+
globalBaseNullHandle.push_back(new BaseNullHandle());
54+
return reinterpret_cast<void*>(globalBaseNullHandle.back());
55+
} else {
56+
return reinterpret_cast<void*>( ++count );
57+
}
3658
}
3759
};
3860

source/loader/ze_ldrddi.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,10 @@ namespace loader
9494
{
9595
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
9696
uint32_t driver_index = total_driver_handle_count + i;
97-
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
98-
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
97+
if (!drv.driverSupportsDDIHandles) {
98+
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
99+
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
100+
}
99101
}
100102
}
101103
catch( std::bad_alloc& )
@@ -178,8 +180,10 @@ namespace loader
178180
{
179181
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
180182
uint32_t driver_index = total_driver_handle_count + i;
181-
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
182-
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
183+
if (!drv.driverSupportsDDIHandles) {
184+
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
185+
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
186+
}
183187
}
184188
}
185189
catch( std::bad_alloc& )

source/loader/ze_loader.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

source/loader/ze_loader_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ namespace loader
4848
ze_result_t initStatus = ZE_RESULT_SUCCESS;
4949
ze_result_t initDriversStatus = ZE_RESULT_SUCCESS;
5050
dditable_t dditable = {};
51-
ze_handle_t driverDDIHandles = {};
5251
std::string name;
5352
bool driverInuse = false;
5453
zel_driver_type_t driverType = ZEL_DRIVER_TYPE_FORCE_UINT32;
5554
ze_driver_properties_t properties;
5655
bool pciOrderingRequested = false;
56+
bool driverSupportsDDIHandles = false;
5757
};
5858

5959
using driver_vector_t = std::vector< driver_t >;

source/loader/ze_object.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class object_t
3636
zes_dditable_driver_t *pSysman;
3737
handle_t handle;
3838
dditable_t* dditable;
39-
std::string name = "unknown";
4039

4140
object_t() = delete;
4241

source/loader/zes_ldrddi.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ namespace loader
9595
{
9696
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
9797
uint32_t driver_index = total_driver_handle_count + i;
98-
phDrivers[ driver_index ] = reinterpret_cast<zes_driver_handle_t>(
99-
context->zes_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
98+
if (!drv.driverSupportsDDIHandles) {
99+
phDrivers[ driver_index ] = reinterpret_cast<zes_driver_handle_t>(
100+
context->zes_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
101+
}
100102
}
101103
}
102104
catch( std::bad_alloc& )

0 commit comments

Comments
 (0)