internal void Initialise() { RemoveAndDispose(ref _d2dFactory); RemoveAndDispose(ref _dwFactory); _d2dFactory = ToDispose(new SharpDX.Direct2D1.Factory1(FactoryType.SingleThreaded)); _dwFactory = ToDispose(new SharpDX.DirectWrite.Factory(SharpDX.DirectWrite.FactoryType.Shared)); RemoveAndDispose(ref _d3dDevice); RemoveAndDispose(ref _d3dContext); RemoveAndDispose(ref _d2dDevice); RemoveAndDispose(ref _d2dContext); //var desc = CreateSwapChainDescription(); using (var device = new Device(DriverType.Hardware, DeviceCreationFlags.BgraSupport)) // | DeviceCreationFlags.Debug, { _d3dDevice = ToDispose(device.QueryInterface <SharpDX.Direct3D11.Device1>()); } _d3dContext = ToDispose(_d3dDevice.ImmediateContext.QueryInterface <SharpDX.Direct3D11.DeviceContext1>()); using (var dxgiDevice = _d3dDevice.QueryInterface <SharpDX.DXGI.Device>()) { _d2dDevice = ToDispose(new SharpDX.Direct2D1.Device(_d2dFactory, dxgiDevice)); } _d2dContext = ToDispose(new DeviceContext(_d2dDevice, DeviceContextOptions.None)); /* * D2Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport, new [] { FeatureLevel.Level_10_0 }, desc, out _device, out _swapChain); * * ToDispose(_device); * ToDispose(_swapChain); * * var d2dFactory = ToDispose(new SharpDX.Direct2D1.Factory()); * * Factory factory = ToDispose(_swapChain.GetParent<Factory>()); * factory.MakeWindowAssociation(_outputHandle, WindowAssociationFlags.IgnoreAll); * * _backBuffer = ToDispose(Texture2D.FromSwapChain<Texture2D>(_swapChain, 0)); * _renderTargetView = ToDispose(new RenderTargetView(_device, _backBuffer)); * _surface = ToDispose(_backBuffer.QueryInterface<Surface>()); * * _target = ToDispose(new RenderTarget(d2dFactory, _surface, new RenderTargetProperties(new PixelFormat(Format.Unknown, AlphaMode.Premultiplied)))); */ InitialiseResources(); RemoveAndDispose(ref _fpsCounter); _fpsCounter = new FpsCounter(); _fpsCounter.InitialiseGraphics(this); OnInitialize?.Invoke(this); }
// Initialize hardware-dependent resources. private void CreateDeviceResources() { // Unlike the original C++ sample, we don't have smart pointers so we need to // dispose Direct3D objects explicitly Utilities.Dispose(ref d3dDevice); Utilities.Dispose(ref d2dDevice); Utilities.Dispose(ref d2dContext); // This flag adds support for surfaces with a different color channel ordering // than the API default. It is required for compatibility with Direct2D. var creationFlags = DeviceCreationFlags.BgraSupport; #if DEBUG // If the project is in a debug build, enable debugging via SDK Layers. creationFlags |= DeviceCreationFlags.Debug; #endif // This array defines the set of DirectX hardware feature levels this app will support. // Note the ordering should be preserved. // Don't forget to declare your application's minimum required feature level in its // description. All applications are assumed to support 9.1 unless otherwise stated. FeatureLevel[] featureLevels = { FeatureLevel.Level_12_0, FeatureLevel.Level_12_1, FeatureLevel.Level_11_1, FeatureLevel.Level_11_0, FeatureLevel.Level_10_1, FeatureLevel.Level_10_0, FeatureLevel.Level_9_3, FeatureLevel.Level_9_2, FeatureLevel.Level_9_1, }; // Create the Direct3D 11 API device object. d3dDevice = new Device(DriverType.Hardware, creationFlags, featureLevels); // Get the Direct3D 11.1 API device. using (var dxgiDevice = d3dDevice.QueryInterface <SharpDX.DXGI.Device>()) { // Create the Direct2D device object and a corresponding context. d2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice); d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, DeviceContextOptions.None); // Query for ISurfaceImageSourceNative interface. using (var sisNative = ComObject.QueryInterface <ISurfaceImageSourceNative>(this)) sisNative.Device = dxgiDevice; } }
public void InitializeDeviceResources() { ModeDescription backBufferDesc = new ModeDescription(1600, 900, new Rational(60, 1), Format.B8G8R8A8_UNorm); SwapChainDescription swapChainDesc = new SwapChainDescription() { ModeDescription = backBufferDesc, SampleDescription = new SampleDescription(1, 0), Usage = Usage.RenderTargetOutput, BufferCount = 1, OutputHandle = this.Handle, IsWindowed = true }; var creationFlags = SharpDX.Direct3D11.DeviceCreationFlags.VideoSupport | SharpDX.Direct3D11.DeviceCreationFlags.BgraSupport | DeviceCreationFlags.Debug; //SharpDX.Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, SharpDX.Direct3D11.DeviceCreationFlags.None, swapChainDesc, out d3dDevice, out swapChain); SharpDX.Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, creationFlags, swapChainDesc, out d3dDevice, out swapChain); d3dDeviceContext = d3dDevice.ImmediateContext.QueryInterface <SharpDX.Direct3D11.DeviceContext1>(); using (SharpDX.Direct3D11.Texture2D backBuffer = swapChain.GetBackBuffer <SharpDX.Direct3D11.Texture2D>(0)) { renderTargetView = new SharpDX.Direct3D11.RenderTargetView(d3dDevice, backBuffer); } System.Drawing.Graphics g = this.CreateGraphics(); SharpDX.Direct2D1.Factory d2dFactory = new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.SingleThreaded, SharpDX.Direct2D1.DebugLevel.None); // Create Direct2D device var dxgiDevice = d3dDevice.QueryInterface <SharpDX.DXGI.Device>(); //d2dDevice = new SharpDX.Direct2D1.Device(d2dFactory, dxgiDevice); d2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice); d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None); //d2dContext.PrimitiveBlend = PrimitiveBlend.SourceOver; BitmapProperties1 properties = new BitmapProperties1(new SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Ignore), g.DpiX, g.DpiY, BitmapOptions.Target | BitmapOptions.CannotDraw); Surface backBuffer2D = swapChain.GetBackBuffer <Surface>(0); //new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied) SharpDX.Direct2D1.RenderTargetProperties rtp = new SharpDX.Direct2D1.RenderTargetProperties(new SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Ignore)); d2dRenderTarget = new SharpDX.Direct2D1.RenderTarget(d2dFactory, backBuffer2D, rtp); d2dTarget = new Bitmap1(d2dContext, backBuffer2D, properties); d3dDeviceContext.OutputMerger.SetRenderTargets(renderTargetView); }
// Initialize hardware-dependent resources. private void CreateDeviceResources() { // Unlike the original C++ sample, we don't have smart pointers so we need to // dispose Direct3D objects explicitly Utilities.Dispose(ref d3dDevice); Utilities.Dispose(ref d2dDevice); Utilities.Dispose(ref d2dContext); // This flag adds support for surfaces with a different color channel ordering // than the API default. It is required for compatibility with Direct2D. var creationFlags = DeviceCreationFlags.BgraSupport; #if DEBUG // If the project is in a debug build, enable debugging via SDK Layers. creationFlags |= DeviceCreationFlags.Debug; #endif // This array defines the set of DirectX hardware feature levels this app will support. // Note the ordering should be preserved. // Don't forget to declare your application's minimum required feature level in its // description. All applications are assumed to support 9.1 unless otherwise stated. FeatureLevel[] featureLevels = { FeatureLevel.Level_11_1, FeatureLevel.Level_11_0, FeatureLevel.Level_10_1, FeatureLevel.Level_10_0, FeatureLevel.Level_9_3, FeatureLevel.Level_9_2, FeatureLevel.Level_9_1, }; // Create the Direct3D 11 API device object. d3dDevice = new Device(DriverType.Hardware, creationFlags, featureLevels); // Get the Direct3D 11.1 API device. using (var dxgiDevice = d3dDevice.QueryInterface<SharpDX.DXGI.Device>()) { // Create the Direct2D device object and a corresponding context. d2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice); d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, DeviceContextOptions.EnableMultithreadedOptimizations); // Query for ISurfaceImageSourceNative interface. using (var sisNative = ComObject.QueryInterface<ISurfaceImageSourceNative>(this)) sisNative.Device = dxgiDevice; } }
public Renderer2D(Form form, DriverType driverType) { _form = form; var swapChainDescription = new SwapChainDescription { BufferCount = 1, ModeDescription = new ModeDescription(_form.ClientSize.Width, _form.ClientSize.Height, new Rational(60, 1), Format.B8G8R8A8_UNorm), IsWindowed = true, OutputHandle = _form.Handle, SampleDescription = new SampleDescription(1, 0), SwapEffect = SwapEffect.Discard, // TODO FlipDiscard is preferred for performance but it breaks current screen shot capture. Usage = Usage.RenderTargetOutput }; var directXDriverType = driverType switch { DriverType.Hardware => SharpDX.Direct3D.DriverType.Hardware, DriverType.Software => SharpDX.Direct3D.DriverType.Warp, _ => throw new ArgumentOutOfRangeException(nameof(driverType), driverType, "Unknown driver type.") }; Device.CreateWithSwapChain( directXDriverType, DeviceCreationFlags.BgraSupport, // TODO Investigate DeviceCreationFlags.Debug new[] { FeatureLevel.Level_11_0 }, swapChainDescription, out _d3D11Device, out _dxgiSwapChain); using var dxgiFactory = _dxgiSwapChain.GetParent <SharpDX.DXGI.Factory>(); dxgiFactory.MakeWindowAssociation(_form.Handle, WindowAssociationFlags.IgnoreAll); // Ignore all windows events using var dxgiDevice = _d3D11Device.QueryInterface <SharpDX.DXGI.Device>(); using var d2D1Device = new SharpDX.Direct2D1.Device(dxgiDevice); _d2D1DeviceContext = new SharpDX.Direct2D1.DeviceContext(d2D1Device, DeviceContextOptions.None); using var backBufferSurface = _dxgiSwapChain.GetBackBuffer <Surface>(0); var renderTargetBitmap = new SharpDX.Direct2D1.Bitmap(_d2D1DeviceContext, backBufferSurface, new BitmapProperties(new PixelFormat(Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied))); _d2D1DeviceContext.Target = renderTargetBitmap; }
// Initialize hardware-dependent resources. // Device-independent resources, such as ID2D1Geometry, are kept on the CPU. // Device-dependent resources, such as ID2D1RenderTarget and ID2D1LinearGradientBrush, directly map to resources on the GPU // (when hardware acceleration is available). // Rendering calls are performed by combining vertex and coverage information from a geometry with texturing information produced by the device-dependent resources. private void CreateDeviceResources() { // http://msdn.microsoft.com/zh-tw/library/windows/apps/dn481540.aspx // Unlike the original C++ sample, we don't have smart pointers so we need to // dispose Direct3D objects explicitly Utilities.Dispose(ref d3dDevice); Utilities.Dispose(ref d2dDevice); Utilities.Dispose(ref d2dContext); Utilities.Dispose(ref d2dFactory); #if DEBUG var debugLevel = SharpDX.Direct2D1.DebugLevel.Information; #else var debugLevel = SharpDX.Direct2D1.DebugLevel.None; #endif d2dFactory = new SharpDX.Direct2D1.Factory1(SharpDX.Direct2D1.FactoryType.SingleThreaded); // This flag adds support for surfaces with a different color channel ordering // than the API default. It is required for compatibility with Direct2D. var creationFlags = DeviceCreationFlags.BgraSupport; #if DEBUG // If the project is in a debug build, enable debugging via SDK Layers. creationFlags |= DeviceCreationFlags.Debug; #endif // This array defines the set of DirectX hardware feature levels this app will support. // Note the ordering should be preserved. // Don't forget to declare your application's minimum required feature level in its // description. All applications are assumed to support 9.1 unless otherwise stated. FeatureLevel[] featureLevels = { FeatureLevel.Level_11_1, FeatureLevel.Level_11_0, FeatureLevel.Level_10_1, FeatureLevel.Level_10_0, FeatureLevel.Level_9_3, FeatureLevel.Level_9_2, FeatureLevel.Level_9_1, }; // Create the Direct3D 11 API device object. d3dDevice = new Device(DriverType.Hardware, creationFlags, featureLevels); // Get the Direct3D 11.1 API device. // DXGI : DirectX Graphics Infrastructure // DXGI 是一組用來設定和管理低階圖形與圖形卡資源的 API // 為了直接存取 GPU 並管理其資源,必須有一個對應用程式描述它的方式。 // 您所需最重要的 GPU 資訊就是繪製像素的位置,這樣它才能夠將這些像素傳送到螢幕上。 // 這通常稱為「背景緩衝區」—GPU 記憶體中的一個位置,您可以在該處繪製像素, // 然後「翻轉」或「交換」,並在收到重新整理訊號時傳送到螢幕上。 // DXGI 可讓您取得該位置以及使用該緩衝區 (稱為「交換鏈結」, // 因為這是可交換的緩衝區鏈結,允許多個緩衝處理策略) 的方法。 using (var dxgiDevice = d3dDevice.QueryInterface<SharpDX.DXGI.Device>()) { // Create the Direct2D device object and a corresponding context. // 是 GPU 資源的虛擬表示法 // ID3D11Device 包含您不常呼叫的圖形方法,通常是在任何轉譯發生之前呼叫這些方法,用來取得和設定開始繪製像素時所需的一組資源。 d2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice); // 是轉譯管線與處理程序的跨裝置抽象概念 // ID3D11DeviceContext 則包含您在每個框架呼叫的方法: // 在緩衝區與檢視及其他資源中載入、變更輸出合併與轉譯器狀態、管理著色器, // 以及繪製將這些資源在狀態與著色器之間傳遞的結果。 d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, DeviceContextOptions.EnableMultithreadedOptimizations); // Query for ISurfaceImageSourceNative interface. using (var sisNative = ComObject.QueryInterface<ISurfaceImageSourceNative>(this)) sisNative.Device = dxgiDevice; } setPrimitiveBlend(); }
public RLocalRenderer(int width, int height) { RenderWidth = width; RenderHeight = height; renderForm = new RenderForm("RLocal Renderer"); renderForm.ClientSize = new Size(RenderWidth, RenderHeight); renderForm.AllowUserResizing = false; //renderForm.IsFullscreen = true; ModeDescription backBufferDesc = new ModeDescription(RenderWidth, RenderHeight, new Rational(60, 1), Format.B8G8R8A8_UNorm); SwapChainDescription swapChainDesc = new SwapChainDescription() { ModeDescription = backBufferDesc, SampleDescription = new SampleDescription(1, 0), Usage = Usage.RenderTargetOutput, BufferCount = 1, OutputHandle = renderForm.Handle, IsWindowed = true }; var creationFlags = SharpDX.Direct3D11.DeviceCreationFlags.VideoSupport | SharpDX.Direct3D11.DeviceCreationFlags.BgraSupport; // | DeviceCreationFlags.Debug; //SharpDX.Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, SharpDX.Direct3D11.DeviceCreationFlags.None, swapChainDesc, out d3dDevice, out swapChain); SharpDX.Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, creationFlags, swapChainDesc, out d3dDevice, out swapChain); d3dDeviceContext = d3dDevice.ImmediateContext.QueryInterface <SharpDX.Direct3D11.DeviceContext1>(); ConfigureAltEnter(); using (SharpDX.Direct3D11.Texture2D backBuffer = swapChain.GetBackBuffer <SharpDX.Direct3D11.Texture2D>(0)) { renderTargetView = new SharpDX.Direct3D11.RenderTargetView(d3dDevice, backBuffer); } System.Drawing.Graphics graphics = renderForm.CreateGraphics(); SharpDX.Direct2D1.Factory d2dFactory = new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.SingleThreaded, SharpDX.Direct2D1.DebugLevel.None); // Create Direct2D device var dxgiDevice = d3dDevice.QueryInterface <SharpDX.DXGI.Device>(); //d2dDevice = new SharpDX.Direct2D1.Device(d2dFactory, dxgiDevice); d2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice); d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None); //d2dContext.PrimitiveBlend = PrimitiveBlend.SourceOver; BitmapProperties1 properties = new BitmapProperties1(new SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Ignore), graphics.DpiX, graphics.DpiY, BitmapOptions.Target | BitmapOptions.CannotDraw); Surface backBuffer2D = swapChain.GetBackBuffer <Surface>(0); //new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied) SharpDX.Direct2D1.RenderTargetProperties rtp = new SharpDX.Direct2D1.RenderTargetProperties(new SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Ignore)); d2dRenderTarget = new SharpDX.Direct2D1.RenderTarget(d2dFactory, backBuffer2D, rtp); d2dTarget = new Bitmap1(d2dContext, backBuffer2D, properties); d3dDeviceContext.OutputMerger.SetRenderTargets(renderTargetView); RenderBuffer = new byte[RLocalUtils.GetSizeBGRA(RenderWidth, RenderHeight)]; }
public bool Initialize(GameForm pForm, bool pFullScreen) { _form = pForm; try { #if DEBUG Device defaultDevice = new Device(DriverType.Hardware, DeviceCreationFlags.Debug | DeviceCreationFlags.BgraSupport); _debug = defaultDevice.QueryInterface <DeviceDebug>(); #else Device defaultDevice = new Device(DriverType.Hardware, DeviceCreationFlags.BgraSupport); #endif Device = defaultDevice.QueryInterface <SharpDX.Direct3D11.Device1>(); var dxgiDevice2 = Device.QueryInterface <SharpDX.DXGI.Device2>(); var dxgiFactory2 = dxgiDevice2.Adapter.GetParent <SharpDX.DXGI.Factory2>(); // SwapChain description var desc = new SwapChainDescription1() { Width = 0, Height = 0, Format = Format.B8G8R8A8_UNorm, Stereo = false, SampleDescription = new SampleDescription(1, 0), BufferCount = BUFFER_COUNT, Scaling = Scaling.None, SwapEffect = SwapEffect.FlipSequential, Usage = Usage.RenderTargetOutput }; _swapChain = new SwapChain1(dxgiFactory2, Device, pForm.Handle, ref desc, null); _2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice2); Context = new SharpDX.Direct2D1.DeviceContext(_2dDevice, DeviceContextOptions.EnableMultithreadedOptimizations); SecondaryContext = new SharpDX.Direct2D1.DeviceContext(_2dDevice, DeviceContextOptions.None); #if DEBUG Factory2D = new SharpDX.Direct2D1.Factory(FactoryType.SingleThreaded, DebugLevel.Information); #else Factory2D = new SharpDX.Direct2D1.Factory(FactoryType.SingleThreaded); #endif var dpi = Factory2D.DesktopDpi; var prop = new BitmapProperties1(new PixelFormat(Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied), dpi.Height, dpi.Width, BitmapOptions.CannotDraw | BitmapOptions.Target); _backBuffer = _swapChain.GetBackBuffer <Surface>(0); _renderTarget = new Bitmap1(Context, _backBuffer, prop); Context.Target = _renderTarget; // Ignore all windows events using (Factory factory = _swapChain.GetParent <Factory>()) { factory.MakeWindowAssociation(pForm.Handle, WindowAssociationFlags.IgnoreAll); } FactoryDWrite = new SharpDX.DirectWrite.Factory(); return(true); } catch (System.Exception e) { System.Diagnostics.Debug.WriteLine("Error creating render target: " + e.Message); return(false); } }