summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/CommandProcessor.cpp
diff options
context:
space:
mode:
authorMarkus Wick <markus+github@selfnet.de>2015-04-06 13:24:17 +0200
committerMarkus Wick <markus+github@selfnet.de>2015-04-06 13:24:17 +0200
commit4669b50e2351830656e7d26ec2f0eec8b4740e69 (patch)
tree7da8e9583a95528ef48ade14003b8e381c600908 /Source/Core/VideoCommon/CommandProcessor.cpp
parentea50dc240d0df56490aea86408dd0f621787950d (diff)
parent74795b45539ebee1c2af78fd6dca9022c3189c76 (diff)
Merge pull request #2172 from degasus/block_gpu_thread
Block gpu thread
Diffstat (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp')
-rw-r--r--Source/Core/VideoCommon/CommandProcessor.cpp27
1 files changed, 8 insertions, 19 deletions
diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp
index b53c50fc2e..2c6660e1f8 100644
--- a/Source/Core/VideoCommon/CommandProcessor.cpp
+++ b/Source/Core/VideoCommon/CommandProcessor.cpp
@@ -40,12 +40,13 @@ 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;
volatile bool interruptFinishWaiting = false;
+Common::Flag s_gpuMaySleep;
+
volatile u32 VITicks = CommandProcessor::m_cpClockOrigin;
static bool IsOnThread()
@@ -70,7 +71,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 +123,6 @@ void Init()
interruptFinishWaiting = false;
interruptTokenWaiting = false;
- isPossibleWaitingSetDrawDone = false;
-
et_UpdateInterrupts = CoreTiming::RegisterEvent("CPInterrupt", UpdateInterrupts_Wrapper);
}
@@ -319,13 +317,10 @@ void GatherPipeBursted()
(ProcessorInterface::Fifo_CPUBase == fifo.CPBase) &&
fifo.CPReadWriteDistance > 0)
{
- ProcessFifoAllDistance();
+ FlushGpu();
}
}
- else
- {
- RunGpu();
- }
+ RunGpu();
return;
}
@@ -375,6 +370,7 @@ void UpdateInterrupts(u64 userdata)
}
CoreTiming::ForceExceptionCheck(0);
interruptWaiting = false;
+ RunGpu();
}
void UpdateInterruptsFromVideoBackend(u64 userdata)
@@ -470,15 +466,6 @@ void SetCPStatusFromCPU()
}
}
-void ProcessFifoAllDistance()
-{
- if (IsOnThread())
- {
- while (!interruptWaiting && fifo.bFF_GPReadEnable && fifo.CPReadWriteDistance && !AtBreakpoint())
- Common::YieldCPU();
- }
-}
-
void ProcessFifoEvents()
{
if (IsOnThread() && (interruptWaiting || interruptFinishWaiting || interruptTokenWaiting))
@@ -520,7 +507,7 @@ void SetCpControlRegister()
if (fifo.bFF_GPReadEnable && !m_CPCtrlReg.GPReadEnable)
{
fifo.bFF_GPReadEnable = m_CPCtrlReg.GPReadEnable;
- while (fifo.isGpuReadingData) Common::YieldCPU();
+ FlushGpu();
}
else
{
@@ -551,5 +538,7 @@ void Update()
if (fifo.isGpuReadingData)
Common::AtomicAdd(VITicks, SystemTimers::GetTicksPerSecond() / 10000);
+
+ RunGpu();
}
} // end of namespace CommandProcessor