From 40a598b0ab6f7389470ce7ddd92f2e733cc37dce Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 9 Jun 2016 15:57:05 +0300 Subject: [PATCH] gl/vk: Quickly ignore access violations outside cache range --- rpcs3/Emu/RSX/GL/gl_texture_cache.h | 12 ++++++++++++ rpcs3/Emu/RSX/VK/VKTextureCache.h | 12 +++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/gl_texture_cache.h b/rpcs3/Emu/RSX/GL/gl_texture_cache.h index d87a07e304..ceedf7f19b 100644 --- a/rpcs3/Emu/RSX/GL/gl_texture_cache.h +++ b/rpcs3/Emu/RSX/GL/gl_texture_cache.h @@ -62,6 +62,8 @@ namespace gl std::vector texture_cache; std::vector rtt_cache; u32 frame_ctr; + std::pair texture_cache_range = std::make_pair(0xFFFFFFFF, 0); + u32 max_tex_address = 0; bool lock_memory_region(u32 start, u32 size) { @@ -69,6 +71,12 @@ namespace gl start = start & ~(memory_page_size - 1); size = (u32)align(size, memory_page_size); + if (start < texture_cache_range.first) + texture_cache_range = std::make_pair(start, texture_cache_range.second); + + if ((start+size) > texture_cache_range.second) + texture_cache_range = std::make_pair(texture_cache_range.first, (start+size)); + return vm::page_protect(start, size, 0, 0, vm::page_writable); } @@ -500,6 +508,10 @@ namespace gl bool mark_as_dirty(u32 address) { + if (address < texture_cache_range.first || + address > texture_cache_range.second) + return false; + bool response = false; for (gl_cached_texture &tex: texture_cache) diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.h b/rpcs3/Emu/RSX/VK/VKTextureCache.h index e9f16b0fc4..29d447b172 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.h +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.h @@ -30,7 +30,7 @@ namespace vk { private: std::vector m_cache; - + std::pair texture_cache_range = std::make_pair(0xFFFFFFFF, 0); std::vector > m_temporary_image_view; bool lock_memory_region(u32 start, u32 size) @@ -120,6 +120,12 @@ namespace vk obj.protected_rgn_end += obj.protected_rgn_start; lock_memory_region(static_cast(obj.protected_rgn_start), static_cast(obj.native_rsx_size)); + + if (obj.protected_rgn_start < texture_cache_range.first) + texture_cache_range = std::make_pair(obj.protected_rgn_start, texture_cache_range.second); + + if (obj.protected_rgn_end > texture_cache_range.second) + texture_cache_range = std::make_pair(texture_cache_range.first, obj.protected_rgn_end); } void unlock_object(cached_texture_object &obj) @@ -254,6 +260,10 @@ namespace vk bool invalidate_address(u32 rsx_address) { + if (rsx_address < texture_cache_range.first || + rsx_address > texture_cache_range.second) + return false; + for (cached_texture_object &tex : m_cache) { if (tex.dirty) continue;