mirror of https://github.com/RPCS3/rpcs3.git
rsx: Avoid unsigned/signed mismatch with fifo ret addr
This commit is contained in:
parent
8cfd3b56d6
commit
822287b418
|
@ -387,7 +387,7 @@ namespace rsx
|
|||
// Error. Should reset the queue
|
||||
LOG_ERROR(RSX, "FIFO error: possible desync event");
|
||||
fifo_ctrl->set_get(restore_point);
|
||||
m_return_addr = restore_ret;
|
||||
fifo_ret_addr = saved_fifo_ret;
|
||||
std::this_thread::sleep_for(1ms);
|
||||
return;
|
||||
}
|
||||
|
@ -434,30 +434,29 @@ namespace rsx
|
|||
}
|
||||
if ((cmd & RSX_METHOD_CALL_CMD_MASK) == RSX_METHOD_CALL_CMD)
|
||||
{
|
||||
if (m_return_addr != -1)
|
||||
if (fifo_ret_addr != RSX_CALL_STACK_EMPTY)
|
||||
{
|
||||
// Only one layer is allowed in the call stack.
|
||||
LOG_ERROR(RSX, "FIFO: CALL found inside a subroutine. Discarding subroutine");
|
||||
fifo_ctrl->set_get(std::exchange(m_return_addr, -1));
|
||||
fifo_ctrl->set_get(std::exchange(fifo_ret_addr, RSX_CALL_STACK_EMPTY));
|
||||
return;
|
||||
}
|
||||
|
||||
const u32 offs = cmd & RSX_METHOD_CALL_OFFSET_MASK;
|
||||
m_return_addr = fifo_ctrl->get_pos() + 4;
|
||||
fifo_ret_addr = fifo_ctrl->get_pos() + 4;
|
||||
fifo_ctrl->set_get(offs);
|
||||
return;
|
||||
}
|
||||
if ((cmd & RSX_METHOD_RETURN_MASK) == RSX_METHOD_RETURN_CMD)
|
||||
{
|
||||
if (m_return_addr == -1)
|
||||
if (fifo_ret_addr == RSX_CALL_STACK_EMPTY)
|
||||
{
|
||||
LOG_ERROR(RSX, "FIFO: RET found without corresponding CALL. Discarding queue");
|
||||
fifo_ctrl->set_get(ctrl->put);
|
||||
return;
|
||||
}
|
||||
|
||||
fifo_ctrl->set_get(m_return_addr);
|
||||
m_return_addr = -1;
|
||||
fifo_ctrl->set_get(std::exchange(fifo_ret_addr, RSX_CALL_STACK_EMPTY));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -573,7 +573,7 @@ namespace rsx
|
|||
if (sync_point_request)
|
||||
{
|
||||
restore_point = ctrl->get;
|
||||
restore_ret = m_return_addr;
|
||||
saved_fifo_ret = fifo_ret_addr;
|
||||
sync_point_request = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -490,7 +490,8 @@ namespace rsx
|
|||
// FIFO
|
||||
std::unique_ptr<FIFO::FIFO_control> fifo_ctrl;
|
||||
FIFO::flattening_helper m_flattener;
|
||||
s32 m_return_addr{ -1 }, restore_ret{ -1 };
|
||||
u32 fifo_ret_addr = RSX_CALL_STACK_EMPTY;
|
||||
u32 saved_fifo_ret = RSX_CALL_STACK_EMPTY;
|
||||
|
||||
// Occlusion query
|
||||
bool zcull_surface_active = false;
|
||||
|
|
|
@ -1040,7 +1040,7 @@ enum
|
|||
};
|
||||
|
||||
|
||||
enum Method
|
||||
enum Method : u32
|
||||
{
|
||||
/*
|
||||
CELL_GCM_METHOD_FLAG_NON_INCREMENT = 0x40000000,
|
||||
|
@ -1078,6 +1078,9 @@ enum Method
|
|||
|
||||
RSX_METHOD_NOP_CMD = 0x00000000,
|
||||
RSX_METHOD_NOP_MASK = 0xbfff0003,
|
||||
|
||||
// Stack is empty (invalid value)
|
||||
RSX_CALL_STACK_EMPTY = 0x00000003,
|
||||
};
|
||||
|
||||
//Fog
|
||||
|
|
Loading…
Reference in New Issue