rsx: Avoid unsigned/signed mismatch with fifo ret addr

This commit is contained in:
Eladash 2019-09-28 10:29:16 +03:00 committed by kd-11
parent 8cfd3b56d6
commit 822287b418
4 changed files with 13 additions and 10 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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