From 6918e265ec10a7ee74d32d72e3ec5bd94d4b74dc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 24 Oct 2017 15:58:53 +0300 Subject: [PATCH] rsx/vk: Be a little more frugal with texture memory to avoid running out of VRAM on 1GB cards --- rpcs3/Emu/RSX/Common/texture_cache.h | 4 ++-- rpcs3/Emu/RSX/VK/VKTextureCache.h | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 68b0de10bc..90a7d25e64 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -165,7 +165,7 @@ namespace rsx bool blit_engine_incompatibility_warning_raised = false; //Memory usage - const s32 m_max_zombie_objects = 128; //Limit on how many texture objects to keep around for reuse after they are invalidated + const s32 m_max_zombie_objects = 64; //Limit on how many texture objects to keep around for reuse after they are invalidated std::atomic m_unreleased_texture_objects = { 0 }; //Number of invalidated objects not yet freed from memory std::atomic m_texture_memory_in_use = { 0 }; @@ -1239,7 +1239,7 @@ namespace rsx return m_unreleased_texture_objects; } - const u32 get_texture_memory_in_use() const + virtual const u32 get_texture_memory_in_use() const { return m_texture_memory_in_use; } diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.h b/rpcs3/Emu/RSX/VK/VKTextureCache.h index 1cbc9a4773..6ed7ee8039 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.h +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.h @@ -286,6 +286,9 @@ namespace vk std::unique_ptr view; std::unique_ptr img; + //Memory held by this temp storage object + u32 block_size = 0; + const u64 frame_tag = vk::get_current_frame_id(); discarded_storage(std::unique_ptr& _view) @@ -308,6 +311,7 @@ namespace vk { view = std::move(tex.get_view()); img = std::move(tex.get_texture()); + block_size = tex.get_section_size(); } const bool test(u64 ref_frame) const @@ -329,6 +333,7 @@ namespace vk //Stuff that has been dereferenced goes into these std::list m_discardable_storage; + std::atomic m_discarded_memory_size = { 0 }; void purge_cache() { @@ -354,12 +359,14 @@ namespace vk m_discardable_storage.clear(); m_unreleased_texture_objects = 0; m_texture_memory_in_use = 0; + m_discarded_memory_size = 0; } protected: void free_texture_section(cached_texture_section& tex) override { + m_discarded_memory_size += tex.get_section_size(); m_discardable_storage.push_back(tex); tex.destroy(); } @@ -667,13 +674,22 @@ namespace vk void on_frame_end() override { - if (m_unreleased_texture_objects >= m_max_zombie_objects) + if (m_unreleased_texture_objects >= m_max_zombie_objects || + m_discarded_memory_size > 0x4000000) //If already holding over 64M in discardable memory, be frugal with memory resources { purge_dirty(); } const u64 last_complete_frame = vk::get_last_completed_frame_id(); - m_discardable_storage.remove_if([&](const discarded_storage& o) {return o.test(last_complete_frame);}); + m_discardable_storage.remove_if([&](const discarded_storage& o) + { + if (o.test(last_complete_frame)) + { + m_discarded_memory_size -= o.block_size; + return true; + } + return false; + }); } template @@ -727,5 +743,10 @@ namespace vk { return m_unreleased_texture_objects + (u32)m_discardable_storage.size(); } + + const u32 get_texture_memory_in_use() const override + { + return m_texture_memory_in_use + m_discarded_memory_size; + } }; }