diff --git a/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs index a31e82007f..b93c0f9d9b 100644 --- a/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs +++ b/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs @@ -107,6 +107,11 @@ namespace BizHawk.Client.EmuHawk foreach (var f in ShaderChainFrugalizers) if (f != null) f.Dispose(); + foreach (var s in new [] { ShaderChain_hq2x, ShaderChain_scanlines, ShaderChain_bicubic, ShaderChain_user }) + if (s != null) + s.Dispose(); + TheOneFont.Dispose(); + Renderer.Dispose(); } //rendering resources: diff --git a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs index 56d5b87ab7..4e90b9b3ae 100644 --- a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs +++ b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs @@ -79,7 +79,10 @@ namespace BizHawk.Client.EmuHawk.Filters public void Dispose() { - //todo + if (_isDisposed) return; + foreach (var s in Shaders) + s.Dispose(); + _isDisposed = true; } /// @@ -92,6 +95,8 @@ namespace BizHawk.Client.EmuHawk.Filters public readonly RetroShaderPreset Preset; public readonly RetroShader[] Shaders; public readonly RetroShaderPreset.ShaderPass[] Passes; + + private bool _isDisposed; } public class RetroShaderPreset diff --git a/BizHawk.Client.EmuHawk/Program.cs b/BizHawk.Client.EmuHawk/Program.cs index dd6d1a34c3..e05a74892a 100644 --- a/BizHawk.Client.EmuHawk/Program.cs +++ b/BizHawk.Client.EmuHawk/Program.cs @@ -181,6 +181,7 @@ namespace BizHawk.Client.EmuHawk Renderer = new BizHawk.Bizware.BizwareGL.GuiRenderer(GlobalWin.GL); else Renderer = new BizHawk.Bizware.BizwareGL.Drivers.GdiPlus.GDIPlusGuiRenderer((BizHawk.Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus)GlobalWin.GL); + Renderer.Dispose(); } catch(Exception ex) { diff --git a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs index b11d884133..97a02954f4 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs @@ -131,6 +131,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX void IDisposable.Dispose() { + devBB.Dispose(); ResetHandlers.Reset(); DestroyDevice(); d3d.Dispose(); @@ -163,7 +164,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX tw.Texture.Dispose(); } - class ShaderWrapper : IDisposable + class ShaderWrapper // Disposable fields cleaned up by Internal_FreeShader { public d3d9.ShaderBytecode bytecode; public d3d9.VertexShader vs; @@ -171,15 +172,6 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX public Shader IGLShader; public Dictionary MapCodeToNative; public Dictionary MapNativeToCode; - - public void Dispose() - { - vs.Dispose(); - vs = null; - ps.Dispose(); - bytecode.Dispose(); - bytecode = null; - } } public Shader CreateFragmentShader(bool cg, string source, string entry, bool required) @@ -527,6 +519,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX { var pw = pipeline.Opaque as PipelineWrapper; + pw.VertexDeclaration.Dispose(); pw.FragmentShader.IGLShader.Release(); pw.VertexShader.IGLShader.Release(); } @@ -548,7 +541,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX public int SamplerIndex; } - class PipelineWrapper + class PipelineWrapper // Disposable fields cleaned up in FreePipeline { public d3d9.VertexDeclaration VertexDeclaration; public ShaderWrapper VertexShader, FragmentShader;