From 85ec469bd4ce9ed68ec3cb04a35cfc1889d143ed Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Fri, 27 Mar 2020 07:47:16 +0100 Subject: [PATCH] Add support for int64_t registry keys Resolves: NEO-4505 Change-Id: I583d26a5932193acfd58eac50462ec81cd460d8f Signed-off-by: Lukasz Jobczyk --- .../windows/driver_info_tests.cpp | 1 + .../windows/mock_registry_reader.cpp | 6 ++++++ .../windows/registry_reader_tests.cpp | 7 +++++++ .../os_interface/windows/wddm20_tests.cpp | 1 + .../test/unit_test/test_files/igdrcl.config | 3 ++- .../debug_settings/debug_settings_manager.cpp | 7 ++++++- .../debug_settings/debug_variables_base.inl | 1 + .../os_interface/linux/debug_env_reader.cpp | 8 ++++++-- .../os_interface/linux/debug_env_reader.h | 1 + .../windows/debug_registry_reader.cpp | 15 +++++++++------ .../windows/debug_registry_reader.h | 1 + shared/source/utilities/debug_file_reader.cpp | 8 ++++++-- shared/source/utilities/debug_file_reader.h | 1 + .../source/utilities/debug_settings_reader.h | 1 + .../debug_settings_manager_fixture.h | 4 ++++ .../debug_settings_manager_tests.cpp | 19 +++++++++++++++---- .../helpers/debug_manager_state_restore.h | 11 +++++++++-- 17 files changed, 77 insertions(+), 18 deletions(-) diff --git a/opencl/test/unit_test/os_interface/windows/driver_info_tests.cpp b/opencl/test/unit_test/os_interface/windows/driver_info_tests.cpp index b98219b9a4..db29270c0f 100644 --- a/opencl/test/unit_test/os_interface/windows/driver_info_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/driver_info_tests.cpp @@ -128,6 +128,7 @@ class MockRegistryReader : public SettingsReader { } bool getSetting(const char *settingName, bool defaultValue) override { return defaultValue; }; + int64_t getSetting(const char *settingName, int64_t defaultValue) override { return defaultValue; }; int32_t getSetting(const char *settingName, int32_t defaultValue) override { return defaultValue; }; const char *appSpecificLocation(const std::string &name) override { return name.c_str(); }; diff --git a/opencl/test/unit_test/os_interface/windows/mock_registry_reader.cpp b/opencl/test/unit_test/os_interface/windows/mock_registry_reader.cpp index a33233bf4d..540e66fc3e 100644 --- a/opencl/test/unit_test/os_interface/windows/mock_registry_reader.cpp +++ b/opencl/test/unit_test/os_interface/windows/mock_registry_reader.cpp @@ -54,6 +54,12 @@ LSTATUS APIENTRY RegQueryValueExA( } else { *lpcbData = sizeof(DWORD); } + } else if (strcmp(lpValueName, "settingSourceInt64") == 0) { + if (lpData) { + *reinterpret_cast(lpData) = 0xffffffffeeeeeeee; + } else { + *lpcbData = sizeof(INT64); + } } else if (strcmp(lpValueName, "settingSourceBinary") == 0) { const auto settingSource = L"registry"; auto size = wcslen(settingSource) * sizeof(wchar_t); diff --git a/opencl/test/unit_test/os_interface/windows/registry_reader_tests.cpp b/opencl/test/unit_test/os_interface/windows/registry_reader_tests.cpp index 5aa4c93547..f42c992766 100644 --- a/opencl/test/unit_test/os_interface/windows/registry_reader_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/registry_reader_tests.cpp @@ -79,6 +79,13 @@ TEST_F(DebugReaderWithRegistryAndEnvTest, givenIntDebugKeyWhenReadFromRegistrySu EXPECT_EQ(1, registryReader.getSetting("settingSourceInt", 0)); } +TEST_F(DebugReaderWithRegistryAndEnvTest, givenInt64DebugKeyWhenReadFromRegistrySucceedsThenReturnObtainedValue) { + regOpenKeySuccessCount = 1u; + regQueryValueSuccessCount = 1u; + + EXPECT_EQ(0xffffffffeeeeeeee, registryReader.getSetting("settingSourceInt64", 0)); +} + TEST_F(DebugReaderWithRegistryAndEnvTest, givenIntDebugKeyWhenQueryValueFailsThenObtainValueFromEnv) { regOpenKeySuccessCount = 1u; regQueryValueSuccessCount = 0u; diff --git a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp index cfe2ed51e8..74ac7cabb0 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp @@ -1387,6 +1387,7 @@ TEST(DiscoverDevices, whenDriverInfoHasIncompatibleDriverStoreThenHwDeviceIdIsNo } bool getSetting(const char *settingName, bool defaultValue) override { return defaultValue; }; + int64_t getSetting(const char *settingName, int64_t defaultValue) override { return defaultValue; }; int32_t getSetting(const char *settingName, int32_t defaultValue) override { return defaultValue; }; const char *appSpecificLocation(const std::string &name) override { return name.c_str(); }; diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index b151a481be..09db0ade14 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -141,4 +141,5 @@ DirectSubmissionDisableMonitorFence = 0 ForceFineGrainedSVMSupport = -1 DirectSubmissionBufferAddressing = -1 DirectSubmissionSemaphoreAddressing = -1 -ForceBuffersToSystemMemory = 0 \ No newline at end of file +ForceBuffersToSystemMemory = 0 +Report64BitIdentifier = 0 diff --git a/shared/source/debug_settings/debug_settings_manager.cpp b/shared/source/debug_settings/debug_settings_manager.cpp index 3f0437e82a..4d3cd8c8c9 100644 --- a/shared/source/debug_settings/debug_settings_manager.cpp +++ b/shared/source/debug_settings/debug_settings_manager.cpp @@ -14,6 +14,7 @@ #include "shared/source/utilities/debug_settings_reader_creator.h" #include +#include #include namespace std { @@ -59,6 +60,10 @@ void DebugSettingsManager::dumpNonDefaultFlag(const char *variableNa template void DebugSettingsManager::dumpFlags() const { + if (flags.Report64BitIdentifier.get()) { + std::cout << "Report64BitIdentifier flag value = " << flags.Report64BitIdentifier.get() << std::endl; + } + if (flags.PrintDebugSettings.get() == false) { return; } @@ -68,7 +73,7 @@ void DebugSettingsManager::dumpFlags() const { #define DECLARE_DEBUG_VARIABLE(dataType, variableName, defaultValue, description) \ settingsDumpFile << #variableName << " = " << flags.variableName.get() << '\n'; \ - dumpNonDefaultFlag(#variableName, flags.variableName.get(), defaultValue); + dumpNonDefaultFlag(#variableName, flags.variableName.get(), defaultValue); #include "debug_variables.inl" #undef DECLARE_DEBUG_VARIABLE } diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 812ebff1c6..b21aa53856 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -150,6 +150,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, RenderCompressedBuffersEnabled, -1, "-1: default DECLARE_DEBUG_VARIABLE(int32_t, EnableSharedSystemUsmSupport, -1, "-1: default, 0: shared system memory disabled, 1: shared system memory enabled") DECLARE_DEBUG_VARIABLE(int32_t, EnablePassInlineData, -1, "-1: default, 0: Do not allow to pass inline data 1: Enable passing of inline data") DECLARE_DEBUG_VARIABLE(int32_t, ForceFineGrainedSVMSupport, -1, "-1: default, 0: Do not report Fine Grained SVM capabilties 1: Report SVM Fine Grained capabilities if device supports SVM") +DECLARE_DEBUG_VARIABLE(int64_t, Report64BitIdentifier, 0, ">0: print this value during initialization to ensure that 64 bit debug variables are working properly.") /*DRIVER TOGGLES*/ DECLARE_DEBUG_VARIABLE(int32_t, ForceOCLVersion, 0, "Force specific OpenCL API version") diff --git a/shared/source/os_interface/linux/debug_env_reader.cpp b/shared/source/os_interface/linux/debug_env_reader.cpp index 760f00561c..24bffaf4b2 100644 --- a/shared/source/os_interface/linux/debug_env_reader.cpp +++ b/shared/source/os_interface/linux/debug_env_reader.cpp @@ -18,11 +18,15 @@ const char *EnvironmentVariableReader::appSpecificLocation(const std::string &na } bool EnvironmentVariableReader::getSetting(const char *settingName, bool defaultValue) { - return getSetting(settingName, static_cast(defaultValue)) ? true : false; + return getSetting(settingName, static_cast(defaultValue)) ? true : false; } int32_t EnvironmentVariableReader::getSetting(const char *settingName, int32_t defaultValue) { - int32_t value = defaultValue; + return static_cast(getSetting(settingName, static_cast(defaultValue))); +} + +int64_t EnvironmentVariableReader::getSetting(const char *settingName, int64_t defaultValue) { + int64_t value = defaultValue; char *envValue; envValue = getenv(settingName); diff --git a/shared/source/os_interface/linux/debug_env_reader.h b/shared/source/os_interface/linux/debug_env_reader.h index 9223ec2b46..f18238dbdb 100644 --- a/shared/source/os_interface/linux/debug_env_reader.h +++ b/shared/source/os_interface/linux/debug_env_reader.h @@ -15,6 +15,7 @@ namespace NEO { class EnvironmentVariableReader : public SettingsReader { public: int32_t getSetting(const char *settingName, int32_t defaultValue) override; + int64_t getSetting(const char *settingName, int64_t defaultValue) override; bool getSetting(const char *settingName, bool defaultValue) override; std::string getSetting(const char *settingName, const std::string &value) override; const char *appSpecificLocation(const std::string &name) override; diff --git a/shared/source/os_interface/windows/debug_registry_reader.cpp b/shared/source/os_interface/windows/debug_registry_reader.cpp index bf3af70dff..9d752d6844 100644 --- a/shared/source/os_interface/windows/debug_registry_reader.cpp +++ b/shared/source/os_interface/windows/debug_registry_reader.cpp @@ -39,12 +39,16 @@ const char *RegistryReader::appSpecificLocation(const std::string &name) { } bool RegistryReader::getSetting(const char *settingName, bool defaultValue) { - return getSetting(settingName, static_cast(defaultValue)) ? true : false; + return getSetting(settingName, static_cast(defaultValue)) ? true : false; } int32_t RegistryReader::getSetting(const char *settingName, int32_t defaultValue) { + return static_cast(getSetting(settingName, static_cast(defaultValue))); +} + +int64_t RegistryReader::getSetting(const char *settingName, int64_t defaultValue) { HKEY Key{}; - DWORD value = defaultValue; + int64_t value = defaultValue; DWORD success = ERROR_SUCCESS; bool readSettingFromEnv = true; @@ -55,14 +59,13 @@ int32_t RegistryReader::getSetting(const char *settingName, int32_t defaultValue &Key); if (ERROR_SUCCESS == success) { - DWORD regType; - DWORD size = sizeof(DWORD); - DWORD regData; + DWORD size = sizeof(int64_t); + int64_t regData; success = RegQueryValueExA(Key, settingName, NULL, - ®Type, + NULL, reinterpret_cast(®Data), &size); if (ERROR_SUCCESS == success) { diff --git a/shared/source/os_interface/windows/debug_registry_reader.h b/shared/source/os_interface/windows/debug_registry_reader.h index 497f955768..10e1b686ce 100644 --- a/shared/source/os_interface/windows/debug_registry_reader.h +++ b/shared/source/os_interface/windows/debug_registry_reader.h @@ -20,6 +20,7 @@ class RegistryReader : public SettingsReader { RegistryReader() = delete; RegistryReader(bool userScope, const std::string ®Key); int32_t getSetting(const char *settingName, int32_t defaultValue) override; + int64_t getSetting(const char *settingName, int64_t defaultValue) override; bool getSetting(const char *settingName, bool defaultValue) override; std::string getSetting(const char *settingName, const std::string &value) override; const char *appSpecificLocation(const std::string &name) override; diff --git a/shared/source/utilities/debug_file_reader.cpp b/shared/source/utilities/debug_file_reader.cpp index d6f6ed6612..1d454c9fe6 100644 --- a/shared/source/utilities/debug_file_reader.cpp +++ b/shared/source/utilities/debug_file_reader.cpp @@ -29,7 +29,11 @@ SettingsFileReader::~SettingsFileReader() { } int32_t SettingsFileReader::getSetting(const char *settingName, int32_t defaultValue) { - int32_t value = defaultValue; + return static_cast(getSetting(settingName, static_cast(defaultValue))); +} + +int64_t SettingsFileReader::getSetting(const char *settingName, int64_t defaultValue) { + int64_t value = defaultValue; std::map::iterator it = settingStringMap.find(std::string(settingName)); if (it != settingStringMap.end()) { @@ -40,7 +44,7 @@ int32_t SettingsFileReader::getSetting(const char *settingName, int32_t defaultV } bool SettingsFileReader::getSetting(const char *settingName, bool defaultValue) { - return getSetting(settingName, static_cast(defaultValue)) ? true : false; + return getSetting(settingName, static_cast(defaultValue)) ? true : false; } std::string SettingsFileReader::getSetting(const char *settingName, const std::string &value) { diff --git a/shared/source/utilities/debug_file_reader.h b/shared/source/utilities/debug_file_reader.h index cb51ba59ea..7b7dd50fb3 100644 --- a/shared/source/utilities/debug_file_reader.h +++ b/shared/source/utilities/debug_file_reader.h @@ -21,6 +21,7 @@ class SettingsFileReader : public SettingsReader { SettingsFileReader(const char *filePath = nullptr); ~SettingsFileReader() override; int32_t getSetting(const char *settingName, int32_t defaultValue) override; + int64_t getSetting(const char *settingName, int64_t defaultValue) override; bool getSetting(const char *settingName, bool defaultValue) override; std::string getSetting(const char *settingName, const std::string &value) override; const char *appSpecificLocation(const std::string &name) override; diff --git a/shared/source/utilities/debug_settings_reader.h b/shared/source/utilities/debug_settings_reader.h index 99f79111d7..9491f9fff5 100644 --- a/shared/source/utilities/debug_settings_reader.h +++ b/shared/source/utilities/debug_settings_reader.h @@ -25,6 +25,7 @@ class SettingsReader { static SettingsReader *createOsReader(bool userScope, const std::string ®Key); static SettingsReader *createFileReader(); virtual int32_t getSetting(const char *settingName, int32_t defaultValue) = 0; + virtual int64_t getSetting(const char *settingName, int64_t defaultValue) = 0; virtual bool getSetting(const char *settingName, bool defaultValue) = 0; virtual std::string getSetting(const char *settingName, const std::string &value) = 0; virtual const char *appSpecificLocation(const std::string &name) = 0; diff --git a/shared/test/unit_test/debug_settings/debug_settings_manager_fixture.h b/shared/test/unit_test/debug_settings/debug_settings_manager_fixture.h index 5adafed316..de038c4bbd 100644 --- a/shared/test/unit_test/debug_settings/debug_settings_manager_fixture.h +++ b/shared/test/unit_test/debug_settings/debug_settings_manager_fixture.h @@ -31,6 +31,10 @@ class TestDebugFlagsChecker { return returnedValue == defaultValue; } + static bool isEqual(int64_t returnedValue, int64_t defaultValue) { + return returnedValue == defaultValue; + } + static bool isEqual(std::string returnedValue, std::string defaultValue) { return returnedValue == defaultValue; } diff --git a/shared/test/unit_test/debug_settings/debug_settings_manager_tests.cpp b/shared/test/unit_test/debug_settings/debug_settings_manager_tests.cpp index ee15462bfc..bccaf3b284 100644 --- a/shared/test/unit_test/debug_settings/debug_settings_manager_tests.cpp +++ b/shared/test/unit_test/debug_settings/debug_settings_manager_tests.cpp @@ -42,10 +42,10 @@ TEST(DebugSettingsManager, WithoutDebugFunctionality) { EXPECT_EQ(nullptr, debugManager.getSettingsReader()); // debug variables / flags set to default -#define DECLARE_DEBUG_VARIABLE(dataType, variableName, defaultValue, description) \ - { \ - bool isEqual = TestDebugFlagsChecker::isEqual(debugManager.flags.variableName.get(), defaultValue); \ - EXPECT_TRUE(isEqual); \ +#define DECLARE_DEBUG_VARIABLE(dataType, variableName, defaultValue, description) \ + { \ + bool isEqual = TestDebugFlagsChecker::isEqual(debugManager.flags.variableName.get(), static_cast(defaultValue)); \ + EXPECT_TRUE(isEqual); \ } #include "debug_variables.inl" #undef DECLARE_DEBUG_VARIABLE @@ -112,6 +112,17 @@ TEST(DebugSettingsManager, givenReaderImplInDebugManagerWhenSettingDifferentRead EXPECT_EQ(readerImpl2, debugManager.getReaderImpl()); } +TEST(DebugSettingsManager, givenReport64BitIdetntifierFlagWhenDumpFlagsThen64BitValueIsPrinted) { + testing::internal::CaptureStdout(); + FullyEnabledTestDebugManager debugManager; + debugManager.flags.Report64BitIdentifier.set(0xffffffffeeeeeeee); + + debugManager.dumpFlags(); + + std::string output = testing::internal::GetCapturedStdout(); + EXPECT_FALSE(output.compare("Report64BitIdentifier flag value = -286331154\n")); +} + TEST(DebugSettingsManager, givenPrintDebugSettingsEnabledWhenCallingDumpFlagsThenFlagsAreWrittenToDumpFile) { testing::internal::CaptureStdout(); FullyEnabledTestDebugManager debugManager; diff --git a/shared/test/unit_test/helpers/debug_manager_state_restore.h b/shared/test/unit_test/helpers/debug_manager_state_restore.h index e74d8f99f9..9a9d3e20c8 100644 --- a/shared/test/unit_test/helpers/debug_manager_state_restore.h +++ b/shared/test/unit_test/helpers/debug_manager_state_restore.h @@ -32,6 +32,7 @@ class DebugManagerStateRestore { void shrink(std::string &flag) { flag.shrink_to_fit(); } + void shrink(int64_t &flag) {} void shrink(int32_t &flag) {} void shrink(bool &flag) {} }; @@ -41,11 +42,16 @@ class RegistryReaderMock : public SettingsReader { RegistryReaderMock() {} ~RegistryReaderMock() override {} - unsigned int forceRetValue = 1; + uint64_t forceRetValue = 1; int32_t getSetting(const char *settingName, int32_t defaultValue) override { - return static_cast(forceRetValue); + return static_cast(forceRetValue); } + + int64_t getSetting(const char *settingName, int64_t defaultValue) override { + return forceRetValue; + } + bool getSetting(const char *settingName, bool defaultValue) override { return true; } @@ -53,6 +59,7 @@ class RegistryReaderMock : public SettingsReader { std::string getSetting(const char *settingName, const std::string &value) override { return ""; } + const char *appSpecificLocation(const std::string &name) override { return name.c_str(); }