Skip to content

Commit 0a681d7

Browse files
authored
Fix zeInit Compatibility when zeInitDrivers is undefined (#232)
* Fix zeInit Compatibility when zeInitDrivers is undefined - Handle when zeinitDrivers is called first and the driver does not support the api yet. Included a unit test to cover these types of cases going forward. Signed-off-by: Neil R. Spruit <[email protected]>
1 parent 3cd7e37 commit 0a681d7

File tree

7 files changed

+49
-3
lines changed

7 files changed

+49
-3
lines changed

scripts/templates/libapi.cpp.mako

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ ${th.make_func_name(n, tags, obj)}(
8686
return result;
8787
});
8888

89+
if (result != ${X}_RESULT_SUCCESS) {
90+
return result;
91+
}
92+
8993
if(ze_lib::context->inTeardown) {
9094
return ${X}_RESULT_ERROR_UNINITIALIZED;
9195
}

scripts/templates/nullddi.cpp.mako

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ ${tbl['export']['name']}(
130130

131131
${x}_result_t result = ${X}_RESULT_SUCCESS;
132132

133+
% if tbl['name'] == 'Global' and n == 'ze':
134+
pDdiTable->pfnInit = driver::zeInit;
135+
136+
auto missing_api = getenv_string( "ZEL_TEST_MISSING_API" );
137+
if (std::strcmp(missing_api.c_str(), "zeInitDrivers") == 0) {
138+
pDdiTable->pfnInitDrivers = nullptr;
139+
} else {
140+
pDdiTable->pfnInitDrivers = driver::zeInitDrivers;
141+
}
142+
%else:
133143
%for obj in tbl['functions']:
134144
%if 'condition' in obj:
135145
#if ${th.subt(n, tags, obj['condition'])}
@@ -142,6 +152,7 @@ ${tbl['export']['name']}(
142152
%endif
143153

144154
%endfor
155+
%endif
145156
return result;
146157
}
147158

source/drivers/null/ze_nullddi.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5142,8 +5142,12 @@ zeGetGlobalProcAddrTable(
51425142

51435143
pDdiTable->pfnInit = driver::zeInit;
51445144

5145-
pDdiTable->pfnInitDrivers = driver::zeInitDrivers;
5146-
5145+
auto missing_api = getenv_string( "ZEL_TEST_MISSING_API" );
5146+
if (std::strcmp(missing_api.c_str(), "zeInitDrivers") == 0) {
5147+
pDdiTable->pfnInitDrivers = nullptr;
5148+
} else {
5149+
pDdiTable->pfnInitDrivers = driver::zeInitDrivers;
5150+
}
51475151
return result;
51485152
}
51495153

source/lib/ze_libapi.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ zeInitDrivers(
197197
return result;
198198
});
199199

200+
if (result != ZE_RESULT_SUCCESS) {
201+
return result;
202+
}
203+
200204
if(ze_lib::context->inTeardown) {
201205
return ZE_RESULT_ERROR_UNINITIALIZED;
202206
}

source/loader/ze_loader.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,14 @@ namespace loader
145145
debug_trace_message(message, "");
146146
}
147147
}
148+
// If zeInitDrivers is not supported by this driver, but zeInitDrivers is called first, then return uninitialized.
149+
if (desc && !loader::context->initDriversSupport) {
150+
std::string message = "zeInitDrivers called first, but not supported by driver, returning uninitialized.";
151+
debug_trace_message(message, "");
152+
return ZE_RESULT_ERROR_UNINITIALIZED;
153+
}
154+
155+
148156
bool return_first_driver_result=false;
149157
std::string initName = "zeInit";
150158
driver_vector_t *drivers = &zeDrivers;

test/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ set_property(TEST tests_both_succeed PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER
3737
add_test(NAME tests_both_gpu COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingzeInitThenZeInitDriversThenBothCallsSucceedWithGPUTypes*)
3838
set_property(TEST tests_both_gpu PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")
3939
add_test(NAME tests_both_npu COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingzeInitThenZeInitDriversThenBothCallsSucceedWithNPUTypes*)
40-
set_property(TEST tests_both_npu PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")
40+
set_property(TEST tests_both_npu PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")
41+
add_test(NAME tests_missing_api COMMAND tests --gtest_filter=*GivenZeInitDriversUnsupportedOnTheDriverWhenCallingZeInitDriversThenUninitializedReturned*)
42+
set_property(TEST tests_missing_api PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")

test/loader_api.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,19 @@ TEST(
143143
EXPECT_EQ(ZE_RESULT_SUCCESS, zeInit(ZE_INIT_FLAG_GPU_ONLY));
144144
}
145145

146+
TEST(
147+
LoaderInit,
148+
GivenZeInitDriversUnsupportedOnTheDriverWhenCallingZeInitDriversThenUninitializedReturned) {
149+
150+
uint32_t pCount = 0;
151+
ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC};
152+
desc.flags = UINT32_MAX;
153+
desc.pNext = nullptr;
154+
putenv_safe( const_cast<char *>( "ZEL_TEST_MISSING_API=zeInitDrivers" ) );
155+
EXPECT_EQ(ZE_RESULT_ERROR_UNINITIALIZED, zeInitDrivers(&pCount, nullptr, &desc));
156+
EXPECT_EQ(ZE_RESULT_SUCCESS, zeInit(0));
157+
}
158+
146159
TEST(
147160
LoaderInit,
148161
GivenLevelZeroLoaderPresentWhenCallingZeInitDriversThenzeInitThenBothCallsSucceedWithNPUTypes) {

0 commit comments

Comments
 (0)