예제 #1
0
    public void Dispose()
    {
        _vertexBuffer.Dispose();
        _vertexShader.Dispose();
        _pixelShader.Dispose();
        _inputLayout.Dispose();

        BackBufferTexture?.Dispose();
        OffscreenTexture?.Dispose();
        RenderTargetView.Dispose();
        DepthStencilTexture?.Dispose();
        DepthStencilView?.Dispose();

        DeviceContext.ClearState();
        DeviceContext.Flush();
        DeviceContext.Dispose();
        SwapChain?.Dispose();

#if DEBUG
        uint refCount = Device.Release();
        if (refCount > 0)
        {
            System.Diagnostics.Debug.WriteLine($"Direct3D11: There are {refCount} unreleased references left on the device");

            ID3D11Debug?d3d11Debug = Device.QueryInterfaceOrNull <ID3D11Debug>();
            if (d3d11Debug != null)
            {
                d3d11Debug.ReportLiveDeviceObjects(ReportLiveDeviceObjectFlags.Detail | ReportLiveDeviceObjectFlags.IgnoreInternal);
                d3d11Debug.Dispose();
            }
        }
#else
        Device.Dispose();
#endif
        Factory.Dispose();

#if DEBUG
        if (DXGIGetDebugInterface1(out IDXGIDebug1? dxgiDebug).Success)
        {
            dxgiDebug !.ReportLiveObjects(DebugAll, ReportLiveObjectFlags.Summary | ReportLiveObjectFlags.IgnoreInternal);
            dxgiDebug !.Dispose();
        }
#endif
    }