From ff2bd9ee2fec8ebf9e54406c2f126fcce9543193 Mon Sep 17 00:00:00 2001 From: moonpower Date: Wed, 19 Nov 2025 06:01:20 +0300 Subject: [PATCH] Enhance imgui overlay rendering with additional metrics and audio device management --- frontend/imgui_layer.cpp | 10 +++++++--- frontend/imgui_layer.h | 2 +- frontend/main.c | 4 +++- frontend/screen.c | 31 +++++++++++++++++++++++-------- frontend/screen.h | 1 + 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/frontend/imgui_layer.cpp b/frontend/imgui_layer.cpp index be09b5e..b08e8ed 100644 --- a/frontend/imgui_layer.cpp +++ b/frontend/imgui_layer.cpp @@ -72,7 +72,7 @@ extern "C" PSXE_API void imgui_layer_new_frame(void) { ImGui::NewFrame(); } -extern "C" PSXE_API void imgui_layer_render_overlay(const char* os_name, float fps) { +extern "C" PSXE_API void imgui_layer_render_overlay(const char* os_name, float fps, float frame_ms, int dropped_frames, int paused, int tex_w, int tex_h, int out_w, int out_h) { if (!g_imgui_initialized) return; @@ -86,10 +86,14 @@ extern "C" PSXE_API void imgui_layer_render_overlay(const char* os_name, float f ImGuiWindowFlags_NoBackground; ImGui::SetNextWindowPos(ImVec2(10.0f, 10.0f), ImGuiCond_Always); - ImGui::SetNextWindowSize(ImVec2(240.0f, 60.0f), ImGuiCond_Always); + ImGui::SetNextWindowSize(ImVec2(240.0f, 115.0f), ImGuiCond_Always); ImGui::Begin("Overlay", nullptr, flags); ImGui::Text("FPS: %.1f", fps); + ImGui::Text("Frame: %.2f ms", frame_ms); + ImGui::Text("Dropped: %d", dropped_frames); + ImGui::Text("Paused: %s", paused ? "yes" : "no"); + ImGui::Text("Tex: %dx%d Out: %dx%d", tex_w, tex_h, out_w, out_h); ImGui::Text("OS : %s", os_name ? os_name : "unknown"); ImGui::End(); } @@ -836,7 +840,7 @@ extern "C" PSXE_API void imgui_ingame_menu_render(int paused, const char* curren ImGui::EndMenuBar(); } - ImGui::TextWrapped("CDROM: %s", current_cd && current_cd[0] ? current_cd : "(none)"); + //ImGui::TextWrapped("CDROM: %s", current_cd && current_cd[0] ? current_cd : "(none)"); } ImGui::End(); diff --git a/frontend/imgui_layer.h b/frontend/imgui_layer.h index 94666dd..9f58174 100644 --- a/frontend/imgui_layer.h +++ b/frontend/imgui_layer.h @@ -11,7 +11,7 @@ PSXE_API void imgui_layer_init(SDL_Window* window, SDL_Renderer* renderer); PSXE_API void imgui_layer_shutdown(void); PSXE_API void imgui_layer_handle_event(const SDL_Event* event); PSXE_API void imgui_layer_new_frame(void); -PSXE_API void imgui_layer_render_overlay(const char* os_name, float fps); +PSXE_API void imgui_layer_render_overlay(const char* os_name, float fps, float frame_ms, int dropped_frames, int paused, int tex_w, int tex_h, int out_w, int out_h); PSXE_API void imgui_layer_flush(void); #if defined(IMGUI_FRONTEND) && !defined(__DLL_BUILD) && !defined(IOS_TARGET) && !defined(__ANDROID__) diff --git a/frontend/main.c b/frontend/main.c index 9e799c7..54d397a 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -114,8 +114,10 @@ int psxe_run_configured(psxe_config_t* cfg, void* external_window, void* externa dev = SDL_OpenAudioDevice(NULL, 0, &desired, &obtained, 0); - if (dev) + if (dev) { SDL_PauseAudioDevice(dev, 0); + screen->audio_dev = dev; + } psx_gpu_t* gpu = psx_get_gpu(psx); psx_gpu_set_event_callback(gpu, GPU_EVENT_DMODE, psxe_gpu_dmode_event_cb); diff --git a/frontend/screen.c b/frontend/screen.c index dcdb5de..0a5896f 100644 --- a/frontend/screen.c +++ b/frontend/screen.c @@ -114,6 +114,7 @@ void psxe_screen_init(psxe_screen_t* screen, psx_t* psx, const psxe_config_t* cf screen->paused = 0; screen->menu_visible = 1; memset(screen->current_cd, 0, sizeof(screen->current_cd)); + screen->audio_dev = 0; if (cfg && cfg->cd_path) strncpy(screen->current_cd, cfg->cd_path, sizeof(screen->current_cd) - 1); @@ -296,9 +297,10 @@ void psxe_screen_toggle_debug_mode(psxe_screen_t* screen) { // int frame = 0; -void psxe_screen_update(psxe_screen_t* screen) { - void* display_buf = screen->debug_mode ? - psx_get_vram(screen->psx) : psx_get_display_buffer(screen->psx); +void psxe_screen_update(psxe_screen_t* screen) { + void* display_buf = screen->debug_mode ? + psx_get_vram(screen->psx) : psx_get_display_buffer(screen->psx); + int out_width = 0, out_height = 0; // printf("res=(%u,%u) off=(%u,%u) disp=(%u,%u-%u,%u) draw=(%u,%u-%u,%u) vres=%u\n", // screen->texture_width, @@ -352,6 +354,8 @@ void psxe_screen_update(psxe_screen_t* screen) { memset(&actions, 0, sizeof(actions)); #endif + SDL_GetRendererOutputSize(screen->renderer, &out_width, &out_height); + if (screen->debug_panel #if defined(IMGUI_FRONTEND) && !defined(__DLL_BUILD) && !defined(IOS_TARGET) && !defined(__ANDROID__) || screen->menu_visible @@ -361,16 +365,22 @@ void psxe_screen_update(psxe_screen_t* screen) { if (screen->debug_panel) { static uint64_t last_tick = 0; static float fps = 0.0f; + static float frame_ms = 0.0f; + static int dropped_frames = 0; uint64_t now = SDL_GetTicks(); if (last_tick) { uint64_t delta = now - last_tick; - if (delta) + if (delta) { fps = 1000.0f / (float)delta; + frame_ms = (float)delta; + if (delta > 25) + dropped_frames++; + } } last_tick = now; - imgui_layer_render_overlay(STR(OS_INFO), fps); + imgui_layer_render_overlay(STR(OS_INFO), fps, frame_ms, dropped_frames, screen->paused, screen->texture_width, screen->texture_height, out_width, out_height); } #if defined(IMGUI_FRONTEND) && !defined(__DLL_BUILD) && !defined(IOS_TARGET) && !defined(__ANDROID__) @@ -387,6 +397,9 @@ void psxe_screen_update(psxe_screen_t* screen) { #if defined(IMGUI_FRONTEND) && !defined(__DLL_BUILD) && !defined(IOS_TARGET) && !defined(__ANDROID__) if (actions.toggle_pause) screen->paused = !screen->paused; + if (screen->audio_dev) { + SDL_PauseAudioDevice(screen->audio_dev, screen->paused ? 1 : 0); + } if (actions.reset) psx_soft_reset(screen->psx); @@ -397,9 +410,11 @@ void psxe_screen_update(psxe_screen_t* screen) { if (actions.swap_cd && actions.new_cd_path[0]) { strncpy(screen->current_cd, actions.new_cd_path, sizeof(screen->current_cd) - 1); screen->current_cd[sizeof(screen->current_cd) - 1] = '\0'; - if (psx_swap_disc(screen->psx, screen->current_cd) == 0) { - psx_soft_reset(screen->psx); - screen->paused = 0; + psx_swap_disc(screen->psx, screen->current_cd); + psx_soft_reset(screen->psx); + screen->paused = 0; + if (screen->audio_dev) { + SDL_PauseAudioDevice(screen->audio_dev, 0); } } #endif diff --git a/frontend/screen.h b/frontend/screen.h index 4d680c2..f90fe01 100644 --- a/frontend/screen.h +++ b/frontend/screen.h @@ -43,6 +43,7 @@ typedef struct { int paused; int menu_visible; char current_cd[512]; + SDL_AudioDeviceID audio_dev; SDL_GameController* controller; } psxe_screen_t;