From 279c657cda7772a39f318b5df68fb279bb0400b4 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 5 Mar 2015 17:12:24 +0100 Subject: Fifo: Replace busy loop with condition variable --- Source/Core/VideoCommon/CommandProcessor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp') diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp index b53c50fc2e..21ef0be2a9 100644 --- a/Source/Core/VideoCommon/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/CommandProcessor.cpp @@ -322,10 +322,7 @@ void GatherPipeBursted() ProcessFifoAllDistance(); } } - else - { - RunGpu(); - } + RunGpu(); return; } @@ -375,6 +372,7 @@ void UpdateInterrupts(u64 userdata) } CoreTiming::ForceExceptionCheck(0); interruptWaiting = false; + RunGpu(); } void UpdateInterruptsFromVideoBackend(u64 userdata) @@ -551,5 +549,7 @@ void Update() if (fifo.isGpuReadingData) Common::AtomicAdd(VITicks, SystemTimers::GetTicksPerSecond() / 10000); + + RunGpu(); } } // end of namespace CommandProcessor -- cgit v1.2.3 From b020ae1c5db4e2e198d1beea91c75219a251a167 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 5 Mar 2015 21:14:46 +0100 Subject: Fifo: rewrite sync on idle skipping hack Now it's done without a busy loop --- Source/Core/VideoCommon/CommandProcessor.cpp | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp') diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp index 21ef0be2a9..162e3a2d53 100644 --- a/Source/Core/VideoCommon/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/CommandProcessor.cpp @@ -40,7 +40,6 @@ static u16 m_bboxright; static u16 m_bboxbottom; static u16 m_tokenReg; -volatile bool isPossibleWaitingSetDrawDone = false; volatile bool interruptSet= false; volatile bool interruptWaiting= false; volatile bool interruptTokenWaiting = false; @@ -70,7 +69,6 @@ void DoState(PointerWrap &p) p.Do(m_tokenReg); p.Do(fifo); - p.Do(isPossibleWaitingSetDrawDone); p.Do(interruptSet); p.Do(interruptWaiting); p.Do(interruptTokenWaiting); @@ -123,8 +121,6 @@ void Init() interruptFinishWaiting = false; interruptTokenWaiting = false; - isPossibleWaitingSetDrawDone = false; - et_UpdateInterrupts = CoreTiming::RegisterEvent("CPInterrupt", UpdateInterrupts_Wrapper); } @@ -319,7 +315,7 @@ void GatherPipeBursted() (ProcessorInterface::Fifo_CPUBase == fifo.CPBase) && fifo.CPReadWriteDistance > 0) { - ProcessFifoAllDistance(); + FlushGpu(); } } RunGpu(); @@ -468,15 +464,6 @@ void SetCPStatusFromCPU() } } -void ProcessFifoAllDistance() -{ - if (IsOnThread()) - { - while (!interruptWaiting && fifo.bFF_GPReadEnable && fifo.CPReadWriteDistance && !AtBreakpoint()) - Common::YieldCPU(); - } -} - void ProcessFifoEvents() { if (IsOnThread() && (interruptWaiting || interruptFinishWaiting || interruptTokenWaiting)) @@ -518,7 +505,7 @@ void SetCpControlRegister() if (fifo.bFF_GPReadEnable && !m_CPCtrlReg.GPReadEnable) { fifo.bFF_GPReadEnable = m_CPCtrlReg.GPReadEnable; - while (fifo.isGpuReadingData) Common::YieldCPU(); + FlushGpu(); } else { -- cgit v1.2.3 From d2c62b17445b666b81a19cb3a6c46f9ee2d1388e Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 13 Mar 2015 23:36:31 +0100 Subject: Fifo: only sleep once within every ms of emulated time --- Source/Core/VideoCommon/CommandProcessor.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp') diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp index 162e3a2d53..2c6660e1f8 100644 --- a/Source/Core/VideoCommon/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/CommandProcessor.cpp @@ -45,6 +45,8 @@ volatile bool interruptWaiting= false; volatile bool interruptTokenWaiting = false; volatile bool interruptFinishWaiting = false; +Common::Flag s_gpuMaySleep; + volatile u32 VITicks = CommandProcessor::m_cpClockOrigin; static bool IsOnThread() -- cgit v1.2.3