From dfda7d909b07dab8e66a0bfc09ca015bd915b327 Mon Sep 17 00:00:00 2001 From: beirich Date: Tue, 21 Jun 2011 02:01:51 +0000 Subject: [PATCH] Don't die when D3D9 device is lost --- BizHawk.MultiClient/RenderPanel.cs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/BizHawk.MultiClient/RenderPanel.cs b/BizHawk.MultiClient/RenderPanel.cs index 4723711fa4..f7acf36a5c 100644 --- a/BizHawk.MultiClient/RenderPanel.cs +++ b/BizHawk.MultiClient/RenderPanel.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; +using System.Threading; using System.Windows.Forms; using SlimDX; using SlimDX.Direct3D9; @@ -222,7 +223,28 @@ namespace BizHawk.MultiClient Device.Present(Present.DoNotWait); } - public void Render(IVideoProvider video) + public void Render(IVideoProvider video) + { + try + { + RenderExec(video); + } catch (Direct3D9Exception) { + // Wait until device is available or user gets annoyed and closes app + Result r; + do + { + r = Device.TestCooperativeLevel(); + Thread.Sleep(100); + } while (r == ResultCode.DeviceLost); + + // lets try recovery! + DestroyDevice(); + CreateDevice(); + RenderExec(video); + } + } + + private void RenderExec(IVideoProvider video) { if (video == null) {