| 308 | } |
| 309 | |
| 310 | static __fi void _vifCode_MPG(int idx, u32 addr, const u32* data, int size) |
| 311 | { |
| 312 | VURegs& VUx = idx ? VU1 : VU0; |
| 313 | vifStruct& vifX = GetVifX; |
| 314 | const u16 vuMemSize = idx ? 0x4000 : 0x1000; |
| 315 | pxAssert(VUx.Micro); |
| 316 | |
| 317 | vifExecQueue(idx); |
| 318 | |
| 319 | if (idx && THREAD_VU1) |
| 320 | { |
| 321 | if ((addr + size * 4) > vuMemSize) |
| 322 | { |
| 323 | vu1Thread.WriteMicroMem(addr, (u8*)data, vuMemSize - addr); |
| 324 | size -= (vuMemSize - addr) / 4; |
| 325 | data += (vuMemSize - addr) / 4; |
| 326 | vu1Thread.WriteMicroMem(0, (u8*)data, size * 4); |
| 327 | vifX.tag.addr = size * 4; |
| 328 | } |
| 329 | else |
| 330 | { |
| 331 | vu1Thread.WriteMicroMem(addr, (u8*)data, size * 4); |
| 332 | vifX.tag.addr += size * 4; |
| 333 | } |
| 334 | return; |
| 335 | } |
| 336 | |
| 337 | // Don't forget the Unsigned designator for these checks |
| 338 | if ((addr + size * 4) > vuMemSize) |
| 339 | { |
| 340 | //DevCon.Warning("Handling split MPG"); |
| 341 | if (!idx) |
| 342 | CpuVU0->Clear(addr, vuMemSize - addr); |
| 343 | else |
| 344 | CpuVU1->Clear(addr, vuMemSize - addr); |
| 345 | |
| 346 | memcpy(VUx.Micro + addr, data, vuMemSize - addr); |
| 347 | size -= (vuMemSize - addr) / 4; |
| 348 | data += (vuMemSize - addr) / 4; |
| 349 | memcpy(VUx.Micro, data, size * 4); |
| 350 | |
| 351 | vifX.tag.addr = size * 4; |
| 352 | } |
| 353 | else |
| 354 | { |
| 355 | //The compare is pretty much a waste of time, likelyhood is that the program isnt there, thats why its copying it. |
| 356 | //Faster without. |
| 357 | //if (memcmp(VUx.Micro + addr, data, size*4)) { |
| 358 | // Clear VU memory before writing! |
| 359 | if (!idx) |
| 360 | CpuVU0->Clear(addr, size * 4); |
| 361 | else |
| 362 | CpuVU1->Clear(addr, size * 4); |
| 363 | memcpy(VUx.Micro + addr, data, size * 4); //from tests, memcpy is 1fps faster on Grandia 3 than memcpy |
| 364 | |
| 365 | vifX.tag.addr += size * 4; |
| 366 | } |
| 367 | } |
no test coverage detected