FPS Counter at the end of the display chain
1) Gives actual refresh rate of the window 2) FPS display based on profiler data, toggleable by pressing the the h key on the keyboard, use Shift + h to modify FPS text scale (x1, x2 or x4) 3) Fix linux build by updating the gtk window 4) Fix linux build again, include microprofiler header directly and correct parameters sent to ImGui::Text 5) Fix linux build by using a define to hide undefined functions on linux
This commit is contained in:
parent
4d709dccd2
commit
d360c80094
|
@ -100,6 +100,13 @@ bool EmulatorWindow::Initialize() {
|
||||||
window_->on_key_down.AddListener([this](KeyEvent* e) {
|
window_->on_key_down.AddListener([this](KeyEvent* e) {
|
||||||
bool handled = true;
|
bool handled = true;
|
||||||
switch (e->key_code()) {
|
switch (e->key_code()) {
|
||||||
|
case 0x48: { // h
|
||||||
|
if (e->is_shift_pressed()) {
|
||||||
|
window_->FPSTextScale();
|
||||||
|
} else {
|
||||||
|
window_->ToggleFPS();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
case 0x4F: { // o
|
case 0x4F: { // o
|
||||||
if (e->is_ctrl_pressed()) {
|
if (e->is_ctrl_pressed()) {
|
||||||
FileOpen();
|
FileOpen();
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include "xenia/base/logging.h"
|
#include "xenia/base/logging.h"
|
||||||
#include "xenia/ui/imgui_drawer.h"
|
#include "xenia/ui/imgui_drawer.h"
|
||||||
|
|
||||||
|
#include "xenia/base/profiling.h"
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
|
@ -183,6 +185,33 @@ void Window::OnPaint(UIEvent* e) {
|
||||||
tick_frequency));
|
tick_frequency));
|
||||||
fps_update_time_ticks_ = now_ticks;
|
fps_update_time_ticks_ = now_ticks;
|
||||||
fps_frame_count_ = 0;
|
fps_frame_count_ = 0;
|
||||||
|
|
||||||
|
#if XE_OPTION_PROFILING
|
||||||
|
// This means FPS counter will not work with profiling disabled (e.g. on
|
||||||
|
// Linux)
|
||||||
|
float fToMs =
|
||||||
|
MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());
|
||||||
|
uint64_t nFlipTicks = 0;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(MicroProfileGetMutex());
|
||||||
|
MicroProfile& S = *MicroProfileGet();
|
||||||
|
nFlipTicks = S.nFlipTicks;
|
||||||
|
}
|
||||||
|
float fMs = fToMs * nFlipTicks;
|
||||||
|
|
||||||
|
if (fMs != 0.0f) {
|
||||||
|
game_fps_ = static_cast<uint32_t>(1000.0f / fMs);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
title_fps_text_ = base_title_;
|
||||||
|
title_fps_text_ += " | ";
|
||||||
|
title_fps_text_ += std::to_string(game_fps_);
|
||||||
|
title_fps_text_ += " FPS";
|
||||||
|
set_title(title_fps_text_, false);
|
||||||
|
|
||||||
|
osd_fps_text_ = std::to_string(game_fps_);
|
||||||
|
osd_fps_text_ += " FPS";
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphicsContextLock context_lock(context_.get());
|
GraphicsContextLock context_lock(context_.get());
|
||||||
|
@ -213,6 +242,20 @@ void Window::OnPaint(UIEvent* e) {
|
||||||
ForEachListener([e](auto listener) { listener->OnPaint(e); });
|
ForEachListener([e](auto listener) { listener->OnPaint(e); });
|
||||||
on_paint(e);
|
on_paint(e);
|
||||||
|
|
||||||
|
if (display_fps_) {
|
||||||
|
ImGui::Begin("FPS", (bool*)0,
|
||||||
|
ImGuiWindowFlags_::ImGuiWindowFlags_NoTitleBar |
|
||||||
|
ImGuiWindowFlags_::ImGuiWindowFlags_NoResize |
|
||||||
|
ImGuiWindowFlags_::ImGuiWindowFlags_NoMove |
|
||||||
|
ImGuiWindowFlags_::ImGuiWindowFlags_NoScrollbar |
|
||||||
|
ImGuiWindowFlags_::ImGuiWindowFlags_NoSavedSettings |
|
||||||
|
ImGuiWindowFlags_::ImGuiWindowFlags_NoInputs);
|
||||||
|
ImGui::SetWindowFontScale(fps_font_scale_);
|
||||||
|
ImGui::Text("%s", osd_fps_text_.c_str());
|
||||||
|
ImGui::SetWindowSize({0.0f, 0.0f}); // Resize to fit content
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
// Flush ImGui buffers before we swap.
|
// Flush ImGui buffers before we swap.
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
imgui_drawer_->RenderDrawLists();
|
imgui_drawer_->RenderDrawLists();
|
||||||
|
|
|
@ -47,15 +47,27 @@ class Window {
|
||||||
virtual void EnableMainMenu() = 0;
|
virtual void EnableMainMenu() = 0;
|
||||||
virtual void DisableMainMenu() = 0;
|
virtual void DisableMainMenu() = 0;
|
||||||
|
|
||||||
|
|
||||||
const std::string& title() const { return title_; }
|
const std::string& title() const { return title_; }
|
||||||
virtual bool set_title(const std::string& title) {
|
virtual bool set_title(const std::string& title,
|
||||||
|
bool set_base_title = true) {
|
||||||
if (title == title_) {
|
if (title == title_) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
title_ = title;
|
title_ = title;
|
||||||
|
if (set_base_title) {
|
||||||
|
base_title_ = title;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToggleFPS() { display_fps_ = !display_fps_; }
|
||||||
|
|
||||||
|
void FPSTextScale() {
|
||||||
|
fps_font_scale_ = fps_font_scale_ * 2.0f;
|
||||||
|
fps_font_scale_ = (fps_font_scale_ > 4.0f) ? 1.0f : fps_font_scale_;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool SetIcon(const void* buffer, size_t size) = 0;
|
virtual bool SetIcon(const void* buffer, size_t size) = 0;
|
||||||
void ResetIcon() { SetIcon(nullptr, 0); }
|
void ResetIcon() { SetIcon(nullptr, 0); }
|
||||||
|
|
||||||
|
@ -171,7 +183,10 @@ class Window {
|
||||||
|
|
||||||
Loop* loop_ = nullptr;
|
Loop* loop_ = nullptr;
|
||||||
std::unique_ptr<MenuItem> main_menu_;
|
std::unique_ptr<MenuItem> main_menu_;
|
||||||
|
|
||||||
std::string title_;
|
std::string title_;
|
||||||
|
std::string base_title_;
|
||||||
|
|
||||||
int32_t width_ = 0;
|
int32_t width_ = 0;
|
||||||
int32_t height_ = 0;
|
int32_t height_ = 0;
|
||||||
bool has_focus_ = true;
|
bool has_focus_ = true;
|
||||||
|
@ -187,6 +202,13 @@ class Window {
|
||||||
uint64_t fps_frame_count_ = 0;
|
uint64_t fps_frame_count_ = 0;
|
||||||
uint64_t last_paint_time_ticks_ = 0;
|
uint64_t last_paint_time_ticks_ = 0;
|
||||||
|
|
||||||
|
bool display_fps_ = false;
|
||||||
|
uint32_t game_fps_ = 0;
|
||||||
|
float fps_font_scale_ = 1.0f;
|
||||||
|
|
||||||
|
std::string title_fps_text_;
|
||||||
|
std::string osd_fps_text_;
|
||||||
|
|
||||||
bool modifier_shift_pressed_ = false;
|
bool modifier_shift_pressed_ = false;
|
||||||
bool modifier_cntrl_pressed_ = false;
|
bool modifier_cntrl_pressed_ = false;
|
||||||
bool modifier_alt_pressed_ = false;
|
bool modifier_alt_pressed_ = false;
|
||||||
|
|
|
@ -99,8 +99,8 @@ void GTKWindow::OnClose() {
|
||||||
super::OnClose();
|
super::OnClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GTKWindow::set_title(const std::string& title) {
|
bool GTKWindow::set_title(const std::string& title, bool set_base_title) {
|
||||||
if (!super::set_title(title)) {
|
if (!super::set_title(title, set_base_title)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
gtk_window_set_title(GTK_WINDOW(window_), (gchar*)title.c_str());
|
gtk_window_set_title(GTK_WINDOW(window_), (gchar*)title.c_str());
|
||||||
|
|
|
@ -38,7 +38,8 @@ class GTKWindow : public Window {
|
||||||
void EnableMainMenu() override {}
|
void EnableMainMenu() override {}
|
||||||
void DisableMainMenu() override {}
|
void DisableMainMenu() override {}
|
||||||
|
|
||||||
bool set_title(const std::string& title) override;
|
bool set_title(const std::string& title,
|
||||||
|
bool set_base_title = true) override;
|
||||||
|
|
||||||
bool SetIcon(const void* buffer, size_t size) override;
|
bool SetIcon(const void* buffer, size_t size) override;
|
||||||
|
|
||||||
|
|
|
@ -198,8 +198,8 @@ void Win32Window::DisableMainMenu() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Win32Window::set_title(const std::string& title) {
|
bool Win32Window::set_title(const std::string& title, bool set_base_title) {
|
||||||
if (!super::set_title(title)) {
|
if (!super::set_title(title, set_base_title)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
SetWindowTextW(hwnd_, reinterpret_cast<LPCWSTR>(xe::to_utf16(title).c_str()));
|
SetWindowTextW(hwnd_, reinterpret_cast<LPCWSTR>(xe::to_utf16(title).c_str()));
|
||||||
|
|
|
@ -34,7 +34,8 @@ class Win32Window : public Window {
|
||||||
void EnableMainMenu() override;
|
void EnableMainMenu() override;
|
||||||
void DisableMainMenu() override;
|
void DisableMainMenu() override;
|
||||||
|
|
||||||
bool set_title(const std::string& title) override;
|
bool set_title(const std::string& title,
|
||||||
|
bool set_base_title = true) override;
|
||||||
|
|
||||||
bool SetIcon(const void* buffer, size_t size) override;
|
bool SetIcon(const void* buffer, size_t size) override;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue