rsx: Write ref+get atomically

May contribute to better FIFO synchronization in some cases.
This commit is contained in:
Eladash 2020-04-11 14:56:15 +03:00 committed by kd-11
parent ff74c241c7
commit e407018bb5
3 changed files with 5 additions and 1 deletions

View File

@ -260,6 +260,7 @@ error_code sys_rsx_context_allocate(vm::ptr<u32> context_id, vm::ptr<u64> 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));

View File

@ -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<u32> external_interrupt_lock{ 0 };

View File

@ -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<atomic_be_t<u64>>(rsx->dma_address + ::offset32(&RsxDmaControl::get)).store(u64{rsx->fifo_ctrl->get_pos()} << 32 | arg);
}
void semaphore_acquire(thread* rsx, u32 /*_reg*/, u32 arg)