From cc713a0091500f68bde84607c9bb86b9cede79b7 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 10 Mar 2016 20:58:17 +0300 Subject: [PATCH] vk: Release dirty resources to prevent mem leak --- rpcs3/Emu/RSX/VK/VKTextureCache.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.h b/rpcs3/Emu/RSX/VK/VKTextureCache.h index a474f3d1cb..470dfe950d 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.h +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.h @@ -30,6 +30,7 @@ namespace vk { private: std::vector m_cache; + u32 num_dirty_textures = 0; bool lock_memory_region(u32 start, u32 size) { @@ -126,6 +127,20 @@ namespace vk unlock_memory_region(obj.protected_rgn_start, obj.native_rsx_size); } + void purge_dirty_textures() + { + for (cached_texture_object &tex : m_cache) + { + if (tex.dirty && tex.exists) + { + tex.uploaded_texture.destroy(); + tex.exists = false; + } + } + + num_dirty_textures = 0; + } + public: texture_cache() {} @@ -147,6 +162,15 @@ namespace vk vk::texture& upload_texture(command_buffer cmd, rsx::texture &tex, rsx::vk_render_targets &m_rtts) { + if (num_dirty_textures > 32) + { + /** + * Should actually reuse available dirty textures whenever possible. + * For now, just remove them, from vram + */ + purge_dirty_textures(); + } + const u32 texaddr = rsx::get_address(tex.offset(), tex.location()); const u32 range = (u32)get_texture_size(tex); @@ -202,6 +226,7 @@ namespace vk { unlock_object(tex); + num_dirty_textures++; tex.native_rsx_address = 0; tex.dirty = true; @@ -233,6 +258,7 @@ namespace vk cto.dirty = true; cto.native_rsx_address = 0; + num_dirty_textures++; m_cache.push_back(cto); } }