diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.h b/rpcs3/Emu/Cell/lv2/sys_rsx.h index df8cee938f..ba437936c2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.h +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.h @@ -68,20 +68,20 @@ struct RsxDmaControl be_t unk1; }; -struct RsxSemaphore +struct alignas(16) RsxSemaphore { be_t val; be_t pad; be_t timestamp; }; -struct RsxNotify +struct alignas(16) RsxNotify { be_t timestamp; be_t zero; }; -struct RsxReport +struct alignas(16) RsxReport { be_t timestamp; be_t val; diff --git a/rpcs3/Emu/RSX/GCM.h b/rpcs3/Emu/RSX/GCM.h index 68e85791d7..3e0c4340df 100644 --- a/rpcs3/Emu/RSX/GCM.h +++ b/rpcs3/Emu/RSX/GCM.h @@ -65,7 +65,7 @@ struct CellGcmSurface be_t y; }; -struct CellGcmReportData +struct alignas(16) CellGcmReportData { be_t timer; be_t value; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 17e033af73..90b5c6f76b 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2340,10 +2340,7 @@ namespace rsx } } - vm::ptr result = sink; - result->value = value; - result->padding = 0; - result->timer = timestamp(); + vm::_ref>(sink).store({ timestamp(), value, 0}); } void thread::sync() @@ -2819,7 +2816,7 @@ namespace rsx m_cycles_delay = max_zcull_delay_us; } - void ZCULL_control::write(vm::addr_t sink, u32 timestamp, u32 type, u32 value) + void ZCULL_control::write(vm::addr_t sink, u64 timestamp, u32 type, u32 value) { verify(HERE), sink; @@ -2840,10 +2837,7 @@ namespace rsx break; } - vm::ptr out = sink; - out->value = value; - out->timer = timestamp; - out->padding = 0; + vm::_ref>(sink).store({ timestamp, value, 0}); } void ZCULL_control::sync(::rsx::thread* ptimer) @@ -2888,7 +2882,7 @@ namespace rsx if (!writer.forwarder) //No other queries in the chain, write result - write(writer.sink, (u32)ptimer->timestamp(), writer.type, result); + write(writer.sink, ptimer->timestamp(), writer.type, result); processed++; } @@ -3049,7 +3043,7 @@ namespace rsx //only zpass supported right now if (!writer.forwarder) //No other queries in the chain, write result - write(writer.sink, (u32)ptimer->timestamp(), writer.type, result); + write(writer.sink, ptimer->timestamp(), writer.type, result); processed++; } diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 565aad16dc..aaa27e233c 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -371,7 +371,7 @@ namespace rsx void set_enabled(class ::rsx::thread* ptimer, bool state); void set_active(class ::rsx::thread* ptimer, bool state); - void write(vm::addr_t sink, u32 timestamp, u32 type, u32 value); + void write(vm::addr_t sink, u64 timestamp, u32 type, u32 value); // Read current zcull statistics into the address provided void read_report(class ::rsx::thread* ptimer, vm::addr_t sink, u32 type); diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 97fb6fd1ef..39aa5d359a 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -180,9 +180,11 @@ namespace rsx return; } - auto& notify = vm::_ref(verify(HERE, RSXIOMem.RealAddr(0xf100000 + (index * 0x40)))); - notify.zero = 0; - notify.timestamp = rsx->timestamp(); + vm::_ref>(verify(HERE, RSXIOMem.RealAddr(0xf100000 + (index * 0x40)))).store( + { + rsx->timestamp(), + 0 + }); } void texture_read_semaphore_release(thread* rsx, u32 _reg, u32 arg) @@ -196,10 +198,12 @@ namespace rsx // } - auto& sema = vm::_ref(get_address(offset, method_registers.semaphore_context_dma_4097())); - sema.val = arg; - sema.pad = 0; - sema.timestamp = rsx->timestamp(); + vm::_ref>(get_address(offset, method_registers.semaphore_context_dma_4097())).store( + { + arg, + 0, + rsx->timestamp() + }); } void back_end_write_semaphore_release(thread* rsx, u32 _reg, u32 arg) @@ -213,10 +217,12 @@ namespace rsx rsx->sync(); u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff); - auto& sema = vm::_ref(get_address(offset, method_registers.semaphore_context_dma_4097())); - sema.val = val; - sema.pad = 0; - sema.timestamp = rsx->timestamp(); + vm::_ref>(get_address(offset, method_registers.semaphore_context_dma_4097())).store( + { + val, + 0, + rsx->timestamp() + }); } /** @@ -509,8 +515,6 @@ namespace rsx return; } - vm::ptr result = address_ptr; - switch (type) { case CELL_GCM_ZPASS_PIXEL_CNT: @@ -522,8 +526,12 @@ namespace rsx break; default: LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type); - result->timer = rsx->timestamp(); - result->padding = 0; + + vm::_ref>(address_ptr).atomic_op([&](CellGcmReportData& data) + { + data.timer = rsx->timestamp(); + data.padding = 0; + }); break; } }