mirror of https://github.com/PCSX2/pcsx2.git
GS: Adjust CLUT dirty checks to reduce false positives
This commit is contained in:
parent
cb0e79972d
commit
f191915b53
|
@ -752,19 +752,68 @@ void GSClut::Expand16(const u16* RESTRICT src, u32* RESTRICT dst, int w, const G
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
bool GSClut::WriteState::IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
bool GSClut::WriteState::IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||||
{
|
{
|
||||||
return dirty || !GSVector4i::load<true>(this).eq(GSVector4i::load(&TEX0, &TEXCLUT));
|
constexpr u64 mask = 0x1FFFFFE000000000ull; // CSA CSM CPSM CBP
|
||||||
|
|
||||||
|
bool is_dirty = dirty;
|
||||||
|
|
||||||
|
if ((this->TEX0.U64 ^ TEX0.U64) & mask)
|
||||||
|
is_dirty |= true;
|
||||||
|
else if (TEX0.CSM == 1 && (TEXCLUT.U32[0] ^ this->TEXCLUT.U32[0]))
|
||||||
|
is_dirty |= true;
|
||||||
|
|
||||||
|
if (!is_dirty)
|
||||||
|
{
|
||||||
|
this->TEX0.U64 = TEX0.U64;
|
||||||
|
this->TEXCLUT.U64 = TEXCLUT.U64;
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_dirty;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GSClut::ReadState::IsDirty(const GIFRegTEX0& TEX0)
|
bool GSClut::ReadState::IsDirty(const GIFRegTEX0& TEX0)
|
||||||
{
|
{
|
||||||
return dirty || !GSVector4i::load<true>(this).eq(GSVector4i::load(&TEX0, &this->TEXA));
|
constexpr u64 mask = 0x1FFFFFE000000000ull; // CSA CSM CPSM CBP
|
||||||
|
|
||||||
|
bool is_dirty = dirty;
|
||||||
|
|
||||||
|
if ((this->TEX0.U64 ^ TEX0.U64) & mask)
|
||||||
|
is_dirty |= true;
|
||||||
|
|
||||||
|
if (!is_dirty)
|
||||||
|
{
|
||||||
|
this->TEX0.U64 = TEX0.U64;
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_dirty;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GSClut::ReadState::IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
bool GSClut::ReadState::IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
||||||
{
|
{
|
||||||
return dirty || !GSVector4i::load<true>(this).eq(GSVector4i::load(&TEX0, &TEXA));
|
constexpr u64 tex0_mask = 0x1FFFFFE000000000ull; // CSA CSM CPSM CBP
|
||||||
|
constexpr u64 texa24_mask = 0x80FFull; // AEM TA0
|
||||||
|
constexpr u64 texa16_mask = 0xFF000080FFull; // TA1 AEM TA0
|
||||||
|
|
||||||
|
bool is_dirty = dirty;
|
||||||
|
|
||||||
|
if ((this->TEX0.U64 ^ TEX0.U64) & tex0_mask)
|
||||||
|
is_dirty |= true;
|
||||||
|
else // Just to optimise the checks.
|
||||||
|
{
|
||||||
|
// Check TA0 and AEM in 24bit mode.
|
||||||
|
if (TEX0.CPSM == PSM_PSMCT24 && ((this->TEXA.U64 ^ TEXA.U64) & texa24_mask))
|
||||||
|
is_dirty |= true;
|
||||||
|
// Check all fields in 16bit mode.
|
||||||
|
else if (TEX0.CPSM >= PSM_PSMCT16 && ((this->TEXA.U64 ^ TEXA.U64) & texa16_mask))
|
||||||
|
is_dirty |= true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_dirty)
|
||||||
|
{
|
||||||
|
this->TEX0.U64 = TEX0.U64;
|
||||||
|
this->TEXA.U64 = TEXA.U64;
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_dirty;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue