Пример #1
0
    public static void Terminate()
    {
        if (IsInitialized)
        {
            Logger.Trace <ID3D11Device>("Disposing managers");
            ReleaseBackbuffer();

            BufferManager.Dispose();
            BufferManager = null;
            TextureManager.Dispose();
            TextureManager = null;
            SamplerManager.Dispose();
            SamplerManager = null;
            ShaderManager.Dispose();
            ShaderManager = null;
            RasterizerManager.Dispose();
            RasterizerManager = null;
            SwapChain.Dispose();
            SwapChain = null;

            Logger.Trace <ID3D11Device>("Disposing resources");
            _swapChain.Dispose();
            _context.Dispose();
            _device.Dispose();
        }
        IsInitialized = false;
    }
Пример #2
0
    public static void Init(DeviceConfiguration config, HWND windowHandle)
    {
        if (IsInitialized)
        {
            throw new InvalidOperationException($"{nameof(GraphicsDevice)} has already been initialized.");
        }

        var deviceCreationFlags = D3D11_CREATE_DEVICE_FLAG.UNSPECIFIED;

        if (config.Debug)
        {
            deviceCreationFlags |= D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_DEBUG;
        }

        if (config.Stats)
        {
            deviceCreationFlags |= D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_BGRA_SUPPORT;
        }

        var featureLevel = D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_11_1;
        var desc         = new DXGI_SWAP_CHAIN_DESC
        {
            BufferCount = 2,
            BufferDesc  = new DXGI_MODE_DESC
            {
                Width       = config.Width,
                Height      = config.Height,
                RefreshRate = new DXGI_RATIONAL {
                    Denominator = config.RefreshRate
                },
                Scaling          = DXGI_MODE_SCALING_UNSPECIFIED,
                ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED,
                Format           = DXGI_FORMAT_B8G8R8A8_UNORM
            },
            SampleDesc = new DXGI_SAMPLE_DESC
            {
                //Count = 2, // TODO: look into how we should use AA/Multi Sampling in Titan
                Count   = 1,
                Quality = 0
            },

            BufferUsage  = DXGI_USAGE_RENDER_TARGET_OUTPUT,
            OutputWindow = windowHandle,
            //SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL,
            SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD,
            Flags      = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH,
            Windowed   = config.Windowed
        };


        Logger.Trace <ID3D11Device>("Creating device");
        CheckAndThrow(D3D11CreateDeviceAndSwapChain(null, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, 0, deviceCreationFlags, null, 0, D3D11_SDK_VERSION, &desc, _swapChain.GetAddressOf(), _device.GetAddressOf(), null, _context.GetAddressOf()), nameof(D3D11CreateDeviceAndSwapChain));
        Logger.Trace <ID3D11Device>("Device created");


#if DEBUG
        Logger.Trace <ID3D11Device>("Sampling quality levels");
        uint qualityLevel = 0;
        for (var sampleCount = 1u; sampleCount <= 16u; ++sampleCount)
        {
            var result = _device.Get()->CheckMultisampleQualityLevels(DXGI_FORMAT_B8G8R8A8_UNORM, sampleCount, &qualityLevel);
            if (SUCCEEDED(result))
            {
                Logger.Debug($"Sample count {sampleCount} supports quality level {qualityLevel}", typeof(GraphicsDevice));
            }
            else
            {
                Logger.Debug($"Sample count {sampleCount} failed with HRESULT {result}", typeof(GraphicsDevice));
            }
        }
#endif

        SwapChain = new SwapChain(_swapChain.Get(), config);

        ImmediateContext  = new Context(_context.Get());
        BufferManager     = new BufferManager(_device);
        TextureManager    = new TextureManager(_device.Get(), SwapChain);
        SamplerManager    = new SamplerManager(_device.Get());
        ShaderManager     = new ShaderManager(_device.Get());
        RasterizerManager = new RasterizerManager(_device.Get());
        BlendStateManager = new BlendStateManager(_device.Get());

        InitBackbuffer();
        IsInitialized = true;
    }