rsx: Mask FIFO PUT on rsx execution
This commit is contained in:
@@ -17,26 +17,26 @@ namespace rsx
|
|||||||
{
|
{
|
||||||
m_internal_get += 4;
|
m_internal_get += 4;
|
||||||
|
|
||||||
if (wait && m_ctrl->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)
|
// 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
|
// Wait for put to allow us to procceed execution
|
||||||
sync_get();
|
sync_get();
|
||||||
|
|
||||||
while (m_ctrl->put == m_internal_get && !Emu.IsStopped())
|
while (read_put() == m_internal_get && !Emu.IsStopped())
|
||||||
{
|
{
|
||||||
std::this_thread::yield();
|
std::this_thread::yield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 FIFO_control::read_put()
|
||||||
|
{
|
||||||
|
return m_ctrl->put.and_fetch(~3);
|
||||||
|
}
|
||||||
|
|
||||||
void FIFO_control::set_put(u32 put)
|
void FIFO_control::set_put(u32 put)
|
||||||
{
|
{
|
||||||
if (m_ctrl->put == put)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ctrl->put = put;
|
m_ctrl->put = put;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ namespace rsx
|
|||||||
{
|
{
|
||||||
// Fast read with no processing, only safe inside a PACKET_BEGIN+count block
|
// Fast read with no processing, only safe inside a PACKET_BEGIN+count block
|
||||||
if (m_remaining_commands &&
|
if (m_remaining_commands &&
|
||||||
m_internal_get != m_ctrl->put)
|
m_internal_get != read_put())
|
||||||
{
|
{
|
||||||
m_command_reg += m_command_inc;
|
m_command_reg += m_command_inc;
|
||||||
m_args_ptr += 4;
|
m_args_ptr += 4;
|
||||||
@@ -81,7 +81,7 @@ namespace rsx
|
|||||||
|
|
||||||
void FIFO_control::read(register_pair& data)
|
void FIFO_control::read(register_pair& data)
|
||||||
{
|
{
|
||||||
const u32 put = m_ctrl->put;
|
const u32 put = read_put();
|
||||||
m_internal_get = m_ctrl->get;
|
m_internal_get = m_ctrl->get;
|
||||||
|
|
||||||
if (put == m_internal_get)
|
if (put == m_internal_get)
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ namespace rsx
|
|||||||
void inc_get(bool wait);
|
void inc_get(bool wait);
|
||||||
void set_get(u32 get);
|
void set_get(u32 get);
|
||||||
void set_put(u32 put);
|
void set_put(u32 put);
|
||||||
|
u32 read_put();
|
||||||
|
|
||||||
void read(register_pair& data);
|
void read(register_pair& data);
|
||||||
inline bool read_unsafe(register_pair& data);
|
inline bool read_unsafe(register_pair& data);
|
||||||
|
|||||||
Reference in New Issue
Block a user