Fix flickering when toggling vsync on/off (e.g. while fast forwarding).
This commit is contained in:
parent
f17e1c3f2a
commit
f1dee6c20e
|
@ -13,6 +13,7 @@ using BizHawk.Client.EmuHawk.FilterManager;
|
||||||
using BizHawk.Bizware.BizwareGL;
|
using BizHawk.Bizware.BizwareGL;
|
||||||
|
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
|
using BizHawk.Bizware.BizwareGL.Drivers.SlimDX;
|
||||||
using BizHawk.Bizware.BizwareGL.Drivers.GdiPlus;
|
using BizHawk.Bizware.BizwareGL.Drivers.GdiPlus;
|
||||||
|
|
||||||
namespace BizHawk.Client.EmuHawk
|
namespace BizHawk.Client.EmuHawk
|
||||||
|
@ -719,6 +720,52 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
void UpdateSourceDrawingWork(JobInfo job)
|
void UpdateSourceDrawingWork(JobInfo job)
|
||||||
{
|
{
|
||||||
|
bool vsync = false;
|
||||||
|
bool alternateVsync = false;
|
||||||
|
//only used by alternate vsync
|
||||||
|
IGL_SlimDX9 dx9 = null;
|
||||||
|
|
||||||
|
if (!job.offscreen)
|
||||||
|
{
|
||||||
|
//apply the vsync setting (should probably try to avoid repeating this)
|
||||||
|
vsync = Global.Config.VSyncThrottle || Global.Config.VSync;
|
||||||
|
|
||||||
|
//ok, now this is a bit undesireable.
|
||||||
|
//maybe the user wants vsync, but not vsync throttle.
|
||||||
|
//this makes sense... but we dont have the infrastructure to support it now (we'd have to enable triple buffering or something like that)
|
||||||
|
//so what we're gonna do is disable vsync no matter what if throttling is off, and maybe nobody will notice.
|
||||||
|
//update 26-mar-2016: this upsets me. When fastforwarding and skipping frames, vsync should still work. But I'm not changing it yet
|
||||||
|
if (Global.DisableSecondaryThrottling)
|
||||||
|
vsync = false;
|
||||||
|
|
||||||
|
//for now, it's assumed that the presentation panel is the main window, but that may not always be true
|
||||||
|
if (vsync && Global.Config.DispAlternateVsync && Global.Config.VSyncThrottle)
|
||||||
|
{
|
||||||
|
dx9 = GlobalWin.GL as IGL_SlimDX9;
|
||||||
|
if (dx9 != null)
|
||||||
|
{
|
||||||
|
alternateVsync = true;
|
||||||
|
//unset normal vsync if we've chosen the alternate vsync
|
||||||
|
vsync = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO - whats so hard about triple buffering anyway? just enable it always, and change api to SetVsync(enable,throttle)
|
||||||
|
//maybe even SetVsync(enable,throttlemethod) or just SetVsync(enable,throttle,advanced)
|
||||||
|
|
||||||
|
if (LastVsyncSetting != vsync || LastVsyncSettingGraphicsControl != presentationPanel.GraphicsControl)
|
||||||
|
{
|
||||||
|
if (LastVsyncSetting == null && vsync)
|
||||||
|
{
|
||||||
|
// Workaround for vsync not taking effect at startup (Intel graphics related?)
|
||||||
|
presentationPanel.GraphicsControl.SetVsync(false);
|
||||||
|
}
|
||||||
|
presentationPanel.GraphicsControl.SetVsync(vsync);
|
||||||
|
LastVsyncSettingGraphicsControl = presentationPanel.GraphicsControl;
|
||||||
|
LastVsyncSetting = vsync;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//begin rendering on this context
|
//begin rendering on this context
|
||||||
//should this have been done earlier?
|
//should this have been done earlier?
|
||||||
//do i need to check this on an intel video card to see if running excessively is a problem? (it used to be in the FinalTarget command below, shouldnt be a problem)
|
//do i need to check this on an intel video card to see if running excessively is a problem? (it used to be in the FinalTarget command below, shouldnt be a problem)
|
||||||
|
@ -786,45 +833,6 @@ namespace BizHawk.Client.EmuHawk
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Assert(inFinalTarget);
|
Debug.Assert(inFinalTarget);
|
||||||
//apply the vsync setting (should probably try to avoid repeating this)
|
|
||||||
bool vsync = Global.Config.VSyncThrottle || Global.Config.VSync;
|
|
||||||
|
|
||||||
//only used by alternate vsync
|
|
||||||
var dx9 = GlobalWin.GL as BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9;
|
|
||||||
|
|
||||||
//ok, now this is a bit undesireable.
|
|
||||||
//maybe the user wants vsync, but not vsync throttle.
|
|
||||||
//this makes sense... but we dont have the infrastructure to support it now (we'd have to enable triple buffering or something like that)
|
|
||||||
//so what we're gonna do is disable vsync no matter what if throttling is off, and maybe nobody will notice.
|
|
||||||
//update 26-mar-2016: this upsets me. When fastforwarding and skipping frames, vsync should still work. But I'm not changing it yet
|
|
||||||
if (Global.DisableSecondaryThrottling)
|
|
||||||
vsync = false;
|
|
||||||
|
|
||||||
//for now, it's assumed that the presentation panel is the main window, but that may not always be true
|
|
||||||
bool alternateVsync = false;
|
|
||||||
if (dx9 != null)
|
|
||||||
{
|
|
||||||
alternateVsync = Global.Config.DispAlternateVsync && vsync && Global.Config.VSyncThrottle;
|
|
||||||
//unset normal vsync if we've chosen the alternate vsync
|
|
||||||
if (alternateVsync)
|
|
||||||
vsync = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO - whats so hard about triple buffering anyway? just enable it always, and change api to SetVsync(enable,throttle)
|
|
||||||
//maybe even SetVsync(enable,throttlemethod) or just SetVsync(enable,throttle,advanced)
|
|
||||||
|
|
||||||
if (LastVsyncSetting != vsync || LastVsyncSettingGraphicsControl != presentationPanel.GraphicsControl)
|
|
||||||
{
|
|
||||||
if (LastVsyncSetting == null && vsync)
|
|
||||||
{
|
|
||||||
// Workaround for vsync not taking effect at startup (Intel graphics related?)
|
|
||||||
presentationPanel.GraphicsControl.SetVsync(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
presentationPanel.GraphicsControl.SetVsync(vsync);
|
|
||||||
LastVsyncSettingGraphicsControl = presentationPanel.GraphicsControl;
|
|
||||||
LastVsyncSetting = vsync;
|
|
||||||
}
|
|
||||||
|
|
||||||
//wait for vsync to begin
|
//wait for vsync to begin
|
||||||
if (alternateVsync) dx9.AlternateVsyncPass(0);
|
if (alternateVsync) dx9.AlternateVsyncPass(0);
|
||||||
|
@ -835,7 +843,6 @@ namespace BizHawk.Client.EmuHawk
|
||||||
//wait for vsync to end
|
//wait for vsync to end
|
||||||
if (alternateVsync) dx9.AlternateVsyncPass(1);
|
if (alternateVsync) dx9.AlternateVsyncPass(1);
|
||||||
|
|
||||||
|
|
||||||
//nope. dont do this. workaround for slow context switching on intel GPUs. just switch to another context when necessary before doing anything
|
//nope. dont do this. workaround for slow context switching on intel GPUs. just switch to another context when necessary before doing anything
|
||||||
//presentationPanel.GraphicsControl.End();
|
//presentationPanel.GraphicsControl.End();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue