summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/CommandProcessor.cpp
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2014-11-14 11:46:02 +1100
committerskidau <skidau@gmail.com>2014-11-19 12:48:08 +1100
commitb2c02e216ceaeb51ee4f6c644050e26d4adab566 (patch)
tree5560189eaeda32f324597be34cadde1457b7c4f4 /Source/Core/VideoCommon/CommandProcessor.cpp
parent32f2cd8c7f1c0774a619fb7e4e5c9521a7ca82e0 (diff)
Separated out the CPU and GPU thread path to avoid clobbering.
Removed the Eternal Darkness check as it is no longer required. Fixes issue 7835.
Diffstat (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp')
-rw-r--r--Source/Core/VideoCommon/CommandProcessor.cpp52
1 files changed, 31 insertions, 21 deletions
diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp
index 8af2af9ccc..155e4b18ec 100644
--- a/Source/Core/VideoCommon/CommandProcessor.cpp
+++ b/Source/Core/VideoCommon/CommandProcessor.cpp
@@ -404,7 +404,33 @@ void SetCPStatusFromGPU()
INFO_LOG(COMMANDPROCESSOR, "Cleared breakpoint at %i", fifo.CPReadPointer);
fifo.bFF_Breakpoint = false;
}
- SetCPStatusFromCPU();
+ // overflow & underflow check
+ fifo.bFF_HiWatermark = (fifo.CPReadWriteDistance > fifo.CPHiWatermark);
+ fifo.bFF_LoWatermark = (fifo.CPReadWriteDistance < fifo.CPLoWatermark);
+
+ bool bpInt = fifo.bFF_Breakpoint && fifo.bFF_BPInt;
+ bool ovfInt = fifo.bFF_HiWatermark && fifo.bFF_HiWatermarkInt;
+ bool undfInt = fifo.bFF_LoWatermark && fifo.bFF_LoWatermarkInt;
+
+ bool interrupt = (bpInt || ovfInt || undfInt) && m_CPCtrlReg.GPReadEnable;
+
+ if (interrupt != interruptSet && !interruptWaiting)
+ {
+ u64 userdata = interrupt ? 1 : 0;
+ if (IsOnThread())
+ {
+ if (!interrupt || bpInt || undfInt || ovfInt)
+ {
+ // Schedule the interrupt asynchronously
+ interruptWaiting = true;
+ CommandProcessor::UpdateInterruptsFromVideoBackend(userdata);
+ }
+ }
+ else
+ {
+ CommandProcessor::UpdateInterrupts(userdata);
+ }
+ }
}
void SetCPStatusFromCPU()
@@ -426,18 +452,9 @@ void SetCPStatusFromCPU()
{
if (!interrupt || bpInt || undfInt || ovfInt)
{
- if (Core::IsGPUThread())
- {
- // Schedule the interrupt asynchronously
- interruptWaiting = true;
- CommandProcessor::UpdateInterruptsFromVideoBackend(userdata);
- }
- else
- {
- interruptSet = interrupt;
- INFO_LOG(COMMANDPROCESSOR,"Interrupt set");
- ProcessorInterface::SetInterrupt(INT_CAUSE_CP, interrupt);
- }
+ interruptSet = interrupt;
+ INFO_LOG(COMMANDPROCESSOR,"Interrupt set");
+ ProcessorInterface::SetInterrupt(INT_CAUSE_CP, interrupt);
}
}
else
@@ -451,7 +468,7 @@ void ProcessFifoAllDistance()
{
if (IsOnThread())
{
- while (!CommandProcessor::interruptWaiting && fifo.bFF_GPReadEnable &&
+ while (!interruptWaiting && fifo.bFF_GPReadEnable &&
fifo.CPReadWriteDistance && !AtBreakpoint())
Common::YieldCPU();
}
@@ -489,13 +506,6 @@ void SetCpStatusRegister()
void SetCpControlRegister()
{
- // If the new fifo is being attached, force an exception check
- // This fixes the hang while booting Eternal Darkness
- if (!fifo.bFF_GPReadEnable && m_CPCtrlReg.GPReadEnable && !m_CPCtrlReg.BPEnable)
- {
- CoreTiming::ForceExceptionCheck(0);
- }
-
fifo.bFF_BPInt = m_CPCtrlReg.BPInt;
fifo.bFF_BPEnable = m_CPCtrlReg.BPEnable;
fifo.bFF_HiWatermarkInt = m_CPCtrlReg.FifoOverflowIntEnable;