Enhance imgui overlay rendering with additional metrics and audio device management

This commit is contained in:
moonpower
2025-11-19 06:01:20 +03:00
parent 09e1b3e820
commit ff2bd9ee2f
5 changed files with 35 additions and 13 deletions
+7 -3
View File
@@ -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();
+1 -1
View File
@@ -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__)
+3 -1
View File
@@ -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);
+23 -8
View File
@@ -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
+1
View File
@@ -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;