diff --git a/pcsx2/GS/Renderers/HW/GSHwHack.cpp b/pcsx2/GS/Renderers/HW/GSHwHack.cpp index ee9def78d4..4aa6fdc3d4 100644 --- a/pcsx2/GS/Renderers/HW/GSHwHack.cpp +++ b/pcsx2/GS/Renderers/HW/GSHwHack.cpp @@ -293,17 +293,29 @@ bool GSHwHack::GSC_BlackAndBurnoutSky(GSRendererHW& r, const GSFrameInfo& fi, in const GIFRegTEX0& TEX0 = RCONTEXT->TEX0; const GIFRegALPHA& ALPHA = RCONTEXT->ALPHA; const GIFRegFRAME& FRAME = RCONTEXT->FRAME; - if (RPRIM->PRIM == GS_SPRITE && !RPRIM->IIP && RPRIM->TME && !RPRIM->FGE && RPRIM->ABE && !RPRIM->AA1 && !RPRIM->FST && !RPRIM->FIX && TEX0.TBW == 16 && TEX0.TW == 10 && TEX0.TCC && !TEX0.TFX && TEX0.PSM == PSM_PSMT8 && TEX0.CPSM == PSM_PSMCT32 && !TEX0.CSM && TEX0.TH == 8 && ALPHA.A == ALPHA.B && ALPHA.D == 0 && FRAME.FBW == 16 && FRAME.PSM == PSM_PSMCT32) - { - // Readback clouds being rendered during level loading. - // Later the alpha channel from the 32 bit frame buffer is used as an 8 bit indexed texture to draw - // the clouds on top of the sky at each frame. - // Burnout 3 PAL 50Hz: 0x3ba0 => 0x1e80. - GL_INS("OO_BurnoutGames - Readback clouds renderered from TEX0.TBP0 = 0x%04x (TEX0.CBP = 0x%04x) to FBP = 0x%04x", TEX0.TBP0, TEX0.CBP, FRAME.Block()); - r.SwPrimRender(r, true); - skip = 1; - } + if (RPRIM->PRIM == GS_SPRITE && !RPRIM->IIP && RPRIM->TME && !RPRIM->FGE && RPRIM->ABE && !RPRIM->AA1 && !RPRIM->FST && !RPRIM->FIX && + ALPHA.A == ALPHA.B && ALPHA.D == 0 && FRAME.PSM == PSM_PSMCT32 && TEX0.CPSM == PSM_PSMCT32 && TEX0.TCC && !TEX0.TFX && !TEX0.CSM) + { + if (TEX0.TBW == 16 && TEX0.TW == 10 && TEX0.PSM == PSM_PSMT8 && TEX0.TH == 8 && FRAME.FBW == 16) + { + // Readback clouds being rendered during level loading. + // Later the alpha channel from the 32 bit frame buffer is used as an 8 bit indexed texture to draw + // the clouds on top of the sky at each frame. + // Burnout 3 PAL 50Hz: 0x3ba0 => 0x1e80. + GL_INS("OO_BurnoutGames - Readback clouds renderered from TEX0.TBP0 = 0x%04x (TEX0.CBP = 0x%04x) to FBP = 0x%04x", TEX0.TBP0, TEX0.CBP, FRAME.Block()); + r.SwPrimRender(r, true); + skip = 1; + } + if (TEX0.TBW == 2 && TEX0.TW == 7 && ((TEX0.PSM == PSM_PSMT4 && FRAME.FBW == 3) || (TEX0.PSM == PSM_PSMT8 && FRAME.FBW == 2)) && TEX0.TH == 6 && (FRAME.FBMSK & 0xFFFFFF) == 0xFFFFFF) + { + // Rendering of the glass smashing effect and some chassis decal in to the alpha channel of the FRAME on boot (before the menu). + // This gets ejected from the texture cache due to old age, but never gets written back. + GL_INS("OO_BurnoutGames - Render glass smash from TEX0.TBP0 = 0x%04x (TEX0.CBP = 0x%04x) to FBP = 0x%04x", TEX0.TBP0, TEX0.CBP, FRAME.Block()); + r.SwPrimRender(r, true); + skip = 1; + } + } return true; }