Removed "Automatic frame skipping" option, will now be activated with throttling

Throttling now uses (actually rapes) the Smooth60FPS functionality, so that throttling is no more skippy.
This commit is contained in:
spacy51 2007-12-26 16:09:21 +00:00
parent 1af02fb5ae
commit 3931590c65
8 changed files with 106 additions and 122 deletions

View File

@ -122,8 +122,6 @@ BEGIN_MESSAGE_MAP(MainWnd, CWnd)
ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_150, OnOptionsFrameskipThrottle150) ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_150, OnOptionsFrameskipThrottle150)
ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_200, OnOptionsFrameskipThrottle200) ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_200, OnOptionsFrameskipThrottle200)
ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_OTHER, OnOptionsFrameskipThrottleOther) ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_OTHER, OnOptionsFrameskipThrottleOther)
ON_COMMAND(ID_OPTIONS_FRAMESKIP_AUTOMATIC, OnOptionsFrameskipAutomatic)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_AUTOMATIC, OnUpdateOptionsFrameskipAutomatic)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_0, OnUpdateOptionsVideoFrameskip0) ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_0, OnUpdateOptionsVideoFrameskip0)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_1, OnUpdateOptionsVideoFrameskip1) ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_1, OnUpdateOptionsVideoFrameskip1)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_2, OnUpdateOptionsVideoFrameskip2) ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_2, OnUpdateOptionsVideoFrameskip2)
@ -662,7 +660,7 @@ bool MainWnd::FileRun()
theApp.frameskipadjust = 0; theApp.frameskipadjust = 0;
theApp.renderedFrames = 0; theApp.renderedFrames = 0;
theApp.autoFrameSkipLastTime = theApp.throttleLastTime = systemGetClock(); theApp.autoFrameSkipLastTime = systemGetClock();
theApp.rewindCount = 0; theApp.rewindCount = 0;
theApp.rewindCounter = 0; theApp.rewindCounter = 0;

View File

@ -148,8 +148,6 @@ class MainWnd : public CWnd
afx_msg void OnOptionsFrameskipThrottle150(); afx_msg void OnOptionsFrameskipThrottle150();
afx_msg void OnOptionsFrameskipThrottle200(); afx_msg void OnOptionsFrameskipThrottle200();
afx_msg void OnOptionsFrameskipThrottleOther(); afx_msg void OnOptionsFrameskipThrottleOther();
afx_msg void OnOptionsFrameskipAutomatic();
afx_msg void OnUpdateOptionsFrameskipAutomatic(CCmdUI* pCmdUI);
afx_msg void OnUpdateOptionsVideoFrameskip0(CCmdUI* pCmdUI); afx_msg void OnUpdateOptionsVideoFrameskip0(CCmdUI* pCmdUI);
afx_msg void OnUpdateOptionsVideoFrameskip1(CCmdUI* pCmdUI); afx_msg void OnUpdateOptionsVideoFrameskip1(CCmdUI* pCmdUI);
afx_msg void OnUpdateOptionsVideoFrameskip2(CCmdUI* pCmdUI); afx_msg void OnUpdateOptionsVideoFrameskip2(CCmdUI* pCmdUI);

View File

@ -53,110 +53,101 @@ extern int emulating;
extern void CPUUpdateRenderBuffers(bool force); extern void CPUUpdateRenderBuffers(bool force);
void MainWnd::OnOptionsFrameskipThrottleNothrottle() void MainWnd::OnOptionsFrameskipThrottleNothrottle()
{ {
theApp.throttle = 0; theApp.updateThrottle( 0 ); // disable
theApp.autoFrameSkip = false;
} }
void MainWnd::OnUpdateOptionsFrameskipThrottleNothrottle(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottleNothrottle(CCmdUI* pCmdUI)
{ {
pCmdUI->SetCheck(theApp.throttle == 0); pCmdUI->SetCheck( theApp.throttle == 0 );
} }
void MainWnd::OnOptionsFrameskipThrottle25() void MainWnd::OnOptionsFrameskipThrottle25()
{ {
theApp.throttle = 25; theApp.updateThrottle( 25 );
theApp.autoFrameSkip = false;
} }
void MainWnd::OnUpdateOptionsFrameskipThrottle25(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottle25(CCmdUI* pCmdUI)
{ {
pCmdUI->SetCheck(theApp.throttle == 25); pCmdUI->SetCheck( theApp.throttle == 25 );
} }
void MainWnd::OnOptionsFrameskipThrottle50() void MainWnd::OnOptionsFrameskipThrottle50()
{ {
theApp.throttle = 50; theApp.updateThrottle( 50 );
theApp.autoFrameSkip = false;
} }
void MainWnd::OnUpdateOptionsFrameskipThrottle50(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottle50(CCmdUI* pCmdUI)
{ {
pCmdUI->SetCheck(theApp.throttle == 50); pCmdUI->SetCheck( theApp.throttle == 50 );
} }
void MainWnd::OnOptionsFrameskipThrottle100() void MainWnd::OnOptionsFrameskipThrottle100()
{ {
theApp.throttle = 100; theApp.updateThrottle( 100 );
theApp.autoFrameSkip = false;
} }
void MainWnd::OnUpdateOptionsFrameskipThrottle100(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottle100(CCmdUI* pCmdUI)
{ {
pCmdUI->SetCheck(theApp.throttle == 100); pCmdUI->SetCheck( theApp.throttle == 100 );
} }
void MainWnd::OnOptionsFrameskipThrottle150() void MainWnd::OnOptionsFrameskipThrottle150()
{ {
theApp.throttle = 150; theApp.updateThrottle( 150 );
theApp.autoFrameSkip = false;
} }
void MainWnd::OnUpdateOptionsFrameskipThrottle150(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottle150(CCmdUI* pCmdUI)
{ {
pCmdUI->SetCheck(theApp.throttle == 150); pCmdUI->SetCheck( theApp.throttle == 150 );
} }
void MainWnd::OnOptionsFrameskipThrottle200() void MainWnd::OnOptionsFrameskipThrottle200()
{ {
theApp.throttle = 200; theApp.updateThrottle( 200 );
theApp.autoFrameSkip = false;
} }
void MainWnd::OnUpdateOptionsFrameskipThrottle200(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottle200(CCmdUI* pCmdUI)
{ {
pCmdUI->SetCheck(theApp.throttle == 200); pCmdUI->SetCheck( theApp.throttle == 200 );
} }
void MainWnd::OnOptionsFrameskipThrottleOther() void MainWnd::OnOptionsFrameskipThrottleOther()
{ {
Throttle dlg; Throttle dlg;
int v = (int)dlg.DoModal(); unsigned short v = (unsigned short)dlg.DoModal();
if( v ) { if( v ) {
theApp.throttle = v; theApp.updateThrottle( v );
theApp.autoFrameSkip = false;
} }
} }
void MainWnd::OnUpdateOptionsFrameskipThrottleOther(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsFrameskipThrottleOther(CCmdUI* pCmdUI)
{ {
int throttle = theApp.throttle; pCmdUI->SetCheck(
pCmdUI->SetCheck(throttle != 0 && throttle != 25 && ( theApp.throttle != 0 ) &&
throttle != 50 && throttle != 100 && ( theApp.throttle != 25 ) &&
throttle != 150 && throttle != 200); ( theApp.throttle != 50 ) &&
( theApp.throttle != 100 ) &&
( theApp.throttle != 150 ) &&
( theApp.throttle != 200 ) );
} }
void MainWnd::OnOptionsFrameskipAutomatic()
{
theApp.autoFrameSkip = !theApp.autoFrameSkip;
if(!theApp.autoFrameSkip && emulating)
theApp.updateFrameSkip();
else
{
theApp.throttle = false;
frameSkip = 0;
systemFrameSkip = 0;
}
}
void MainWnd::OnUpdateOptionsFrameskipAutomatic(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(theApp.autoFrameSkip);
}
BOOL MainWnd::OnOptionsFrameskip(UINT nID) BOOL MainWnd::OnOptionsFrameskip(UINT nID)
{ {
@ -174,7 +165,7 @@ BOOL MainWnd::OnOptionsFrameskip(UINT nID)
} }
if(emulating) if(emulating)
theApp.updateFrameSkip(); theApp.updateFrameSkip();
theApp.autoFrameSkip = false; theApp.updateThrottle( 0 );
return TRUE; return TRUE;
break; break;
case ID_OPTIONS_VIDEO_FRAMESKIP_6: case ID_OPTIONS_VIDEO_FRAMESKIP_6:
@ -188,7 +179,7 @@ BOOL MainWnd::OnOptionsFrameskip(UINT nID)
} }
if(emulating) if(emulating)
theApp.updateFrameSkip(); theApp.updateFrameSkip();
theApp.autoFrameSkip = false; theApp.updateThrottle( 0 );
return TRUE; return TRUE;
break; break;
} }

View File

@ -286,8 +286,11 @@ void OpenAL::write()
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
if( nBuffersProcessed == theApp.oalBufferCount ) { if( nBuffersProcessed == theApp.oalBufferCount ) {
static int i = 0; if( theApp.throttle >= 100 ) {
log( "OpenAL: Buffers were not refilled fast enough (%i)\n", i++ ); // we only want to know about it when we are emulating at full speed (or faster)
static int i = 0;
log( "OpenAL: Buffers were not refilled fast enough (%i)\n", i++ );
}
} }
if( !speedup && synchronize && !theApp.throttle ) { if( !speedup && synchronize && !theApp.throttle ) {

View File

@ -181,7 +181,7 @@ extern "C" bool cpu_mmx;
namespace Sm60FPS namespace Sm60FPS
{ {
float K_fCpuSpeed = 98.0f; float K_fCpuSpeed = 100.0f; // was 98.0f before, but why?
float K_fTargetFps = 60.0f * K_fCpuSpeed / 100; float K_fTargetFps = 60.0f * K_fCpuSpeed / 100;
float K_fDT = 1000.0f / K_fTargetFps; float K_fDT = 1000.0f / K_fTargetFps;
@ -280,7 +280,6 @@ VBA::VBA()
tripleBuffering = true; tripleBuffering = true;
autoHideMenu = false; autoHideMenu = false;
throttle = 0; throttle = 0;
throttleLastTime = 0;
autoFrameSkipLastTime = 0; autoFrameSkipLastTime = 0;
autoFrameSkip = false; autoFrameSkip = false;
vsync = false; vsync = false;
@ -919,6 +918,25 @@ void VBA::updateFilter()
} }
void VBA::updateThrottle( unsigned short throttle )
{
this->throttle = throttle;
if( throttle == 0 ) {
autoFrameSkip = false;
return;
} else {
Sm60FPS::K_fCpuSpeed = (float)throttle;
Sm60FPS::K_fTargetFps = 60.0f * Sm60FPS::K_fCpuSpeed / 100;
Sm60FPS::K_fDT = 1000.0f / Sm60FPS::K_fTargetFps;
autoFrameSkip = true;
frameSkip = 0;
systemFrameSkip = 0;
return;
}
}
void VBA::updateMenuBar() void VBA::updateMenuBar()
{ {
if(menu != NULL) { if(menu != NULL) {
@ -1118,32 +1136,20 @@ void systemFrame()
void system10Frames(int rate) void system10Frames(int rate)
{ {
u32 time = systemGetClock(); if( theApp.autoFrameSkip )
{
if (theApp.autoFrameSkip) u32 time = systemGetClock();
{ u32 diff = time - theApp.autoFrameSkipLastTime;
u32 diff = time - theApp.autoFrameSkipLastTime; theApp.autoFrameSkipLastTime = time;
Sm60FPS::nCurSpeed = 100; if( diff ) {
// countermeasure against div/0 when debugging
if (diff) Sm60FPS::nCurSpeed = (1000000/rate)/diff;
Sm60FPS::nCurSpeed = (1000000/rate)/diff; } else {
} Sm60FPS::nCurSpeed = 100;
}
}
if(!theApp.wasPaused && theApp.throttle) {
if(!speedup) {
u32 diff = time - theApp.throttleLastTime;
int target = (1000000/(rate*theApp.throttle));
int d = (target - diff);
if(d > 0) {
Sleep(d);
}
}
theApp.throttleLastTime = systemGetClock();
}
if(theApp.rewindMemory) { if(theApp.rewindMemory) {
if(++theApp.rewindCounter >= (theApp.rewindTimer)) { if(++theApp.rewindCounter >= (theApp.rewindTimer)) {
theApp.rewindSaveNeeded = true; theApp.rewindSaveNeeded = true;
@ -1158,7 +1164,6 @@ void system10Frames(int rate)
} }
theApp.wasPaused = false; theApp.wasPaused = false;
theApp.autoFrameSkipLastTime = time;
} }
void systemScreenMessage(const char *msg) void systemScreenMessage(const char *msg)
@ -1412,8 +1417,6 @@ void VBA::loadSettings()
if(gbFrameSkip < 0 || gbFrameSkip > 9) if(gbFrameSkip < 0 || gbFrameSkip > 9)
gbFrameSkip = 0; gbFrameSkip = 0;
autoFrameSkip = regQueryDwordValue("autoFrameSkip", FALSE) ? TRUE : FALSE;
vsync = regQueryDwordValue("vsync", false) ? true : false ; vsync = regQueryDwordValue("vsync", false) ? true : false ;
synchronize = regQueryDwordValue("synchronize", 1) ? true : false; synchronize = regQueryDwordValue("synchronize", 1) ? true : false;
fullScreenStretch = regQueryDwordValue("stretch", 0) ? true : false; fullScreenStretch = regQueryDwordValue("stretch", 0) ? true : false;
@ -1676,9 +1679,7 @@ void VBA::loadSettings()
fsMaxScale = regQueryDwordValue("fsMaxScale", 0); fsMaxScale = regQueryDwordValue("fsMaxScale", 0);
throttle = regQueryDwordValue("throttle", 0); updateThrottle( (unsigned short)regQueryDwordValue( "throttle", 0 ) );
if(throttle < 5 || throttle > 1000)
throttle = 0;
linktimeout = regQueryDwordValue("LinkTimeout", 1000); linktimeout = regQueryDwordValue("LinkTimeout", 1000);
@ -1690,12 +1691,6 @@ void VBA::loadSettings()
linkenable = regQueryDwordValue("linkEnabled", false) ? true : false; linkenable = regQueryDwordValue("linkEnabled", false) ? true : false;
lanlink.active = regQueryDwordValue("LAN", 0) ? true : false; lanlink.active = regQueryDwordValue("LAN", 0) ? true : false;
if (autoFrameSkip)
{
throttle = 0;
frameSkip = 0;
systemFrameSkip = 0;
}
Sm60FPS::bSaveMoreCPU = regQueryDwordValue("saveMoreCPU", 0); Sm60FPS::bSaveMoreCPU = regQueryDwordValue("saveMoreCPU", 0);
@ -2538,8 +2533,6 @@ void VBA::saveSettings()
regSetDwordValue("gbFrameSkip", gbFrameSkip); regSetDwordValue("gbFrameSkip", gbFrameSkip);
regSetDwordValue("autoFrameSkip", autoFrameSkip);
regSetDwordValue("vsync", vsync); regSetDwordValue("vsync", vsync);
regSetDwordValue("synchronize", synchronize); regSetDwordValue("synchronize", synchronize);
regSetDwordValue("stretch", fullScreenStretch); regSetDwordValue("stretch", fullScreenStretch);

View File

@ -143,8 +143,7 @@ class VBA : public CWinApp
int captureFormat; int captureFormat;
bool tripleBuffering; bool tripleBuffering;
bool autoHideMenu; bool autoHideMenu;
int throttle; unsigned short throttle;
u32 throttleLastTime;
u32 autoFrameSkipLastTime; u32 autoFrameSkipLastTime;
bool autoFrameSkip; bool autoFrameSkip;
bool vsync; bool vsync;
@ -236,6 +235,7 @@ class VBA : public CWinApp
void adjustDestRect(); void adjustDestRect();
void updateIFB(); void updateIFB();
void updateFilter(); void updateFilter();
void updateThrottle( unsigned short throttle );
void updateMenuBar(); void updateMenuBar();
void winAddUpdateListener(IUpdateListener *l); void winAddUpdateListener(IUpdateListener *l);
void winRemoveUpdateListener(IUpdateListener *l); void winRemoveUpdateListener(IUpdateListener *l);

View File

@ -1623,34 +1623,6 @@ BEGIN
MENUITEM "Stretch to &fit", ID_OPTIONS_VIDEO_FULLSCREENSTRETCHTOFIT MENUITEM "Stretch to &fit", ID_OPTIONS_VIDEO_FULLSCREENSTRETCHTOFIT
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
POPUP "&Frame Skip"
BEGIN
MENUITEM "&Automatic", ID_OPTIONS_FRAMESKIP_AUTOMATIC
MENUITEM SEPARATOR
MENUITEM "&No frame skip", ID_OPTIONS_VIDEO_FRAMESKIP_0
MENUITEM "&1 frame", ID_OPTIONS_VIDEO_FRAMESKIP_1
MENUITEM "&2 frames", ID_OPTIONS_VIDEO_FRAMESKIP_2
MENUITEM "&3 frames", ID_OPTIONS_VIDEO_FRAMESKIP_3
MENUITEM "&4 frames", ID_OPTIONS_VIDEO_FRAMESKIP_4
MENUITEM "&5 frames", ID_OPTIONS_VIDEO_FRAMESKIP_5
MENUITEM "&6 frames", ID_OPTIONS_VIDEO_FRAMESKIP_6
MENUITEM "&7 frames", ID_OPTIONS_VIDEO_FRAMESKIP_7
MENUITEM "&8 frames", ID_OPTIONS_VIDEO_FRAMESKIP_8
MENUITEM "&9 frames", ID_OPTIONS_VIDEO_FRAMESKIP_9
MENUITEM SEPARATOR
MENUITEM "Turbo mode", ID_OPTIONS_EMULATOR_SPEEDUPTOGGLE
END
POPUP "Throttle"
BEGIN
MENUITEM "No throttle", ID_OPTIONS_FRAMESKIP_THROTTLE_NOTHROTTLE
MENUITEM "25%", ID_OPTIONS_FRAMESKIP_THROTTLE_25
MENUITEM "50%", ID_OPTIONS_FRAMESKIP_THROTTLE_50
MENUITEM "100%", ID_OPTIONS_FRAMESKIP_THROTTLE_100
MENUITEM "150%", ID_OPTIONS_FRAMESKIP_THROTTLE_150
MENUITEM "200%", ID_OPTIONS_FRAMESKIP_THROTTLE_200
MENUITEM "&Other...", ID_OPTIONS_FRAMESKIP_THROTTLE_OTHER
END
MENUITEM SEPARATOR
MENUITEM "D&isable status messages", ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES MENUITEM "D&isable status messages", ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES
END END
POPUP "&Pixel Filter" POPUP "&Pixel Filter"
@ -1780,6 +1752,34 @@ BEGIN
END END
MENUITEM "Rewind interval...", ID_OPTIONS_EMULATOR_REWINDINTERVAL MENUITEM "Rewind interval...", ID_OPTIONS_EMULATOR_REWINDINTERVAL
END END
POPUP "&Speed"
BEGIN
POPUP "&Throttle"
BEGIN
MENUITEM "25%", ID_OPTIONS_FRAMESKIP_THROTTLE_25
MENUITEM "50%", ID_OPTIONS_FRAMESKIP_THROTTLE_50
MENUITEM "100%", ID_OPTIONS_FRAMESKIP_THROTTLE_100
MENUITEM "150%", ID_OPTIONS_FRAMESKIP_THROTTLE_150
MENUITEM "200%", ID_OPTIONS_FRAMESKIP_THROTTLE_200
MENUITEM "&Other...", ID_OPTIONS_FRAMESKIP_THROTTLE_OTHER
MENUITEM "No throttle", ID_OPTIONS_FRAMESKIP_THROTTLE_NOTHROTTLE
END
MENUITEM SEPARATOR
POPUP "&Frame Skip"
BEGIN
MENUITEM "&No frame skip", ID_OPTIONS_VIDEO_FRAMESKIP_0
MENUITEM "&1 frame", ID_OPTIONS_VIDEO_FRAMESKIP_1
MENUITEM "&2 frames", ID_OPTIONS_VIDEO_FRAMESKIP_2
MENUITEM "&3 frames", ID_OPTIONS_VIDEO_FRAMESKIP_3
MENUITEM "&4 frames", ID_OPTIONS_VIDEO_FRAMESKIP_4
MENUITEM "&5 frames", ID_OPTIONS_VIDEO_FRAMESKIP_5
MENUITEM "&6 frames", ID_OPTIONS_VIDEO_FRAMESKIP_6
MENUITEM "&7 frames", ID_OPTIONS_VIDEO_FRAMESKIP_7
MENUITEM "&8 frames", ID_OPTIONS_VIDEO_FRAMESKIP_8
MENUITEM "&9 frames", ID_OPTIONS_VIDEO_FRAMESKIP_9
END
MENUITEM "Turbo mode", ID_OPTIONS_EMULATOR_SPEEDUPTOGGLE
END
MENUITEM SEPARATOR MENUITEM SEPARATOR
POPUP "&Emulator" POPUP "&Emulator"
BEGIN BEGIN

View File

@ -821,13 +821,14 @@
#define ID_OUTPUTAPI_OALCONFIGURATION 40350 #define ID_OUTPUTAPI_OALCONFIGURATION 40350
#define ID_RENDERAPI_FILTER 40351 #define ID_RENDERAPI_FILTER 40351
#define ID_OPTIONS_VIDEO_RENDEROPTIONS_GLSLSHADERS 40352 #define ID_OPTIONS_VIDEO_RENDEROPTIONS_GLSLSHADERS 40352
#define ID_OPTIONS_SPEED 40353
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 161 #define _APS_NEXT_RESOURCE_VALUE 161
#define _APS_NEXT_COMMAND_VALUE 40353 #define _APS_NEXT_COMMAND_VALUE 40354
#define _APS_NEXT_CONTROL_VALUE 1272 #define _APS_NEXT_CONTROL_VALUE 1272
#define _APS_NEXT_SYMED_VALUE 103 #define _APS_NEXT_SYMED_VALUE 103
#endif #endif