mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-09 08:21:29 +12:00
Revamp PFIFO command submission emulation (#2179)
This commit is contained in:
parent
44b8556dc6
commit
22b1400018
5 changed files with 65 additions and 19 deletions
|
@ -403,14 +403,21 @@ namespace rsx
|
|||
const u32 cmd = ReadIO32(get);
|
||||
const u32 count = (cmd >> 18) & 0x7ff;
|
||||
|
||||
if (cmd & CELL_GCM_METHOD_FLAG_JUMP)
|
||||
if ((cmd & RSX_METHOD_OLD_JUMP_CMD_MASK) == RSX_METHOD_OLD_JUMP_CMD)
|
||||
{
|
||||
u32 offs = cmd & 0x1fffffff;
|
||||
u32 offs = cmd & 0x1ffffffc;
|
||||
//LOG_WARNING(RSX, "rsx jump(0x%x) #addr=0x%x, cmd=0x%x, get=0x%x, put=0x%x", offs, m_ioAddress + get, cmd, get, put);
|
||||
ctrl->get = offs;
|
||||
continue;
|
||||
}
|
||||
if (cmd & CELL_GCM_METHOD_FLAG_CALL)
|
||||
if ((cmd & RSX_METHOD_NEW_JUMP_CMD_MASK) == RSX_METHOD_NEW_JUMP_CMD)
|
||||
{
|
||||
u32 offs = cmd & 0xfffffffc;
|
||||
//LOG_WARNING(RSX, "rsx jump(0x%x) #addr=0x%x, cmd=0x%x, get=0x%x, put=0x%x", offs, m_ioAddress + get, cmd, get, put);
|
||||
ctrl->get = offs;
|
||||
continue;
|
||||
}
|
||||
if ((cmd & RSX_METHOD_CALL_CMD_MASK) == RSX_METHOD_CALL_CMD)
|
||||
{
|
||||
m_call_stack.push(get + 4);
|
||||
u32 offs = cmd & ~3;
|
||||
|
@ -418,7 +425,7 @@ namespace rsx
|
|||
ctrl->get = offs;
|
||||
continue;
|
||||
}
|
||||
if (cmd == CELL_GCM_METHOD_FLAG_RETURN)
|
||||
if (cmd == RSX_METHOD_RETURN_CMD)
|
||||
{
|
||||
u32 get = m_call_stack.top();
|
||||
m_call_stack.pop();
|
||||
|
@ -426,7 +433,6 @@ namespace rsx
|
|||
ctrl->get = get;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cmd == 0) //nop
|
||||
{
|
||||
ctrl->get = get + 4;
|
||||
|
@ -435,7 +441,7 @@ namespace rsx
|
|||
|
||||
auto args = vm::ptr<u32>::make((u32)RSXIOMem.RealAddr(get + 4));
|
||||
|
||||
u32 first_cmd = (cmd & 0xffff) >> 2;
|
||||
u32 first_cmd = (cmd & 0xfffc) >> 2;
|
||||
|
||||
if (cmd & 0x3)
|
||||
{
|
||||
|
@ -444,7 +450,7 @@ namespace rsx
|
|||
|
||||
for (u32 i = 0; i < count; i++)
|
||||
{
|
||||
u32 reg = cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT ? first_cmd : first_cmd + i;
|
||||
u32 reg = ((cmd & RSX_METHOD_NON_INCREMENT_CMD_MASK) == RSX_METHOD_NON_INCREMENT_CMD) ? first_cmd : first_cmd + i;
|
||||
u32 value = args[i];
|
||||
|
||||
//LOG_NOTICE(RSX, "%s(0x%x) = 0x%x", get_method_name(reg).c_str(), reg, value);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue