Use g_fxo for SysRsxConfig

Rename to lv2_rsx_config
This commit is contained in:
Nekotekina 2019-08-25 01:09:54 +03:00
parent cf44038435
commit 38a06c4b14
3 changed files with 30 additions and 28 deletions

View file

@ -79,16 +79,16 @@ error_code sys_rsx_context_allocate(vm::ptr<u32> context_id, vm::ptr<u64> lpar_d
sys_rsx.warning("sys_rsx_context_allocate(context_id=*0x%x, lpar_dma_control=*0x%x, lpar_driver_info=*0x%x, lpar_reports=*0x%x, mem_ctx=0x%llx, system_mode=0x%llx)", sys_rsx.warning("sys_rsx_context_allocate(context_id=*0x%x, lpar_dma_control=*0x%x, lpar_driver_info=*0x%x, lpar_reports=*0x%x, mem_ctx=0x%llx, system_mode=0x%llx)",
context_id, lpar_dma_control, lpar_driver_info, lpar_reports, mem_ctx, system_mode); context_id, lpar_dma_control, lpar_driver_info, lpar_reports, mem_ctx, system_mode);
auto m_sysrsx = fxm::get<SysRsxConfig>(); auto rsx_cfg = g_fxo->get<lv2_rsx_config>();
if (!m_sysrsx) // TODO: check if called twice if (!rsx_cfg->state)
return CELL_EINVAL; return CELL_EINVAL;
*context_id = 0x55555555; *context_id = 0x55555555;
*lpar_dma_control = m_sysrsx->rsx_context_addr + 0x100000; *lpar_dma_control = rsx_cfg->rsx_context_addr + 0x100000;
*lpar_driver_info = m_sysrsx->rsx_context_addr + 0x200000; *lpar_driver_info = rsx_cfg->rsx_context_addr + 0x200000;
*lpar_reports = m_sysrsx->rsx_context_addr + 0x300000; *lpar_reports = rsx_cfg->rsx_context_addr + 0x300000;
auto &reports = vm::_ref<RsxReports>(*lpar_reports); auto &reports = vm::_ref<RsxReports>(*lpar_reports);
std::memset(&reports, 0, sizeof(RsxReports)); std::memset(&reports, 0, sizeof(RsxReports));
@ -120,7 +120,7 @@ error_code sys_rsx_context_allocate(vm::ptr<u32> context_id, vm::ptr<u64> lpar_d
driverInfo.systemModeFlags = system_mode; driverInfo.systemModeFlags = system_mode;
driverInfo.hardware_channel = 1; // * i think* this 1 for games, 0 for vsh driverInfo.hardware_channel = 1; // * i think* this 1 for games, 0 for vsh
m_sysrsx->driverInfo = *lpar_driver_info; rsx_cfg->driverInfo = *lpar_driver_info;
auto &dmaControl = vm::_ref<RsxDmaControl>(*lpar_dma_control); auto &dmaControl = vm::_ref<RsxDmaControl>(*lpar_dma_control);
dmaControl.get = 0; dmaControl.get = 0;
@ -140,15 +140,15 @@ error_code sys_rsx_context_allocate(vm::ptr<u32> context_id, vm::ptr<u64> lpar_d
attr->name_u64 = 0; attr->name_u64 = 0;
sys_event_port_create(vm::get_addr(&driverInfo.handler_queue), SYS_EVENT_PORT_LOCAL, 0); sys_event_port_create(vm::get_addr(&driverInfo.handler_queue), SYS_EVENT_PORT_LOCAL, 0);
m_sysrsx->rsx_event_port = driverInfo.handler_queue; rsx_cfg->rsx_event_port = driverInfo.handler_queue;
sys_event_queue_create(vm::get_addr(&driverInfo.handler_queue), attr, 0, 0x20); sys_event_queue_create(vm::get_addr(&driverInfo.handler_queue), attr, 0, 0x20);
sys_event_port_connect_local(m_sysrsx->rsx_event_port, driverInfo.handler_queue); sys_event_port_connect_local(rsx_cfg->rsx_event_port, driverInfo.handler_queue);
const auto render = rsx::get_current_renderer(); const auto render = rsx::get_current_renderer();
render->display_buffers_count = 0; render->display_buffers_count = 0;
render->current_display_buffer = 0; render->current_display_buffer = 0;
render->label_addr = *lpar_reports; render->label_addr = *lpar_reports;
render->ctxt_addr = m_sysrsx->rsx_context_addr; render->ctxt_addr = rsx_cfg->rsx_context_addr;
render->init(*lpar_dma_control); render->init(*lpar_dma_control);
return CELL_OK; return CELL_OK;
@ -258,14 +258,14 @@ error_code sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64
const auto render = rsx::get_current_renderer(); const auto render = rsx::get_current_renderer();
auto m_sysrsx = fxm::get<SysRsxConfig>(); auto rsx_cfg = g_fxo->get<lv2_rsx_config>();
if (!m_sysrsx) if (!rsx_cfg->state)
{ {
return CELL_EINVAL; return CELL_EINVAL;
} }
auto &driverInfo = vm::_ref<RsxDriverInfo>(m_sysrsx->driverInfo); auto &driverInfo = vm::_ref<RsxDriverInfo>(rsx_cfg->driverInfo);
switch (package_id) switch (package_id)
{ {
case 0x001: // FIFO case 0x001: // FIFO
@ -330,9 +330,9 @@ error_code sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64
driverInfo.head[a3].lastQueuedBufferId = a4; driverInfo.head[a3].lastQueuedBufferId = a4;
driverInfo.head[a3].flipFlags |= 0x40000000 | (1 << a4); driverInfo.head[a3].flipFlags |= 0x40000000 | (1 << a4);
if (a3 == 0) if (a3 == 0)
sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 5), 0); sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 5), 0);
if (a3 == 1) if (a3 == 1)
sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 6), 0); sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 6), 0);
break; break;
case 0x104: // Display buffer case 0x104: // Display buffer
@ -456,9 +456,9 @@ error_code sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64
vm::_ref<u32>(render->label_addr + 0x10) = 0; vm::_ref<u32>(render->label_addr + 0x10) = 0;
//if (a3 == 0) //if (a3 == 0)
// sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 3), 0); // sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 3), 0);
//if (a3 == 1) //if (a3 == 1)
sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 4), 0); sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 4), 0);
break; break;
case 0xFED: // hack: vblank command case 0xFED: // hack: vblank command
@ -466,10 +466,10 @@ error_code sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64
vm::_ref<u32>(render->ctxt_addr + 0x30) = 1; vm::_ref<u32>(render->ctxt_addr + 0x30) = 1;
driverInfo.head[a3].vBlankCount++; driverInfo.head[a3].vBlankCount++;
driverInfo.head[a3].lastSecondVTime = rsxTimeStamp(); driverInfo.head[a3].lastSecondVTime = rsxTimeStamp();
sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 1), 0); sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 1), 0);
if (render->enable_second_vhandler) if (render->enable_second_vhandler)
sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 11), 0); // second vhandler sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 11), 0); // second vhandler
break; break;
@ -478,7 +478,7 @@ error_code sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64
// as i think we need custom lv1 interrupts to handle this accurately // as i think we need custom lv1 interrupts to handle this accurately
// this also should probly be set by rsxthread // this also should probly be set by rsxthread
driverInfo.userCmdParam = a4; driverInfo.userCmdParam = a4;
sys_event_port_send(m_sysrsx->rsx_event_port, 0, (1 << 7), 0); sys_event_port_send(rsx_cfg->rsx_event_port, 0, (1 << 7), 0);
break; break;
default: default:
@ -506,9 +506,10 @@ error_code sys_rsx_device_map(vm::ptr<u64> dev_addr, vm::ptr<u64> a2, u32 dev_id
// a2 seems to not be referenced in cellGcmSys, tests show this arg is ignored // a2 seems to not be referenced in cellGcmSys, tests show this arg is ignored
//*a2 = 0; //*a2 = 0;
auto m_sysrsx = fxm::make<SysRsxConfig>(); auto rsx_cfg = g_fxo->get<lv2_rsx_config>();
if (!m_sysrsx) // TODO
if (!rsx_cfg->state.compare_and_swap_test(0, 1))
{ {
return CELL_EINVAL; // sys_rsx_device_map called twice return CELL_EINVAL; // sys_rsx_device_map called twice
} }
@ -516,7 +517,7 @@ error_code sys_rsx_device_map(vm::ptr<u64> dev_addr, vm::ptr<u64> a2, u32 dev_id
if (const auto area = vm::find_map(0x10000000, 0x10000000, 0x403)) if (const auto area = vm::find_map(0x10000000, 0x10000000, 0x403))
{ {
vm::falloc(area->addr, 0x400000); vm::falloc(area->addr, 0x400000);
m_sysrsx->rsx_context_addr = *dev_addr = area->addr; rsx_cfg->rsx_context_addr = *dev_addr = area->addr;
return CELL_OK; return CELL_OK;
} }

View file

@ -103,11 +103,12 @@ struct RsxDisplayInfo
be_t<u32> height; be_t<u32> height;
}; };
struct SysRsxConfig struct lv2_rsx_config
{ {
u32 rsx_event_port{ 0 }; atomic_t<u32> state = 0;
u32 driverInfo{ 0 }; u32 rsx_event_port = 0;
u32 rsx_context_addr{ 0 }; u32 driverInfo = 0;
u32 rsx_context_addr = 0;
}; };
// SysCalls // SysCalls

View file

@ -2394,9 +2394,9 @@ namespace rsx
// TODO: Check order when sending multiple events // TODO: Check order when sending multiple events
if (u64 to_unmap = unmap_status[i]) if (u64 to_unmap = unmap_status[i])
{ {
// Each 64 entries are grouped by a bit // Each 64 entries are grouped by a bit
const u64 io_event = 0x100000000ull << i; const u64 io_event = 0x100000000ull << i;
sys_event_port_send(fxm::get<SysRsxConfig>()->rsx_event_port, 0, io_event, to_unmap); sys_event_port_send(g_fxo->get<lv2_rsx_config>()->rsx_event_port, 0, io_event, to_unmap);
} }
} }
} }