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

Function _vifCode_MPG

pcsx2/Vif_Codes.cpp:310–367  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

308}
309
310static __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}

Callers 1

Vif_Codes.cppFile · 0.85

Calls 3

vifExecQueueFunction · 0.85
WriteMicroMemMethod · 0.80
ClearMethod · 0.45

Tested by

no test coverage detected