diff --git a/pcsx2/GS/GSLocalMemory.cpp b/pcsx2/GS/GSLocalMemory.cpp index 3ce650b90e..59a702f6bc 100644 --- a/pcsx2/GS/GSLocalMemory.cpp +++ b/pcsx2/GS/GSLocalMemory.cpp @@ -429,11 +429,6 @@ GSLocalMemory::~GSLocalMemory() } } -GSOffset GSLocalMemory::GetOffset(uint32 bp, uint32 bw, uint32 psm) -{ - return GSOffset(m_psm[psm].info, bp, bw, psm); -} - GSPixelOffset* GSLocalMemory::GetPixelOffset(const GIFRegFRAME& FRAME, const GIFRegZBUF& ZBUF) { uint32 fbp = FRAME.Block(); @@ -1178,6 +1173,8 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF int sx = (int)TRXPOS.DSAX; int ex = sx + (int)TRXREG.RRW; + GSOffset off = GetOffset(bp, bw, BITBLTBUF.DPSM); + switch (BITBLTBUF.DPSM) { case PSM_PSMCT32: @@ -1187,7 +1184,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = off.assertSizesMatch(swizzle32).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x++, pd++) @@ -1211,7 +1208,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = off.assertSizesMatch(swizzle32).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x++, pb += 3) @@ -1237,7 +1234,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = off.assertSizesMatch(swizzle16).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x++, pw++) @@ -1258,7 +1255,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x++, pb++) @@ -1279,7 +1276,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x += 2, pb++) @@ -1301,7 +1298,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x++, pb++) @@ -1322,7 +1319,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x += 2, pb++) @@ -1344,7 +1341,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH).pa(0, y); int* offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x += 2, pb++) @@ -1387,6 +1384,8 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB int sx = (int)TRXPOS.SSAX; int ex = sx + (int)TRXREG.RRW; + GSOffset off = GetOffset(bp, bw, BITBLTBUF.SPSM); + // printf("spsm=%d x=%d ex=%d y=%d len=%d\n", BITBLTBUF.SPSM, x, ex, y, len); switch (BITBLTBUF.SPSM) @@ -1401,7 +1400,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* RESTRICT offset = psm->rowOffset[y & 7]; - uint32* RESTRICT ps = &m_vm32[psm->info.pa(0, y, bp, bw)]; + uint32* RESTRICT ps = &m_vm32[off.assertSizesMatch(swizzle32).pa(0, y)]; for (; len > 0 && x < ex && (x & 7); len--, x++, pd++) { @@ -1443,7 +1442,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* RESTRICT offset = psm->rowOffset[y & 7]; - uint32* RESTRICT ps = &m_vm32[psm->info.pa(0, y, bp, bw)]; + uint32* RESTRICT ps = &m_vm32[off.assertSizesMatch(swizzle32).pa(0, y)]; for (; len > 0 && x < ex; len--, x++, pb += 3) { @@ -1473,7 +1472,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* RESTRICT offset = psm->rowOffset[y & 7]; - uint16* RESTRICT ps = &m_vm16[psm->info.pa(0, y, bp, bw)]; + uint16* RESTRICT ps = &m_vm16[off.assertSizesMatch(swizzle16).pa(0, y)]; for (int ex4 = ex - 4; len >= 4 && x <= ex4; len -= 4, x += 4, pw += 4) { @@ -1502,7 +1501,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* RESTRICT offset = psm->rowOffset[y & 7]; - uint8* RESTRICT ps = &m_vm8[psm->info.pa(0, y, bp, bw)]; + uint8* RESTRICT ps = &m_vm8[GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8).pa(0, y)]; for (int ex4 = ex - 4; len >= 4 && x <= ex4; len -= 4, x += 4, pb += 4) { @@ -1530,7 +1529,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { - uint32 addr = psm->info.pa(0, y, bp, bw); + uint32 addr = GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4).pa(0, y); int* RESTRICT offset = psm->rowOffset[y & 7]; for (; len > 0 && x < ex; len--, x += 2, pb++) @@ -1552,7 +1551,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* RESTRICT offset = psm->rowOffset[y & 7]; - uint32* RESTRICT ps = &m_vm32[psm->info.pa(0, y, bp, bw)]; + uint32* RESTRICT ps = &m_vm32[GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H).pa(0, y)]; for (int ex4 = ex - 4; len >= 4 && x <= ex4; len -= 4, x += 4, pb += 4) { @@ -1581,7 +1580,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* offset = psm->rowOffset[y & 7]; - uint32* RESTRICT ps = &m_vm32[psm->info.pa(0, y, bp, bw)]; + uint32* RESTRICT ps = &m_vm32[GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL).pa(0, y)]; for (; len > 0 && x < ex; len--, x += 2, pb++) { @@ -1605,7 +1604,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB while (len > 0) { int* RESTRICT offset = psm->rowOffset[y & 7]; - uint32* RESTRICT ps = &m_vm32[psm->info.pa(0, y, bp, bw)]; + uint32* RESTRICT ps = &m_vm32[GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH).pa(0, y)]; for (; len > 0 && x < ex; len--, x += 2, pb++) { @@ -1633,7 +1632,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB void GSLocalMemory::ReadTexture32(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock32(src, read_dst, dstpitch); }); @@ -1643,14 +1642,14 @@ void GSLocalMemory::ReadTexture24(const GSOffset& off, const GSVector4i& r, uint { if (TEXA.AEM) { - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock24(src, read_dst, dstpitch, TEXA); }); } else { - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock24(src, read_dst, dstpitch, TEXA); }); @@ -1659,7 +1658,7 @@ void GSLocalMemory::ReadTexture24(const GSOffset& off, const GSVector4i& r, uint void GSLocalMemory::ReadTextureGPU24(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 16, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 16, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock16(src, read_dst, dstpitch); }); @@ -1681,14 +1680,14 @@ void GSLocalMemory::ReadTexture16(const GSOffset& off, const GSVector4i& r, uint { if (TEXA.AEM) { - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock16(src, read_dst, dstpitch, TEXA); }); } else { - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock16(src, read_dst, dstpitch, TEXA); }); @@ -1699,7 +1698,7 @@ void GSLocalMemory::ReadTexture8(const GSOffset& off, const GSVector4i& r, uint8 { const uint32* pal = m_clut; - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock8_32(src, read_dst, dstpitch, pal); }); @@ -1709,7 +1708,7 @@ void GSLocalMemory::ReadTexture4(const GSOffset& off, const GSVector4i& r, uint8 { const uint64* pal = m_clut; - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock4_32(src, read_dst, dstpitch, pal); }); @@ -1719,7 +1718,7 @@ void GSLocalMemory::ReadTexture8H(const GSOffset& off, const GSVector4i& r, uint { const uint32* pal = m_clut; - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock8H_32(src, read_dst, dstpitch, pal); }); @@ -1729,7 +1728,7 @@ void GSLocalMemory::ReadTexture4HL(const GSOffset& off, const GSVector4i& r, uin { const uint32* pal = m_clut; - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock4HL_32(src, read_dst, dstpitch, pal); }); @@ -1739,7 +1738,7 @@ void GSLocalMemory::ReadTexture4HH(const GSOffset& off, const GSVector4i& r, uin { const uint32* pal = m_clut; - foreachBlock(off, this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadAndExpandBlock4HH_32(src, read_dst, dstpitch, pal); }); @@ -1900,7 +1899,7 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8* void GSLocalMemory::ReadTexture8P(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock8(src, read_dst, dstpitch); }); @@ -1908,7 +1907,7 @@ void GSLocalMemory::ReadTexture8P(const GSOffset& off, const GSVector4i& r, uint void GSLocalMemory::ReadTexture4P(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock4P(src, read_dst, dstpitch); }); @@ -1916,7 +1915,7 @@ void GSLocalMemory::ReadTexture4P(const GSOffset& off, const GSVector4i& r, uint void GSLocalMemory::ReadTexture8HP(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock8HP(src, read_dst, dstpitch); }); @@ -1924,7 +1923,7 @@ void GSLocalMemory::ReadTexture8HP(const GSOffset& off, const GSVector4i& r, uin void GSLocalMemory::ReadTexture4HLP(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock4HLP(src, read_dst, dstpitch); }); @@ -1932,7 +1931,7 @@ void GSLocalMemory::ReadTexture4HLP(const GSOffset& off, const GSVector4i& r, ui void GSLocalMemory::ReadTexture4HHP(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) { - foreachBlock(off, this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) + foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src) { GSBlock::ReadBlock4HHP(src, read_dst, dstpitch); }); diff --git a/pcsx2/GS/GSLocalMemory.h b/pcsx2/GS/GSLocalMemory.h index c543565f51..eed9187989 100644 --- a/pcsx2/GS/GSLocalMemory.h +++ b/pcsx2/GS/GSLocalMemory.h @@ -298,6 +298,10 @@ public: { pageLooperForRect(rect).loopPages(std::forward(fn)); } + + /// Use compile-time dimensions from `swz` as a performance optimization + /// Also asserts if your assumption was wrong + constexpr GSOffset assertSizesMatch(const GSSwizzleInfo& swz) const; }; class GSSwizzleInfo @@ -372,6 +376,20 @@ constexpr inline GSOffset::GSOffset(const GSSwizzleInfo& swz, uint32 bp, uint32 { } +constexpr GSOffset GSOffset::assertSizesMatch(const GSSwizzleInfo& swz) const +{ + GSOffset o = *this; +#define MATCH(x) ASSERT(o.x == swz.x); o.x = swz.x; + MATCH(m_pageMask) + MATCH(m_blockMask) + MATCH(m_pageShiftX) + MATCH(m_pageShiftY) + MATCH(m_blockShiftX) + MATCH(m_blockShiftY) +#undef MATCH + return o; +} + class GSLocalMemory : public GSAlignedClass<32> { public: @@ -478,7 +496,10 @@ public: GSLocalMemory(); virtual ~GSLocalMemory(); - GSOffset GetOffset(uint32 bp, uint32 bw, uint32 psm); + GSOffset GetOffset(uint32 bp, uint32 bw, uint32 psm) const + { + return GSOffset(m_psm[psm].info, bp, bw, psm); + } GSPixelOffset* GetPixelOffset(const GIFRegFRAME& FRAME, const GIFRegZBUF& ZBUF); GSPixelOffset4* GetPixelOffset4(const GIFRegFRAME& FRAME, const GIFRegZBUF& ZBUF); std::vector* GetPage2TileMap(const GIFRegTEX0& TEX0); diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp index 28197a1ae8..90241e7e14 100644 --- a/pcsx2/GS/GSState.cpp +++ b/pcsx2/GS/GSState.cpp @@ -1650,10 +1650,14 @@ void GSState::Move() // TODO: unroll inner loops (width has special size requirement, must be multiples of 1 << n, depending on the format) - GSOffset spo = m_mem.GetOffset(m_env.BITBLTBUF.SBP, m_env.BITBLTBUF.SBW, m_env.BITBLTBUF.SPSM); - GSOffset dpo = m_mem.GetOffset(m_env.BITBLTBUF.DBP, m_env.BITBLTBUF.DBW, m_env.BITBLTBUF.DPSM); + int sbp = m_env.BITBLTBUF.SBP; + int sbw = m_env.BITBLTBUF.SBW; + int dbp = m_env.BITBLTBUF.DBP; + int dbw = m_env.BITBLTBUF.DBW; + GSOffset spo = m_mem.GetOffset(sbp, sbw, m_env.BITBLTBUF.SPSM); + GSOffset dpo = m_mem.GetOffset(dbp, dbw, m_env.BITBLTBUF.DPSM); - auto copy = [&](auto&& pxCopyFn) + auto copy = [&](const GSOffset& dpo, const GSOffset& spo, auto&& pxCopyFn) { if (xinc > 0) { @@ -1691,14 +1695,14 @@ void GSState::Move() { if (spsm.trbpp == 32) { - copy([&](uint32 doff, uint32 soff) + copy(dpo.assertSizesMatch(GSLocalMemory::swizzle32), spo.assertSizesMatch(GSLocalMemory::swizzle32), [&](uint32 doff, uint32 soff) { m_mem.m_vm32[doff] = m_mem.m_vm32[soff]; }); } else if (spsm.trbpp == 24) { - copy([&](uint32 doff, uint32 soff) + copy(dpo.assertSizesMatch(GSLocalMemory::swizzle32), spo.assertSizesMatch(GSLocalMemory::swizzle32), [&](uint32 doff, uint32 soff) { uint32& d = m_mem.m_vm32[doff]; d = (d & 0xff000000) | (m_mem.m_vm32[soff] & 0x00ffffff); @@ -1706,7 +1710,7 @@ void GSState::Move() } else // if(spsm.trbpp == 16) { - copy([&](uint32 doff, uint32 soff) + copy(dpo.assertSizesMatch(GSLocalMemory::swizzle16), spo.assertSizesMatch(GSLocalMemory::swizzle16), [&](uint32 doff, uint32 soff) { m_mem.m_vm16[doff] = m_mem.m_vm16[soff]; }); @@ -1714,21 +1718,21 @@ void GSState::Move() } else if (m_env.BITBLTBUF.SPSM == PSM_PSMT8 && m_env.BITBLTBUF.DPSM == PSM_PSMT8) { - copy([&](uint32 doff, uint32 soff) + copy(GSOffset::fromKnownPSM(dbp, dbw, PSM_PSMT8), GSOffset::fromKnownPSM(sbp, sbw, PSM_PSMT8), [&](uint32 doff, uint32 soff) { m_mem.m_vm8[doff] = m_mem.m_vm8[soff]; }); } else if (m_env.BITBLTBUF.SPSM == PSM_PSMT4 && m_env.BITBLTBUF.DPSM == PSM_PSMT4) { - copy([&](uint32 doff, uint32 soff) + copy(GSOffset::fromKnownPSM(dbp, dbw, PSM_PSMT4), GSOffset::fromKnownPSM(sbp, sbw, PSM_PSMT4), [&](uint32 doff, uint32 soff) { m_mem.WritePixel4(doff, m_mem.ReadPixel4(soff)); }); } else { - copy([&](uint32 doff, uint32 soff) + copy(dpo, spo, [&](uint32 doff, uint32 soff) { (m_mem.*dpsm.wpa)(doff, (m_mem.*spsm.rpa)(soff)); }); diff --git a/pcsx2/GS/GSVector.h b/pcsx2/GS/GSVector.h index 259eeb107a..cec90bd578 100644 --- a/pcsx2/GS/GSVector.h +++ b/pcsx2/GS/GSVector.h @@ -63,12 +63,12 @@ public: { } - bool operator==(const GSVector2T& v) const + constexpr bool operator==(const GSVector2T& v) const { return x == v.x && y == v.y; } - bool operator!=(const GSVector2T& v) const + constexpr bool operator!=(const GSVector2T& v) const { return x != v.x || y != v.y; } diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp index 5ddf40a847..d8c472cfa5 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp @@ -1827,7 +1827,7 @@ void GSRendererHW::OI_GsMemClear() // Based on WritePixel32 for (int y = r.top; y < r.bottom; y++) { - GSOffset::PAHelper pa = off.paMulti(r.left, y); + GSOffset::PAHelper pa = off.assertSizesMatch(GSLocalMemory::swizzle32).paMulti(r.left, y); for (; pa.x() < r.right; pa.incX()) { @@ -1840,7 +1840,7 @@ void GSRendererHW::OI_GsMemClear() // Based on WritePixel24 for (int y = r.top; y < r.bottom; y++) { - GSOffset::PAHelper pa = off.paMulti(r.left, y); + GSOffset::PAHelper pa = off.assertSizesMatch(GSLocalMemory::swizzle32).paMulti(r.left, y); for (; pa.x() < r.right; pa.incX()) { @@ -1855,7 +1855,7 @@ void GSRendererHW::OI_GsMemClear() // Based on WritePixel16 for(int y = r.top; y < r.bottom; y++) { - GSOffset::PAHelper pa = off.paMulti(r.left, y); + GSOffset::PAHelper pa = off.assertSizesMatch(GSLocalMemory::swizzle16).paMulti(r.left, y); for(int x = r.left; x < r.right; x++) { diff --git a/tests/ctest/GS/swizzle_test_nops.cpp b/tests/ctest/GS/swizzle_test_nops.cpp index ee7cd4683e..96db2ce6fb 100644 --- a/tests/ctest/GS/swizzle_test_nops.cpp +++ b/tests/ctest/GS/swizzle_test_nops.cpp @@ -21,10 +21,6 @@ #include "GSLocalMemory.h" GSLocalMemory::psm_t GSLocalMemory::m_psm[64]; -GSOffset GSLocalMemory::GetOffset(uint32 bp, uint32 bw, uint32 psm) -{ - abort(); -} void* vmalloc(size_t size, bool code) {