diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 4f83c623df..9221dea7ea 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -3237,6 +3237,22 @@ namespace rsx return m_predictor; } + bool is_protected(u32 section_base_address) + { + reader_lock lock(m_cache_mutex); + + const auto& block = m_storage.block_for(section_base_address); + for (const auto& tex : block) + { + if (tex.get_section_base() == section_base_address) + { + return tex.is_locked(); + } + } + + return false; + } + /** * The read only texture invalidate flag is set if a read only texture is trampled by framebuffer memory diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index 14133a542d..dd388ce8c1 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -318,9 +318,14 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool /* for (auto& [base_addr, surface] : m_rtts.orphaned_surfaces) { - const bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer : + 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)) + { + lock = false; + } + if (!lock) [[likely]] { m_gl_texture_cache.commit_framebuffer_memory_region(cmd, surface->get_memory_range()); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 1994c672db..3e99a840e6 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2423,9 +2423,14 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context) for (auto& [base_addr, surface] : m_rtts.orphaned_surfaces) { - const bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer : + 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)) + { + lock = false; + } + if (!lock) [[likely]] { m_texture_cache.commit_framebuffer_memory_region(*m_current_command_buffer, surface->get_memory_range());