d3d display method: survive ctrl+alt+del (should fix #522)
This commit is contained in:
parent
3adc8f7c82
commit
1aa4382d21
|
@ -80,6 +80,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
{
|
{
|
||||||
BackBufferWidth = 8,
|
BackBufferWidth = 8,
|
||||||
BackBufferHeight = 8,
|
BackBufferHeight = 8,
|
||||||
|
BackBufferCount = 2,
|
||||||
DeviceWindowHandle = OffscreenNativeWindow.WindowInfo.Handle,
|
DeviceWindowHandle = OffscreenNativeWindow.WindowInfo.Handle,
|
||||||
PresentationInterval = PresentInterval.Immediate,
|
PresentationInterval = PresentInterval.Immediate,
|
||||||
EnableAutoDepthStencil = false
|
EnableAutoDepthStencil = false
|
||||||
|
@ -88,20 +89,27 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
|
|
||||||
void ResetDevice()
|
void ResetDevice()
|
||||||
{
|
{
|
||||||
|
devBB.Dispose();
|
||||||
ResetHandlers.Reset();
|
ResetHandlers.Reset();
|
||||||
for(;;)
|
for (; ; )
|
||||||
{
|
{
|
||||||
var pp = MakePresentParameters();
|
var result = dev.TestCooperativeLevel();
|
||||||
try
|
if (result.IsSuccess)
|
||||||
{
|
|
||||||
dev.Reset(pp);
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
if (dev.TestCooperativeLevel().IsSuccess)
|
|
||||||
break;
|
break;
|
||||||
|
if (result.Code == -2005530519) // D3DERR_DEVICENOTRESET
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pp = MakePresentParameters();
|
||||||
|
dev.Reset(pp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
System.Threading.Thread.Sleep(100);
|
System.Threading.Thread.Sleep(100);
|
||||||
}
|
}
|
||||||
ResetHandlers.Restore();
|
ResetHandlers.Restore();
|
||||||
|
devBB = dev.GetBackBuffer(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateDevice()
|
public void CreateDevice()
|
||||||
|
@ -118,6 +126,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
|
|
||||||
flags |= CreateFlags.FpuPreserve;
|
flags |= CreateFlags.FpuPreserve;
|
||||||
dev = new Device(d3d, 0, DeviceType.Hardware, pp.DeviceWindowHandle, flags, pp);
|
dev = new Device(d3d, 0, DeviceType.Hardware, pp.DeviceWindowHandle, flags, pp);
|
||||||
|
devBB = dev.GetBackBuffer(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IDisposable.Dispose()
|
void IDisposable.Dispose()
|
||||||
|
@ -816,19 +825,19 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
public void BeginControl(GLControlWrapper_SlimDX9 control)
|
public void BeginControl(GLControlWrapper_SlimDX9 control)
|
||||||
{
|
{
|
||||||
_CurrentControl = control;
|
_CurrentControl = control;
|
||||||
//don't dispose this backbuffer reference, even though it's tempting to.
|
|
||||||
//it results in weird flashes of corruption when changing the vsync setting (unproven; it's another similar code sequence that broke it)
|
|
||||||
dev.SetRenderTarget(0, _CurrentControl.SwapChain.GetBackBuffer(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//this dispose isnt strictly needed but it seems benign
|
||||||
|
var surface = _CurrentControl.SwapChain.GetBackBuffer(0);
|
||||||
|
dev.SetRenderTarget(0, surface);
|
||||||
|
surface.Dispose();
|
||||||
|
}
|
||||||
|
Surface devBB;
|
||||||
public void EndControl(GLControlWrapper_SlimDX9 control)
|
public void EndControl(GLControlWrapper_SlimDX9 control)
|
||||||
{
|
{
|
||||||
if (control != _CurrentControl)
|
if (control != _CurrentControl)
|
||||||
throw new InvalidOperationException();
|
throw new InvalidOperationException();
|
||||||
|
|
||||||
//don't dispose this backbuffer reference, even though it's tempting to.
|
dev.SetRenderTarget(0, devBB);
|
||||||
//it results in weird flashes of corruption when changing the vsync setting (unproven; it's another similar code sequence that broke it)
|
|
||||||
dev.SetRenderTarget(0, dev.GetBackBuffer(0, 0));
|
|
||||||
|
|
||||||
_CurrentControl = null;
|
_CurrentControl = null;
|
||||||
}
|
}
|
||||||
|
@ -865,6 +874,18 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
var tw = new TextureWrapper() { Texture = d3dtex };
|
var tw = new TextureWrapper() { Texture = d3dtex };
|
||||||
var tex = new Texture2d(this, tw, w, h);
|
var tex = new Texture2d(this, tw, w, h);
|
||||||
RenderTarget rt = new RenderTarget(this, tw, tex);
|
RenderTarget rt = new RenderTarget(this, tw, tex);
|
||||||
|
ResetHandlers.Add(rt, "RenderTarget",
|
||||||
|
() =>
|
||||||
|
{
|
||||||
|
d3dtex.Dispose();
|
||||||
|
tw.Texture = null;
|
||||||
|
},
|
||||||
|
() =>
|
||||||
|
{
|
||||||
|
d3dtex = new d3d9.Texture(dev, w, h, 1, d3d9.Usage.RenderTarget, d3d9.Format.A8R8G8B8, d3d9.Pool.Default);
|
||||||
|
tw.Texture = d3dtex;
|
||||||
|
}
|
||||||
|
);
|
||||||
return rt;
|
return rt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -874,15 +895,18 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
|
|
||||||
if (rt == null)
|
if (rt == null)
|
||||||
{
|
{
|
||||||
//don't dispose this backbuffer reference, even though it's tempting to.
|
//this dispose is needed for correct device resets, I have no idea why
|
||||||
//it results in weird flashes of corruption when changing the vsync setting
|
//don't try caching it either
|
||||||
dev.SetRenderTarget(0, _CurrentControl.SwapChain.GetBackBuffer(0));
|
var surface = _CurrentControl.SwapChain.GetBackBuffer(0);
|
||||||
|
dev.SetRenderTarget(0, surface);
|
||||||
|
surface.Dispose();
|
||||||
|
|
||||||
dev.DepthStencilSurface = null;
|
dev.DepthStencilSurface = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//dispose doesn't seem necessary for reset here...
|
||||||
var tw = rt.Opaque as TextureWrapper;
|
var tw = rt.Opaque as TextureWrapper;
|
||||||
//TODO - cache surface level in an RT wrapper
|
|
||||||
dev.SetRenderTarget(0, tw.Texture.GetSurfaceLevel(0));
|
dev.SetRenderTarget(0, tw.Texture.GetSurfaceLevel(0));
|
||||||
dev.DepthStencilSurface = null;
|
dev.DepthStencilSurface = null;
|
||||||
}
|
}
|
||||||
|
@ -900,7 +924,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
{
|
{
|
||||||
BackBufferWidth = Math.Max(8,control.ClientSize.Width),
|
BackBufferWidth = Math.Max(8,control.ClientSize.Width),
|
||||||
BackBufferHeight = Math.Max(8, control.ClientSize.Height),
|
BackBufferHeight = Math.Max(8, control.ClientSize.Height),
|
||||||
BackBufferCount = 2,
|
BackBufferCount = 1,
|
||||||
BackBufferFormat = Format.X8R8G8B8,
|
BackBufferFormat = Format.X8R8G8B8,
|
||||||
DeviceWindowHandle = control.Handle,
|
DeviceWindowHandle = control.Handle,
|
||||||
Windowed = true,
|
Windowed = true,
|
||||||
|
@ -908,7 +932,12 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX
|
||||||
};
|
};
|
||||||
|
|
||||||
control.SwapChain = new SwapChain(dev, pp);
|
control.SwapChain = new SwapChain(dev, pp);
|
||||||
ResetHandlers.Add(control, "SwapChain", () => { control.SwapChain.Dispose(); control.SwapChain = null; }, () => RefreshControlSwapChain(control));
|
ResetHandlers.Add(control, "SwapChain", () =>
|
||||||
|
{
|
||||||
|
control.SwapChain.Dispose();
|
||||||
|
control.SwapChain = null;
|
||||||
|
},
|
||||||
|
() => RefreshControlSwapChain(control));
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceLostHandler ResetHandlers = new DeviceLostHandler();
|
DeviceLostHandler ResetHandlers = new DeviceLostHandler();
|
||||||
|
|
Loading…
Reference in New Issue