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
|
// Error. Should reset the queue
|
||||||
LOG_ERROR(RSX, "FIFO error: possible desync event");
|
LOG_ERROR(RSX, "FIFO error: possible desync event");
|
||||||
fifo_ctrl->set_get(restore_point);
|
fifo_ctrl->set_get(restore_point);
|
||||||
m_return_addr = restore_ret;
|
fifo_ret_addr = saved_fifo_ret;
|
||||||
std::this_thread::sleep_for(1ms);
|
std::this_thread::sleep_for(1ms);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -434,30 +434,29 @@ namespace rsx
|
||||||
}
|
}
|
||||||
if ((cmd & RSX_METHOD_CALL_CMD_MASK) == RSX_METHOD_CALL_CMD)
|
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.
|
// Only one layer is allowed in the call stack.
|
||||||
LOG_ERROR(RSX, "FIFO: CALL found inside a subroutine. Discarding subroutine");
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const u32 offs = cmd & RSX_METHOD_CALL_OFFSET_MASK;
|
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);
|
fifo_ctrl->set_get(offs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((cmd & RSX_METHOD_RETURN_MASK) == RSX_METHOD_RETURN_CMD)
|
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");
|
LOG_ERROR(RSX, "FIFO: RET found without corresponding CALL. Discarding queue");
|
||||||
fifo_ctrl->set_get(ctrl->put);
|
fifo_ctrl->set_get(ctrl->put);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fifo_ctrl->set_get(m_return_addr);
|
fifo_ctrl->set_get(std::exchange(fifo_ret_addr, RSX_CALL_STACK_EMPTY));
|
||||||
m_return_addr = -1;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -573,7 +573,7 @@ namespace rsx
|
||||||
if (sync_point_request)
|
if (sync_point_request)
|
||||||
{
|
{
|
||||||
restore_point = ctrl->get;
|
restore_point = ctrl->get;
|
||||||
restore_ret = m_return_addr;
|
saved_fifo_ret = fifo_ret_addr;
|
||||||
sync_point_request = false;
|
sync_point_request = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -490,7 +490,8 @@ namespace rsx
|
||||||
// FIFO
|
// FIFO
|
||||||
std::unique_ptr<FIFO::FIFO_control> fifo_ctrl;
|
std::unique_ptr<FIFO::FIFO_control> fifo_ctrl;
|
||||||
FIFO::flattening_helper m_flattener;
|
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
|
// Occlusion query
|
||||||
bool zcull_surface_active = false;
|
bool zcull_surface_active = false;
|
||||||
|
|
|
@ -1040,7 +1040,7 @@ enum
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum Method
|
enum Method : u32
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
CELL_GCM_METHOD_FLAG_NON_INCREMENT = 0x40000000,
|
CELL_GCM_METHOD_FLAG_NON_INCREMENT = 0x40000000,
|
||||||
|
@ -1078,6 +1078,9 @@ enum Method
|
||||||
|
|
||||||
RSX_METHOD_NOP_CMD = 0x00000000,
|
RSX_METHOD_NOP_CMD = 0x00000000,
|
||||||
RSX_METHOD_NOP_MASK = 0xbfff0003,
|
RSX_METHOD_NOP_MASK = 0xbfff0003,
|
||||||
|
|
||||||
|
// Stack is empty (invalid value)
|
||||||
|
RSX_CALL_STACK_EMPTY = 0x00000003,
|
||||||
};
|
};
|
||||||
|
|
||||||
//Fog
|
//Fog
|
||||||
|
|
Loading…
Reference in New Issue