| 2137 | |
| 2138 | template <int i> |
| 2139 | void 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 | |
| 2192 | template <int i> |
| 2193 | void GSState::GIFRegHandlerZBUF(const GIFReg* RESTRICT r) |
nothing calls this directly
no test coverage detected