diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp index 4b42055d05..0acad175bf 100644 --- a/pcsx2/GS/GSState.cpp +++ b/pcsx2/GS/GSState.cpp @@ -802,7 +802,7 @@ void GSState::GIFPackedRegHandlerXYZF2(const GIFPackedReg* RESTRICT r) m_v.m[1] = xy.upl32(zf); - VertexKick(adc ? 1 : r->XYZ2.Skip()); + VertexKick(adc ? 1 : r->XYZF2.Skip()); } template @@ -1945,17 +1945,19 @@ void GSState::Write(const u8* mem, int len) if (!m_tr.Update(w, h, psm.trbpp, len)) return; + // TODO: Not really sufficient if a partial texture update is done outside the block. + // No need to check CLUT here, we can invalidate it below, no need to flush it since TEX0 needs to update, then we can flush. + // Only flush on a NEW transfer if a pending one is using the same address. + // Check Fast & Furious (Hardare mode) and Assault Suits Valken (either renderer). + if (m_tr.end == 0 && m_index.tail > 0 && m_prev_env.PRIM.TME && + (blit.DBP == m_prev_env.CTXT[m_prev_env.PRIM.CTXT].TEX0.TBP0 || blit.DBP == m_prev_env.CTXT[m_prev_env.PRIM.CTXT].TEX0.CBP)) + Flush(); + GL_CACHE("Write! ... => 0x%x W:%d F:%s (DIR %d%d), dPos(%d %d) size(%d %d)", blit.DBP, blit.DBW, psm_str(blit.DPSM), m_env.TRXPOS.DIRX, m_env.TRXPOS.DIRY, m_env.TRXPOS.DSAX, m_env.TRXPOS.DSAY, w, h); - // TODO: Not really sufficient if a partial texture update is done outside the block. - // No need to check CLUT here, we can invalidate it below, no need to flush it since TEX0 needs to update, then we can flush. - if ((PRIM->TME && (blit.DBP == m_context->TEX0.TBP0)) || - (m_prev_env.PRIM.TME && (blit.DBP == m_prev_env.CTXT[m_prev_env.PRIM.CTXT].TEX0.TBP0))) - Flush(); - if (m_tr.end == 0 && len >= m_tr.total) { // received all data in one piece, no need to buffer it