mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 23:41:26 +12:00
overlays: add settings for overlay graphs
This commit is contained in:
parent
dd1707bd46
commit
fb96047d2f
8 changed files with 134 additions and 40 deletions
|
@ -94,7 +94,7 @@ namespace rsx
|
||||||
|
|
||||||
void perf_metrics_overlay::reset_transforms()
|
void perf_metrics_overlay::reset_transforms()
|
||||||
{
|
{
|
||||||
const u16 per_overlay_padding = m_font_size / 2;
|
const u16 perf_overlay_padding = m_font_size / 2;
|
||||||
const u16 graphs_padding = m_font_size * 2;
|
const u16 graphs_padding = m_font_size * 2;
|
||||||
|
|
||||||
const u16 fps_graph_h = 60;
|
const u16 fps_graph_h = 60;
|
||||||
|
@ -102,31 +102,59 @@ namespace rsx
|
||||||
|
|
||||||
u16 bottom_margin{};
|
u16 bottom_margin{};
|
||||||
|
|
||||||
if (m_graphs_enabled)
|
if (m_framerate_graph_enabled || m_frametime_graph_enabled)
|
||||||
{
|
{
|
||||||
// Adjust body size to account for the graphs
|
// Adjust body size to account for the graphs
|
||||||
// TODO: Bit hacky, could do this with margins if overlay_element had bottom margin (or negative top at least)
|
// TODO: Bit hacky, could do this with margins if overlay_element had bottom margin (or negative top at least)
|
||||||
bottom_margin = per_overlay_padding + fps_graph_h + graphs_padding + frametime_graph_h;
|
bottom_margin = perf_overlay_padding;
|
||||||
|
|
||||||
|
if (m_framerate_graph_enabled)
|
||||||
|
{
|
||||||
|
bottom_margin += fps_graph_h;
|
||||||
|
|
||||||
|
if (m_frametime_graph_enabled)
|
||||||
|
{
|
||||||
|
bottom_margin += graphs_padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_frametime_graph_enabled)
|
||||||
|
{
|
||||||
|
bottom_margin += frametime_graph_h;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set body/titles transform
|
// Set body/titles transform
|
||||||
reset_transform(m_body, bottom_margin);
|
reset_transform(m_body, bottom_margin);
|
||||||
reset_transform(m_titles, bottom_margin);
|
reset_transform(m_titles, bottom_margin);
|
||||||
|
|
||||||
if (m_graphs_enabled)
|
if (m_framerate_graph_enabled || m_frametime_graph_enabled)
|
||||||
{
|
{
|
||||||
// Position the graphs within the body
|
// Position the graphs within the body
|
||||||
const u16 graphs_width = m_body.w;
|
const u16 graphs_width = m_body.w;
|
||||||
const u16 body_left = m_body.x;
|
const u16 body_left = m_body.x;
|
||||||
const u16 body_bottom = m_body.y + m_body.h + per_overlay_padding;
|
const u16 body_bottom = m_body.y + m_body.h + perf_overlay_padding;
|
||||||
|
|
||||||
|
if (m_framerate_graph_enabled)
|
||||||
|
{
|
||||||
m_fps_graph.set_pos(body_left, body_bottom);
|
m_fps_graph.set_pos(body_left, body_bottom);
|
||||||
m_fps_graph.set_size(graphs_width, fps_graph_h);
|
m_fps_graph.set_size(graphs_width, fps_graph_h);
|
||||||
|
}
|
||||||
|
|
||||||
m_frametime_graph.set_pos(body_left, body_bottom + m_fps_graph.h + graphs_padding);
|
if (m_frametime_graph_enabled)
|
||||||
|
{
|
||||||
|
u16 padding = 0;
|
||||||
|
|
||||||
|
if (m_framerate_graph_enabled)
|
||||||
|
{
|
||||||
|
padding = m_fps_graph.h + graphs_padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_frametime_graph.set_pos(body_left, body_bottom + padding);
|
||||||
m_frametime_graph.set_size(graphs_width, frametime_graph_h);
|
m_frametime_graph.set_size(graphs_width, frametime_graph_h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void perf_metrics_overlay::reset_body()
|
void perf_metrics_overlay::reset_body()
|
||||||
{
|
{
|
||||||
|
@ -165,18 +193,6 @@ namespace rsx
|
||||||
reset_text();
|
reset_text();
|
||||||
force_next_update();
|
force_next_update();
|
||||||
|
|
||||||
m_fps_graph.set_title("Framerate");
|
|
||||||
m_fps_graph.set_font_size(m_font_size * 0.8);
|
|
||||||
m_fps_graph.set_count(50);
|
|
||||||
m_fps_graph.set_color(convert_color_code(g_cfg.video.perf_overlay.color_body));
|
|
||||||
m_fps_graph.set_guide_interval(10);
|
|
||||||
|
|
||||||
m_frametime_graph.set_title("Frametime");
|
|
||||||
m_frametime_graph.set_font_size(m_font_size * 0.8);
|
|
||||||
m_frametime_graph.set_count(170);
|
|
||||||
m_frametime_graph.set_color(convert_color_code(g_cfg.video.perf_overlay.color_body));
|
|
||||||
m_frametime_graph.set_guide_interval(8);
|
|
||||||
|
|
||||||
m_update_timer.Start();
|
m_update_timer.Start();
|
||||||
m_frametime_timer.Start();
|
m_frametime_timer.Start();
|
||||||
|
|
||||||
|
@ -185,12 +201,48 @@ namespace rsx
|
||||||
m_is_initialised = true;
|
m_is_initialised = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void perf_metrics_overlay::set_framerate_graph_enabled(bool enabled)
|
||||||
|
{
|
||||||
|
m_framerate_graph_enabled = enabled;
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
m_fps_graph.set_title("Framerate");
|
||||||
|
m_fps_graph.set_font_size(m_font_size * 0.8);
|
||||||
|
m_fps_graph.set_count(50);
|
||||||
|
m_fps_graph.set_color(convert_color_code(g_cfg.video.perf_overlay.color_body));
|
||||||
|
m_fps_graph.set_guide_interval(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_is_initialised)
|
||||||
|
{
|
||||||
|
reset_transforms();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void perf_metrics_overlay::set_frametime_graph_enabled(bool enabled)
|
||||||
|
{
|
||||||
|
m_frametime_graph_enabled = enabled;
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
m_frametime_graph.set_title("Frametime");
|
||||||
|
m_frametime_graph.set_font_size(m_font_size * 0.8);
|
||||||
|
m_frametime_graph.set_count(170);
|
||||||
|
m_frametime_graph.set_color(convert_color_code(g_cfg.video.perf_overlay.color_body));
|
||||||
|
m_frametime_graph.set_guide_interval(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_is_initialised)
|
||||||
|
{
|
||||||
|
reset_transforms();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void perf_metrics_overlay::set_detail_level(detail_level level)
|
void perf_metrics_overlay::set_detail_level(detail_level level)
|
||||||
{
|
{
|
||||||
m_detail = level;
|
m_detail = level;
|
||||||
|
|
||||||
m_graphs_enabled = (level == detail_level::high);
|
|
||||||
|
|
||||||
if (m_is_initialised)
|
if (m_is_initialised)
|
||||||
{
|
{
|
||||||
reset_titles();
|
reset_titles();
|
||||||
|
@ -263,7 +315,7 @@ namespace rsx
|
||||||
{
|
{
|
||||||
const auto elapsed_update = m_update_timer.GetElapsedTimeInMilliSec();
|
const auto elapsed_update = m_update_timer.GetElapsedTimeInMilliSec();
|
||||||
|
|
||||||
if (m_is_initialised && m_graphs_enabled)
|
if (m_is_initialised && m_frametime_graph_enabled)
|
||||||
{
|
{
|
||||||
const auto elapsed_frame = m_frametime_timer.GetElapsedTimeInMilliSec();
|
const auto elapsed_frame = m_frametime_timer.GetElapsedTimeInMilliSec();
|
||||||
m_frametime_graph.record_datapoint(elapsed_frame);
|
m_frametime_graph.record_datapoint(elapsed_frame);
|
||||||
|
@ -276,7 +328,7 @@ namespace rsx
|
||||||
|
|
||||||
if (elapsed_update >= m_update_interval || m_force_update)
|
if (elapsed_update >= m_update_interval || m_force_update)
|
||||||
{
|
{
|
||||||
if (!m_force_update && m_graphs_enabled)
|
if (!m_force_update)
|
||||||
{
|
{
|
||||||
m_update_timer.Start();
|
m_update_timer.Start();
|
||||||
}
|
}
|
||||||
|
@ -350,7 +402,7 @@ namespace rsx
|
||||||
case detail_level::minimal:
|
case detail_level::minimal:
|
||||||
{
|
{
|
||||||
fps = m_force_update ? 0 : std::max(0.0, static_cast<f32>(m_frames) / (elapsed_update / 1000));
|
fps = m_force_update ? 0 : std::max(0.0, static_cast<f32>(m_frames) / (elapsed_update / 1000));
|
||||||
if (m_is_initialised && m_graphs_enabled)
|
if (m_is_initialised && m_framerate_graph_enabled)
|
||||||
m_fps_graph.record_datapoint(fps);
|
m_fps_graph.record_datapoint(fps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,11 +468,14 @@ namespace rsx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_graphs_enabled)
|
if (m_framerate_graph_enabled)
|
||||||
{
|
{
|
||||||
m_fps_graph.update();
|
m_fps_graph.update();
|
||||||
m_frametime_graph.update();
|
}
|
||||||
|
|
||||||
|
if (m_frametime_graph_enabled)
|
||||||
|
{
|
||||||
|
m_frametime_graph.update();
|
||||||
m_frametime_timer.Start();
|
m_frametime_timer.Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -431,9 +486,13 @@ namespace rsx
|
||||||
|
|
||||||
compiled_resources.add(m_titles.get_compiled());
|
compiled_resources.add(m_titles.get_compiled());
|
||||||
|
|
||||||
if (m_graphs_enabled)
|
if (m_framerate_graph_enabled)
|
||||||
{
|
{
|
||||||
compiled_resources.add(m_fps_graph.get_compiled());
|
compiled_resources.add(m_fps_graph.get_compiled());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_frametime_graph_enabled)
|
||||||
|
{
|
||||||
compiled_resources.add(m_frametime_graph.get_compiled());
|
compiled_resources.add(m_frametime_graph.get_compiled());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,8 @@ namespace rsx
|
||||||
label m_body{};
|
label m_body{};
|
||||||
label m_titles{};
|
label m_titles{};
|
||||||
|
|
||||||
bool m_graphs_enabled{};
|
bool m_framerate_graph_enabled{};
|
||||||
|
bool m_frametime_graph_enabled{};
|
||||||
graph m_fps_graph;
|
graph m_fps_graph;
|
||||||
graph m_frametime_graph;
|
graph m_frametime_graph;
|
||||||
|
|
||||||
|
@ -52,6 +53,8 @@ namespace rsx
|
||||||
public:
|
public:
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
void set_framerate_graph_enabled(bool enabled);
|
||||||
|
void set_frametime_graph_enabled(bool enabled);
|
||||||
void set_detail_level(detail_level level);
|
void set_detail_level(detail_level level);
|
||||||
void set_position(screen_quadrant quadrant);
|
void set_position(screen_quadrant quadrant);
|
||||||
void set_update_interval(u32 update_interval);
|
void set_update_interval(u32 update_interval);
|
||||||
|
|
|
@ -438,6 +438,8 @@ namespace rsx
|
||||||
perf_overlay->set_font_size(perf_settings.font_size);
|
perf_overlay->set_font_size(perf_settings.font_size);
|
||||||
perf_overlay->set_margins(perf_settings.margin_x, perf_settings.margin_y);
|
perf_overlay->set_margins(perf_settings.margin_x, perf_settings.margin_y);
|
||||||
perf_overlay->set_opacity(perf_settings.opacity / 100.f);
|
perf_overlay->set_opacity(perf_settings.opacity / 100.f);
|
||||||
|
perf_overlay->set_framerate_graph_enabled(perf_settings.framerate_graph_enabled.get());
|
||||||
|
perf_overlay->set_frametime_graph_enabled(perf_settings.frametime_graph_enabled.get());
|
||||||
perf_overlay->init();
|
perf_overlay->init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -515,6 +515,8 @@ struct cfg_root : cfg::node
|
||||||
node_perf_overlay(cfg::node* _this) : cfg::node(_this, "Performance Overlay") {}
|
node_perf_overlay(cfg::node* _this) : cfg::node(_this, "Performance Overlay") {}
|
||||||
|
|
||||||
cfg::_bool perf_overlay_enabled{this, "Enabled", false};
|
cfg::_bool perf_overlay_enabled{this, "Enabled", false};
|
||||||
|
cfg::_bool framerate_graph_enabled{ this, "Enable Framerate Graph", false };
|
||||||
|
cfg::_bool frametime_graph_enabled{ this, "Enable Frametime Graph", false };
|
||||||
cfg::_enum<detail_level> level{this, "Detail level", detail_level::medium};
|
cfg::_enum<detail_level> level{this, "Detail level", detail_level::medium};
|
||||||
cfg::_int<30, 5000> update_interval{ this, "Metrics update interval (ms)", 350 };
|
cfg::_int<30, 5000> update_interval{ this, "Metrics update interval (ms)", 350 };
|
||||||
cfg::_int<4, 36> font_size{ this, "Font size (px)", 10 };
|
cfg::_int<4, 36> font_size{ this, "Font size (px)", 10 };
|
||||||
|
|
|
@ -91,6 +91,8 @@
|
||||||
},
|
},
|
||||||
"overlay": {
|
"overlay": {
|
||||||
"perfOverlayEnabled": "Enables or disables the performance overlay.",
|
"perfOverlayEnabled": "Enables or disables the performance overlay.",
|
||||||
|
"perfOverlayFramerateGraphEnabled": "Enables or disables the framerate graph.",
|
||||||
|
"perfOverlayFrametimeGraphEnabled": "Enables or disables the frametime graph.",
|
||||||
"perfOverlayPosition": "Sets the on-screen position (quadrant) of the performance overlay.",
|
"perfOverlayPosition": "Sets the on-screen position (quadrant) of the performance overlay.",
|
||||||
"perfOverlayDetailLevel": "Controls the amount of information displayed on the performance overlay.",
|
"perfOverlayDetailLevel": "Controls the amount of information displayed on the performance overlay.",
|
||||||
"perfOverlayUpdateInterval": "Sets the time interval in which the performance overlay is being updated (measured in milliseconds).",
|
"perfOverlayUpdateInterval": "Sets the time interval in which the performance overlay is being updated (measured in milliseconds).",
|
||||||
|
|
|
@ -86,6 +86,8 @@ public:
|
||||||
|
|
||||||
// Performance Overlay
|
// Performance Overlay
|
||||||
PerfOverlayEnabled,
|
PerfOverlayEnabled,
|
||||||
|
PerfOverlayFramerateGraphEnabled,
|
||||||
|
PerfOverlayFrametimeGraphEnabled,
|
||||||
PerfOverlayDetailLevel,
|
PerfOverlayDetailLevel,
|
||||||
PerfOverlayPosition,
|
PerfOverlayPosition,
|
||||||
PerfOverlayUpdateInterval,
|
PerfOverlayUpdateInterval,
|
||||||
|
@ -313,9 +315,11 @@ private:
|
||||||
|
|
||||||
// Performance Overlay
|
// Performance Overlay
|
||||||
{ PerfOverlayEnabled, { "Video", "Performance Overlay", "Enabled" } },
|
{ PerfOverlayEnabled, { "Video", "Performance Overlay", "Enabled" } },
|
||||||
|
{ PerfOverlayFramerateGraphEnabled, { "Video", "Performance Overlay", "Enable Framerate Graph" } },
|
||||||
|
{ PerfOverlayFrametimeGraphEnabled, { "Video", "Performance Overlay", "Enable Frametime Graph" } },
|
||||||
{ PerfOverlayDetailLevel, { "Video", "Performance Overlay", "Detail level" } },
|
{ PerfOverlayDetailLevel, { "Video", "Performance Overlay", "Detail level" } },
|
||||||
{ PerfOverlayPosition, { "Video", "Performance Overlay", "Position" } },
|
{ PerfOverlayPosition, { "Video", "Performance Overlay", "Position" } },
|
||||||
{ PerfOverlayUpdateInterval,{ "Video", "Performance Overlay", "Metrics update interval (ms)" } },
|
{ PerfOverlayUpdateInterval, { "Video", "Performance Overlay", "Metrics update interval (ms)" } },
|
||||||
{ PerfOverlayFontSize, { "Video", "Performance Overlay", "Font size (px)" } },
|
{ PerfOverlayFontSize, { "Video", "Performance Overlay", "Font size (px)" } },
|
||||||
{ PerfOverlayOpacity, { "Video", "Performance Overlay", "Opacity (%)" } },
|
{ PerfOverlayOpacity, { "Video", "Performance Overlay", "Opacity (%)" } },
|
||||||
{ PerfOverlayMarginX, { "Video", "Performance Overlay", "Horizontal Margin (px)" } },
|
{ PerfOverlayMarginX, { "Video", "Performance Overlay", "Horizontal Margin (px)" } },
|
||||||
|
|
|
@ -1170,6 +1170,12 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
|
||||||
});
|
});
|
||||||
ui->perfOverlayMarginY->setEnabled(!ui->perfOverlayCenterY->isChecked());
|
ui->perfOverlayMarginY->setEnabled(!ui->perfOverlayCenterY->isChecked());
|
||||||
|
|
||||||
|
xemu_settings->EnhanceCheckBox(ui->perfOverlayFramerateGraphEnabled, emu_settings::PerfOverlayFramerateGraphEnabled);
|
||||||
|
SubscribeTooltip(ui->perfOverlayFramerateGraphEnabled, json_emu_overlay["perfOverlayFramerateGraphEnabled"].toString());
|
||||||
|
|
||||||
|
xemu_settings->EnhanceCheckBox(ui->perfOverlayFrametimeGraphEnabled, emu_settings::PerfOverlayFrametimeGraphEnabled);
|
||||||
|
SubscribeTooltip(ui->perfOverlayFrametimeGraphEnabled, json_emu_overlay["perfOverlayFrametimeGraphEnabled"].toString());
|
||||||
|
|
||||||
xemu_settings->EnhanceCheckBox(ui->perfOverlayEnabled, emu_settings::PerfOverlayEnabled);
|
xemu_settings->EnhanceCheckBox(ui->perfOverlayEnabled, emu_settings::PerfOverlayEnabled);
|
||||||
SubscribeTooltip(ui->perfOverlayEnabled, json_emu_overlay["perfOverlayEnabled"].toString());
|
SubscribeTooltip(ui->perfOverlayEnabled, json_emu_overlay["perfOverlayEnabled"].toString());
|
||||||
auto EnablePerfOverlayOptions = [this](bool enabled)
|
auto EnablePerfOverlayOptions = [this](bool enabled)
|
||||||
|
@ -1190,6 +1196,8 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
|
||||||
ui->perfOverlayMarginY->setEnabled(enabled && !ui->perfOverlayCenterY->isChecked());
|
ui->perfOverlayMarginY->setEnabled(enabled && !ui->perfOverlayCenterY->isChecked());
|
||||||
ui->perfOverlayCenterX->setEnabled(enabled);
|
ui->perfOverlayCenterX->setEnabled(enabled);
|
||||||
ui->perfOverlayCenterY->setEnabled(enabled);
|
ui->perfOverlayCenterY->setEnabled(enabled);
|
||||||
|
ui->perfOverlayFramerateGraphEnabled->setEnabled(enabled);
|
||||||
|
ui->perfOverlayFrametimeGraphEnabled->setEnabled(enabled);
|
||||||
};
|
};
|
||||||
EnablePerfOverlayOptions(ui->perfOverlayEnabled->isChecked());
|
EnablePerfOverlayOptions(ui->perfOverlayEnabled->isChecked());
|
||||||
connect(ui->perfOverlayEnabled, &QCheckBox::clicked, EnablePerfOverlayOptions);
|
connect(ui->perfOverlayEnabled, &QCheckBox::clicked, EnablePerfOverlayOptions);
|
||||||
|
|
|
@ -2138,6 +2138,20 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="perfOverlayFramerateGraphEnabled">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show framerate graph</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="perfOverlayFrametimeGraphEnabled">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show frametime graph</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_detail_level">
|
<widget class="QLabel" name="label_detail_level">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue