Hotkey for onscreen FPS (#770)

* fps counter

* more
This commit is contained in:
Logan McNaughton
2026-04-18 21:55:37 +02:00
committed by GitHub
parent 5a91d09f9e
commit bc3dd4d39a
7 changed files with 87 additions and 15 deletions
+42
View File
@@ -75,6 +75,11 @@ typedef struct {
FrameBufferInfo frame_buffer_info;
} RDP_DEVICE;
typedef struct {
uint32_t fps;
uint32_t vis;
} FPS_DATA;
typedef struct {
std::string message;
Vulkan::ImageHandle image;
@@ -106,6 +111,9 @@ static Vulkan::ImageHandle achievement_progress_indicator_image;
static std::map<uint32_t, std::string> leaderboard_trackers;
static bool display_challenge_indicator;
static bool display_fps;
static Vulkan::ImageHandle fps_image;
#define MESSAGE_TIME 3000 // 3 seconds
typedef struct {
@@ -147,6 +155,9 @@ bool sdl_event_filter(void *userdata, SDL_Event *event) {
if (gfx_info.fullscreen)
callback.emu_running = false;
break;
case SDL_SCANCODE_F1:
display_fps = !display_fps;
break;
case SDL_SCANCODE_F4:
crop_letterbox = !crop_letterbox;
break;
@@ -331,12 +342,15 @@ void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font,
leaderboard_trackers.clear();
achievement_challenge_indicator_image = Vulkan::ImageHandle();
achievement_progress_indicator_image = Vulkan::ImageHandle();
fps_image = Vulkan::ImageHandle();
display_fps = false;
}
void rdp_close() {
messages = std::queue<Message>();
achievement_challenge_indicator_image = Vulkan::ImageHandle();
achievement_progress_indicator_image = Vulkan::ImageHandle();
fps_image = Vulkan::ImageHandle();
if (wsi)
wsi->end_frame();
@@ -421,6 +435,18 @@ static void draw_indicator(CommandBufferHandle cmd,
cmd->draw(3);
}
static void draw_fps(CommandBufferHandle cmd, Vulkan::ImageHandle fps_image,
VkViewport &vp) {
cmd->set_texture(0, 0, fps_image->get_view(),
Vulkan::StockSampler::NearestClamp);
vp.y = vp.y + vp.height - fps_image->get_height();
vp.height = fps_image->get_height();
vp.width = fps_image->get_width();
cmd->set_viewport(vp);
cmd->draw(3);
}
static void render_frame(Vulkan::Device &device) {
RDP::ScanoutOptions options = {};
options.persist_frame_on_invalid_input = true;
@@ -517,6 +543,10 @@ static void render_frame(Vulkan::Device &device) {
display_challenge_indicator) {
draw_indicator(cmd, achievement_challenge_indicator_image, vp);
}
if (messages.empty() && display_fps && fps_image) {
draw_fps(cmd, fps_image, vp);
}
}
cmd->end_render_pass();
@@ -822,6 +852,18 @@ uint64_t rdp_process_commands() {
return interrupt_timer;
}
void rdp_set_fps_callback(void *userdata) {
FPS_DATA *data = (FPS_DATA *)userdata;
fps_image = create_message_image(
wsi->get_device(), 0, message_font,
std::format("FPS: {} VI/S: {}", data->fps, data->vis).c_str());
}
void rdp_set_fps(uint32_t fps, uint32_t vis) {
FPS_DATA data = {fps, vis};
SDL_RunOnMainThread(rdp_set_fps_callback, &data, true);
}
static void update_challenge_indicator() {
std::string message;
for (const auto &leaderboard_tracker : leaderboard_trackers) {