diff --git a/CHANGELOG.md b/CHANGELOG.md index 9456fbee..ef8ce1ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Level zero loader changelog +## v1.19.2 +* Remove static result in InitDrivers given first init fails ## v1.19.1 * Fix to Use relative paths for events deadlock detection third party headers ## v1.19.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index ab2cbf30..ca0746fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ message(FATAL_ERROR "Visual Studio Compiler Version >= 1900 Required to build.") endif() # This project follows semantic versioning (https://semver.org/) -project(level-zero VERSION 1.19.1) +project(level-zero VERSION 1.19.2) include(GNUInstallDirs) diff --git a/scripts/templates/libapi.cpp.mako b/scripts/templates/libapi.cpp.mako index 36ee5ae9..8c963555 100644 --- a/scripts/templates/libapi.cpp.mako +++ b/scripts/templates/libapi.cpp.mako @@ -55,8 +55,8 @@ ${th.make_func_name(n, tags, obj)}( ) { %if re.match("Init", obj['name']): +%if re.match("zes", n): static ${x}_result_t result = ${X}_RESULT_SUCCESS; -%if re.match("zes", n): std::call_once(${x}_lib::context->initOnceSysMan, [flags]() { result = ${x}_lib::context->Init(flags, true, nullptr); @@ -81,7 +81,8 @@ ${th.make_func_name(n, tags, obj)}( } %else: %if re.match("InitDrivers", obj['name']): - std::call_once(${x}_lib::context->initOnceDrivers, [desc]() { + ${x}_result_t result = ${X}_RESULT_SUCCESS; + std::call_once(${x}_lib::context->initOnceDrivers, [desc,&result]() { result = ${x}_lib::context->Init(0, false, desc); return result; }); @@ -112,6 +113,7 @@ ${th.make_func_name(n, tags, obj)}( return result; %else: + static ${x}_result_t result = ${X}_RESULT_SUCCESS; std::call_once(${x}_lib::context->initOnce, [flags]() { result = ${x}_lib::context->Init(flags, false, nullptr); diff --git a/source/lib/ze_libapi.cpp b/source/lib/ze_libapi.cpp index 3f7ed2bc..4fafd1cd 100644 --- a/source/lib/ze_libapi.cpp +++ b/source/lib/ze_libapi.cpp @@ -196,8 +196,8 @@ zeInitDrivers( ///< including ::ze_init_driver_type_flag_t combinations. ) { - static ze_result_t result = ZE_RESULT_SUCCESS; - std::call_once(ze_lib::context->initOnceDrivers, [desc]() { + ze_result_t result = ZE_RESULT_SUCCESS; + std::call_once(ze_lib::context->initOnceDrivers, [desc,&result]() { result = ze_lib::context->Init(0, false, desc); return result; }); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 146801ef..2df908a0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -41,6 +41,8 @@ add_test(NAME tests_both_npu COMMAND tests --gtest_filter=*GivenLevelZeroLoaderP set_property(TEST tests_both_npu PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1") add_test(NAME tests_missing_api COMMAND tests --gtest_filter=*GivenZeInitDriversUnsupportedOnTheDriverWhenCallingZeInitDriversThenUninitializedReturned*) set_property(TEST tests_missing_api PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1") +add_test(NAME tests_multi_call_failure COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingZeInitDriversWithTypesUnsupportedWithFailureThenSupportedTypesThenSuccessReturned*) +set_property(TEST tests_multi_call_failure PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1") # These tests are currently not supported on Windows. The reason is that the std::cerr is not being redirected to a pipe in Windows to be then checked against the expected output. if(NOT MSVC) diff --git a/test/loader_api.cpp b/test/loader_api.cpp index dd59a350..c5638c7d 100644 --- a/test/loader_api.cpp +++ b/test/loader_api.cpp @@ -48,6 +48,23 @@ TEST( } } +TEST( + LoaderInit, + GivenLevelZeroLoaderPresentWhenCallingZeInitDriversWithTypesUnsupportedWithFailureThenSupportedTypesThenSuccessReturned) { + + uint32_t pCount = 0; + ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; + desc.flags = ZE_INIT_DRIVER_TYPE_FLAG_NPU; + desc.pNext = nullptr; + putenv_safe( const_cast( "ZEL_TEST_NULL_DRIVER_TYPE=GPU" ) ); + EXPECT_EQ(ZE_RESULT_ERROR_UNINITIALIZED, zeInitDrivers(&pCount, nullptr, &desc)); + EXPECT_EQ(pCount, 0); + pCount = 0; + desc.flags = UINT32_MAX; + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pCount, nullptr, &desc)); + EXPECT_GT(pCount, 0); +} + TEST( LoaderInit, GivenLevelZeroLoaderPresentWhenCallingZeInitDriversWithGPUTypeThenExpectPassWithGPUorAllOnly) {