MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / GIFRegHandlerFRAME

Method GIFRegHandlerFRAME

pcsx2/GS/GSState.cpp:2139–2190  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2137
2138template <int i>
2139void GSState::GIFRegHandlerFRAME(const GIFReg* RESTRICT r)
2140{
2141 GL_REG("FRAME_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
2142
2143 GIFRegFRAME NewFrame = r->FRAME;
2144 // FBW is clamped to 32
2145 NewFrame.FBW = std::min(NewFrame.FBW, 32U);
2146
2147 if ((NewFrame.PSM & 0x30) == 0x30)
2148 m_env.CTXT[i].ZBUF.PSM &= ~0x30;
2149 else
2150 m_env.CTXT[i].ZBUF.PSM |= 0x30;
2151
2152 if ((m_env.CTXT[i].FRAME.U32[0] ^ NewFrame.U32[0]) & 0x3f3f01ff) // FBP FBW PSM
2153 {
2154 m_env.CTXT[i].offset.fb = m_mem.GetOffset(NewFrame.Block(), NewFrame.FBW, NewFrame.PSM);
2155 m_env.CTXT[i].offset.zb = m_mem.GetOffset(m_env.CTXT[i].ZBUF.Block(), NewFrame.FBW, m_env.CTXT[i].ZBUF.PSM);
2156 m_env.CTXT[i].offset.fzb4 = m_mem.GetPixelOffset4(NewFrame, m_env.CTXT[i].ZBUF);
2157 }
2158
2159 m_env.CTXT[i].FRAME = NewFrame;
2160
2161 switch (m_env.CTXT[i].FRAME.PSM)
2162 {
2163 case PSMT8H:
2164 // Berserk uses the format to only update the alpha channel
2165 GL_INS("CORRECT FRAME FORMAT replaces PSMT8H by PSMCT32/0x00FF_FFFF");
2166 m_env.CTXT[i].FRAME.PSM = PSMCT32;
2167 m_env.CTXT[i].FRAME.FBMSK = 0x00FFFFFF;
2168 break;
2169 case PSMT4HH: // Not tested. Based on PSMT8H behavior
2170 GL_INS("CORRECT FRAME FORMAT replaces PSMT4HH by PSMCT32/0x0FFF_FFFF");
2171 m_env.CTXT[i].FRAME.PSM = PSMCT32;
2172 m_env.CTXT[i].FRAME.FBMSK = 0x0FFFFFFF;
2173 break;
2174 case PSMT4HL: // Not tested. Based on PSMT8H behavior
2175 GL_INS("CORRECT FRAME FORMAT replaces PSMT4HL by PSMCT32/0xF0FF_FFFF");
2176 m_env.CTXT[i].FRAME.PSM = PSMCT32;
2177 m_env.CTXT[i].FRAME.FBMSK = 0xF0FFFFFF;
2178 break;
2179 default:
2180 break;
2181 }
2182
2183 if (i == m_prev_env.PRIM.CTXT)
2184 {
2185 if ((m_prev_env.CTXT[i].FRAME.U64 ^ m_env.CTXT[i].FRAME.U64) & FRAME_REG_MASK)
2186 m_dirty_gs_regs |= (1 << DIRTY_REG_FRAME);
2187 else
2188 m_dirty_gs_regs &= ~(1 << DIRTY_REG_FRAME);
2189 }
2190}
2191
2192template <int i>
2193void GSState::GIFRegHandlerZBUF(const GIFReg* RESTRICT r)

Callers

nothing calls this directly

Calls 4

GetPixelOffset4Method · 0.80
minFunction · 0.70
GetOffsetMethod · 0.45
BlockMethod · 0.45

Tested by

no test coverage detected