void InitSwapChain() { var panelUnknown = Marshal.GetIUnknownForObject(SwapChain); IntPtr swapChainPanelNativePtr = IntPtr.Zero; try { var guid = Guid.Parse("63aad0b8-7c24-40ff-85a8-640d944cc325"); Marshal.ThrowExceptionForHR(Marshal.QueryInterface(panelUnknown, ref guid, out swapChainPanelNativePtr)); } finally { Marshal.Release(panelUnknown); } if (swapChainPanelNativePtr != IntPtr.Zero) { m_swapChainNative = (ISwapChainPanelNative *)swapChainPanelNativePtr; try { #region Init SwapChain DXGI_SWAP_CHAIN_DESC1 swapChainDesc = new DXGI_SWAP_CHAIN_DESC1 { Width = (uint)SwapChain.ActualWidth, Height = (uint)SwapChain.ActualHeight, Format = colorFormat, // This is the most common swapchain format. Stereo = 0, BufferUsage = (uint)(1L << (1 + 4)), BufferCount = 2, Scaling = DXGI_SCALING.DXGI_SCALING_STRETCH, SwapEffect = DXGI_SWAP_EFFECT.DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, Flags = 0 }; swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling. swapChainDesc.SampleDesc.Quality = 0; // Get D3DDevice // This flag adds support for surfaces with a different color channel // ordering than the API default. It is required for compatibility with Direct2D. D3D11_CREATE_DEVICE_FLAG creationFlags = D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_BGRA_SUPPORT; #if DEBUG // If the project is in a debug build, enable debugging via SDK Layers. creationFlags |= D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_DEBUG; #endif // This example only uses feature level 9.1. D3D_FEATURE_LEVEL[] featureLevels = { D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_1 }; var pFeatureLevel = D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_11_1; // Create the Direct3D 11 API device object and a corresponding context. D3D11CreateDevice( (IDXGIAdapter *)IntPtr.Zero.ToPointer(), // Specify nullptr to use the default adapter. D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, IntPtr.Zero, (uint)creationFlags, InteropUtilities.AsPointer(featureLevels.AsSpan()), (uint)featureLevels.Length, D3D11_SDK_VERSION, // UWP apps must set this to D3D11_SDK_VERSION. m_d3dDevice.GetAddressOf(), // Returns the Direct3D device created. InteropUtilities.AsPointer(ref pFeatureLevel), m_d3dContext.GetAddressOf() // Returns the device immediate context. ); // QI for DXGI device m_d3dDevice.As(ref m_dxgiDevice); // Get the DXGI adapter. IDXGIAdapter *dxgiAdapter; m_dxgiDevice.Get()->GetAdapter(&dxgiAdapter); // Get the DXGI factory. IDXGIFactory2 *dxgiFactory; var dxgiFactoryGuid = typeof(IDXGIFactory2).GUID; dxgiAdapter->GetParent(InteropUtilities.AsPointer(ref dxgiFactoryGuid), (void **)&dxgiFactory); // Create a swap chain by calling CreateSwapChainForComposition. dxgiFactory->CreateSwapChainForComposition( (IUnknown *)(ID3D11Device *)m_d3dDevice, &swapChainDesc, null, // Allow on any display. m_swapChain.GetAddressOf() ); m_swapChainNative.Get()->SetSwapChain((IDXGISwapChain *)m_swapChain.Get()); #endregion InitPipeline(); InitGraphics(); int hr = m_swapChain.Get()->Present(1, 0); Marshal.ThrowExceptionForHR(hr); SwapChain.SizeChanged += SwapChain_SizeChanged; } finally { m_swapChainNative.Get()->Release(); } } }