From 7c5bde4aebf0251a5566d3fd133687dc9ae0f7e7 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 21 Aug 2019 20:39:49 +0300 Subject: [PATCH] rsx: Update tag timestamp to match newest inherited data - Avoids memory appearing older when used for depth test without depth write The write_barrier before the call will inherit new data but the tag will not update as no new information is added. --- rpcs3/Emu/RSX/GL/GLRenderTargets.cpp | 5 ++++- rpcs3/Emu/RSX/VK/VKRenderTargets.h | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index d2a089b63a..c174e6bc86 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -586,6 +586,7 @@ void gl::render_target::memory_barrier(gl::command_context& cmd, bool force_init const bool dst_is_depth = !!(aspect() & gl::image_aspect::depth); const auto dst_bpp = get_bpp(); unsigned first = prepare_rw_barrier_for_transfer(this); + u64 newest_tag = 0; for (auto i = first; i < old_contents.size(); ++i) { @@ -632,9 +633,11 @@ void gl::render_target::memory_barrier(gl::command_context& cmd, bool force_init section.src_rect(), section.dst_rect(), !dst_is_depth, dst_is_depth, typeless_info); + + newest_tag = src_texture->last_use_tag; } // Memory has been transferred, discard old contents and update memory flags // TODO: Preserve memory outside surface clip region - on_write(); + on_write(newest_tag); } diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index dd8564b76b..e343345890 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -425,6 +425,7 @@ namespace vk unsigned first = prepare_rw_barrier_for_transfer(this); bool optimize_copy = true; bool any_valid_writes = false; + u64 newest_tag = 0; for (auto i = first; i < old_contents.size(); ++i) { @@ -504,6 +505,7 @@ namespace vk /*linear?*/false, /*depth?(unused)*/false, typeless_info); optimize_copy = optimize_copy && !memory_load; + newest_tag = src_texture->last_use_tag; } if (UNLIKELY(!any_valid_writes)) @@ -524,7 +526,7 @@ namespace vk } // NOTE: Optimize flag relates to stencil resolve/unresolve for NVIDIA. - on_write_copy(0, optimize_copy); + on_write_copy(newest_tag, optimize_copy); if (!read_access && samples() > 1) {