diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index 707524af8d..1e85acafcf 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -260,6 +260,7 @@ error_code sys_rsx_context_allocate(vm::ptr context_id, vm::ptr lpar_d render->current_display_buffer = 0; render->label_addr = vm::cast(*lpar_reports, HERE); render->device_addr = rsx_cfg->device_addr; + render->dma_address = rsx_cfg->dma_address; render->local_mem_size = rsx_cfg->memory_size; render->init(vm::cast(*lpar_dma_control, HERE)); diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 595601b66a..c6ee64a2f0 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -618,6 +618,7 @@ namespace rsx public: RsxDmaControl* ctrl = nullptr; + u32 dma_address{0}; rsx_iomap_table iomap_table; u32 restore_point = 0; atomic_t external_interrupt_lock{ 0 }; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 8bfdbe2d23..31ac692104 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -45,7 +45,9 @@ namespace rsx void set_reference(thread* rsx, u32 _reg, u32 arg) { rsx->sync(); - rsx->ctrl->ref.exchange(arg); + + // Write ref+get atomically (get will be written again with the same value at command end) + vm::_ref>(rsx->dma_address + ::offset32(&RsxDmaControl::get)).store(u64{rsx->fifo_ctrl->get_pos()} << 32 | arg); } void semaphore_acquire(thread* rsx, u32 /*_reg*/, u32 arg)