/// <summary> /// Unloads all resources. /// </summary> public void UnloadResources() { m_immediateContext = CommonTools.DisposeObject(m_immediateContext); m_immediateContext3 = CommonTools.DisposeObject(m_immediateContext3); m_device1 = CommonTools.DisposeObject(m_device1); m_device3 = CommonTools.DisposeObject(m_device3); m_creationFlags = D3D11.DeviceCreationFlags.None; m_featureLevel = D3D.FeatureLevel.Level_11_0; }
private void SwapChainPanel_OnLoaded(object sender, RoutedEventArgs e) { using (var defDevice = new D3D.Device(DriverType.Hardware, D3D.DeviceCreationFlags.Debug)) { _device = defDevice.QueryInterface <D3D.Device3>(); } _context = _device.ImmediateContext3; var pixelScale = DisplayInformation.GetForCurrentView().LogicalDpi / 96.0f; var swapChainDesc = new DXGI.SwapChainDescription1() { AlphaMode = DXGI.AlphaMode.Premultiplied, BufferCount = 2, Flags = DXGI.SwapChainFlags.None, Format = DXGI.Format.B8G8R8A8_UNorm, Width = (int)(panel.RenderSize.Width * pixelScale), Height = (int)(panel.RenderSize.Height * pixelScale), SampleDescription = new DXGI.SampleDescription(1, 0), Scaling = DXGI.Scaling.Stretch, Stereo = false, SwapEffect = DXGI.SwapEffect.FlipSequential, Usage = DXGI.Usage.BackBuffer | DXGI.Usage.RenderTargetOutput }; using (var dxgiDevice = _device.QueryInterface <DXGI.Device3>()) { var factory = dxgiDevice.Adapter.GetParent <DXGI.Factory4>(); using (var tmpSwapChain = new DXGI.SwapChain1(factory, _device, ref swapChainDesc)) { _swapChain = tmpSwapChain.QueryInterface <DXGI.SwapChain3>(); } } using (var nativeObject = ComObject.As <DXGI.ISwapChainPanelNative>(panel)) { nativeObject.SwapChain = _swapChain; } using (var depthBuffer = new D3D.Texture2D(_device, new D3D.Texture2DDescription() { Format = DXGI.Format.D24_UNorm_S8_UInt, ArraySize = 1, MipLevels = 1, Width = swapChainDesc.Width, Height = swapChainDesc.Height, SampleDescription = new DXGI.SampleDescription(1, 0), BindFlags = D3D.BindFlags.DepthStencil, })) { _depthStencilView = new D3D.DepthStencilView(_device, depthBuffer, new D3D.DepthStencilViewDescription() { Dimension = D3D.DepthStencilViewDimension.Texture2D }); } _backBuffer = D3D.Resource.FromSwapChain <D3D.Texture2D>(_swapChain, 0); _renderView = new D3D.RenderTargetView1(_device, _backBuffer); var viewport = new ViewportF(0, 0, (float)panel.RenderSize.Width, (float)panel.RenderSize.Height, 0.0f, 1.0f); _context.Rasterizer.SetViewport(viewport); ShaderBytecode shaderBytecode; using (shaderBytecode = ShaderBytecode.CompileFromFile("shaders.hlsl", "vs", "vs_5_0", ShaderFlags.Debug)) { _vertexShader = new D3D.VertexShader(_device, shaderBytecode); } using (var byteCode = ShaderBytecode.CompileFromFile(@"shaders.hlsl", "ps", "ps_5_0", ShaderFlags.Debug)) { _pixelShader = new D3D.PixelShader(_device, byteCode); } D3D.InputElement[] inputElements = { new D3D.InputElement("POSITION", 0, DXGI.Format.R32G32B32A32_Float, 0, 0), }; _inputLayout = new D3D.InputLayout(_device, shaderBytecode, inputElements); _vertices = new[] { new Vector4(-0.5f, 0.0f, 0.5f, 1.0f), new Vector4(0.0f, 0.5f, 0.5f, 1.0f), new Vector4(0.5f, 0.0f, 0.5f, 1.0f), }; _vertexBuffer = D3D.Buffer.Create(_device, D3D.BindFlags.VertexBuffer, _vertices); _vertexBinding = new D3D.VertexBufferBinding(_vertexBuffer, Utilities.SizeOf <Vector4>(), 0); _constantBuffer = new SharpDX.Direct3D11.Buffer( _device, Utilities.SizeOf <SharpDX.Matrix>(), D3D.ResourceUsage.Default, D3D.BindFlags.ConstantBuffer, D3D.CpuAccessFlags.None, D3D.ResourceOptionFlags.None, 0); _timer = new Stopwatch(); _timer.Start(); CompositionTarget.Rendering += CompositionTarget_Rendering; }
/// <summary> /// Initializes a new instance of the <see cref="DeviceHandlerD3D11"/> class. /// </summary> /// <param name="dxgiAdapter">The tasrget adapter.</param> /// <param name="debugEnabled">Is debug mode enabled?</param> internal DeviceHandlerD3D11(DXGI.Adapter1 dxgiAdapter, bool debugEnabled) { m_dxgiAdapter = dxgiAdapter; // Define possible create flags D3D11.DeviceCreationFlags createFlagsBgra = D3D11.DeviceCreationFlags.BgraSupport; D3D11.DeviceCreationFlags createFlags = D3D11.DeviceCreationFlags.None; if (debugEnabled) { createFlagsBgra |= D3D11.DeviceCreationFlags.Debug; createFlags |= D3D11.DeviceCreationFlags.Debug; } // Define all steps on which we try to initialize Direct3D List <Tuple <D3D.FeatureLevel, D3D11.DeviceCreationFlags, HardwareDriverLevel> > initParameterQueue = new List <Tuple <D3D.FeatureLevel, D3D11.DeviceCreationFlags, HardwareDriverLevel> >(); // Define all trys for hardware initialization initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_11_1, createFlagsBgra, HardwareDriverLevel.Direct3D11)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_11_0, createFlagsBgra, HardwareDriverLevel.Direct3D11)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_10_0, createFlagsBgra, HardwareDriverLevel.Direct3D10)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_3, createFlagsBgra, HardwareDriverLevel.Direct3D9_3)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_2, createFlagsBgra, HardwareDriverLevel.Direct3D9_2)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_1, createFlagsBgra, HardwareDriverLevel.Direct3D9_1)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_10_0, createFlags, HardwareDriverLevel.Direct3D10)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_3, createFlags, HardwareDriverLevel.Direct3D9_3)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_2, createFlags, HardwareDriverLevel.Direct3D9_2)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_1, createFlags, HardwareDriverLevel.Direct3D9_1)); // Try to create the device, each defined configuration step by step foreach (Tuple <D3D.FeatureLevel, D3D11.DeviceCreationFlags, HardwareDriverLevel> actInitParameters in initParameterQueue) { D3D.FeatureLevel featureLevel = actInitParameters.Item1; D3D11.DeviceCreationFlags direct3D11Flags = actInitParameters.Item2; HardwareDriverLevel actDriverLevel = actInitParameters.Item3; try { // Try to create the device using current parameters using (D3D11.Device device = new D3D11.Device(dxgiAdapter, direct3D11Flags, featureLevel)) { m_device1 = device.QueryInterface <D3D11.Device1>(); m_device3 = CommonTools.TryExecute(() => m_device1.QueryInterface <D3D11.Device3>()); if (m_device3 != null) { m_immediateContext3 = m_device3.ImmediateContext3; } } // Device successfully created, save all parameters and break this loop m_featureLevel = featureLevel; m_creationFlags = direct3D11Flags; m_driverLevel = actDriverLevel; break; } catch (Exception) { } } // Throw exception on failure if (m_device1 == null) { throw new SeeingSharpGraphicsException("Unable to initialize d3d11 device!"); } // Get immediate context from the device m_immediateContext = m_device1.ImmediateContext; }