mirror of https://github.com/PCSX2/pcsx2.git
ReorderingMTGS: Minor performance tweak. MTGS was only queuing 1 frame ahead instead of 2.
git-svn-id: http://pcsx2.googlecode.com/svn/branches/ReorderingMTGS@3467 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
ec7e1ed0a1
commit
a6b3acb5d0
|
@ -149,7 +149,7 @@ void SysMtgsThread::PostVsyncEnd()
|
||||||
// and they also allow us to reuse the front of the ringbuffer more often, which should improve
|
// and they also allow us to reuse the front of the ringbuffer more often, which should improve
|
||||||
// L2 cache performance.
|
// L2 cache performance.
|
||||||
|
|
||||||
if( AtomicIncrement(m_QueuedFrameCount) == 0 ) return;
|
if( AtomicIncrement(m_QueuedFrameCount) < 2 ) return;
|
||||||
|
|
||||||
uint readpos = volatize(m_RingPos);
|
uint readpos = volatize(m_RingPos);
|
||||||
uint freeroom;
|
uint freeroom;
|
||||||
|
@ -164,7 +164,7 @@ void SysMtgsThread::PostVsyncEnd()
|
||||||
|
|
||||||
m_SignalRingPosition = totalAccum;
|
m_SignalRingPosition = totalAccum;
|
||||||
|
|
||||||
//Console.WriteLn( Color_Blue, "(MTGS Sync) EEcore Vsync Sleep!\t\twrapspot=0x%06x, ringpos=0x%06x, writepos=0x%06x, signalpos=0x%06x", m_RingWrapSpot, readpos, writepos, m_SignalRingPosition );
|
//Console.WriteLn( Color_Blue, "(EEcore Sleep) Vsync\tringpos=0x%06x, writepos=0x%06x, signalpos=0x%06x", readpos, m_WritePos, m_SignalRingPosition );
|
||||||
|
|
||||||
AtomicExchange( m_SignalRingEnable, 1 );
|
AtomicExchange( m_SignalRingEnable, 1 );
|
||||||
SetEvent();
|
SetEvent();
|
||||||
|
@ -694,7 +694,7 @@ void SysMtgsThread::PrepDataPacket( MTGS_RingCommand cmd, u32 size )
|
||||||
pxAssertDev( m_SignalRingEnable == 0, "MTGS Thread Synchronization Error" );
|
pxAssertDev( m_SignalRingEnable == 0, "MTGS Thread Synchronization Error" );
|
||||||
m_SignalRingPosition = somedone;
|
m_SignalRingPosition = somedone;
|
||||||
|
|
||||||
//Console.WriteLn( Color_Blue, "(EEcore Sleep) GenStall \tringpos=0x%06x, writepos=0x%06x, wrapspot=0x%06x, signalpos=0x%06x", readpos, writepos, m_RingWrapSpot, m_SignalRingPosition );
|
//Console.WriteLn( Color_Blue, "(EEcore Sleep) PrepDataPacker \tringpos=0x%06x, writepos=0x%06x, signalpos=0x%06x", readpos, writepos, m_SignalRingPosition );
|
||||||
|
|
||||||
do {
|
do {
|
||||||
AtomicExchange( m_SignalRingEnable, 1 );
|
AtomicExchange( m_SignalRingEnable, 1 );
|
||||||
|
@ -708,6 +708,7 @@ void SysMtgsThread::PrepDataPacket( MTGS_RingCommand cmd, u32 size )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//Console.WriteLn( Color_StrongGray, "(EEcore Spin) PrepDataPacket!" );
|
||||||
SetEvent();
|
SetEvent();
|
||||||
do {
|
do {
|
||||||
SpinWait();
|
SpinWait();
|
||||||
|
@ -744,69 +745,6 @@ void SysMtgsThread::PrepDataPacket( GIF_PATH pathidx, u32 size )
|
||||||
PrepDataPacket( (MTGS_RingCommand)pathidx, size );
|
PrepDataPacket( (MTGS_RingCommand)pathidx, size );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
void SysMtgsThread::RestartRingbuffer( uint packsize )
|
|
||||||
{
|
|
||||||
if( m_WritePos == 0 ) return;
|
|
||||||
const uint thefuture = packsize;
|
|
||||||
|
|
||||||
//Console.WriteLn( Color_Magenta, "**** Ringbuffer Restart!!" );
|
|
||||||
// Always kick the MTGS into action for a ringbuffer restart.
|
|
||||||
SetEvent();
|
|
||||||
|
|
||||||
uint readpos = volatize(m_RingPos);
|
|
||||||
|
|
||||||
if( (readpos > m_WritePos) || (readpos <= thefuture) )
|
|
||||||
{
|
|
||||||
// We have to be careful not to leapfrog our read-position, which would happen if
|
|
||||||
// it's greater than the current write position (since wrapping writepos to 0 would
|
|
||||||
// be the act of skipping PAST readpos). Stall until it loops around to the
|
|
||||||
// beginning of the buffer, and past the size of our packet allocation.
|
|
||||||
|
|
||||||
uint somedone;
|
|
||||||
|
|
||||||
if( readpos > m_WritePos )
|
|
||||||
somedone = (m_RingWrapSpot - readpos) + packsize + 1;
|
|
||||||
else
|
|
||||||
somedone = (packsize + 1) - readpos;
|
|
||||||
|
|
||||||
if( somedone > 0x80 )
|
|
||||||
{
|
|
||||||
m_SignalRingPosition = somedone;
|
|
||||||
//Console.WriteLn( Color_Blue, "(EEcore Sleep) Restart!\tringpos=0x%06x, writepos=0x%06x, wrapspot=0x%06x, signalpos=0x%06x",
|
|
||||||
// readpos, m_WritePos, m_RingWrapSpot, m_SignalRingPosition );
|
|
||||||
|
|
||||||
do {
|
|
||||||
AtomicExchange( m_SignalRingEnable, 1 );
|
|
||||||
SetEvent();
|
|
||||||
m_sem_OnRingReset.WaitWithoutYield();
|
|
||||||
readpos = volatize(m_RingPos);
|
|
||||||
//Console.WriteLn( Color_Blue, "(EEcore Awake) Report!\tringpos=0x%06x", readpos );
|
|
||||||
} while( (readpos > m_WritePos) || (readpos <= thefuture) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetEvent();
|
|
||||||
do {
|
|
||||||
SpinWait();
|
|
||||||
readpos = volatize(m_RingPos);
|
|
||||||
} while( (readpos > m_WritePos) || (readpos <= thefuture) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PacketTagType& tag = (PacketTagType&)RingBuffer[m_WritePos];
|
|
||||||
|
|
||||||
tag.command = GS_RINGTYPE_RESTART;
|
|
||||||
|
|
||||||
m_RingWrapSpot = m_WritePos;
|
|
||||||
m_WritePos = 0;
|
|
||||||
m_QueuedFrameCount = 0;
|
|
||||||
|
|
||||||
if( EmuConfig.GS.SynchronousMTGS )
|
|
||||||
WaitGS();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__forceinline uint SysMtgsThread::_PrepForSimplePacket()
|
__forceinline uint SysMtgsThread::_PrepForSimplePacket()
|
||||||
{
|
{
|
||||||
#ifdef RINGBUF_DEBUG_STACK
|
#ifdef RINGBUF_DEBUG_STACK
|
||||||
|
@ -843,7 +781,7 @@ __forceinline uint SysMtgsThread::_PrepForSimplePacket()
|
||||||
{
|
{
|
||||||
m_SignalRingPosition = somedone;
|
m_SignalRingPosition = somedone;
|
||||||
|
|
||||||
//Console.WriteLn( Color_Blue, "(MTGS Sync) EEcore Simple Sleep!\t\twrapspot=0x%06x, ringpos=0x%06x, writepos=0x%06x, signalpos=0x%06x", m_RingWrapSpot, readpos, writepos, m_SignalRingPosition );
|
//Console.WriteLn( Color_Blue, "(EEcore Sleep) PrepSimplePacket\tringpos=0x%06x, writepos=0x%06x, signalpos=0x%06x", readpos, m_WritePos, m_SignalRingPosition );
|
||||||
|
|
||||||
do {
|
do {
|
||||||
AtomicExchange( m_SignalRingEnable, 1 );
|
AtomicExchange( m_SignalRingEnable, 1 );
|
||||||
|
@ -857,6 +795,8 @@ __forceinline uint SysMtgsThread::_PrepForSimplePacket()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//Console.WriteLn( Color_StrongGray, "(EEcore Spin) PrepSimplePacket!" );
|
||||||
|
|
||||||
SetEvent();
|
SetEvent();
|
||||||
do {
|
do {
|
||||||
SpinWait();
|
SpinWait();
|
||||||
|
|
Loading…
Reference in New Issue