aboutsummaryrefslogtreecommitdiff
path: root/plugins/dfxvideo/gpu.c
diff options
context:
space:
mode:
authornotaz2011-03-12 02:50:00 +0200
committernotaz2011-03-14 00:59:21 +0200
commit79f584137c0e0d77047e54e3ac220575cb4c3354 (patch)
tree6f4432052802ac893b8ca6984b35e43266dae9c5 /plugins/dfxvideo/gpu.c
parent72bb6fddbe46f31e2cc7ae5c2537efde727e293c (diff)
downloadpcsx_rearmed-79f584137c0e0d77047e54e3ac220575cb4c3354.tar.gz
pcsx_rearmed-79f584137c0e0d77047e54e3ac220575cb4c3354.tar.bz2
pcsx_rearmed-79f584137c0e0d77047e54e3ac220575cb4c3354.zip
dfxvideo: make fskip update on vsync too
Diffstat (limited to 'plugins/dfxvideo/gpu.c')
-rw-r--r--plugins/dfxvideo/gpu.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/plugins/dfxvideo/gpu.c b/plugins/dfxvideo/gpu.c
index 8e36f8e..36171b5 100644
--- a/plugins/dfxvideo/gpu.c
+++ b/plugins/dfxvideo/gpu.c
@@ -51,6 +51,8 @@ DATAREGISTERMODES DataWriteMode;
DATAREGISTERMODES DataReadMode;
BOOL bSkipNextFrame = FALSE;
+BOOL fskip_frameReady;
+DWORD lace_count_since_flip;
DWORD dwLaceCnt=0;
short sDispWidths[8] = {256,320,512,640,368,384,512,640};
PSXDisplay_t PSXDisplay;
@@ -205,22 +207,36 @@ static void updateDisplay(void) // UPDATE DISPLAY
if(UseFrameSkip) // skip ?
{
- if(!bSkipNextFrame) DoBufferSwap(); // -> to skip or not to skip
- if(dwActFixes&0xa0) // -> pc fps calculation fix/old skipping fix
+ if(fskip_frameReady)
{
- if((fps_skip < fFrameRateHz) && !(bSkipNextFrame)) // -> skip max one in a row
- {bSkipNextFrame = TRUE; fps_skip=fFrameRateHz;}
- else bSkipNextFrame = FALSE;
+ DoBufferSwap(); // -> to skip or not to skip
+ fskip_frameReady=FALSE;
+ bDoVSyncUpdate=FALSE; // vsync done
}
- else FrameSkip();
}
else // no skip ?
{
bSkipNextFrame = FALSE;
DoBufferSwap(); // -> swap
+ bDoVSyncUpdate=FALSE; // vsync done
}
+}
+
+static void decideSkip(void)
+{
+ if(!bDoVSyncUpdate)
+ return;
+
+ lace_count_since_flip=0;
+ fskip_frameReady=!bSkipNextFrame;
- bDoVSyncUpdate=FALSE; // vsync done
+ if(dwActFixes&0xa0) // -> pc fps calculation fix/old skipping fix
+ {
+ if((fps_skip < fFrameRateHz) && !bSkipNextFrame) // -> skip max one in a row
+ {bSkipNextFrame = TRUE; fps_skip=fFrameRateHz;}
+ else bSkipNextFrame = FALSE;
+ }
+ else FrameSkip();
}
////////////////////////////////////////////////////////////////////////
@@ -376,7 +392,7 @@ static void updateDisplayIfChanged(void) // UPDATE DISPLAY
if(iFrameLimit==2) SetAutoFrameCap(); // -> set it
- if(UseFrameSkip) updateDisplay(); // stupid stuff when frame skipping enabled
+ if(UseFrameSkip) decideSkip(); // stupid stuff when frame skipping enabled
}
////////////////////////////////////////////////////////////////////////
@@ -405,20 +421,24 @@ void CALLBACK GPUupdateLace(void) // VSYNC
{
if(dwActFixes&64) // lazy screen update fix
{
- if(bDoLazyUpdate && !UseFrameSkip)
+ if(bDoLazyUpdate)
updateDisplay();
bDoLazyUpdate=FALSE;
}
else
{
- if((bDoVSyncUpdate && !UseFrameSkip) // some primitives drawn?
- || bDoVSyncUpdate >= 8) // not syned for a while
+ if(bDoVSyncUpdate) // some primitives drawn?
updateDisplay(); // -> update display
}
}
- if(bDoVSyncUpdate) // if display not synced
- bDoVSyncUpdate++; // count how many times
+ if(UseFrameSkip) { // frame over-skip guard
+ lace_count_since_flip++;
+ if(lace_count_since_flip > 8) {
+ bSkipNextFrame=FALSE;
+ fskip_frameReady=TRUE;
+ }
+ }
}
////////////////////////////////////////////////////////////////////////
@@ -555,7 +575,7 @@ void CALLBACK GPUwriteStatus(uint32_t gdata) // WRITE STATUS
if (!(PSXDisplay.Interlaced)) // stupid frame skipping option
{
- if(UseFrameSkip) updateDisplay();
+ if(UseFrameSkip) decideSkip();
if(dwActFixes&64) bDoLazyUpdate=TRUE;
}
}return;