| 309 | } |
| 310 | |
| 311 | GSPixelOffset4* GSLocalMemory::GetPixelOffset4(const GIFRegFRAME& FRAME, const GIFRegZBUF& ZBUF) |
| 312 | { |
| 313 | u32 fbp = FRAME.Block(); |
| 314 | u32 zbp = ZBUF.Block(); |
| 315 | u32 fpsm = FRAME.PSM; |
| 316 | u32 zpsm = ZBUF.PSM; |
| 317 | u32 bw = FRAME.FBW; |
| 318 | |
| 319 | pxAssert(m_psm[fpsm].trbpp > 8 || m_psm[zpsm].trbpp > 8); |
| 320 | |
| 321 | // "(psm & 0x0f) ^ ((psm & 0xf0) >> 2)" creates 4 bit unique identifiers for render target formats (only) |
| 322 | |
| 323 | u32 fpsm_hash = (fpsm & 0x0f) ^ ((fpsm & 0x30) >> 2); |
| 324 | u32 zpsm_hash = (zpsm & 0x0f) ^ ((zpsm & 0x30) >> 2); |
| 325 | |
| 326 | u32 hash = (FRAME.FBP << 0) | (ZBUF.ZBP << 9) | (bw << 18) | (fpsm_hash << 24) | (zpsm_hash << 28); |
| 327 | |
| 328 | auto it = m_po4map.find(hash); |
| 329 | |
| 330 | if (it != m_po4map.end()) |
| 331 | { |
| 332 | return it->second; |
| 333 | } |
| 334 | |
| 335 | GSPixelOffset4* off = (GSPixelOffset4*)_aligned_malloc(sizeof(GSPixelOffset4), VECTOR_ALIGNMENT); |
| 336 | |
| 337 | off->hash = hash; |
| 338 | off->fbp = fbp; |
| 339 | off->zbp = zbp; |
| 340 | off->fpsm = fpsm; |
| 341 | off->zpsm = zpsm; |
| 342 | off->bw = bw; |
| 343 | |
| 344 | int fs = m_psm[fpsm].bpp >> 5; |
| 345 | int zs = m_psm[zpsm].bpp >> 5; |
| 346 | |
| 347 | for (int i = 0; i < 2048; i++) |
| 348 | { |
| 349 | off->row[i].x = (int)m_psm[fpsm].info.pa(0, i, fbp, bw) << fs; |
| 350 | off->row[i].y = (int)m_psm[zpsm].info.pa(0, i, zbp, bw) << zs; |
| 351 | } |
| 352 | |
| 353 | for (int i = 0; i < 512; i++) |
| 354 | { |
| 355 | off->col[i].x = (m_psm[fpsm].info.pa(i * 4, 0, 0, 32) - m_psm[fpsm].info.pa(0, 0, 0, 32)) << fs; |
| 356 | off->col[i].y = (m_psm[zpsm].info.pa(i * 4, 0, 0, 32) - m_psm[zpsm].info.pa(0, 0, 0, 32)) << zs; |
| 357 | } |
| 358 | |
| 359 | m_po4map[hash] = off; |
| 360 | |
| 361 | return off; |
| 362 | } |
| 363 | |
| 364 | std::vector<GSVector2i>* GSLocalMemory::GetPage2TileMap(const GIFRegTEX0& TEX0) |
| 365 | { |
no test coverage detected