summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlightlessMango <flightlessmangoyt@gmail.com>2023-09-21 22:20:22 +0200
committerFlightlessMango <flightlessmangoyt@gmail.com>2023-09-28 11:49:14 +0200
commit087d68a9f483c81929f631ee1157e802d5bc30a0 (patch)
tree1c834b7c965e00ed54ce66bc32be3e5c14c966b6
parent5df2c7dbcd372b5f9e40ab0b87081b7a4e309547 (diff)
hudelements: frame_timing: draw plot using implotimplot-subproject
Implot allows us to draw multiple lines in the graph. We draw the frametime as usual but also include thermal and power throttling. Thermal throttling is red and power is yellow.
-rw-r--r--src/amdgpu.h8
-rw-r--r--src/hud_elements.cpp57
-rw-r--r--src/overlay_params.h1
3 files changed, 64 insertions, 2 deletions
diff --git a/src/amdgpu.h b/src/amdgpu.h
index 79d296c..54e5603 100644
--- a/src/amdgpu.h
+++ b/src/amdgpu.h
@@ -10,6 +10,7 @@
#include <condition_variable>
#include <vector>
#include <sys/param.h>
+#include <algorithm>
#define METRICS_UPDATE_PERIOD_MS 500
#define METRICS_POLLING_PERIOD_MS 25
@@ -227,6 +228,13 @@ class Throttling {
thermal.erase(thermal.begin());
}
+ bool power_throttling(){
+ return std::find(power.begin(), power.end(), 0.1f) != power.end();
+ }
+
+ bool thermal_throttling(){
+ return std::find(thermal.begin(), thermal.end(), 0.1f) != thermal.end();
+ }
};
extern std::unique_ptr<Throttling> throttling;
diff --git a/src/hud_elements.cpp b/src/hud_elements.cpp
index 3fb3d73..73d5dba 100644
--- a/src/hud_elements.cpp
+++ b/src/hud_elements.cpp
@@ -19,6 +19,10 @@
#include <IconsForkAwesome.h>
#include "version.h"
#include "blacklist.h"
+#ifdef __linux__
+#include "implot.h"
+#endif
+#include "amdgpu.h"
#define CHAR_CELSIUS "\xe2\x84\x83"
#define CHAR_FAHRENHEIT "\xe2\x84\x89"
@@ -704,6 +708,17 @@ void HudElements::wine(){
}
}
+static inline double TransformForward_Custom(double v, void*) {
+ if (v > 50)
+ v = 49.9;
+
+ return v;
+}
+
+static inline double TransformInverse_Custom(double v, void*) {
+ return v;
+}
+
void HudElements::frame_timing(){
if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_frame_timing]){
ImguiNextColumnFirstItem();
@@ -726,7 +741,7 @@ void HudElements::frame_timing(){
float width, height = 0;
if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_horizontal]){
width = 150;
- height = HUDElements.params->font_size;
+ height = HUDElements.params->font_size * 0.85;
} else {
width = ImGui::GetWindowContentRegionWidth();
height = max_time;
@@ -737,20 +752,58 @@ void HudElements::frame_timing(){
max_time = max_frametime;
}
- if (ImGui::BeginChild("my_child_window", ImVec2(width, height))) {
+ if (ImGui::BeginChild("my_child_window", ImVec2(width, height), false, ImGuiWindowFlags_NoDecoration)) {
if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_histogram]){
ImGui::PlotHistogram(hash, get_time_stat, HUDElements.sw_stats,
ARRAY_SIZE(HUDElements.sw_stats->frames_stats), 0,
NULL, min_time, max_time,
ImVec2(width, height));
} else {
+#ifndef __linux__
ImGui::PlotLines(hash, get_time_stat, HUDElements.sw_stats,
ARRAY_SIZE(HUDElements.sw_stats->frames_stats), 0,
NULL, min_time, max_time,
ImVec2(width, height));
+#else
+ if (ImPlot::BeginPlot("My Plot", ImVec2(width, height), ImPlotFlags_CanvasOnly | ImPlotFlags_NoInputs)) {
+ ImPlotStyle& style = ImPlot::GetStyle();
+ style.Colors[ImPlotCol_PlotBg] = ImVec4(0.92f, 0.92f, 0.95f, 0.00f);
+ ImPlotAxisFlags ax_flags = ImPlotAxisFlags_NoDecorations;
+ ImPlot::SetupAxes(nullptr, nullptr, ax_flags,ax_flags);
+ ImPlot::SetupAxisScale(ImAxis_Y1, TransformForward_Custom, TransformInverse_Custom);
+ ImPlot::SetupAxesLimits(0, 200, min_time, max_time);
+ ImPlot::PushStyleVar(ImPlotStyleVar_PlotPadding, ImVec2(0,0));
+ ImPlot::SetNextLineStyle(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), 1.5);
+ ImPlot::PlotLine("frametime line", frametime_data.data(), frametime_data.size());
+ if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_throttling_status_graph] && throttling){
+ ImPlot::SetNextLineStyle(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), 1.5);
+ ImPlot::PlotLine("power line", throttling->power.data(), throttling->power.size());
+ ImPlot::SetNextLineStyle(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), 1.5);
+ ImPlot::PlotLine("thermal line", throttling->thermal.data(), throttling->thermal.size());
+ }
+ ImPlot::EndPlot();
+ }
+#endif
}
}
ImGui::EndChild();
+ if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_throttling_status_graph] && throttling){
+ ImGui::Dummy(ImVec2(0.0f, real_font_size.y / 2));
+
+ if (throttling->power_throttling()) {
+ ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "%s", ICON_FK_SQUARE);
+ ImGui::SameLine();
+ ImGui::Text("Power throttling");
+ }
+
+ ImGui::Dummy(ImVec2(0.0f, real_font_size.y / 2));
+
+ if (throttling->thermal_throttling()) {
+ ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "%s", ICON_FK_SQUARE);
+ ImGui::SameLine();
+ ImGui::Text("Thermal throttling");
+ }
+ }
ImGui::PopFont();
ImGui::PopStyleColor();
}
diff --git a/src/overlay_params.h b/src/overlay_params.h
index 73f3994..b721df2 100644
--- a/src/overlay_params.h
+++ b/src/overlay_params.h
@@ -85,6 +85,7 @@ typedef unsigned long KeySym;
OVERLAY_PARAM_BOOL(hide_fsr_sharpness) \
OVERLAY_PARAM_BOOL(fan) \
OVERLAY_PARAM_BOOL(throttling_status) \
+ OVERLAY_PARAM_BOOL(throttling_status_graph) \
OVERLAY_PARAM_BOOL(fcat) \
OVERLAY_PARAM_BOOL(log_versioning) \
OVERLAY_PARAM_BOOL(horizontal) \