other experimental commit:

applied mlkbouba patch to make Mario Strikers Charged Football work (i do not own the game so please test).
some minor tweaks to the plugins to improve performance. for game that do not use xfb the best settings are dual core enabled, audio throtle disabled, frame limit set to the desired value, and xfb off.
change the frameskip calculations to use fps instead of vps as in dual core vps != fps caused by unresolved sync problems, till this problems are fixed the best for game play is calculate times in base of fps.
please test and let me know the results

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5239 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Rodolfo Osvaldo Bogado 2010-03-25 22:01:33 +00:00
parent 9dae690951
commit beee4f4804
5 changed files with 22 additions and 17 deletions

View File

@ -595,14 +595,14 @@ void ScreenShot()
// This should only be called from VI
void VideoThrottle()
{
u32 TargetVPS = (SConfig::GetInstance().m_Framelimit > 1) ?
u32 TargetFPS = (SConfig::GetInstance().m_Framelimit > 1) ?
SConfig::GetInstance().m_Framelimit * 10 : VideoInterface::TargetRefreshRate;
// When frame limit is NOT off
if (SConfig::GetInstance().m_Framelimit)
{
// Make the limiter a bit loose
u32 frametime = DrawnVideo * 1000 / ++TargetVPS;
u32 frametime = DrawnFrame * 1000 / ++TargetFPS;
while ((u32)Timer.GetTimeDifference() < frametime)
Common::YieldCPU();
//Common::SleepCurrentThread(1);
@ -616,7 +616,7 @@ void VideoThrottle()
u32 FPS = Common::AtomicLoad(DrawnFrame) * 1000 / ElapseTime;
u32 VPS = --DrawnVideo * 1000 / ElapseTime;
u32 Speed = VPS * 100 / VideoInterface::TargetRefreshRate;
u32 Speed = FPS * 100 / VideoInterface::TargetRefreshRate;
// Settings are shown the same for both extended and summary info
std::string SSettings = StringFromFormat("%s %s",

View File

@ -86,6 +86,7 @@ static bool s_bScreenshot = false;
static Common::CriticalSection s_criticalScreenshot;
static char s_sScreenshotName[1024];
static LPDIRECT3DSURFACE9 ScreenShootMEMSurface = NULL;
extern volatile u32 s_swapRequested;
// State translation lookup tables
@ -566,13 +567,13 @@ void CheckForResize()
}
}
extern volatile u32 s_swapRequested;
void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc)
{
if(!fbWidth || !fbHeight)
return;
VideoFifo_CheckEFBAccess();
//VideoFifo_CheckEFBAccess();
// If we're about to write to a requested XFB, make sure the previous
// contents make it to the screen first.
if (g_ActiveConfig.bUseXFB)

View File

@ -435,8 +435,8 @@ u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y)
if (g_VideoInitialize.bOnThread)
{
while (Common::AtomicLoadAcquire(s_efbAccessRequested) && !s_FifoShuttingDown)
Common::SleepCurrentThread(1);
//Common::YieldCPU();
//Common::SleepCurrentThread(1);
Common::YieldCPU();
}
else
VideoFifo_CheckEFBAccess();

View File

@ -775,18 +775,20 @@ void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaE
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glClear(bits);
}
static bool XFBWrited = false;
void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc)
{
s_skipSwap = g_bSkipCurrentFrame;
VideoFifo_CheckEFBAccess();
//VideoFifo_CheckEFBAccess();
// If we're about to write to a requested XFB, make sure the previous
// contents make it to the screen first.
VideoFifo_CheckSwapRequestAt(xfbAddr, fbWidth, fbHeight);
if (g_ActiveConfig.bUseXFB)
VideoFifo_CheckSwapRequestAt(xfbAddr, fbWidth, fbHeight);
g_framebufferManager.CopyToXFB(xfbAddr, fbWidth, fbHeight, sourceRc);
XFBWrited = true;
// XXX: Without the VI, how would we know what kind of field this is? So
// just use progressive.
if (!g_ActiveConfig.bUseXFB)
@ -804,7 +806,8 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
g_VideoInitialize.pCopiedToXFB(false);
return;
}
if(!XFBWrited)
return;
if (field == FIELD_LOWER)
xfbAddr -= fbWidth * 2;
@ -1142,6 +1145,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
// SaveTexture("tex.tga", GL_TEXTURE_RECTANGLE_ARB, s_FakeZTarget, GetTargetWidth(), GetTargetHeight());
g_VideoInitialize.pCopiedToXFB(false);
XFBWrited = false;
}
// Create On-Screen-Messages

View File

@ -516,14 +516,14 @@ void VideoFifo_CheckSwapRequestAt(u32 xfbAddr, u32 fbWidth, u32 fbHeight)
// Run from the CPU thread (from VideoInterface.cpp)
void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
{
if (s_PluginInitialized)
if (s_PluginInitialized && g_ActiveConfig.bUseXFB)
{
// Make sure previous swap request has made it to the screen
if (g_VideoInitialize.bOnThread)
{
while (Common::AtomicLoadAcquire(s_swapRequested) && !s_FifoShuttingDown)
Common::SleepCurrentThread(1);
//Common::YieldCPU();
//Common::SleepCurrentThread(1);
Common::YieldCPU();
}
else
VideoFifo_CheckSwapRequest();
@ -574,8 +574,8 @@ u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y)
if (g_VideoInitialize.bOnThread)
{
while (Common::AtomicLoadAcquire(s_efbAccessRequested) && !s_FifoShuttingDown)
Common::SleepCurrentThread(1);
//Common::YieldCPU();
//Common::SleepCurrentThread(1);
Common::YieldCPU();
}
else
VideoFifo_CheckEFBAccess();