From eca86ad449723c5eb78517aa23c4bbb2961d7137 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 8 Mar 2025 19:35:47 +0300 Subject: [PATCH] rsx: Add program cache lookup ellision rate to overlay --- rpcs3/Emu/Cell/Modules/cellPad.cpp | 2 +- rpcs3/Emu/RSX/Core/RSXDisplay.h | 3 +++ rpcs3/Emu/RSX/GL/GLGSRender.cpp | 13 +++++++++++++ rpcs3/Emu/RSX/GL/GLPresent.cpp | 13 ++++++++++--- .../HomeMenu/overlay_home_menu_settings.cpp | 2 +- rpcs3/Emu/RSX/Overlays/overlay_debug_overlay.cpp | 4 ++-- rpcs3/Emu/RSX/RSXThread.cpp | 2 +- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 13 +++++++++++++ rpcs3/Emu/RSX/VK/VKPresent.cpp | 15 +++++++++++---- rpcs3/Emu/system_config.h | 2 +- 10 files changed, 56 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index 39ee7d0359..f28d96d1ce 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -717,7 +717,7 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) pad_get_data(port_no, data.get_ptr()); - if (g_cfg.io.debug_overlay && !g_cfg.video.overlay && port_no == 0) + if (g_cfg.io.debug_overlay && !g_cfg.video.debug_overlay && port_no == 0) { show_debug_overlay(*data, *pad, config); } diff --git a/rpcs3/Emu/RSX/Core/RSXDisplay.h b/rpcs3/Emu/RSX/Core/RSXDisplay.h index 4d4c90cd0d..77407f2f19 100644 --- a/rpcs3/Emu/RSX/Core/RSXDisplay.h +++ b/rpcs3/Emu/RSX/Core/RSXDisplay.h @@ -59,6 +59,9 @@ namespace rsx u32 vertex_cache_request_count; u32 vertex_cache_miss_count; + u32 program_cache_lookups_total; + u32 program_cache_lookups_ellided; + framebuffer_statistics_t framebuffer_stats; }; diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 79c93b2cd4..8cefa0c794 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -780,6 +780,19 @@ bool GLGSRender::load_program() if (shadermode != shader_mode::interpreter_only) [[likely]] { + if (g_cfg.video.debug_overlay) + { + m_frame_stats.program_cache_lookups_total += 2; + if (m_program_cache_hint.has_fragment_program()) + { + m_frame_stats.program_cache_lookups_ellided++; + } + if (m_program_cache_hint.has_vertex_program()) + { + m_frame_stats.program_cache_lookups_ellided++; + } + } + void* pipeline_properties = nullptr; std::tie(m_program, m_vertex_prog, m_fragment_prog) = m_prog_buffer.get_graphics_pipeline( &m_program_cache_hint, diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index 1eaa3a6193..c73415edb2 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -382,7 +382,7 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) } } - if (g_cfg.video.overlay) + if (g_cfg.video.debug_overlay) { const auto num_dirty_textures = m_gl_texture_cache.get_unreleased_textures_count(); const auto texture_memory_size = m_gl_texture_cache.get_texture_memory_in_use() / (1024 * 1024); @@ -400,6 +400,11 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) const auto vertex_cache_hit_ratio = info.stats.vertex_cache_request_count ? (vertex_cache_hit_count * 100) / info.stats.vertex_cache_request_count : 0; + const auto program_cache_lookups = info.stats.program_cache_lookups_total; + const auto program_cache_ellided = info.stats.program_cache_lookups_ellided; + const auto program_cache_ellision_rate = program_cache_lookups + ? (program_cache_ellided * 100) / program_cache_lookups + : 0; rsx::overlays::set_debug_overlay_text(fmt::format( "Internal Resolution: %s\n" @@ -413,13 +418,15 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) "Texture memory: %12dM\n" "Flush requests: %12d = %2d (%3d%%) hard faults, %2d unavoidable, %2d misprediction(s), %2d speculation(s)\n" "Texture uploads: %11u (%u from CPU - %02u%%, %u copies avoided)\n" - "Vertex cache hits: %9u/%u (%u%%)", + "Vertex cache hits: %9u/%u (%u%%)\n" + "Program cache lookup ellision: %u/%u (%u%%)", info.stats.framebuffer_stats.to_string(!backend_config.supports_hw_msaa), get_load(), info.stats.draw_calls, info.stats.setup_time, info.stats.vertex_upload_time, info.stats.textures_upload_time, info.stats.draw_exec_time, num_dirty_textures, texture_memory_size, num_flushes, num_misses, cache_miss_ratio, num_unavoidable, num_mispredict, num_speculate, num_texture_upload, num_texture_upload_miss, texture_upload_miss_ratio, texture_copies_ellided, - vertex_cache_hit_count, info.stats.vertex_cache_request_count, vertex_cache_hit_ratio) + vertex_cache_hit_count, info.stats.vertex_cache_request_count, vertex_cache_hit_ratio, + program_cache_ellided, program_cache_lookups, program_cache_ellision_rate) ); } diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index daaf5cc8ee..119f411a24 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -132,7 +132,7 @@ namespace rsx home_menu_settings_debug::home_menu_settings_debug(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent) : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_DEBUG)) { - add_checkbox(&g_cfg.video.overlay, localized_string_id::HOME_MENU_SETTINGS_DEBUG_OVERLAY); + add_checkbox(&g_cfg.video.debug_overlay, localized_string_id::HOME_MENU_SETTINGS_DEBUG_OVERLAY); add_checkbox(&g_cfg.io.debug_overlay, localized_string_id::HOME_MENU_SETTINGS_DEBUG_INPUT_OVERLAY); add_checkbox(&g_cfg.video.disable_video_output, localized_string_id::HOME_MENU_SETTINGS_DEBUG_DISABLE_VIDEO_OUTPUT); add_float_slider(&g_cfg.video.texture_lod_bias, localized_string_id::HOME_MENU_SETTINGS_DEBUG_TEXTURE_LOD_BIAS, "", 0.25f); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_debug_overlay.cpp b/rpcs3/Emu/RSX/Overlays/overlay_debug_overlay.cpp index 2f6aca17a2..d616737b16 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_debug_overlay.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_debug_overlay.cpp @@ -50,7 +50,7 @@ namespace rsx { auto overlay = manager->get(); - if (g_cfg.video.overlay || g_cfg.io.debug_overlay) + if (g_cfg.video.debug_overlay || g_cfg.io.debug_overlay) { if (!overlay) { @@ -66,7 +66,7 @@ namespace rsx extern void set_debug_overlay_text(std::string&& text) { - if (!g_cfg.misc.use_native_interface || (!g_cfg.video.overlay && !g_cfg.io.debug_overlay)) + if (!g_cfg.misc.use_native_interface || (!g_cfg.video.debug_overlay && !g_cfg.io.debug_overlay)) return; if (auto manager = g_fxo->try_get()) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 860136e187..f33c778e62 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -3151,7 +3151,7 @@ namespace rsx // Reset current stats m_frame_stats = {}; - m_profiler.enabled = !!g_cfg.video.overlay; + m_profiler.enabled = !!g_cfg.video.debug_overlay; } f64 thread::get_cached_display_refresh_rate() diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index c81df01ff3..8e834d3081 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1959,6 +1959,19 @@ bool VKGSRender::load_program() { vk::enter_uninterruptible(); + if (g_cfg.video.debug_overlay) + { + m_frame_stats.program_cache_lookups_total += 2; + if (m_program_cache_hint.has_fragment_program()) + { + m_frame_stats.program_cache_lookups_ellided++; + } + if (m_program_cache_hint.has_vertex_program()) + { + m_frame_stats.program_cache_lookups_ellided++; + } + } + // Load current program from cache std::tie(m_program, m_vertex_prog, m_fragment_prog) = m_prog_buffer->get_graphics_pipeline( &m_program_cache_hint, diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index e8f182c897..b6d0496fd9 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -766,7 +766,7 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) } const bool has_overlay = (m_overlay_manager && m_overlay_manager->has_visible()); - if (g_cfg.video.overlay || has_overlay) + if (g_cfg.video.debug_overlay || has_overlay) { if (target_layout != VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { @@ -809,7 +809,7 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) } } - if (g_cfg.video.overlay) + if (g_cfg.video.debug_overlay) { const auto num_dirty_textures = m_texture_cache.get_unreleased_textures_count(); const auto texture_memory_size = m_texture_cache.get_texture_memory_in_use() / (1024 * 1024); @@ -828,6 +828,11 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) const auto vertex_cache_hit_ratio = info.stats.vertex_cache_request_count ? (vertex_cache_hit_count * 100) / info.stats.vertex_cache_request_count : 0; + const auto program_cache_lookups = info.stats.program_cache_lookups_total; + const auto program_cache_ellided = info.stats.program_cache_lookups_ellided; + const auto program_cache_ellision_rate = program_cache_lookups + ? (program_cache_ellided * 100) / program_cache_lookups + : 0; rsx::overlays::set_debug_overlay_text(fmt::format( "Internal Resolution: %s\n" @@ -844,14 +849,16 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) "Temporary texture memory: %3dM\n" "Flush requests: %13d = %2d (%3d%%) hard faults, %2d unavoidable, %2d misprediction(s), %2d speculation(s)\n" "Texture uploads: %12u (%u from CPU - %02u%%, %u copies avoided)\n" - "Vertex cache hits: %10u/%u (%u%%)", + "Vertex cache hits: %10u/%u (%u%%)\n" + "Program cache lookup ellision: %u/%u (%u%%)", info.stats.framebuffer_stats.to_string(!backend_config.supports_hw_msaa), get_load(), info.stats.draw_calls, info.stats.submit_count, info.stats.setup_time, info.stats.vertex_upload_time, info.stats.textures_upload_time, info.stats.draw_exec_time, info.stats.flip_time, num_dirty_textures, texture_memory_size, tmp_texture_memory_size, num_flushes, num_misses, cache_miss_ratio, num_unavoidable, num_mispredict, num_speculate, num_texture_upload, num_texture_upload_miss, texture_upload_miss_ratio, texture_copies_ellided, - vertex_cache_hit_count, info.stats.vertex_cache_request_count, vertex_cache_hit_ratio) + vertex_cache_hit_count, info.stats.vertex_cache_request_count, vertex_cache_hit_ratio, + program_cache_ellided, program_cache_lookups, program_cache_ellision_rate) ); } diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 6256639add..a476e03584 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -141,7 +141,7 @@ struct cfg_root : cfg::node cfg::_bool log_programs{ this, "Log shader programs" }; cfg::_bool vsync{ this, "VSync" }; cfg::_bool debug_output{ this, "Debug output" }; - cfg::_bool overlay{ this, "Debug overlay", false, true }; + cfg::_bool debug_overlay{ this, "Debug overlay", false, true }; cfg::_bool renderdoc_compatiblity{ this, "Renderdoc Compatibility Mode" }; cfg::_bool use_gpu_texture_scaling{ this, "Use GPU texture scaling", false }; cfg::_bool stretch_to_display_area{ this, "Stretch To Display Area", false, true };