From d3ab62c4b144b5b2ced7b6720fcef19bb7b9fa30 Mon Sep 17 00:00:00 2001 From: Elad Ashkenazi <18193363+elad335@users.noreply.github.com> Date: Thu, 23 May 2024 11:12:38 +0300 Subject: [PATCH] RSX/SPU: Import and improve RSX accurate reservations functionality --- rpcs3/Emu/RSX/RSXThread.cpp | 16 ++++++++++++++-- rpcs3/Emu/RSX/RSXZCULL.cpp | 21 +++++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 9fcd793266..08a9b38af6 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -19,6 +19,7 @@ #include "Emu/Cell/lv2/sys_event.h" #include "Emu/Cell/lv2/sys_time.h" #include "Emu/Cell/Modules/cellGcmSys.h" +#include "Emu/Memory/vm_reservation.h" #include "util/serialization_ext.hpp" #include "Overlays/overlay_perf_metrics.h" #include "Overlays/overlay_debug_overlay.h" @@ -3103,8 +3104,19 @@ namespace rsx } } - rsx::reservation_lock lock(sink, 16); - vm::_ref>(sink).store({ timestamp(), value, 0}); + CellGcmReportData report_data{ timestamp(), value, 0}; + + if (sink < label_addr || sink >= label_addr + sizeof(RsxReports::report)) + { + vm::light_op(vm::_ref>(sink), [&](atomic_t& data) + { + data.release(report_data); + }); + } + else + { + vm::_ref>(sink).store(report_data); + } } u32 thread::copy_zcull_stats(u32 memory_range_start, u32 memory_range, u32 destination) diff --git a/rpcs3/Emu/RSX/RSXZCULL.cpp b/rpcs3/Emu/RSX/RSXZCULL.cpp index cdc1d14b0a..c2dc58a5a7 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.cpp +++ b/rpcs3/Emu/RSX/RSXZCULL.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Core/RSXEngLock.hpp" #include "Core/RSXReservationLock.hpp" +#include "Emu/Memory/vm_reservation.h" #include "RSXThread.h" namespace rsx @@ -346,14 +347,26 @@ namespace rsx case CELL_GCM_ZCULL_STATS1: case CELL_GCM_ZCULL_STATS: default: - //Not implemented + // Not implemented value = (write_enabled && stats_enabled) ? -1 : 0; break; } - rsx::reservation_lock lock(sink, 16); - auto report = vm::get_super_ptr>(sink); - report->store({ timestamp, value, 0 }); + const u32 label_addr = rsx::get_current_renderer()->label_addr; + + CellGcmReportData report_data{ timestamp, value, 0 }; + + if (sink < label_addr || sink >= label_addr + sizeof(RsxReports::report)) + { + vm::light_op(*vm::get_super_ptr>(sink), [&](atomic_t& data) + { + data.release(report_data); + }); + } + else + { + vm::get_super_ptr>(sink)->store(report_data); + } } void ZCULL_control::write(queued_report_write* writer, u64 timestamp, u32 value)