GSdx: Implement DX9 "on the fly" vsync enabler/disabler, and fix some dx9 vsync bugs in legacy gui (hopefully)

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2302 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2009-12-04 04:50:49 +00:00
parent a3dee78c6c
commit 2675957851
4 changed files with 22 additions and 8 deletions

View File

@ -257,6 +257,7 @@ EXPORT_C_(INT32) GSopen(void* dsp, char* title, int mt)
{ {
int renderer; int renderer;
// Legacy GUI expects to acquire vsync from the configuration files.
s_vsync = !!theApp.GetConfig("vsync", 0); s_vsync = !!theApp.GetConfig("vsync", 0);
if(mt == 2) if(mt == 2)
@ -573,6 +574,8 @@ EXPORT_C GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
uint8 regs[0x2000]; uint8 regs[0x2000];
GSsetBaseMem(regs); GSsetBaseMem(regs);
s_vsync = !!theApp.GetConfig("vsync", 0);
HWND hWnd = NULL; HWND hWnd = NULL;
_GSopen(&hWnd, "", renderer); _GSopen(&hWnd, "", renderer);

View File

@ -239,6 +239,19 @@ bool GSDevice9::Create(GSWnd* wnd)
return true; return true;
} }
void GSDevice9::SetVsync(bool enable)
{
if( m_vsync == enable ) return;
__super::SetVsync(enable);
// Clever trick: Delete the backbuffer, so that the next Present will fail and
// cause a DXDevice9::Reset call, which re-creates the backbuffer with current
// vsync settings. :)
delete m_backbuffer;
m_backbuffer = NULL;
}
bool GSDevice9::Reset(int w, int h) bool GSDevice9::Reset(int w, int h)
{ {
if(!__super::Reset(w, h)) if(!__super::Reset(w, h))
@ -260,6 +273,7 @@ bool GSDevice9::Reset(int w, int h)
m_pp.BackBufferWidth = w; m_pp.BackBufferWidth = w;
m_pp.BackBufferHeight = h; m_pp.BackBufferHeight = h;
m_pp.PresentationInterval = m_vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
hr = m_dev->CreateAdditionalSwapChain(&m_pp, &m_swapchain); hr = m_dev->CreateAdditionalSwapChain(&m_pp, &m_swapchain);
@ -296,12 +310,7 @@ bool GSDevice9::Reset(int w, int h)
m_pp.BackBufferFormat = D3DFMT_X8R8G8B8; m_pp.BackBufferFormat = D3DFMT_X8R8G8B8;
m_pp.BackBufferWidth = 1; m_pp.BackBufferWidth = 1;
m_pp.BackBufferHeight = 1; m_pp.BackBufferHeight = 1;
m_pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; m_pp.PresentationInterval = m_vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
if(m_vsync)
{
m_pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // was D3DPRESENT_INTERVAL_DEFAULT, but ONE is like more "forceful"!
}
// m_pp.Flags |= D3DPRESENTFLAG_VIDEO; // enables tv-out (but I don't think anyone would still use a regular tv...) // m_pp.Flags |= D3DPRESENTFLAG_VIDEO; // enables tv-out (but I don't think anyone would still use a regular tv...)
@ -309,7 +318,7 @@ bool GSDevice9::Reset(int w, int h)
int mh = theApp.GetConfig("ModeHeight", 0); int mh = theApp.GetConfig("ModeHeight", 0);
int mrr = theApp.GetConfig("ModeRefreshRate", 0); int mrr = theApp.GetConfig("ModeRefreshRate", 0);
if(!m_wnd->IsManaged() && mode == Fullscreen && mw > 0 && mh > 0 && mrr >= 0) if(m_wnd->IsManaged() && mode == Fullscreen && mw > 0 && mh > 0 && mrr >= 0)
{ {
m_pp.Windowed = FALSE; m_pp.Windowed = FALSE;
m_pp.BackBufferWidth = mw; m_pp.BackBufferWidth = mw;

View File

@ -154,6 +154,8 @@ public:
bool IsLost(bool update); bool IsLost(bool update);
void Flip(); void Flip();
void SetVsync(bool enable);
void BeginScene(); void BeginScene();
void DrawPrimitive(); void DrawPrimitive();
void EndScene(); void EndScene();

View File

@ -284,7 +284,7 @@ void GSRenderer::SetFrameLimit(bool limit)
void GSRenderer::SetVsync(bool enabled) void GSRenderer::SetVsync(bool enabled)
{ {
m_vsync = enabled; m_vsync = enabled;
if( m_dev ) m_dev->SetVsync(m_vsync && m_framelimit); if( m_dev ) m_dev->SetVsync(m_vsync);
} }