mirror of
https://github.com/libretro/pcsx2.git
synced 2025-01-07 10:10:41 +00:00
ac9bf45f98
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
92 lines
2.4 KiB
C++
92 lines
2.4 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/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "AppEventListeners.h"
|
|
|
|
class BaseCpuUsageProvider
|
|
{
|
|
public:
|
|
BaseCpuUsageProvider() {}
|
|
virtual ~BaseCpuUsageProvider() throw() {}
|
|
|
|
virtual bool IsImplemented() const=0;
|
|
virtual void UpdateStats()=0;
|
|
virtual int GetEEcorePct() const=0;
|
|
virtual int GetGsPct() const=0;
|
|
virtual int GetVUPct() const=0;
|
|
virtual int GetGuiPct() const=0;
|
|
};
|
|
|
|
|
|
class CpuUsageProvider : public BaseCpuUsageProvider
|
|
{
|
|
protected:
|
|
ScopedPtr<BaseCpuUsageProvider> m_Implementation;
|
|
|
|
public:
|
|
CpuUsageProvider();
|
|
virtual ~CpuUsageProvider() throw();
|
|
|
|
virtual bool IsImplemented() const { return m_Implementation->IsImplemented(); }
|
|
virtual void UpdateStats() { m_Implementation->UpdateStats(); }
|
|
virtual int GetEEcorePct() const { return m_Implementation->GetEEcorePct(); }
|
|
virtual int GetGsPct() const { return m_Implementation->GetGsPct(); }
|
|
virtual int GetVUPct() const { return m_Implementation->GetVUPct(); }
|
|
virtual int GetGuiPct() const { return m_Implementation->GetGuiPct(); }
|
|
};
|
|
|
|
struct AllPCSX2Threads
|
|
{
|
|
u64 ee, gs, vu, ui;
|
|
u64 update;
|
|
|
|
void LoadWithCurrentTimes();
|
|
AllPCSX2Threads operator-( const AllPCSX2Threads& right ) const;
|
|
};
|
|
|
|
class DefaultCpuUsageProvider :
|
|
public BaseCpuUsageProvider,
|
|
public EventListener_CoreThread
|
|
{
|
|
public:
|
|
static const uint QueueDepth = 4;
|
|
|
|
protected:
|
|
AllPCSX2Threads m_queue[QueueDepth];
|
|
|
|
uint m_writepos;
|
|
u32 m_pct_ee;
|
|
u32 m_pct_gs;
|
|
u32 m_pct_vu;
|
|
u32 m_pct_ui;
|
|
|
|
public:
|
|
DefaultCpuUsageProvider();
|
|
virtual ~DefaultCpuUsageProvider() throw() {}
|
|
|
|
bool IsImplemented() const;
|
|
void Reset();
|
|
void UpdateStats();
|
|
int GetEEcorePct() const;
|
|
int GetGsPct() const;
|
|
int GetVUPct() const;
|
|
int GetGuiPct() const;
|
|
|
|
protected:
|
|
void CoreThread_OnResumed() { Reset(); }
|
|
};
|