From a90c841b39e005e50b9fccaf5bb2a6e1d0dc4738 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 17 Sep 2026 18:08:51 +0300 Subject: [PATCH] rsx: Fix flush predictor behavior when using surface cache targets for blit engine --- rpcs3/Emu/RSX/Common/texture_cache.h | 10 ++++++---- rpcs3/Emu/RSX/Common/texture_cache_helpers.h | 8 +------- rpcs3/Emu/RSX/GL/GLTextureCache.h | 4 ++-- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 4 ++-- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 49983eaa23..c8d902c8ca 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -1829,6 +1829,7 @@ namespace rsx // Fake RTT cache hit dst_subres.surface = dst_surface; + dst_subres.base_address = section_attr.address; dst_is_render_target = true; dest_texture = dst_surface->get_surface(rsx::surface_access::transfer_write); @@ -3798,16 +3799,17 @@ namespace rsx if (cached_dest) { - result.real_dst_address = cached_dest->get_section_base(); - result.real_dst_size = cached_dest->get_section_size(); + result.dst_range = utils::address_range32::start_length( + cached_dest->get_section_base(), + cached_dest->get_section_size()); } else { ensure(dst_is_render_target); dst_subres.surface->on_write_copy(rsx::get_shared_tag(), false, raster_type); - result.real_dst_address = dst_base_address; - result.real_dst_size = dst.pitch * dst_dimensions.height; + // We use the full surface range here. Blit resources are always locked after writing regardless of WCB/WDB settings. + result.dst_range = dst_subres.surface->get_memory_range(); } return result; diff --git a/rpcs3/Emu/RSX/Common/texture_cache_helpers.h b/rpcs3/Emu/RSX/Common/texture_cache_helpers.h index e6789e84a9..b381449fad 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_helpers.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_helpers.h @@ -49,16 +49,10 @@ namespace rsx struct blit_op_result { bool succeeded = false; - u32 real_dst_address = 0; - u32 real_dst_size = 0; + utils::address_range32 dst_range{}; blit_op_result(bool success) : succeeded(success) {} - - inline address_range32 to_address_range() const - { - return address_range32::start_length(real_dst_address, real_dst_size); - } }; struct blit_target_properties diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index f7f293aba5..28cd84b46c 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -945,9 +945,9 @@ namespace gl if (result.succeeded) { - if (result.real_dst_size) + if (result.dst_range.valid()) { - flush_if_cache_miss_likely(cmd, result.to_address_range()); + flush_if_cache_miss_likely(cmd, result.dst_range); } return true; diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 5329daee08..4b4d14bcdf 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1686,9 +1686,9 @@ namespace vk if (reply.succeeded) { - if (reply.real_dst_size) + if (reply.dst_range.valid()) { - flush_if_cache_miss_likely(cmd, reply.to_address_range()); + flush_if_cache_miss_likely(cmd, reply.dst_range); } return true;