Skip to content

Commit 256c091

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 9bf0958 commit 256c091

9 files changed

Lines changed: 74 additions & 22 deletions

File tree

samples/zello_world/zello_world.cpp

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

117117
for( uint32_t driver = 0; driver < driverCount; ++driver )
118118
{
119+
std::cout << "Driver # " << driver << "\n";
119120
pDriver = drivers[driver];
120121
pDevice = findDevice( pDriver, type );
121-
if( pDevice )
122-
{
123-
break;
124-
}
125122
}
126123
}
127124

scripts/templates/ldrddi.cpp.mako

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,10 @@ namespace loader
119119
{
120120
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
121121
uint32_t driver_index = total_driver_handle_count + i;
122-
${obj['params'][1]['name']}[ driver_index ] = reinterpret_cast<${n}_driver_handle_t>(
123-
context->${n}_driver_factory.getInstance( ${obj['params'][1]['name']}[ driver_index ], &drv.dditable ) );
122+
if (!drv.driverSupportsDDIHandles) {
123+
${obj['params'][1]['name']}[ driver_index ] = reinterpret_cast<${n}_driver_handle_t>(
124+
context->${n}_driver_factory.getInstance( ${obj['params'][1]['name']}[ driver_index ], &drv.dditable ) );
125+
}
124126
}
125127
}
126128
catch( std::bad_alloc& )

source/drivers/null/ze_null.cpp

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

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

70-
*pDriverProperties = driverProperties;
7179
return ZE_RESULT_SUCCESS;
7280
};
7381

@@ -362,6 +370,20 @@ namespace driver
362370
if( pRawData ) *pRawData = 0;
363371
return ZE_RESULT_SUCCESS;
364372
};
373+
pCore.Driver = &zeDdiTable.Driver;
374+
pCore.Device = &zeDdiTable.Device;
375+
pCore.Mem = &zeDdiTable.Mem;
376+
pCore.isValidFlag = 1;
377+
pCore.version = ZE_API_VERSION_CURRENT;
378+
pTools.MetricGroup = &zetDdiTable.MetricGroup;
379+
pTools.Metric = &zetDdiTable.Metric;
380+
pTools.MetricQuery = &zetDdiTable.MetricQuery;
381+
pTools.MetricStreamer = &zetDdiTable.MetricStreamer;
382+
pTools.isValidFlag = 1;
383+
pTools.version = ZE_API_VERSION_CURRENT;
384+
pSysman.Driver = &zesDdiTable.Driver;
385+
pSysman.isValidFlag = 1;
386+
pSysman.version = ZE_API_VERSION_CURRENT;
365387
}
366388
} // namespace driver
367389

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
@@ -87,8 +87,10 @@ namespace loader
8787
{
8888
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
8989
uint32_t driver_index = total_driver_handle_count + i;
90-
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
91-
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
90+
if (!drv.driverSupportsDDIHandles) {
91+
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
92+
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
93+
}
9294
}
9395
}
9496
catch( std::bad_alloc& )
@@ -164,8 +166,10 @@ namespace loader
164166
{
165167
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
166168
uint32_t driver_index = total_driver_handle_count + i;
167-
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
168-
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
169+
if (!drv.driverSupportsDDIHandles) {
170+
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
171+
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
172+
}
169173
}
170174
}
171175
catch( std::bad_alloc& )

source/loader/ze_loader.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,12 @@ namespace loader
317317
}
318318

319319
for (auto handle : driverHandles) {
320+
ze_driver_ddi_handles_ext_properties_t driverDdiHandlesExtProperties = {};
321+
driverDdiHandlesExtProperties.stype = ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES;
322+
driverDdiHandlesExtProperties.pNext = nullptr;
320323
ze_driver_properties_t properties = {};
321324
properties.stype = ZE_STRUCTURE_TYPE_DRIVER_PROPERTIES;
322-
properties.pNext = nullptr;
325+
properties.pNext = &driverDdiHandlesExtProperties;
323326
ze_result_t res = driver.dditable.ze.Driver.pfnGetProperties(handle, &properties);
324327
if (res != ZE_RESULT_SUCCESS) {
325328
if (debugTraceEnabled) {
@@ -329,6 +332,7 @@ namespace loader
329332
return res;
330333
}
331334
driver.properties = properties;
335+
driver.driverSupportsDDIHandles = driverDdiHandlesExtProperties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED;
332336
uint32_t deviceCount = 0;
333337
res = driver.dditable.ze.Device.pfnGet( handle, &deviceCount, nullptr );
334338
if( ZE_RESULT_SUCCESS != res ) {

source/loader/ze_loader_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ namespace loader
4646
ze_result_t initStatus = ZE_RESULT_SUCCESS;
4747
ze_result_t initDriversStatus = ZE_RESULT_SUCCESS;
4848
dditable_t dditable = {};
49-
ze_handle_t driverDDIHandles = {};
5049
std::string name;
5150
bool driverInuse = false;
5251
zel_driver_type_t driverType;
5352
ze_driver_properties_t properties;
5453
bool pciOrderingRequested = false;
54+
bool driverSupportsDDIHandles = false;
5555
};
5656

5757
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
@@ -88,8 +88,10 @@ namespace loader
8888
{
8989
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
9090
uint32_t driver_index = total_driver_handle_count + i;
91-
phDrivers[ driver_index ] = reinterpret_cast<zes_driver_handle_t>(
92-
context->zes_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
91+
if (!drv.driverSupportsDDIHandles) {
92+
phDrivers[ driver_index ] = reinterpret_cast<zes_driver_handle_t>(
93+
context->zes_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
94+
}
9395
}
9496
}
9597
catch( std::bad_alloc& )

0 commit comments

Comments
 (0)