diff --git a/rpcs3/Emu/RSX/Core/RSXDisplay.h b/rpcs3/Emu/RSX/Core/RSXDisplay.h index 9f0c35a059..5628ce77a2 100644 --- a/rpcs3/Emu/RSX/Core/RSXDisplay.h +++ b/rpcs3/Emu/RSX/Core/RSXDisplay.h @@ -16,6 +16,9 @@ namespace rsx s64 textures_upload_time; s64 draw_exec_time; s64 flip_time; + + u32 vertex_cache_request_count; + u32 vertex_cache_miss_count; }; struct frame_time_t diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index e9544a054e..82cfb6cf4c 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -364,10 +364,17 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) const auto num_texture_upload = m_gl_texture_cache.get_texture_upload_calls_this_frame(); const auto num_texture_upload_miss = m_gl_texture_cache.get_texture_upload_misses_this_frame(); const auto texture_upload_miss_ratio = m_gl_texture_cache.get_texture_upload_miss_percentage(); + println(fmt::format("Unreleased textures: %7d", num_dirty_textures)); println(fmt::format("Texture memory: %12dM", texture_memory_size)); println(fmt::format("Flush requests: %12d = %2d (%3d%%) hard faults, %2d unavoidable, %2d misprediction(s), %2d speculation(s)", num_flushes, num_misses, cache_miss_ratio, num_unavoidable, num_mispredict, num_speculate)); println(fmt::format("Texture uploads: %15u (%u from CPU - %02u%%)", num_texture_upload, num_texture_upload_miss, texture_upload_miss_ratio)); + + const auto vertex_cache_hit_count = (info.stats.vertex_cache_request_count - info.stats.vertex_cache_miss_count); + const auto vertex_cache_hit_ratio = info.stats.vertex_cache_request_count + ? (vertex_cache_hit_count * 100) / info.stats.vertex_cache_request_count + : 0; + println(fmt::format("Vertex cache hits: %12u/%u (%u%%)", vertex_cache_hit_count, info.stats.vertex_cache_request_count, vertex_cache_hit_ratio)); } if (gl::debug::g_vis_texture) diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index 202499cc6d..09d422dd20 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -801,11 +801,18 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) const auto num_texture_upload = m_texture_cache.get_texture_upload_calls_this_frame(); const auto num_texture_upload_miss = m_texture_cache.get_texture_upload_misses_this_frame(); const auto texture_upload_miss_ratio = m_texture_cache.get_texture_upload_miss_percentage(); + println(fmt::format("Unreleased textures: %8d", num_dirty_textures)); println(fmt::format("Texture cache memory: %7dM", texture_memory_size)); println(fmt::format("Temporary texture memory: %3dM", tmp_texture_memory_size)); println(fmt::format("Flush requests: %13d = %2d (%3d%%) hard faults, %2d unavoidable, %2d misprediction(s), %2d speculation(s)", num_flushes, num_misses, cache_miss_ratio, num_unavoidable, num_mispredict, num_speculate)); println(fmt::format("Texture uploads: %14u (%u from CPU - %02u%%)", num_texture_upload, num_texture_upload_miss, texture_upload_miss_ratio)); + + const auto vertex_cache_hit_count = (info.stats.vertex_cache_request_count - info.stats.vertex_cache_miss_count); + const auto vertex_cache_hit_ratio = info.stats.vertex_cache_request_count + ? (vertex_cache_hit_count * 100) / info.stats.vertex_cache_request_count + : 0; + println(fmt::format("Vertex cache hits: %12u/%u (%u%%)", vertex_cache_hit_count, info.stats.vertex_cache_request_count, vertex_cache_hit_ratio)); } direct_fbo->release(); diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 09efe5c260..59f4a47ae5 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -243,6 +243,8 @@ vk::vertex_upload_info VKGSRender::upload_vertex_data() bool to_store = false; u32 storage_address = -1; + m_frame_stats.vertex_cache_request_count++; + if (m_vertex_layout.interleaved_blocks.size() == 1 && rsx::method_registers.current_draw_clause.command != rsx::draw_command::inlined_array) { @@ -264,6 +266,8 @@ vk::vertex_upload_info VKGSRender::upload_vertex_data() if (!in_cache) { + m_frame_stats.vertex_cache_miss_count++; + persistent_offset = static_cast(m_attrib_ring_info.alloc<256>(required.first)); persistent_range_base = static_cast(persistent_offset);