Make sure Direct3D objects get disposed. Fixes all SlimDX warnings when exiting.

This commit is contained in:
J.D. Purcell 2017-04-08 15:18:55 -04:00
parent 1096e1bc5a
commit 0b81463408
4 changed files with 16 additions and 12 deletions

View File

@ -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:

View File

@ -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;
}
/// <summary>
@ -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

View File

@ -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)
{

View File

@ -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<string, string> MapCodeToNative;
public Dictionary<string, string> 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;