summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/CommandProcessor.cpp
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2011-01-31 01:28:32 +0000
committerJordan Woyak <jordan.woyak@gmail.com>2011-01-31 01:28:32 +0000
commitfbaf9659958cd6d8c0df6b0c217f6e60f57f9d77 (patch)
tree3ddd90222b5d7afd0c98b936ab4c9e37375ec919 /Source/Core/VideoCommon/Src/CommandProcessor.cpp
parentae7c64ec134799183487adb5104c6908cf282240 (diff)
Eliminated the plugin interface. Merged DX9/DX11/OGL video plugins into Dolphin. It could still use a lot of cleanup. Lots of things are still named "plugin". Software renderer is temporarily disabled until it gets some namespaces. I only updated vs08/10, Linux/OSX builds are broken.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6996 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/CommandProcessor.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/CommandProcessor.cpp68
1 files changed, 38 insertions, 30 deletions
diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp
index bae72b3516..efc0c35ed9 100644
--- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp
+++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp
@@ -78,10 +78,20 @@
#include "ChunkFile.h"
#include "CommandProcessor.h"
#include "PixelEngine.h"
+#include "CoreTiming.h"
+#include "ConfigManager.h"
+#include "HW/ProcessorInterface.h"
+#include "HW/GPFifo.h"
+#include "HW/Memmap.h"
namespace CommandProcessor
{
+bool IsOnThread()
+{
+ return SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread;
+}
+
int et_UpdateInterrupts;
@@ -185,7 +195,7 @@ void Init()
s_fifoIdleEvent.Init();
- et_UpdateInterrupts = g_VideoInitialize.pRegisterEvent("UpdateInterrupts", UpdateInterrupts_Wrapper);
+ et_UpdateInterrupts = CoreTiming::RegisterEvent("UpdateInterrupts", UpdateInterrupts_Wrapper);
}
void Shutdown()
@@ -204,7 +214,7 @@ void Read16(u16& _rReturnValue, const u32 _Address)
// Here always there is one fifo attached to the GPU
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
{
m_CPStatusReg.Breakpoint = fifo.bFF_Breakpoint;
m_CPStatusReg.ReadIdle = (fifo.CPReadPointer == fifo.CPWritePointer) || (fifo.CPReadPointer == fifo.CPBreakpoint);
@@ -406,7 +416,7 @@ void Write16(const u16 _Value, const u32 _Address)
// (mb2) We don't sleep here since it could be a perf issue for super monkey ball (yup only this game IIRC)
// Touching that game is a no-go so I don't want to take the risk :p
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
{
//ProcessFifoAllDistance();
@@ -437,7 +447,7 @@ void Write16(const u16 _Value, const u32 _Address)
// seems invalid or has a bug and hang the game.
// Single Core MODE
- if (!g_VideoInitialize.bOnThread)
+ if (!IsOnThread())
{
Common::AtomicStore(fifo.bFF_Breakpoint, false);
@@ -463,9 +473,9 @@ void Write16(const u16 _Value, const u32 _Address)
if(tmpCtrl.GPReadEnable && tmpCtrl.GPLinkEnable)
{
- *(g_VideoInitialize.Fifo_CPUWritePointer) = fifo.CPWritePointer;
- *(g_VideoInitialize.Fifo_CPUBase) = fifo.CPBase;
- *(g_VideoInitialize.Fifo_CPUEnd) = fifo.CPEnd;
+ ProcessorInterface::Fifo_CPUWritePointer = fifo.CPWritePointer;
+ ProcessorInterface::Fifo_CPUBase = fifo.CPBase;
+ ProcessorInterface::Fifo_CPUEnd = fifo.CPEnd;
}
// If overflown happens process the fifo to LoWatemark
if (bProcessFifoToLoWatemark)
@@ -488,7 +498,7 @@ void Write16(const u16 _Value, const u32 _Address)
{
UCPClearReg tmpCtrl(_Value);
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
{
if (!tmpCtrl.ClearFifoUnderflow && tmpCtrl.ClearFifoOverflow)
bProcessFifoToLoWatemark = true;
@@ -607,7 +617,7 @@ void Write16(const u16 _Value, const u32 _Address)
WARN_LOG(COMMANDPROCESSOR, "(w16) unknown CP reg write %04x @ %08x", _Value, _Address);
}
- if (!g_VideoInitialize.bOnThread)
+ if (!IsOnThread())
CatchUpGPU();
ProcessFifoEvents();
}
@@ -648,12 +658,12 @@ void STACKALIGN GatherPipeBursted()
// if we aren't linked, we don't care about gather pipe data
if (!m_CPCtrlReg.GPLinkEnable)
{
- if (!g_VideoInitialize.bOnThread)
+ if (!IsOnThread())
CatchUpGPU();
return;
}
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
SetOverflowStatusFromGatherPipe();
@@ -667,7 +677,7 @@ void STACKALIGN GatherPipeBursted()
- if (!g_VideoInitialize.bOnThread)
+ if (!IsOnThread())
{
CatchUpGPU();
if (!m_CPStatusReg.OverflowHiWatermark && fifo.CPReadWriteDistance >= fifo.CPHiWatermark)
@@ -703,17 +713,17 @@ void STACKALIGN GatherPipeBursted()
"FIFO is overflown by GatherPipe !\nCPU thread is too fast!");
// check if we are in sync
- _assert_msg_(COMMANDPROCESSOR, fifo.CPWritePointer == *(g_VideoInitialize.Fifo_CPUWritePointer), "FIFOs linked but out of sync");
- _assert_msg_(COMMANDPROCESSOR, fifo.CPBase == *(g_VideoInitialize.Fifo_CPUBase), "FIFOs linked but out of sync");
- _assert_msg_(COMMANDPROCESSOR, fifo.CPEnd == *(g_VideoInitialize.Fifo_CPUEnd), "FIFOs linked but out of sync");
+ _assert_msg_(COMMANDPROCESSOR, fifo.CPWritePointer == ProcessorInterface::Fifo_CPUWritePointer, "FIFOs linked but out of sync");
+ _assert_msg_(COMMANDPROCESSOR, fifo.CPBase == ProcessorInterface::Fifo_CPUBase, "FIFOs linked but out of sync");
+ _assert_msg_(COMMANDPROCESSOR, fifo.CPEnd == ProcessorInterface::Fifo_CPUEnd, "FIFOs linked but out of sync");
}
// This is only used in single core mode
void CatchUpGPU()
{
- // HyperIris: Memory_GetPtr is an expensive call, call it less, run faster
- u8 *ptr = Memory_GetPtr(fifo.CPReadPointer);
+ // HyperIris: Memory::GetPointer is an expensive call, call it less, run faster
+ u8 *ptr = Memory::GetPointer(fifo.CPReadPointer);
// check if we are able to run this buffer
while (fifo.bFF_GPReadEnable && (fifo.CPReadWriteDistance ||
@@ -767,31 +777,29 @@ void UpdateInterruptsScMode()
|| (m_CPCtrlReg.FifoUnderflowIntEnable && fifo.bFF_LoWatermark)
|| (m_CPCtrlReg.FifoOverflowIntEnable && m_CPStatusReg.OverflowHiWatermark);
INFO_LOG(COMMANDPROCESSOR, "Fifo Interrupt: %s", (active)? "Asserted" : "Deasserted");
- g_VideoInitialize.pSetInterrupt(INT_CAUSE_CP, active);
+ ProcessorInterface::SetInterrupt(INT_CAUSE_CP, active);
}
-
-
void UpdateInterrupts(u64 userdata)
{
if (userdata)
{
interruptSet = true;
INFO_LOG(COMMANDPROCESSOR,"Interrupt set");
- g_VideoInitialize.pSetInterrupt(INT_CAUSE_CP, true);
+ ProcessorInterface::SetInterrupt(INT_CAUSE_CP, true);
}
else
{
interruptSet = false;
INFO_LOG(COMMANDPROCESSOR,"Interrupt cleared");
- g_VideoInitialize.pSetInterrupt(INT_CAUSE_CP, false);
+ ProcessorInterface::SetInterrupt(INT_CAUSE_CP, false);
}
interruptWaiting = false;
}
void UpdateInterruptsFromVideoPlugin(u64 userdata)
{
- g_VideoInitialize.pScheduleEvent_Threadsafe(0, et_UpdateInterrupts, userdata);
+ CoreTiming::ScheduleEvent_Threadsafe(0, et_UpdateInterrupts, userdata);
}
void SetFifoIdleFromVideoPlugin()
@@ -807,8 +815,8 @@ void AbortFrame()
{
fifo.bFF_GPReadEnable = false;
while (CommandProcessor::isFifoBusy)
- Common::YieldCPU();
- g_VideoInitialize.pResetGatherPipe();
+ Common::YieldCPU();
+ GPFifo::ResetGatherPipe();
ResetVideoBuffer();
fifo.CPReadPointer = fifo.CPWritePointer;
fifo.CPReadWriteDistance = 0;
@@ -876,7 +884,7 @@ void SetStatus()
if (interrupt != interruptSet && !interruptWaiting)
{
u64 userdata = interrupt?1:0;
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
{
interruptWaiting = true;
CommandProcessor::UpdateInterruptsFromVideoPlugin(userdata);
@@ -890,7 +898,7 @@ void SetStatus()
void ProcessFifoToLoWatemark()
{
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
{
while (!CommandProcessor::interruptWaiting && fifo.bFF_GPReadEnable &&
fifo.CPReadWriteDistance > fifo.CPLoWatermark && !AtBreakpoint())
@@ -901,7 +909,7 @@ void ProcessFifoToLoWatemark()
void ProcessFifoAllDistance()
{
- if (g_VideoInitialize.bOnThread)
+ if (IsOnThread())
{
while (!CommandProcessor::interruptWaiting && fifo.bFF_GPReadEnable &&
fifo.CPReadWriteDistance && !AtBreakpoint())
@@ -912,8 +920,8 @@ void ProcessFifoAllDistance()
void ProcessFifoEvents()
{
- if (g_VideoInitialize.bOnThread && (interruptWaiting || interruptFinishWaiting || interruptTokenWaiting))
- g_VideoInitialize.pProcessFifoEvents();
+ if (IsOnThread() && (interruptWaiting || interruptFinishWaiting || interruptTokenWaiting))
+ CoreTiming::ProcessFifoWaitEvents();
}