mirror of
https://github.com/RPCS3/rpcs3
synced 2024-10-14 04:02:23 +00:00
RSX/SPU: Import and improve RSX accurate reservations functionality
This commit is contained in:
parent
b3c9f7647f
commit
d3ab62c4b1
|
@ -19,6 +19,7 @@
|
||||||
#include "Emu/Cell/lv2/sys_event.h"
|
#include "Emu/Cell/lv2/sys_event.h"
|
||||||
#include "Emu/Cell/lv2/sys_time.h"
|
#include "Emu/Cell/lv2/sys_time.h"
|
||||||
#include "Emu/Cell/Modules/cellGcmSys.h"
|
#include "Emu/Cell/Modules/cellGcmSys.h"
|
||||||
|
#include "Emu/Memory/vm_reservation.h"
|
||||||
#include "util/serialization_ext.hpp"
|
#include "util/serialization_ext.hpp"
|
||||||
#include "Overlays/overlay_perf_metrics.h"
|
#include "Overlays/overlay_perf_metrics.h"
|
||||||
#include "Overlays/overlay_debug_overlay.h"
|
#include "Overlays/overlay_debug_overlay.h"
|
||||||
|
@ -3103,8 +3104,19 @@ namespace rsx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rsx::reservation_lock<true> lock(sink, 16);
|
CellGcmReportData report_data{ timestamp(), value, 0};
|
||||||
vm::_ref<atomic_t<CellGcmReportData>>(sink).store({ timestamp(), value, 0});
|
|
||||||
|
if (sink < label_addr || sink >= label_addr + sizeof(RsxReports::report))
|
||||||
|
{
|
||||||
|
vm::light_op<false>(vm::_ref<atomic_t<CellGcmReportData>>(sink), [&](atomic_t<CellGcmReportData>& data)
|
||||||
|
{
|
||||||
|
data.release(report_data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vm::_ref<atomic_t<CellGcmReportData>>(sink).store(report_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 thread::copy_zcull_stats(u32 memory_range_start, u32 memory_range, u32 destination)
|
u32 thread::copy_zcull_stats(u32 memory_range_start, u32 memory_range, u32 destination)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Core/RSXEngLock.hpp"
|
#include "Core/RSXEngLock.hpp"
|
||||||
#include "Core/RSXReservationLock.hpp"
|
#include "Core/RSXReservationLock.hpp"
|
||||||
|
#include "Emu/Memory/vm_reservation.h"
|
||||||
#include "RSXThread.h"
|
#include "RSXThread.h"
|
||||||
|
|
||||||
namespace rsx
|
namespace rsx
|
||||||
|
@ -346,14 +347,26 @@ namespace rsx
|
||||||
case CELL_GCM_ZCULL_STATS1:
|
case CELL_GCM_ZCULL_STATS1:
|
||||||
case CELL_GCM_ZCULL_STATS:
|
case CELL_GCM_ZCULL_STATS:
|
||||||
default:
|
default:
|
||||||
//Not implemented
|
// Not implemented
|
||||||
value = (write_enabled && stats_enabled) ? -1 : 0;
|
value = (write_enabled && stats_enabled) ? -1 : 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rsx::reservation_lock<true> lock(sink, 16);
|
const u32 label_addr = rsx::get_current_renderer()->label_addr;
|
||||||
auto report = vm::get_super_ptr<atomic_t<CellGcmReportData>>(sink);
|
|
||||||
report->store({ timestamp, value, 0 });
|
CellGcmReportData report_data{ timestamp, value, 0 };
|
||||||
|
|
||||||
|
if (sink < label_addr || sink >= label_addr + sizeof(RsxReports::report))
|
||||||
|
{
|
||||||
|
vm::light_op<false>(*vm::get_super_ptr<atomic_t<CellGcmReportData>>(sink), [&](atomic_t<CellGcmReportData>& data)
|
||||||
|
{
|
||||||
|
data.release(report_data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vm::get_super_ptr<atomic_t<CellGcmReportData>>(sink)->store(report_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZCULL_control::write(queued_report_write* writer, u64 timestamp, u32 value)
|
void ZCULL_control::write(queued_report_write* writer, u64 timestamp, u32 value)
|
||||||
|
|
Loading…
Reference in a new issue