mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-01-31 01:15:24 +01:00
Threading VU1 took a lot of rewrites and new code to make possible (MTGS, microVU, gifUnit...), but we finally got to the point where it was feasible, and now we've done it! (so now everyone can stop complaining that pcsx2 only takes advantages of 2 cores :p). The speedups in the games that benefit from it are great if you have a cpu with 3+ cores (generally a 10~45% speedup), however games that are GS limited can be a slowdown (especially on dual core cpu's). The option can be found in the speedhacks section as "MTVU (Multi-Threaded microVU1)". And when enabled it should should show the VU thread-time percentage on the title bar window (Like we currently do for EE/GS/UI threads). It is listed as a speedhack because in order for threading VU1 to have been a speedup, we need to assume that games will not send gif packets containing Signal/Finish/Label commands from path 1 (vu1's xgkick). The good news is very-few games ever do this, so the compatibility of MTVU is very high (a game that does do this will likely hang). Note: vs2010 builds and Linux builds need to be updated to include "MTVU.h" and "MTVU.cpp". git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4865 96395faa-99c1-11dd-bbfe-3dabce05a288
99 lines
2.2 KiB
C++
99 lines
2.2 KiB
C++
/* PCSX2 - PS2 Emulator for PCs
|
|
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
|
*
|
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#include "PrecompiledHeader.h"
|
|
#include "Common.h"
|
|
#include "VUmicro.h"
|
|
|
|
|
|
__aligned16 VURegs vuRegs[2];
|
|
|
|
|
|
vuMemoryReserve::vuMemoryReserve()
|
|
: _parent( L"VU0/1 on-chip memory", VU1_PROGSIZE + VU1_MEMSIZE + VU0_PROGSIZE + VU0_MEMSIZE )
|
|
{
|
|
}
|
|
|
|
void vuMemoryReserve::Reserve()
|
|
{
|
|
_parent::Reserve(HostMemoryMap::VUmem);
|
|
//_parent::Reserve(EmuConfig.HostMemMap.VUmem);
|
|
|
|
u8* curpos = m_reserve.GetPtr();
|
|
VU0.Micro = curpos; curpos += VU0_PROGSIZE;
|
|
VU0.Mem = curpos; curpos += VU0_MEMSIZE;
|
|
VU1.Micro = curpos; curpos += VU1_PROGSIZE;
|
|
VU1.Mem = curpos; curpos += VU1_MEMSIZE;
|
|
}
|
|
|
|
void vuMemoryReserve::Release()
|
|
{
|
|
_parent::Release();
|
|
|
|
VU0.Micro = VU0.Mem = NULL;
|
|
VU1.Micro = VU1.Mem = NULL;
|
|
}
|
|
|
|
void vuMemoryReserve::Reset()
|
|
{
|
|
_parent::Reset();
|
|
|
|
pxAssert( VU0.Mem );
|
|
pxAssert( VU1.Mem );
|
|
|
|
// Below memMap is already called by "void eeMemoryReserve::Reset()"
|
|
//memMapVUmicro();
|
|
|
|
// === VU0 Initialization ===
|
|
memzero(VU0.ACC);
|
|
memzero(VU0.VF);
|
|
memzero(VU0.VI);
|
|
VU0.VF[0].f.x = 0.0f;
|
|
VU0.VF[0].f.y = 0.0f;
|
|
VU0.VF[0].f.z = 0.0f;
|
|
VU0.VF[0].f.w = 1.0f;
|
|
VU0.VI[0].UL = 0;
|
|
|
|
// === VU1 Initialization ===
|
|
memzero(VU1.ACC);
|
|
memzero(VU1.VF);
|
|
memzero(VU1.VI);
|
|
VU1.VF[0].f.x = 0.0f;
|
|
VU1.VF[0].f.y = 0.0f;
|
|
VU1.VF[0].f.z = 0.0f;
|
|
VU1.VF[0].f.w = 1.0f;
|
|
VU1.VI[0].UL = 0;
|
|
}
|
|
|
|
void SaveStateBase::vuMicroFreeze()
|
|
{
|
|
FreezeTag( "vuMicroRegs" );
|
|
|
|
Freeze(VU0.ACC);
|
|
Freeze(VU0.code);
|
|
|
|
Freeze(VU0.VF);
|
|
Freeze(VU0.VI);
|
|
|
|
Freeze(VU1.ACC);
|
|
|
|
u32& temp_vu1_code = VU1.code;
|
|
Freeze(temp_vu1_code);
|
|
|
|
Freeze(VU1.VF);
|
|
Freeze(VU1.VI);
|
|
}
|