summarylogtreecommitdiffstats
path: root/overlay.diff
diff options
context:
space:
mode:
Diffstat (limited to 'overlay.diff')
-rw-r--r--overlay.diff401
1 files changed, 401 insertions, 0 deletions
diff --git a/overlay.diff b/overlay.diff
new file mode 100644
index 000000000000..66e7098e3d13
--- /dev/null
+++ b/overlay.diff
@@ -0,0 +1,401 @@
+diff --git a/src/Cafe/HW/Latte/Core/LatteOverlay.cpp b/src/Cafe/HW/Latte/Core/LatteOverlay.cpp
+index cb7c9ba..c8ba86a 100644
+--- a/src/Cafe/HW/Latte/Core/LatteOverlay.cpp
++++ b/src/Cafe/HW/Latte/Core/LatteOverlay.cpp
+@@ -12,30 +12,16 @@
+ #include "imgui/imgui_extension.h"
+
+ #include "input/InputManager.h"
++#include "util/SystemInfo/SystemInfo.h"
+
+ #include <cinttypes>
+
+-#if BOOST_OS_WINDOWS
+-#include <Psapi.h>
+-#include <winternl.h>
+-#pragma comment(lib, "ntdll.lib")
+-#endif
+-
+ struct OverlayStats
+ {
+ OverlayStats() {};
+
+ int processor_count = 1;
+-
+- // cemu cpu stats
+- uint64_t last_cpu{}, kernel{}, user{};
+-
+- // global cpu stats
+- struct ProcessorTime
+- {
+- uint64_t idle{}, kernel{}, user{};
+- };
+-
++ ProcessorTime processor_time_cemu;
+ std::vector<ProcessorTime> processor_times;
+
+ double fps{};
+@@ -565,83 +551,52 @@ void LatteOverlay_render(bool pad_view)
+ }
+ }
+
+-
+ void LatteOverlay_init()
+ {
+-#if BOOST_OS_WINDOWS
+- SYSTEM_INFO sys_info;
+- GetSystemInfo(&sys_info);
+- g_state.processor_count = sys_info.dwNumberOfProcessors;
++ g_state.processor_count = GetProcessorCount();
+
+ g_state.processor_times.resize(g_state.processor_count);
+ g_state.cpu_per_core.resize(g_state.processor_count);
+-#else
+- g_state.processor_count = 1;
+-#endif
+ }
+
+-void LatteOverlay_updateStats(double fps, sint32 drawcalls)
++static void UpdateStats_CemuCpu()
+ {
+- if (GetConfig().overlay.position == ScreenPosition::kDisabled)
+- return;
++ ProcessorTime now;
++ QueryProcTime(now);
++
++ double cpu = ProcessorTime::Compare(g_state.processor_time_cemu, now);
++ cpu /= g_state.processor_count;
++
++ g_state.cpu_usage = cpu * 100;
++ g_state.processor_time_cemu = now;
++}
+
+- g_state.fps = fps;
+- g_state.draw_calls_per_frame = drawcalls;
++static void UpdateStats_CpuPerCore()
++{
++ std::vector<ProcessorTime> now(g_state.processor_count);
++ QueryCoreTimes(g_state.processor_count, now.data());
+
+-#if BOOST_OS_WINDOWS
+- // update cemu cpu
+- FILETIME ftime, fkernel, fuser;
+- LARGE_INTEGER now, kernel, user;
+- GetSystemTimeAsFileTime(&ftime);
+- now.LowPart = ftime.dwLowDateTime;
+- now.HighPart = ftime.dwHighDateTime;
+-
+- GetProcessTimes(GetCurrentProcess(), &ftime, &ftime, &fkernel, &fuser);
+- kernel.LowPart = fkernel.dwLowDateTime;
+- kernel.HighPart = fkernel.dwHighDateTime;
+-
+- user.LowPart = fuser.dwLowDateTime;
+- user.HighPart = fuser.dwHighDateTime;
+-
+- double percent = (kernel.QuadPart - g_state.kernel) + (user.QuadPart - g_state.user);
+- percent /= (now.QuadPart - g_state.last_cpu);
+- percent /= g_state.processor_count;
+- g_state.cpu_usage = percent * 100;
+- g_state.last_cpu = now.QuadPart;
+- g_state.user = user.QuadPart;
+- g_state.kernel = kernel.QuadPart;
+-
+- // update cpu per core
+- std::vector<SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION> sppi(g_state.processor_count);
+- if (NT_SUCCESS(NtQuerySystemInformation(SystemProcessorPerformanceInformation, sppi.data(), sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * g_state.processor_count, nullptr)))
++ for (int32_t i = 0; i < g_state.processor_count; ++i)
+ {
+- for (sint32 i = 0; i < g_state.processor_count; ++i)
+- {
+- const uint64 kernel_diff = sppi[i].KernelTime.QuadPart - g_state.processor_times[i].kernel;
+- const uint64 user_diff = sppi[i].UserTime.QuadPart - g_state.processor_times[i].user;
+- const uint64 idle_diff = sppi[i].IdleTime.QuadPart - g_state.processor_times[i].idle;
+-
+- const auto total = kernel_diff + user_diff; // kernel time already includes idletime
+- const double cpu = total == 0 ? 0 : (1.0 - ((double)idle_diff / total)) * 100.0;
++ double cpu = ProcessorTime::Compare(g_state.processor_times[i], now[i]);
+
+- g_state.cpu_per_core[i] = cpu;
+- //total_cpu += cpu;
++ g_state.cpu_per_core[i] = cpu * 100;
++ g_state.processor_times[i] = now[i];
++ }
++}
+
+- g_state.processor_times[i].idle = sppi[i].IdleTime.QuadPart;
+- g_state.processor_times[i].kernel = sppi[i].KernelTime.QuadPart;
+- g_state.processor_times[i].user = sppi[i].UserTime.QuadPart;
+- }
++void LatteOverlay_updateStats(double fps, sint32 drawcalls)
++{
++ if (GetConfig().overlay.position == ScreenPosition::kDisabled)
++ return;
+
+- //total_cpu /= g_state.processor_count;
+- //g_state.cpu_usage = total_cpu;
+- }
++ g_state.fps = fps;
++ g_state.draw_calls_per_frame = drawcalls;
++ UpdateStats_CemuCpu();
++ UpdateStats_CpuPerCore();
+
+ // update ram
+- PROCESS_MEMORY_COUNTERS pmc{};
+- pmc.cb = sizeof(pmc);
+- GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
+- g_state.ram_usage = (pmc.WorkingSetSize / 1000) / 1000;
+-#endif
++ g_state.ram_usage = (QueryRamUsage() / 1000) / 1000;
+
+ // update vram
+ g_renderer->GetVRAMInfo(g_state.vramUsage, g_state.vramTotal);
+diff --git a/src/util/SystemInfo/SystemInfo.cpp b/src/util/SystemInfo/SystemInfo.cpp
+new file mode 100644
+index 0000000..afda4e8
+--- /dev/null
++++ b/src/util/SystemInfo/SystemInfo.cpp
+@@ -0,0 +1,34 @@
++#include "util/SystemInfo/SystemInfo.h"
++
++uint64 ProcessorTime::work()
++{
++ return user + kernel;
++}
++
++uint64 ProcessorTime::total()
++{
++ return idle + user + kernel;
++}
++
++double ProcessorTime::Compare(ProcessorTime &last, ProcessorTime &now)
++{
++ auto dwork = now.work() - last.work();
++ auto dtotal = now.total() - last.total();
++
++ return (double)dwork / dtotal;
++}
++
++uint32 GetProcessorCount()
++{
++ return std::thread::hardware_concurrency();
++}
++
++void QueryProcTime(ProcessorTime &out)
++{
++ uint64 now, user, kernel;
++ QueryProcTime(now, user, kernel);
++
++ out.idle = now - (user + kernel);
++ out.kernel = kernel;
++ out.user = user;
++}
+\ No newline at end of file
+diff --git a/src/util/SystemInfo/SystemInfo.h b/src/util/SystemInfo/SystemInfo.h
+new file mode 100644
+index 0000000..1b14038
+--- /dev/null
++++ b/src/util/SystemInfo/SystemInfo.h
+@@ -0,0 +1,17 @@
++#pragma once
++
++struct ProcessorTime
++{
++ uint64 idle{}, kernel{}, user{};
++
++ uint64 work();
++ uint64 total();
++
++ static double Compare(ProcessorTime &last, ProcessorTime &now);
++};
++
++uint32 GetProcessorCount();
++uint64 QueryRamUsage();
++void QueryProcTime(uint64 &out_now, uint64 &out_user, uint64 &out_kernel);
++void QueryProcTime(ProcessorTime &out);
++void QueryCoreTimes(uint32 count, ProcessorTime out[]);
+\ No newline at end of file
+diff --git a/src/util/SystemInfo/SystemInfoLinux.cpp b/src/util/SystemInfo/SystemInfoLinux.cpp
+new file mode 100644
+index 0000000..07fe9ae
+--- /dev/null
++++ b/src/util/SystemInfo/SystemInfoLinux.cpp
+@@ -0,0 +1,67 @@
++#if BOOST_OS_LINUX
++
++#include "util/SystemInfo/SystemInfo.h"
++
++#include <unistd.h>
++#include <sys/times.h>
++
++uint64 QueryRamUsage()
++{
++ long page_size = sysconf(_SC_PAGESIZE);
++ if (page_size == -1)
++ {
++ return 0;
++ }
++
++ std::ifstream file("/proc/self/statm");
++ if (file)
++ {
++ file.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
++ uint64 no_pages;
++ file >> no_pages;
++
++ return no_pages * page_size;
++ }
++ else
++ {
++ return 0;
++ }
++}
++
++void QueryProcTime(uint64 &out_now, uint64 &out_user, uint64 &out_kernel)
++{
++ struct tms time_info;
++ clock_t clock_now = times(&time_info);
++ clock_t clock_user = time_info.tms_utime;
++ clock_t clock_kernel = time_info.tms_stime;
++ out_now = static_cast<uint64>(clock_now);
++ out_user = static_cast<uint64>(clock_user);
++ out_kernel = static_cast<uint64>(clock_kernel);
++}
++
++void QueryCoreTimes(uint32 count, ProcessorTime out[])
++{
++ std::ifstream file("/proc/stat");
++ if (file)
++ {
++ file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
++
++ for (auto i = 0; i < count; ++i)
++ {
++ uint64 user, nice, kernel, idle;
++ file.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
++ file >> user >> nice >> kernel >> idle;
++ file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
++
++ out[i].idle = idle;
++ out[i].kernel = kernel;
++ out[i].user = user + nice;
++ }
++ }
++ else
++ {
++ for (auto i = 0; i < count; ++i) out[i] = { };
++ }
++}
++
++#endif
+\ No newline at end of file
+diff --git a/src/util/SystemInfo/SystemInfoStub.cpp b/src/util/SystemInfo/SystemInfoStub.cpp
+new file mode 100644
+index 0000000..3d970d1
+--- /dev/null
++++ b/src/util/SystemInfo/SystemInfoStub.cpp
+@@ -0,0 +1,25 @@
++#if !BOOST_OS_WINDOWS && !BOOST_OS_LINUX
++
++#include "util/SystemInfo/SystemInfo.h"
++
++uint64 QueryRamUsage()
++{
++ return 0;
++}
++
++void QueryProcTime(uint64 &out_now, uint64 &out_user, uint64 &out_kernel)
++{
++ out_now = 0;
++ out_user = 0;
++ out_kernel = 0;
++}
++
++void QueryCoreTimes(uint32 count, ProcessorTime out[])
++{
++ for (auto i = 0; i < count; ++i)
++ {
++ out[i] = { };
++ }
++}
++
++#endif
+\ No newline at end of file
+diff --git a/src/util/SystemInfo/SystemInfoWin.cpp b/src/util/SystemInfo/SystemInfoWin.cpp
+new file mode 100644
+index 0000000..2f39174
+--- /dev/null
++++ b/src/util/SystemInfo/SystemInfoWin.cpp
+@@ -0,0 +1,72 @@
++#if BOOST_OS_WINDOWS
++
++#include "util/SystemInfo/SystemInfo.h"
++
++#include <Psapi.h>
++#include <winternl.h>
++#pragma comment(lib, "ntdll.lib")
++
++uint64 QueryRamUsage()
++{
++ PROCESS_MEMORY_COUNTERS pmc{};
++ pmc.cb = sizeof(pmc);
++ if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))
++ {
++ return pmc.WorkingSetSize;
++ }
++ else
++ {
++ return 0;
++ }
++}
++
++void QueryProcTime(uint64 &out_now, uint64 &out_user, uint64 &out_kernel)
++{
++ FILETIME ftime, fkernel, fuser;
++ LARGE_INTEGER now, kernel, user;
++ GetSystemTimeAsFileTime(&ftime);
++ now.LowPart = ftime.dwLowDateTime;
++ now.HighPart = ftime.dwHighDateTime;
++
++ if (GetProcessTimes(GetCurrentProcess(), &ftime, &ftime, &fkernel, &fuser))
++ {
++ kernel.LowPart = fkernel.dwLowDateTime;
++ kernel.HighPart = fkernel.dwHighDateTime;
++
++ user.LowPart = fuser.dwLowDateTime;
++ user.HighPart = fuser.dwHighDateTime;
++
++ out_now = now.QuadPart;
++ out_user = user.QuadPart;
++ out_kernel = kernel.QuadPart;
++ }
++ else
++ {
++ out_now = 0;
++ out_user = 0;
++ out_kernel = 0;
++ }
++}
++
++void QueryCoreTimes(uint32 count, ProcessorTime out[])
++{
++ std::vector<SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION> sppi(count);
++ if (NT_SUCCESS(NtQuerySystemInformation(SystemProcessorPerformanceInformation, sppi.data(), sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * count, nullptr)))
++ {
++ for (auto i = 0; i < count; ++i)
++ {
++ out[i].idle = sppi[i].IdleTime.QuadPart;
++ out[i].kernel = sppi[i].KernelTime.QuadPart;
++ out[i].user = sppi[i].UserTime.QuadPart;
++ }
++ }
++ else
++ {
++ for (auto i = 0; i < count; ++i)
++ {
++ out[i] = { };
++ }
++ }
++}
++
++#endif
+\ No newline at end of file