void CreateSwapChain() { SwapChainDescription1 swapChainDescription = new SwapChainDescription1() { Usage = Usage.RenderTargetOutput, BufferCount = 2, SwapEffect = SwapEffect.FlipSequential, Stereo = false, SampleDescription = new SampleDescription(1, 0), Scaling = Scaling.Stretch, Format = Format.R8G8B8A8_UNorm, Height = 1080, Width = 1920, }; // 建立SwapChain using (SharpDX.DXGI.Device3 dxgiDevice3 = D3D11Device.QueryInterface <SharpDX.DXGI.Device3>()) { using (Factory2 dxgiFactory2 = dxgiDevice3.Adapter.GetParent <Factory2>()) { swapChain1 = new SwapChain1(dxgiFactory2, D3D11Device, ref swapChainDescription); swapChain1.QueryInterface <SwapChain>(); } } // 把Xaml的SwapChainPanel與DirectX的SwapChain連結起來 using (ISwapChainPanelNative swapChainPanelNative = ComObject.As <ISwapChainPanelNative>(this)) { swapChainPanelNative.SwapChain = swapChain1; SetViewport(); } }
/// <summary> /// Unloads all resources. /// </summary> internal void UnloadResources() { m_factory = CommonTools.DisposeObject(m_factory); m_adapter = CommonTools.DisposeObject(m_adapter); #if UNIVERSAL m_device = CommonTools.DisposeObject(m_device); #endif }
private void Current_Suspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e) { if (isDXInitialized) { this.deviceContext.ClearState(); using (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface <DXGI.Device3>()) dxgiDevice3.Trim(); } }
/// <summary> /// Initializes a new instance of the <see cref="DeviceHandlerDXGI"/> class. /// </summary> internal DeviceHandlerDXGI(DXGI.Adapter1 adapter, D3D11.Device device) { #if UNIVERSAL m_device = device.QueryInterface <DXGI.Device3>(); #endif m_adapter = adapter; m_factory = m_adapter.GetParent <DXGI.Factory2>(); }
public void CreateDirectXSwapChain() { SwapChainDescription1 swapChainDescription = new SwapChainDescription1() { // Want Transparency. AlphaMode = SharpDX.DXGI.AlphaMode.Premultiplied, // Double buffer. BufferCount = 2, // BGRA 32bit pixel format. Format = Format.B8G8R8A8_UNorm, // Unlike in CoreWindow swap chains, the dimensions must be set. Height = (int)(ActualHeight), Width = (int)(ActualWidth), // Default multisampling. SampleDescription = new SampleDescription(1, 0), // In case the control is resized, stretch the swap chain accordingly. Scaling = Scaling.Stretch, // No support for stereo display. Stereo = false, // Sequential displaying for double buffering. SwapEffect = SwapEffect.FlipSequential, // This swapchain is going to be used as the back buffer. Usage = Usage.BackBuffer | Usage.RenderTargetOutput, }; using (SharpDX.Direct3D11.Device defaultDevice = new SharpDX.Direct3D11.Device(SharpDX.Direct3D.DriverType.Hardware, SharpDX.Direct3D11.DeviceCreationFlags.BgraSupport)) { this.device = defaultDevice.QueryInterface <SharpDX.Direct3D11.Device2>(); } // Save the context instance //this.d3d11DC = this.device.ImmediateContext2; using (SharpDX.DXGI.Device3 dxgiDevice3 = device.QueryInterface <SharpDX.DXGI.Device3>()) { using (SharpDX.DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent <SharpDX.DXGI.Factory3>()) { using (SwapChain1 swapChain1 = new SwapChain1(dxgiFactory3, device, ref swapChainDescription)) { swapChain = swapChain1.QueryInterface <SwapChain2>(); } } } using (ISwapChainPanelNative nativeObject = ComObject.As <ISwapChainPanelNative>(this)) { nativeObject.SwapChain = swapChain; } backBufferTexture = SharpDX.Direct3D11.Resource.FromSwapChain <SharpDX.Direct3D11.Texture2D>(swapChain, 0); using (var surface = backBufferTexture.QueryInterface <Surface2>()) { d2d1DC = new DeviceContext(surface); } }
private void Application_Suspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e) { if (isDXInitialized) { this.deviceContext.ClearState(); using (DXGI.Device3 dxgiDevice3 = this.swapChain.GetDevice <DXGI.Device3>()) { dxgiDevice3.Trim(); } } }
private void Application_Suspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e) { // Check if resources have been initialized. if (isDXInitialized) { // Clear any object references. this.deviceContext.ClearState(); // Trim the memory. using (DXGI.Device3 dxgiDevice3 = this.swapChain.GetDevice <DXGI.Device3>()) { dxgiDevice3.Trim(); } } }
/// <summary> /// Destroys the SwapChain and all related instances. /// </summary> void DestroySwapChain() { _swapChain2?.Dispose(); _swapChain2 = null; _device3?.Dispose(); _device3 = null; _swapChain?.Dispose(); _swapChain = null; _device?.Dispose(); _device = null; _d3D11Device?.Dispose(); _d3D11Device = null; }
private void InitializeD3D() { using (D3D11.Device defaultDevice = new D3D11.Device(D3D.DriverType.Hardware, D3D11.DeviceCreationFlags.Debug)) this.device = defaultDevice.QueryInterface <D3D11.Device2>(); this.deviceContext = this.device.ImmediateContext2; DXGI.SwapChainDescription1 swapChainDescription = new DXGI.SwapChainDescription1() { AlphaMode = DXGI.AlphaMode.Ignore, BufferCount = 2, Format = DXGI.Format.R8G8B8A8_UNorm, Height = (int)(this.swapChainPanel.RenderSize.Height), Width = (int)(this.swapChainPanel.RenderSize.Width), SampleDescription = new DXGI.SampleDescription(1, 0), Scaling = SharpDX.DXGI.Scaling.Stretch, Stereo = false, SwapEffect = DXGI.SwapEffect.FlipSequential, Usage = DXGI.Usage.RenderTargetOutput }; using (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface <DXGI.Device3>()) using (DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent <DXGI.Factory3>()) { DXGI.SwapChain1 swapChain1 = new DXGI.SwapChain1(dxgiFactory3, this.device, ref swapChainDescription); this.swapChain = swapChain1.QueryInterface <DXGI.SwapChain2>(); } using (DXGI.ISwapChainPanelNative nativeObject = ComObject.As <DXGI.ISwapChainPanelNative>(this.swapChainPanel)) nativeObject.SwapChain = this.swapChain; this.backBufferTexture = this.swapChain.GetBackBuffer <D3D11.Texture2D>(0); this.backBufferView = new D3D11.RenderTargetView(this.device, this.backBufferTexture); deviceContext.Rasterizer.SetViewport(0, 0, (int)swapChainPanel.ActualWidth, (int)swapChainPanel.ActualHeight); CompositionTarget.Rendering += CompositionTarget_Rendering; Application.Current.Suspending += Current_Suspending; isDXInitialized = true; }
/// <summary> /// Initializes the SwapChain for use with LibVLC /// </summary> void CreateSwapChain() { SharpDX.DXGI.Factory2 dxgiFactory = null; try { var deviceCreationFlags = DeviceCreationFlags.BgraSupport | DeviceCreationFlags.VideoSupport; #if DEBUG if (Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily != Mobile) { deviceCreationFlags |= DeviceCreationFlags.Debug; } try { dxgiFactory = new SharpDX.DXGI.Factory2(true); } catch (SharpDXException) { dxgiFactory = new SharpDX.DXGI.Factory2(false); } #else dxgiFactory = new SharpDX.DXGI.Factory2(false); #endif _d3D11Device = null; foreach (var adapter in dxgiFactory.Adapters) { try { _d3D11Device = new SharpDX.Direct3D11.Device(adapter, deviceCreationFlags); break; } catch (SharpDXException) { } } if (_d3D11Device is null) { throw new VLCException("Could not create Direct3D11 device : No compatible adapter found."); } _device = _d3D11Device.QueryInterface <SharpDX.DXGI.Device1>(); //Create the swapchain var swapChainDescription = new SharpDX.DXGI.SwapChainDescription1 { Width = (int)(_panel.ActualWidth * _panel.CompositionScaleX), Height = (int)(_panel.ActualHeight * _panel.CompositionScaleY), Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm, Stereo = false, SampleDescription = { Count = 1, Quality = 0 }, Usage = Usage.RenderTargetOutput, BufferCount = 2, SwapEffect = SwapEffect.FlipSequential, Flags = SwapChainFlags.None, AlphaMode = AlphaMode.Unspecified }; _swapChain = new SharpDX.DXGI.SwapChain1(dxgiFactory, _d3D11Device, ref swapChainDescription); _device.MaximumFrameLatency = 1; using (var panelNative = ComObject.As <ISwapChainPanelNative>(_panel)) { panelNative.SwapChain = _swapChain; } // This is necessary so we can call Trim() on suspend _device3 = _device.QueryInterface <SharpDX.DXGI.Device3>(); if (_device3 == null) { throw new VLCException("Failed to query interface \"Device3\""); } _swapChain2 = _swapChain.QueryInterface <SharpDX.DXGI.SwapChain2>(); if (_swapChain2 == null) { throw new VLCException("Failed to query interface \"SwapChain2\""); } UpdateScale(); UpdateSize(); _loaded = true; Initialized?.Invoke(this, new InitializedEventArgs(SwapChainOptions)); } catch (Exception ex) { DestroySwapChain(); if (ex is SharpDXException) { throw new VLCException("SharpDX operation failed, see InnerException for details", ex); } throw; } finally { dxgiFactory?.Dispose(); } }
private void SwapChainPanel_Loaded(object sender, RoutedEventArgs e) { var v = ApplicationView.GetForCurrentView(); v.FullScreenSystemOverlayMode = FullScreenSystemOverlayMode.Minimal; v.TryEnterFullScreenMode(); #if DEBUG var debugLevel = D3D11.DeviceCreationFlags.Debug | D3D11.DeviceCreationFlags.BgraSupport; #else var debugLevel = D3D11.DeviceCreationFlags.None | D3D11.DeviceCreationFlags.BgraSupport; #endif using (D3D11.Device defaultDevice = new D3D11.Device(D3D.DriverType.Hardware, debugLevel)) { this.device = defaultDevice.QueryInterface <D3D11.Device2>(); } this.deviceContext = this.device.ImmediateContext2; float pixelScale = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi / 96.0f; DXGI.SwapChainDescription1 swapChainDescription = new DXGI.SwapChainDescription1() { AlphaMode = DXGI.AlphaMode.Premultiplied, BufferCount = 2, Format = DXGI.Format.B8G8R8A8_UNorm, Height = (int)(this.SwapChainPanel.RenderSize.Height * pixelScale), Width = (int)(this.SwapChainPanel.RenderSize.Width * 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 (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface <DXGI.Device3>()) { using (DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent <DXGI.Factory3>()) { using (DXGI.SwapChain1 swapChain1 = new DXGI.SwapChain1(dxgiFactory3, this.device, ref swapChainDescription)) { this.swapChain = swapChain1.QueryInterface <DXGI.SwapChain2>(); } } } using (DXGI.ISwapChainPanelNative nativeObject = ComObject.As <DXGI.ISwapChainPanelNative>(this.SwapChainPanel)) { nativeObject.SwapChain = this.swapChain; } this.backBufferTexture = D3D11.Texture2D.FromSwapChain <D3D11.Texture2D>(this.swapChain, 0); this.backBufferView = new D3D11.RenderTargetView(this.device, this.backBufferTexture); isDXInitialized = true; tw = new TextWirter(device, swapChain, Color.Black, DisplayInformation.GetForCurrentView().LogicalDpi); // #region D2D //#if DEBUG // var debug = SharpDX.Direct2D1.DebugLevel.Error; //#else // var debug = SharpDX.Direct2D1.DebugLevel.None; //#endif // d2dFactory = new SharpDX.Direct2D1.Factory1(SharpDX.Direct2D1.FactoryType.SingleThreaded, debug); // using (var dxgiDevice = device.QueryInterface<SharpDX.DXGI.Device>()) // { // d2dDevice = new SharpDX.Direct2D1.Device(d2dFactory, dxgiDevice); // } // d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None); // BitmapProperties1 properties = new BitmapProperties1( // new PixelFormat( // SharpDX.DXGI.Format.B8G8R8A8_UNorm, // SharpDX.Direct2D1.AlphaMode.Premultiplied), // DisplayInformation.GetForCurrentView().LogicalDpi, // DisplayInformation.GetForCurrentView().LogicalDpi, // BitmapOptions.Target | BitmapOptions.CannotDraw); // DXGI.Surface backBuffer = swapChain.GetBackBuffer<DXGI.Surface>(0); // d2dTarget = new Bitmap1(d2dContext, backBuffer, properties); // SharpDX.DirectWrite.Factory fontFactory = new SharpDX.DirectWrite.Factory(); // textFormat = new TextFormat(fontFactory, "Segoe UI", 24.0f); // textLayout1 = new TextLayout(fontFactory, "This is an example of a moving TextLayout object with snapped pixel boundaries.", textFormat, 400.0f, 200.0f); // textLayout2 = new TextLayout(fontFactory, "This is an example of a moving TextLayout object with no snapped pixel boundaries.", textFormat, 400.0f, 200.0f); // layoutY = 0.0f; // backgroundBrush = new SharpDX.Direct2D1.SolidColorBrush(d2dContext, Color.White); // textBrush = new SharpDX.Direct2D1.SolidColorBrush(d2dContext, Color.Black); // #endregion CompositionTarget.Rendering += CompositionTarget_Rendering; Application.Current.Suspending += Application_Suspending; }
public void CreateDirectXSwapChain(Adapter adapter) { var desc = adapter.Description; Debug.WriteLine(desc.Description); Debug.WriteLine($"vender = {desc.VendorId:X4}"); Debug.WriteLine($"Shared Memory: {desc.SharedSystemMemory} bytes"); Debug.WriteLine($"Video Memory: {desc.DedicatedVideoMemory} bytes"); Debug.WriteLine($"device: {desc.DeviceId}"); FeatureLevel[] featureLevels = new FeatureLevel[] { FeatureLevel.Level_11_1, FeatureLevel.Level_11_0, FeatureLevel.Level_10_1, }; D3D11Device = new SharpDX.Direct3D11.Device(adapter, DeviceCreationFlags.BgraSupport, featureLevels); SwapChainDescription1 swapChainDescription = new SwapChainDescription1() { // Double buffer. BufferCount = 2, // BGRA 32bit pixel format. Format = Format.B8G8R8A8_UNorm, // Unlike in CoreWindow swap chains, the dimensions must be set. Height = (int)(ActualHeight), Width = (int)(ActualWidth), // Default multisampling. SampleDescription = new SampleDescription(1, 0), // In case the control is resized, stretch the swap chain accordingly. Scaling = Scaling.Stretch, // No support for stereo display. Stereo = false, // Sequential displaying for double buffering. SwapEffect = SwapEffect.FlipSequential, // This swapchain is going to be used as the back buffer. Usage = Usage.BackBuffer | Usage.RenderTargetOutput, }; // 建立SwapChain using (SharpDX.DXGI.Device3 dxgiDevice3 = D3D11Device.QueryInterface <SharpDX.DXGI.Device3>()) { using (Factory2 dxgiFactory2 = dxgiDevice3.Adapter.GetParent <Factory2>()) { using (SwapChain1 swapChain1 = new SwapChain1(dxgiFactory2, D3D11Device, ref swapChainDescription)) { swapChain = swapChain1.QueryInterface <SwapChain>(); } } } // 把Xaml的SwapChainPanel與DirectX的SwapChain連結起來 using (ISwapChainPanelNative swapChainPanelNative = ComObject.As <ISwapChainPanelNative>(this)) { swapChainPanelNative.SwapChain = swapChain; } backBuffer = SharpDX.Direct3D11.Resource.FromSwapChain <Texture2D>(swapChain, 0); var renderTarget = new RenderTargetView(D3D11Device, backBuffer); context = D3D11Device.ImmediateContext; // Clear Screen to Teel Blue. context.ClearRenderTargetView(renderTarget, new Color(0xFF887536)); swapChain.Present(1, PresentFlags.None); }
private void SwapChainPanel_Loaded(object sender, RoutedEventArgs e) { // Create a new Direct3D hardware device and ask for Direct3D 11.2 support using (D3D11.Device defaultDevice = new D3D11.Device(D3D.DriverType.Hardware, D3D11.DeviceCreationFlags.Debug)) { this.device = defaultDevice.QueryInterface <D3D11.Device2>(); } // Save the context instance this.deviceContext = this.device.ImmediateContext2; Size2 sizeInPixels = RenderSizeToPixelSize(this.SwapChainPanel.RenderSize); // Properties of the swap chain DXGI.SwapChainDescription1 swapChainDescription = new DXGI.SwapChainDescription1() { // No transparency. AlphaMode = DXGI.AlphaMode.Ignore, // Double buffer. BufferCount = 2, // BGRA 32bit pixel format. Format = DXGI.Format.B8G8R8A8_UNorm, // Unlike in CoreWindow swap chains, the dimensions must be set. Height = sizeInPixels.Height, Width = sizeInPixels.Width, // Default multisampling. SampleDescription = new DXGI.SampleDescription(1, 0), // In case the control is resized, stretch the swap chain accordingly. Scaling = DXGI.Scaling.Stretch, // No support for stereo display. Stereo = false, // Sequential displaying for double buffering. SwapEffect = DXGI.SwapEffect.FlipSequential, // This swapchain is going to be used as the back buffer. Usage = DXGI.Usage.BackBuffer | DXGI.Usage.RenderTargetOutput, }; // Retrive the DXGI device associated to the Direct3D device. using (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface <DXGI.Device3>()) { // Get the DXGI factory automatically created when initializing the Direct3D device. using (DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent <DXGI.Factory3>()) { // Create the swap chain and get the highest version available. using (DXGI.SwapChain1 swapChain1 = new DXGI.SwapChain1(dxgiFactory3, this.device, ref swapChainDescription)) { this.swapChain = swapChain1.QueryInterface <DXGI.SwapChain2>(); } } } // Obtain a reference to the native COM object of the SwapChainPanel. using (DXGI.ISwapChainPanelNative nativeObject = ComObject.As <DXGI.ISwapChainPanelNative>(this.SwapChainPanel)) { // Set its swap chain. nativeObject.SwapChain = this.swapChain; } // Create a Texture2D from the existing swap chain to use as this.backBufferTexture = D3D11.Texture2D.FromSwapChain <D3D11.Texture2D>(this.swapChain, 0); this.backBufferView = new D3D11.RenderTargetView(this.device, this.backBufferTexture); // This event is fired when the application requests a new frame from the DirectX interop controls. CompositionTarget.Rendering += CompositionTarget_Rendering; // Subscribe to the suspending event Application.Current.Suspending += Application_Suspending; // Mark our resources as initialized isDXInitialized = true; }