diff --git a/rpcs3/Emu/RSX/RSXFIFO.cpp b/rpcs3/Emu/RSX/RSXFIFO.cpp index 3729586868..667bf9bed4 100644 --- a/rpcs3/Emu/RSX/RSXFIFO.cpp +++ b/rpcs3/Emu/RSX/RSXFIFO.cpp @@ -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; } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index c61b4a0bc2..cd75b092f9 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -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; } diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index d6f397d9ad..75136652f7 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -490,7 +490,8 @@ namespace rsx // FIFO std::unique_ptr 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; diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 0c5d24def5..be539d4d43 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -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