diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.h b/rpcs3/Emu/RSX/GL/GLRenderTargets.h index 790045f2a5..dbb59c2852 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.h +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.h @@ -196,7 +196,7 @@ struct gl_render_target_traits static void clone_surface( - gl::command_context&, + gl::command_context& cmd, std::unique_ptr& sink, gl::render_target* ref, u32 address, barrier_descriptor_t& prev) { @@ -227,6 +227,20 @@ struct gl_render_target_traits prev.target = sink.get(); sink->sync_tag(); + + if (!sink->old_contents.empty()) + { + // Deal with this, likely only needs to clear + if (sink->surface_width > prev.width || sink->surface_height > prev.height) + { + sink->write_barrier(cmd); + } + else + { + sink->clear_rw_barrier(); + } + } + sink->set_old_contents_region(prev, false); sink->last_use_tag = ref->last_use_tag; } diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 208d80cc27..96398ee0c3 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -590,6 +590,20 @@ namespace rsx sink->rsx_pitch = ref->get_rsx_pitch(); sink->sync_tag(); + + if (!sink->old_contents.empty()) + { + // Deal with this, likely only needs to clear + if (sink->surface_width > prev.width || sink->surface_height > prev.height) + { + sink->write_barrier(cmd); + } + else + { + sink->clear_rw_barrier(); + } + } + sink->set_old_contents_region(prev, false); sink->last_use_tag = ref->last_use_tag; }