GS/HW: Split up consecutive channel shuffles

This commit is contained in:
Stenzek 2023-02-15 02:14:00 +10:00 committed by refractionpcsx2
parent 51420dade4
commit f97191e241
2 changed files with 9 additions and 2 deletions

View File

@ -1361,7 +1361,10 @@ void GSRendererHW::Draw()
if (m_channel_shuffle) if (m_channel_shuffle)
{ {
m_channel_shuffle = draw_sprite_tex && (m_context->TEX0.PSM == PSM_PSMT8) && single_page; // NFSU2 does consecutive channel shuffles with blending, reducing the alpha channel over time.
// Fortunately, it seems to change the FBMSK along the way, so this check alone is sufficient.
m_channel_shuffle = draw_sprite_tex && m_context->TEX0.PSM == PSM_PSMT8 && single_page &&
m_last_channel_shuffle_fbmsk == m_context->FRAME.FBMSK;
if (m_channel_shuffle) if (m_channel_shuffle)
{ {
GL_CACHE("Channel shuffle effect detected SKIP"); GL_CACHE("Channel shuffle effect detected SKIP");
@ -1375,6 +1378,7 @@ void GSRendererHW::Draw()
{ {
GL_INS("Channel shuffle effect detected"); GL_INS("Channel shuffle effect detected");
m_channel_shuffle = true; m_channel_shuffle = true;
m_last_channel_shuffle_fbmsk = m_context->FRAME.FBMSK;
} }
else else
{ {
@ -1621,6 +1625,7 @@ void GSRendererHW::Draw()
{ {
GL_INS("Channel shuffle effect detected (2nd shot)"); GL_INS("Channel shuffle effect detected (2nd shot)");
m_channel_shuffle = true; m_channel_shuffle = true;
m_last_channel_shuffle_fbmsk = m_context->FRAME.FBMSK;
} }
else else
{ {

View File

@ -107,8 +107,10 @@ private:
int m_skip = 0; int m_skip = 0;
int m_skip_offset = 0; int m_skip_offset = 0;
bool m_tex_is_fb = false; u32 m_last_channel_shuffle_fbmsk = 0;
bool m_channel_shuffle = false; bool m_channel_shuffle = false;
bool m_tex_is_fb = false;
bool m_userhacks_tcoffset = false; bool m_userhacks_tcoffset = false;
float m_userhacks_tcoffset_x = 0.0f; float m_userhacks_tcoffset_x = 0.0f;
float m_userhacks_tcoffset_y = 0.0f; float m_userhacks_tcoffset_y = 0.0f;