diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 9221dea7ea..7717015c48 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -3237,7 +3237,7 @@ namespace rsx return m_predictor; } - bool is_protected(u32 section_base_address) + bool is_protected(u32 section_base_address, const address_range& test_range, rsx::texture_upload_context context) { reader_lock lock(m_cache_mutex); @@ -3246,7 +3246,9 @@ namespace rsx { if (tex.get_section_base() == section_base_address) { - return tex.is_locked(); + return tex.get_context() == context && + tex.is_locked() && + test_range.inside(tex.get_section_range()); } } diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index dd388ce8c1..76b5697485 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -321,7 +321,11 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool /* bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer : !!g_cfg.video.write_color_buffers; - if (lock && !m_gl_texture_cache.is_protected(base_addr)) + if (lock && + !m_gl_texture_cache.is_protected( + base_addr, + surface->get_memory_range(), + rsx::texture_upload_context::framebuffer_storage)) { lock = false; } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 3e99a840e6..f6db56b45e 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2426,7 +2426,11 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context) bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer : !!g_cfg.video.write_color_buffers; - if (lock && !m_texture_cache.is_protected(base_addr)) + if (lock && + !m_texture_cache.is_protected( + base_addr, + surface->get_memory_range(), + rsx::texture_upload_context::framebuffer_storage)) { lock = false; }