diff --git a/Source/Core/Core/Src/HW/GPFifo.cpp b/Source/Core/Core/Src/HW/GPFifo.cpp index 01d38ed0f5..4d9a160a1c 100644 --- a/Source/Core/Core/Src/HW/GPFifo.cpp +++ b/Source/Core/Core/Src/HW/GPFifo.cpp @@ -80,14 +80,10 @@ void STACKALIGN CheckGatherPipe() memcpy(m_gatherPipe, m_gatherPipe + GATHER_PIPE_SIZE, m_gatherPipeCount); // increase the CPUWritePointer - ProcessorInterface::Fifo_CPUWritePointer += GATHER_PIPE_SIZE; - - if (ProcessorInterface::Fifo_CPUWritePointer > ProcessorInterface::Fifo_CPUEnd) - _assert_msg_(DYNA_REC, 0, "Fifo_CPUWritePointer out of bounds: %08x (end = %08x)", - ProcessorInterface::Fifo_CPUWritePointer, ProcessorInterface::Fifo_CPUEnd); - - if (ProcessorInterface::Fifo_CPUWritePointer >= ProcessorInterface::Fifo_CPUEnd) - ProcessorInterface::Fifo_CPUWritePointer = ProcessorInterface::Fifo_CPUBase; + if (ProcessorInterface::Fifo_CPUWritePointer == ProcessorInterface::Fifo_CPUEnd) + ProcessorInterface::Fifo_CPUWritePointer = ProcessorInterface::Fifo_CPUBase; + else + ProcessorInterface::Fifo_CPUWritePointer += GATHER_PIPE_SIZE; // TODO store video plugin pointer CPluginManager::GetInstance().GetVideo()->Video_GatherPipeBursted(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.cpp index 0d3f8f7874..3abae6da41 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.cpp @@ -17,16 +17,33 @@ #include "Common.h" #include "pluginspecs_video.h" +#include "Thread.h" +#include "Atomic.h" #include "CommandProcessor.h" -#include "OpcodeDecoder.h" -#include "main.h" #include "ChunkFile.h" #include "MathUtil.h" +volatile bool g_bSkipCurrentFrame; +bool fifoStateRun; -u8* g_pVideoData; // data reader uses this as the read pointer +// set to 0 if using in video common +#define SW_PLUGIN 1 +#if (SW_PLUGIN) + +#include "OpcodeDecoder.h" +#include "main.h" +u8* g_pVideoData; + +#else + +#include "VideoConfig.h" +#include "OpcodeDecoding.h" +#include "VideoCommon.h" +extern u8* g_pVideoData; + +#endif namespace CommandProcessor { @@ -40,17 +57,18 @@ enum // STATE_TO_SAVE // variables -const int commandBufferSize = 4 * 1024; -const int commandBufferCopySize = 32; -const int maxCommandBufferWrite = commandBufferSize - commandBufferCopySize; +const int commandBufferSize = 1024 * 1024; +const int maxCommandBufferWrite = commandBufferSize - GATHER_PIPE_SIZE; u8 commandBuffer[commandBufferSize]; u32 readPos; u32 writePos; -bool interruptSet; int et_UpdateInterrupts; +volatile bool interruptSet; +volatile bool interruptWaiting; CPReg cpreg; // shared between gfx and emulator thread +Common::CriticalSection criticalSection; void DoState(PointerWrap &p) { @@ -67,7 +85,12 @@ inline u16 ReadHigh (u32 _reg) {return (u16)(_reg >> 16);} void UpdateInterrupts_Wrapper(u64 userdata, int cyclesLate) { - UpdateInterrupts(); + UpdateInterrupts(userdata); +} + +inline bool AtBreakpoint() +{ + return cpreg.ctrl.BPEnable && (cpreg.readptr == cpreg.breakpt); } void Init() @@ -93,8 +116,10 @@ void Init() writePos = 0; interruptSet = false; + interruptWaiting = false; g_pVideoData = 0; + g_bSkipCurrentFrame = false; } void Shutdown() @@ -112,7 +137,7 @@ void RunGpu() // run the opcode decoder do { RunBuffer(); - } while (cpreg.ctrl.GPReadEnable && !cpreg.status.Breakpoint && cpreg.rwdistance >= commandBufferCopySize); + } while (cpreg.ctrl.GPReadEnable && !AtBreakpoint() && cpreg.readptr != cpreg.writeptr); LoadSSEState(); } @@ -120,9 +145,10 @@ void RunGpu() void Read16(u16& _rReturnValue, const u32 _Address) { - DEBUG_LOG(COMMANDPROCESSOR, "(r): 0x%08x", _Address); - u32 regAddr = (_Address & 0xFFF) >> 1; + + DEBUG_LOG(COMMANDPROCESSOR, "(r): 0x%08x : 0x%08x", _Address, ((u16*)&cpreg)[regAddr]); + if (regAddr < 0x20) _rReturnValue = ((u16*)&cpreg)[regAddr]; else @@ -137,29 +163,13 @@ void Write16(const u16 _Value, const u32 _Address) { case STATUS_REGISTER: { - UCPStatusReg tmpStatus(_Value); - - if (cpreg.status.Breakpoint != tmpStatus.Breakpoint) - INFO_LOG(COMMANDPROCESSOR,"Set breakpoint status by writing to STATUS_REGISTER"); - - cpreg.status.Hex = _Value; - - INFO_LOG(COMMANDPROCESSOR,"\t write to STATUS_REGISTER : %04x", _Value); - - UpdateInterrupts(); + ERROR_LOG(COMMANDPROCESSOR,"\t write to STATUS_REGISTER : %04x", _Value); } break; case CTRL_REGISTER: { - cpreg.ctrl.Hex = _Value; - - // clear breakpoint if BPEnable and CPIntEnable are 0 - if (!cpreg.ctrl.BPEnable) { - if (!cpreg.ctrl.BreakPointIntEnable) { - cpreg.status.Breakpoint = 0; - } - } + cpreg.ctrl.Hex = _Value; DEBUG_LOG(COMMANDPROCESSOR,"\t write to CTRL_REGISTER : %04x", _Value); DEBUG_LOG(COMMANDPROCESSOR, "\t GPREAD %s | CPULINK %s | BP %s || BPIntEnable %s | OvF %s | UndF %s" @@ -170,9 +180,6 @@ void Write16(const u16 _Value, const u32 _Address) , cpreg.ctrl.FifoOverflowIntEnable ? "ON" : "OFF" , cpreg.ctrl.FifoUnderflowIntEnable ? "ON" : "OFF" ); - - UpdateInterrupts(); - } break; @@ -186,8 +193,6 @@ void Write16(const u16 _Value, const u32 _Address) cpreg.status.UnderflowLoWatermark = 0; INFO_LOG(COMMANDPROCESSOR,"\t write to CLEAR_REGISTER : %04x",_Value); - - UpdateInterrupts(); } break; @@ -198,7 +203,7 @@ void Write16(const u16 _Value, const u32 _Address) break; case FIFO_BASE_LO: - WriteLow ((u32 &)cpreg.fifobase, _Value); + WriteLow ((u32 &)cpreg.fifobase, _Value & 0xFFE0); DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_BASE_LO. FIFO base is : %08x", cpreg.fifobase); break; case FIFO_BASE_HI: @@ -206,7 +211,7 @@ void Write16(const u16 _Value, const u32 _Address) DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_BASE_HI. FIFO base is : %08x", cpreg.fifobase); break; case FIFO_END_LO: - WriteLow ((u32 &)cpreg.fifoend, _Value); + WriteLow ((u32 &)cpreg.fifoend, _Value & 0xFFE0); DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_END_LO. FIFO end is : %08x", cpreg.fifoend); break; case FIFO_END_HI: @@ -215,7 +220,7 @@ void Write16(const u16 _Value, const u32 _Address) break; case FIFO_WRITE_POINTER_LO: - WriteLow ((u32 &)cpreg.writeptr, _Value); + WriteLow ((u32 &)cpreg.writeptr, _Value & 0xFFE0); DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_WRITE_POINTER_LO. write ptr is : %08x", cpreg.writeptr); break; case FIFO_WRITE_POINTER_HI: @@ -223,7 +228,7 @@ void Write16(const u16 _Value, const u32 _Address) DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_WRITE_POINTER_HI. write ptr is : %08x", cpreg.writeptr); break; case FIFO_READ_POINTER_LO: - WriteLow ((u32 &)cpreg.readptr, _Value); + WriteLow ((u32 &)cpreg.readptr, _Value & 0xFFE0); DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_READ_POINTER_LO. read ptr is : %08x", cpreg.readptr); break; case FIFO_READ_POINTER_HI: @@ -249,7 +254,7 @@ void Write16(const u16 _Value, const u32 _Address) break; case FIFO_BP_LO: - WriteLow ((u32 &)cpreg.breakpt, _Value); + WriteLow ((u32 &)cpreg.breakpt, _Value & 0xFFE0); DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_BP_LO. breakpt is : %08x", cpreg.breakpt); break; case FIFO_BP_HI: @@ -257,12 +262,8 @@ void Write16(const u16 _Value, const u32 _Address) DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_BP_HI. breakpt is : %08x", cpreg.breakpt); break; - // Super monkey try to overwrite CPReadWriteDistance by an old saved RWD value. Which is lame for us. - // hack: We have to force CPU to think fifo is alway empty and on idle. - // When we fall here CPReadWriteDistance should be always null and the game should always want to overwrite it by 0. - // So, we can skip it. case FIFO_RW_DISTANCE_LO: - WriteLow ((u32 &)cpreg.rwdistance, _Value); + WriteLow ((u32 &)cpreg.rwdistance, _Value & 0xFFE0); DEBUG_LOG(COMMANDPROCESSOR,"\t write to FIFO_RW_DISTANCE_LO. rwdistance is : %08x", cpreg.rwdistance); break; case FIFO_RW_DISTANCE_HI: @@ -289,105 +290,106 @@ void STACKALIGN GatherPipeBursted() { if (cpreg.ctrl.GPLinkEnable) { - cpreg.writeptr += GATHER_PIPE_SIZE; - if (cpreg.writeptr >= (cpreg.fifoend & 0xFFFFFFE0)) - cpreg.writeptr = cpreg.fifobase; + DEBUG_LOG(COMMANDPROCESSOR,"\t WGP burst. write thru : %08x", cpreg.writeptr); - // the read/write pointers will be managed in RunGpu which will read the current fifo and - // send as much data as is available and the plugin can take - // this will have the cost of copying data to the plugin fifo buffer in the main thread + if (cpreg.writeptr == cpreg.fifoend) + cpreg.writeptr = cpreg.fifobase; + else + cpreg.writeptr += GATHER_PIPE_SIZE; + + Common::AtomicAdd(cpreg.rwdistance, GATHER_PIPE_SIZE); } RunGpu(); } -void UpdateInterrupts() +void UpdateInterrupts(u64 userdata) { - bool bpInt = cpreg.status.Breakpoint && cpreg.ctrl.BreakPointIntEnable; - bool ovfInt = cpreg.status.OverflowHiWatermark && cpreg.ctrl.FifoOverflowIntEnable; - bool undfInt = cpreg.status.UnderflowLoWatermark && cpreg.ctrl.FifoUnderflowIntEnable; - - DEBUG_LOG(COMMANDPROCESSOR, "\tUpdate Interrupts"); - DEBUG_LOG(COMMANDPROCESSOR, "\tBreakPointIntEnable %s | BP %s | OvF %s | UndF %s" - , cpreg.ctrl.BreakPointIntEnable ? "ON" : "OFF" - , cpreg.ctrl.BPEnable ? "ON" : "OFF" - , cpreg.ctrl.FifoOverflowIntEnable ? "ON" : "OFF" - , cpreg.ctrl.FifoUnderflowIntEnable ? "ON" : "OFF" - ); - - interruptSet = bpInt || ovfInt || undfInt; - - if (interruptSet) + if (userdata) { - DEBUG_LOG(COMMANDPROCESSOR,"Interrupt set"); + interruptSet = true; + INFO_LOG(COMMANDPROCESSOR,"Interrupt set"); g_VideoInitialize.pSetInterrupt(INT_CAUSE_CP, true); } else { - DEBUG_LOG(COMMANDPROCESSOR,"Interrupt cleared"); + interruptSet = false; + INFO_LOG(COMMANDPROCESSOR,"Interrupt cleared"); g_VideoInitialize.pSetInterrupt(INT_CAUSE_CP, false); } + interruptWaiting = false; } -void UpdateInterruptsFromVideoPlugin() +void UpdateInterruptsFromVideoPlugin(u64 userdata) { - g_VideoInitialize.pScheduleEvent_Threadsafe(0, et_UpdateInterrupts, 0); + g_VideoInitialize.pScheduleEvent_Threadsafe(0, et_UpdateInterrupts, userdata); } void ReadFifo() { - cpreg.status.ReadIdle = 0; + bool canRead = cpreg.readptr != cpreg.writeptr && writePos < maxCommandBufferWrite; + bool atBreakpoint = AtBreakpoint(); - // update rwdistance - u32 writePtr = cpreg.writeptr; - if (cpreg.readptr <= writePtr) - cpreg.rwdistance = writePtr - cpreg.readptr; - else - cpreg.rwdistance = ((cpreg.fifoend & 0xFFFFFFE0) - cpreg.fifobase) - (cpreg.readptr - writePtr); - - // overflow check - cpreg.status.OverflowHiWatermark = cpreg.rwdistance < cpreg.hiwatermark?0:1; - - // read from fifo - u8 *ptr = g_VideoInitialize.pGetMemoryPointer(cpreg.readptr); - - u32 readptr = cpreg.readptr; - u32 distance = cpreg.rwdistance; - - while (distance >= commandBufferCopySize && !cpreg.status.Breakpoint && writePos < maxCommandBufferWrite) + if (canRead && !atBreakpoint) { - // check for breakpoint - // todo - check if this is precise enough - if (cpreg.ctrl.BPEnable && (cpreg.breakpt & 0xFFFFFFE0) == (readptr & 0xFFFFFFE0)) - { - cpreg.status.Breakpoint = 1; - DEBUG_LOG(VIDEO,"Hit breakpoint at %x", readptr); - } - else + // read from fifo + u8 *ptr = g_VideoInitialize.pGetMemoryPointer(cpreg.readptr); + int bytesRead = 0; + + do { // copy to buffer - memcpy(&commandBuffer[writePos], ptr, commandBufferCopySize); - writePos += commandBufferCopySize; - ptr += commandBufferCopySize; - readptr += commandBufferCopySize; - distance -= commandBufferCopySize; - } + memcpy(&commandBuffer[writePos], ptr, GATHER_PIPE_SIZE); + writePos += GATHER_PIPE_SIZE; + bytesRead += GATHER_PIPE_SIZE; - if (readptr >= (cpreg.fifoend & 0xFFFFFFE0)) - { - readptr = cpreg.fifobase; - ptr = g_VideoInitialize.pGetMemoryPointer(readptr); - } + if (cpreg.readptr == cpreg.fifoend) + { + cpreg.readptr = cpreg.fifobase; + ptr = g_VideoInitialize.pGetMemoryPointer(cpreg.readptr); + } + else + { + cpreg.readptr += GATHER_PIPE_SIZE; + ptr += GATHER_PIPE_SIZE; + } + + canRead = cpreg.readptr != cpreg.writeptr && writePos < maxCommandBufferWrite; + atBreakpoint = AtBreakpoint(); + } while (canRead && !atBreakpoint); + + Common::AtomicAdd(cpreg.rwdistance, -bytesRead); } +} - // lock read pointer until rw distance is updated? - cpreg.readptr = readptr; - cpreg.rwdistance = distance; +void SetStatus() +{ + // overflow check + if (cpreg.rwdistance > cpreg.hiwatermark) + cpreg.status.OverflowHiWatermark = 1; // underflow check - cpreg.status.UnderflowLoWatermark = cpreg.rwdistance > cpreg.lowatermark?0:1; + if (cpreg.rwdistance < cpreg.lowatermark) + cpreg.status.UnderflowLoWatermark = 1; - cpreg.status.ReadIdle = 1; + // breakpoint + if (cpreg.ctrl.BPEnable) + { + if (cpreg.breakpt == cpreg.readptr) + { + if (!cpreg.status.Breakpoint) + INFO_LOG(COMMANDPROCESSOR, "Hit breakpoint at %x", cpreg.readptr); + cpreg.status.Breakpoint = 1; + } + } + else + { + if (cpreg.status.Breakpoint) + INFO_LOG(COMMANDPROCESSOR, "Cleared breakpoint at %x", cpreg.readptr); + cpreg.status.Breakpoint = 0; + } + + cpreg.status.ReadIdle = cpreg.readptr == cpreg.writeptr; bool bpInt = cpreg.status.Breakpoint && cpreg.ctrl.BreakPointIntEnable; bool ovfInt = cpreg.status.OverflowHiWatermark && cpreg.ctrl.FifoOverflowIntEnable; @@ -395,10 +397,16 @@ void ReadFifo() bool interrupt = bpInt || ovfInt || undfInt; - if (interrupt != interruptSet) + if (interrupt != interruptSet && !interruptWaiting) { - interruptSet = interrupt; - UpdateInterruptsFromVideoPlugin(); + u64 userdata = interrupt?1:0; + if (g_VideoInitialize.bOnThread) + { + interruptWaiting = true; + CommandProcessor::UpdateInterruptsFromVideoPlugin(userdata); + } + else + CommandProcessor::UpdateInterrupts(userdata); } } @@ -408,12 +416,16 @@ bool RunBuffer() // read fifo data to internal buffer if (cpreg.ctrl.GPReadEnable) ReadFifo(); + + SetStatus(); + + _dbg_assert_(COMMANDPROCESSOR, writePos >= readPos); g_pVideoData = &commandBuffer[readPos]; u32 availableBytes = writePos - readPos; - _dbg_assert_(VIDEO, writePos >= readPos); +#if (SW_PLUGIN) while (OpcodeDecoder::CommandRunnable(availableBytes)) { cpreg.status.CommandIdle = 0; @@ -425,11 +437,18 @@ bool RunBuffer() _dbg_assert_(VIDEO, writePos >= readPos); availableBytes = writePos - readPos; } +#else + cpreg.status.CommandIdle = 0; + OpcodeDecoder_Run(g_bSkipCurrentFrame); + + // if data was read by the opcode decoder then the video data pointer changed + readPos = g_pVideoData - &commandBuffer[0]; + _dbg_assert_(COMMANDPROCESSOR, writePos >= readPos); + availableBytes = writePos - readPos; +#endif cpreg.status.CommandIdle = 1; - _dbg_assert_(VIDEO, writePos >= readPos); - bool ranDecoder = false; // move data remaing in command buffer @@ -446,3 +465,66 @@ bool RunBuffer() } } // end of namespace CommandProcessor + + +// fifo functions +#if (SW_PLUGIN) + +void Fifo_EnterLoop(const SVideoInitialize &video_initialize) +{ + fifoStateRun = true; + + while (fifoStateRun) + { + g_VideoInitialize.pPeekMessages(); + if (!CommandProcessor::RunBuffer()) { + Common::YieldCPU(); + } + } +} + +#else + +void Fifo_EnterLoop(const SVideoInitialize &video_initialize) +{ + fifoStateRun = true; + + while (fifoStateRun) + { + g_VideoInitialize.pPeekMessages(); + if (g_ActiveConfig.bEFBAccessEnable) + VideoFifo_CheckEFBAccess(); + VideoFifo_CheckSwapRequest(); + + if (!CommandProcessor::RunBuffer()) { + Common::YieldCPU(); + } + } +} + +#endif + +void Fifo_ExitLoop() +{ + fifoStateRun = false; +} + +void Fifo_SetRendering(bool enabled) +{ + g_bSkipCurrentFrame = !enabled; +} + +// for compatibility with video common +void Fifo_Init() {} +void Fifo_Shutdown() {} +void Fifo_DoState(PointerWrap &p) {} + +u8* FAKE_GetFifoStartPtr() +{ + return CommandProcessor::commandBuffer; +} + +u8* FAKE_GetFifoEndPtr() +{ + return &CommandProcessor::commandBuffer[CommandProcessor::writePos]; +} diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.h b/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.h index ed2fc5d1ac..58e1b8cbda 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/CommandProcessor.h @@ -22,6 +22,22 @@ #include "pluginspecs_video.h" class PointerWrap; +extern volatile bool g_bSkipCurrentFrame; + +// for compatibility with video common +void Fifo_Init(); +void Fifo_Shutdown(); +void Fifo_DoState(PointerWrap &p); + +void Fifo_EnterLoop(const SVideoInitialize &video_initialize); +void Fifo_ExitLoop(); +void Fifo_SetRendering(bool bEnabled); + +// Implemented by the Video Plugin +void VideoFifo_CheckSwapRequest(); +void VideoFifo_CheckSwapRequestAt(u32 xfbAddr, u32 fbWidth, u32 fbHeight); +void VideoFifo_CheckEFBAccess(); + namespace CommandProcessor { // internal hardware addresses @@ -76,11 +92,11 @@ namespace CommandProcessor struct { unsigned GPReadEnable : 1; - unsigned BreakPointIntEnable : 1; + unsigned BPEnable : 1; unsigned FifoOverflowIntEnable : 1; unsigned FifoUnderflowIntEnable : 1; unsigned GPLinkEnable : 1; - unsigned BPEnable : 1; + unsigned BreakPointIntEnable : 1; unsigned : 10; }; u16 Hex; @@ -134,6 +150,7 @@ namespace CommandProcessor void DoState(PointerWrap &p); bool RunBuffer(); + void RunGpu(); // Read void Read16(u16& _rReturnValue, const u32 _Address); @@ -143,8 +160,8 @@ namespace CommandProcessor // for CGPFIFO void GatherPipeBursted(); - void UpdateInterrupts(); - void UpdateInterruptsFromVideoPlugin(); + void UpdateInterrupts(u64 userdata); + void UpdateInterruptsFromVideoPlugin(u64 userdata); } // end of namespace CommandProcessor diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp index c5ca3b41cd..43cd617e2d 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp @@ -26,6 +26,7 @@ #include "Statistics.h" #include "HwRasterizer.h" #include "StringUtil.h" +#include "CommandProcessor.h" #include "../../../Core/VideoCommon/Src/ImageWrite.h" namespace DebugUtil @@ -162,7 +163,7 @@ void DrawObjectBuffer(s16 x, s16 y, u8 *color, int buffer, const char *name) void OnObjectBegin() { - if (!g_SkipFrame) + if (!g_bSkipCurrentFrame) { if (g_Config.bDumpTextures && stats.thisFrame.numDrawnObjects >= g_Config.drawStart && stats.thisFrame.numDrawnObjects < g_Config.drawEnd) DumpActiveTextures(); @@ -174,7 +175,7 @@ void OnObjectBegin() void OnObjectEnd() { - if (!g_SkipFrame) + if (!g_bSkipCurrentFrame) { if (g_Config.bDumpObjects && stats.thisFrame.numDrawnObjects >= g_Config.drawStart && stats.thisFrame.numDrawnObjects < g_Config.drawEnd) DumpEfb(StringFromFormat("%s/object%i.tga", FULL_FRAMES_DIR, stats.thisFrame.numDrawnObjects).c_str()); @@ -199,7 +200,7 @@ void OnObjectEnd() void OnFrameEnd() { - if (!g_SkipFrame) + if (!g_bSkipCurrentFrame) { if (g_Config.bDumpFrames) { @@ -207,9 +208,6 @@ void OnFrameEnd() DumpDepth(StringFromFormat("%s/frame%i_depth.tga", FULL_FRAMES_DIR, stats.frameCount).c_str()); } } - - g_SkipFrame = skipFrames > 0; - skipFrames = g_SkipFrame?(skipFrames-1):g_Config.nFrameSkip; } } \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp index 96ecf82ba3..1bf9a163b1 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp @@ -25,6 +25,7 @@ #include "VideoConfig.h" #include "DebugUtil.h" #include "HwRasterizer.h" +#include "CommandProcessor.h" namespace EfbCopy @@ -73,7 +74,7 @@ namespace EfbCopy if (bpmem.triggerEFBCopy.copy_to_xfb) DebugUtil::OnFrameEnd(); - if (!g_SkipFrame) + if (!g_bSkipCurrentFrame) { if (bpmem.triggerEFBCopy.copy_to_xfb) { @@ -95,5 +96,13 @@ namespace EfbCopy ClearEfb(); } } + else + { + if (bpmem.triggerEFBCopy.copy_to_xfb) + { + // no frame rendered but tell that a frame has finished for frame skip counter + g_VideoInitialize.pCopiedToXFB(false); + } + } } } \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp index 8b95b905af..5c27e92c42 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp @@ -27,6 +27,7 @@ #include "VertexLoader.h" #include "Statistics.h" #include "DebugUtil.h" +#include "CommandProcessor.h" typedef void (*DecodingFunction)(u32); DecodingFunction currentFunction = NULL; @@ -47,7 +48,7 @@ void DecodePrimitiveStream(u32 iBufferSize) { u32 vertexSize = vertexLoader.GetVertexSize(); - if(g_SkipFrame) + if(g_bSkipCurrentFrame) { while (streamSize > 0 && iBufferSize >= vertexSize) { diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp index 06ff420c56..d8fdefb11a 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp @@ -36,8 +36,6 @@ Config::Config() bHwRasterizer = false; - nFrameSkip = 0; - drawStart = 0; drawEnd = 100000; } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h index ea6d9511d7..12ba8ba78f 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h @@ -42,8 +42,6 @@ struct Config bool bHwRasterizer; - u32 nFrameSkip; - u32 drawStart; u32 drawEnd; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp index 7a7d57a064..e3378377dc 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp @@ -37,9 +37,7 @@ PLUGIN_GLOBALS* globals = NULL; -static volatile bool fifoStateRun = false; SVideoInitialize g_VideoInitialize; -bool g_SkipFrame; void GetDllInfo (PLUGIN_INFO* _PluginInfo) @@ -76,8 +74,6 @@ void Initialize(void *init) SVideoInitialize *_pVideoInitialize = (SVideoInitialize*)init; g_VideoInitialize = *_pVideoInitialize; - g_SkipFrame = false; - g_Config.Load(); InitBPMemory(); @@ -158,20 +154,12 @@ void Video_Screenshot(const char *_szFilename) // ------------------------------- void Video_EnterLoop() { - fifoStateRun = true; - - while (fifoStateRun) - { - g_VideoInitialize.pPeekMessages(); - if (!CommandProcessor::RunBuffer()) { - Common::SleepCurrentThread(1); - } - } + Fifo_EnterLoop(g_VideoInitialize); } void Video_ExitLoop() { - fifoStateRun = false; + Fifo_ExitLoop(); } void Video_AddMessage(const char* pstr, u32 milliseconds) @@ -179,7 +167,8 @@ void Video_AddMessage(const char* pstr, u32 milliseconds) } void Video_SetRendering(bool bEnabled) -{ +{ + Fifo_SetRendering(bEnabled); } void Video_CommandProcessorRead16(u16& _rReturnValue, const u32 _Address) diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/main.h b/Source/Plugins/Plugin_VideoSoftware/Src/main.h index e2da80d973..f575ddd505 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/main.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/main.h @@ -22,6 +22,4 @@ extern SVideoInitialize g_VideoInitialize; -extern bool g_SkipFrame; - #endif