From ce991e421a38c50ec695fcd7c4180462e61e3353 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 14 Feb 2019 15:08:28 +0000 Subject: [PATCH] Drop psutil requirement in functional tests, fetch memory usage directly --- renderdoc/api/replay/renderdoc_replay.h | 7 +++++ renderdoc/os/os_specific.h | 2 ++ .../os/posix/android/android_process.cpp | 22 +++++++++++++++ renderdoc/os/posix/apple/apple_process.cpp | 14 ++++++++++ renderdoc/os/posix/linux/linux_process.cpp | 22 +++++++++++++++ renderdoc/os/win32/win32_process.cpp | 27 +++++++++++++++++++ renderdoc/replay/entry_points.cpp | 5 ++++ util/test/run_tests.py | 2 -- util/test/tests/Repeat_Load.py | 3 +-- 9 files changed, 100 insertions(+), 4 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index a242deb70..28f672e70 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -2240,6 +2240,13 @@ DOCUMENT(R"(Retrieves the driver information (if available) for a given graphics )"); extern "C" RENDERDOC_API DriverInformation RENDERDOC_CC RENDERDOC_GetDriverInformation(GraphicsAPI api); +DOCUMENT(R"(Returns the current process's memory usage in bytes + +:return: The current memory usage in bytes. +:rtype: ``int`` +)"); +extern "C" RENDERDOC_API uint64_t RENDERDOC_CC RENDERDOC_GetCurrentProcessMemoryUsage(); + DOCUMENT("Internal function for retrieving a config setting."); extern "C" RENDERDOC_API const char *RENDERDOC_CC RENDERDOC_GetConfigSetting(const char *name); diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index ed041fe62..8f91b41b8 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -55,6 +55,8 @@ void ApplyEnvironmentModification(); const char *GetEnvVariable(const char *name); +uint64_t GetMemoryUsage(); + bool CanGlobalHook(); bool StartGlobalHook(const char *pathmatch, const char *capturefile, const CaptureOptions &opts); bool IsGlobalHookActive(); diff --git a/renderdoc/os/posix/android/android_process.cpp b/renderdoc/os/posix/android/android_process.cpp index 38162c8cc..0018aaa24 100644 --- a/renderdoc/os/posix/android/android_process.cpp +++ b/renderdoc/os/posix/android/android_process.cpp @@ -157,3 +157,25 @@ const char *Process::GetEnvVariable(const char *name) return settingsOutput.c_str(); } + +uint64_t Process::GetMemoryUsage() +{ + FILE *f = FileIO::fopen("/proc/self/statm", "r"); + + if(f == NULL) + { + RDCWARN("Couldn't open /proc/self/statm"); + return 0; + } + + char line[512] = {}; + fgets(line, 511, f); + + uint32_t vmPages = 0; + int num = sscanf(line, "%u", &vmPages); + + if(num == 1 && vmPages > 0) + return vmPages * (uint64_t)sysconf(_SC_PAGESIZE); + + return 0; +} \ No newline at end of file diff --git a/renderdoc/os/posix/apple/apple_process.cpp b/renderdoc/os/posix/apple/apple_process.cpp index 7bc2b3f30..852402fbf 100644 --- a/renderdoc/os/posix/apple/apple_process.cpp +++ b/renderdoc/os/posix/apple/apple_process.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include +#include #include #include #include @@ -168,4 +169,17 @@ bool OSUtility::DebuggerPresent() const char *Process::GetEnvVariable(const char *name) { return getenv(name); +} + +uint64_t Process::GetMemoryUsage() +{ + mach_task_basic_info taskInfo; + mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT; + + int ret = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&taskInfo, &infoCount); + + if(ret != KERN_SUCCESS) + return 0; + + return taskInfo.resident_size; } \ No newline at end of file diff --git a/renderdoc/os/posix/linux/linux_process.cpp b/renderdoc/os/posix/linux/linux_process.cpp index fafb3df38..fa46bb5d5 100644 --- a/renderdoc/os/posix/linux/linux_process.cpp +++ b/renderdoc/os/posix/linux/linux_process.cpp @@ -173,4 +173,26 @@ bool OSUtility::DebuggerPresent() const char *Process::GetEnvVariable(const char *name) { return getenv(name); +} + +uint64_t Process::GetMemoryUsage() +{ + FILE *f = FileIO::fopen("/proc/self/statm", "r"); + + if(f == NULL) + { + RDCWARN("Couldn't open /proc/self/statm"); + return 0; + } + + char line[512] = {}; + fgets(line, 511, f); + + uint32_t vmPages = 0; + int num = sscanf(line, "%u", &vmPages); + + if(num == 1 && vmPages > 0) + return vmPages * (uint64_t)sysconf(_SC_PAGESIZE); + + return 0; } \ No newline at end of file diff --git a/renderdoc/os/win32/win32_process.cpp b/renderdoc/os/win32/win32_process.cpp index 810513e5a..2e00e137c 100644 --- a/renderdoc/os/win32/win32_process.cpp +++ b/renderdoc/os/win32/win32_process.cpp @@ -26,6 +26,7 @@ // must be separate so that it's included first and not sorted by clang-format #include +#include #include #include #include @@ -183,6 +184,32 @@ const char *Process::GetEnvVariable(const char *name) return buf; } +uint64_t Process::GetMemoryUsage() +{ + HANDLE proc = GetCurrentProcess(); + + if(proc == NULL) + { + RDCERR("Couldn't open process: %d", GetLastError()); + return 0; + } + + PROCESS_MEMORY_COUNTERS memInfo = {}; + + uint64_t ret = 0; + + if(GetProcessMemoryInfo(proc, &memInfo, sizeof(memInfo))) + { + ret = memInfo.WorkingSetSize; + } + else + { + RDCERR("Couldn't get process memory info: %d", GetLastError()); + } + + return ret; +} + // helpers for various shims and dlls etc, not part of the public API extern "C" __declspec(dllexport) void __cdecl INTERNAL_GetTargetControlIdent(uint32_t *ident) { diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index 2cd5ecc0a..6d5015f9d 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -185,6 +185,11 @@ extern "C" RENDERDOC_API DriverInformation RENDERDOC_CC RENDERDOC_GetDriverInfor return RenderDoc::Inst().GetDriverInformation(api); } +extern "C" RENDERDOC_API uint64_t RENDERDOC_CC RENDERDOC_GetCurrentProcessMemoryUsage() +{ + return Process::GetMemoryUsage(); +} + extern "C" RENDERDOC_API const char *RENDERDOC_CC RENDERDOC_GetConfigSetting(const char *name) { return RenderDoc::Inst().GetConfigSetting(name).c_str(); diff --git a/util/test/run_tests.py b/util/test/run_tests.py index efa3e862e..1910402ec 100644 --- a/util/test/run_tests.py +++ b/util/test/run_tests.py @@ -5,8 +5,6 @@ import sys try: import PIL del PIL - import psutil - del psutil except ImportError as e: print("Missing dependency: {}".format(e)) sys.exit(1) diff --git a/util/test/tests/Repeat_Load.py b/util/test/tests/Repeat_Load.py index 9d28b2a87..76e66b7e8 100644 --- a/util/test/tests/Repeat_Load.py +++ b/util/test/tests/Repeat_Load.py @@ -1,6 +1,5 @@ import rdtest import os -import psutil import renderdoc as rd @@ -20,7 +19,7 @@ class Repeat_Load(rdtest.TestCase): return # Do nothing, just ensure it's loaded - memory_usage: int = psutil.Process(os.getpid()).memory_info().rss + memory_usage: int = rd.GetCurrentProcessMemoryUsage() # We measure the baseline memory usage during the second peak to avoid any persistent caches etc that might # not be full