From 70b4ae6bd61709443177475acf1c14c6ede2cff9 Mon Sep 17 00:00:00 2001 From: Eladash Date: Sun, 29 Sep 2019 20:23:52 +0300 Subject: [PATCH] rsx: Optimize FIFO PUT masking --- rpcs3/Emu/RSX/RSXFIFO.cpp | 14 +++++++++++--- rpcs3/Emu/RSX/RSXFIFO.h | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXFIFO.cpp b/rpcs3/Emu/RSX/RSXFIFO.cpp index 97bb6ab3a2..7f8d80bbb9 100644 --- a/rpcs3/Emu/RSX/RSXFIFO.cpp +++ b/rpcs3/Emu/RSX/RSXFIFO.cpp @@ -17,7 +17,7 @@ namespace rsx { m_internal_get += 4; - if (wait && read_put() == m_internal_get) + if (wait && read_put() == m_internal_get) { // NOTE: Only supposed to be invoked to wait for a single arg on command[0] (4 bytes) // Wait for put to allow us to procceed execution @@ -30,9 +30,17 @@ namespace rsx } } + template u32 FIFO_control::read_put() { - return m_ctrl->put.and_fetch(~3); + if constexpr (!full) + { + return m_ctrl->put & ~3; + } + else + { + return m_ctrl->put.and_fetch(~3); + } } void FIFO_control::set_put(u32 put) @@ -65,7 +73,7 @@ namespace rsx { // Fast read with no processing, only safe inside a PACKET_BEGIN+count block if (m_remaining_commands && - m_internal_get != read_put()) + m_internal_get != read_put()) { m_command_reg += m_command_inc; m_args_ptr += 4; diff --git a/rpcs3/Emu/RSX/RSXFIFO.h b/rpcs3/Emu/RSX/RSXFIFO.h index 405bd87cb2..3308eb2a66 100644 --- a/rpcs3/Emu/RSX/RSXFIFO.h +++ b/rpcs3/Emu/RSX/RSXFIFO.h @@ -131,7 +131,7 @@ namespace rsx void inc_get(bool wait); void set_get(u32 get); void set_put(u32 put); - u32 read_put(); + template u32 read_put(); void read(register_pair& data); inline bool read_unsafe(register_pair& data);