From d3686dbb752293d947f8053c737e216545329100 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 14 Dec 2020 21:29:07 +0300 Subject: [PATCH] rsx: Add some texture upload statistics to the texture cache --- rpcs3/Emu/RSX/Common/texture_cache.h | 23 +++++++++++++++++++++++ rpcs3/Emu/RSX/GL/GLPresent.cpp | 4 ++++ rpcs3/Emu/RSX/VK/VKPresent.cpp | 4 ++++ 3 files changed, 31 insertions(+) diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 7adf15315c..9863a5dbfb 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -332,6 +332,8 @@ namespace rsx atomic_t m_misses_this_frame = { 0 }; atomic_t m_speculations_this_frame = { 0 }; atomic_t m_unavoidable_hard_faults_this_frame = { 0 }; + atomic_t m_texture_upload_calls_this_frame = { 0 }; + atomic_t m_texture_upload_misses_this_frame = { 0 }; static const u32 m_predict_max_flushes_per_frame = 50; // Above this number the predictions are disabled // Invalidation @@ -1810,6 +1812,8 @@ namespace rsx template sampled_image_descriptor upload_texture(commandbuffer_type& cmd, RsxTextureType& tex, surface_store_type& m_rtts, Args&&... extras) { + m_texture_upload_calls_this_frame++; + image_section_attributes_t attributes{}; texture_cache_search_options options{}; attributes.address = rsx::get_address(tex.offset(), tex.location()); @@ -2004,6 +2008,8 @@ namespace rsx } // Do direct upload from CPU as the last resort + m_texture_upload_misses_this_frame++; + const auto subresources_layout = get_subresources_layout(tex); const auto format_class = classify_format(attributes.gcm_format); @@ -2961,6 +2967,8 @@ namespace rsx m_misses_this_frame.store(0u); m_speculations_this_frame.store(0u); m_unavoidable_hard_faults_this_frame.store(0u); + m_texture_upload_calls_this_frame.store(0u); + m_texture_upload_misses_this_frame.store(0u); } void on_flush() @@ -3028,5 +3036,20 @@ namespace rsx const auto num_flushes = m_flushes_this_frame.load(); return (num_flushes == 0u) ? 0.f : static_cast(m_misses_this_frame.load()) / num_flushes; } + + u32 get_texture_upload_calls_this_frame() + { + return m_texture_upload_calls_this_frame; + } + + u32 get_texture_upload_misses_this_frame() + { + return m_texture_upload_misses_this_frame; + } + + u32 get_texture_upload_miss_percentage() + { + return (m_texture_upload_calls_this_frame)? (m_texture_upload_misses_this_frame * 100 / m_texture_upload_calls_this_frame) : 0; + } }; } diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index e2c7f4036c..c7579ef0ef 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -319,9 +319,13 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) const auto num_misses = m_gl_texture_cache.get_num_cache_misses(); const auto num_unavoidable = m_gl_texture_cache.get_num_unavoidable_hard_faults(); const auto cache_miss_ratio = static_cast(ceil(m_gl_texture_cache.get_cache_miss_ratio() * 100)); + 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(); m_text_printer.print_text(0, 126, m_frame->client_width(), m_frame->client_height(), fmt::format("Unreleased textures: %7d", num_dirty_textures)); m_text_printer.print_text(0, 144, m_frame->client_width(), m_frame->client_height(), fmt::format("Texture memory: %12dM", texture_memory_size)); m_text_printer.print_text(0, 162, m_frame->client_width(), m_frame->client_height(), 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)); + m_text_printer.print_text(0, 180, m_frame->client_width(), m_frame->client_height(), fmt::format("Texture uploads: %15u (%u from CPU - %02u%%)", num_texture_upload, num_texture_upload_miss, texture_upload_miss_ratio)); } m_frame->flip(m_context); diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index c9bc1d64d7..a05890622e 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -754,10 +754,14 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) const auto num_misses = m_texture_cache.get_num_cache_misses(); const auto num_unavoidable = m_texture_cache.get_num_unavoidable_hard_faults(); const auto cache_miss_ratio = static_cast(ceil(m_texture_cache.get_cache_miss_ratio() * 100)); + 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(); m_text_writer->print_text(*m_current_command_buffer, *direct_fbo, 0, 144, direct_fbo->width(), direct_fbo->height(), fmt::format("Unreleased textures: %8d", num_dirty_textures)); m_text_writer->print_text(*m_current_command_buffer, *direct_fbo, 0, 162, direct_fbo->width(), direct_fbo->height(), fmt::format("Texture cache memory: %7dM", texture_memory_size)); m_text_writer->print_text(*m_current_command_buffer, *direct_fbo, 0, 180, direct_fbo->width(), direct_fbo->height(), fmt::format("Temporary texture memory: %3dM", tmp_texture_memory_size)); m_text_writer->print_text(*m_current_command_buffer, *direct_fbo, 0, 198, direct_fbo->width(), direct_fbo->height(), 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)); + m_text_writer->print_text(*m_current_command_buffer, *direct_fbo, 0, 216, direct_fbo->width(), direct_fbo->height(), fmt::format("Texture uploads: %14u (%u from CPU - %02u%%)", num_texture_upload, num_texture_upload_miss, texture_upload_miss_ratio)); } direct_fbo->release();