public static IComObject <ID3D11Device> D3D11CreateDevice( IDXGIAdapter adapter, D3D_DRIVER_TYPE driverType, D3D11_CREATE_DEVICE_FLAG flags, D3D_FEATURE_LEVEL[] featureLevels = null, uint sdkVersion = Constants.D3D11_SDK_VERSION) { //featureLevels = featureLevels ?? new D3D_FEATURE_LEVEL[] //{ // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_11_1, // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_11_0, // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_10_1, // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_10_0, // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_3, // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_2, // D3D_FEATURE_LEVEL.D3D_FEATURE_LEVEL_9_1 //}; D3D11CreateDevice( adapter, driverType, IntPtr.Zero, (uint)flags, featureLevels, (uint)(featureLevels?.Length).GetValueOrDefault(), sdkVersion, out ID3D11Device device, out D3D_FEATURE_LEVEL level, out ID3D11DeviceContext dc).ThrowOnError(); if (dc != null) { Marshal.ReleaseComObject(dc); } return(new ComObject <ID3D11Device>(device)); }
public static extern int D3D11CreateDevice( [MarshalAs(UnmanagedType.Interface)] IDXGIAdapter pAdapter, D3D_DRIVER_TYPE DriverType, IntPtr Software, D3D11_CREATE_DEVICE_FLAG Flags, D3D_FEATURE_LEVEL[] pFeatureLevels, UINT FeatureLevels, UINT SDKVersion, [MarshalAs(UnmanagedType.Interface)] out ID3D11Device ppDevice, out D3D_FEATURE_LEVEL pFeatureLevel, [MarshalAs(UnmanagedType.Interface)] out ID3D11DeviceContext ppImmediateContext );
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(); } } }