/// <summary> /// Resizes the backbuffer. /// </summary> /// <param name="width">Width of the back buffer</param> /// <param name="height">Height of the back buffer</param> public override void Resize(int width, int height) { //Do not resize if the dimensions have not changed if (_presentParams.BackBufferHeight == height && _presentParams.BackBufferWidth == width) { return; } _resetting = true; _presentParams.BackBufferWidth = width; _presentParams.BackBufferHeight = height; //If resizing in full screen, resize the target/front buffer otherwise bad things seem to happen if (_isFullScreen) { DXGI.ModeDescription modeDesc = new DXGI.ModeDescription(); modeDesc.Format = D3D10Helper.ToD3DSurfaceFormat(_presentParams.BackBufferFormat); modeDesc.Width = width; modeDesc.Height = height; modeDesc.RefreshRate = new SDX.Rational(0, 0); _swapChain.ResizeTarget(modeDesc); } //Resize the swap chain back buffer DestroyViews(); _swapChain.ResizeBuffers(1, width, height, D3D10Helper.ToD3DSurfaceFormat(_presentParams.BackBufferFormat), DXGI.SwapChainFlags.AllowModeSwitch); CreateViews(); _resetting = false; }
protected override void OnResize(System.EventArgs e) { if (SwapChain != null) { // Do things here. Util.ReleaseCom(ref RenderTargetView); Util.ReleaseCom(ref DepthStencilView); Util.ReleaseCom(ref DepthStencilBuffer); // Resize the render target SwapChain.ResizeBuffers(1, ClientSize.Width, ClientSize.Height, Format.R8G8B8A8_UNorm, SwapChainFlags.None); using (var resource = SlimDX.Direct3D11.Resource.FromSwapChain <Texture2D>(SwapChain, 0)) { RenderTargetView = new RenderTargetView(Device, resource); } // Create the depth/stencil buffer and view var depthBufferDesc = new Texture2DDescription { ArraySize = 1, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None, Format = Format.D32_Float, Height = ClientSize.Height, Width = ClientSize.Width, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default }; DepthStencilBuffer = new Texture2D(Device, depthBufferDesc); var depthStencilViewDesc = new DepthStencilViewDescription { ArraySize = 0, Format = Format.D32_Float, Dimension = DepthStencilViewDimension.Texture2D, MipSlice = 0, Flags = 0, FirstArraySlice = 0 }; DepthStencilView = new DepthStencilView(Device, DepthStencilBuffer, depthStencilViewDesc); ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView); // Set up viewport, render target (back buffer on swap chain), and render target view // TODO KAM: Do the viewports actually need adjusting here? Probably? Viewport = new Viewport(0.0f, 0.0f, ClientSize.Width, ClientSize.Height, 0.0f, 1.0f); ImmediateContext.Rasterizer.SetViewports(Viewport); base.OnResize(e); } }
private void CreateView(int width, int height) { if (width <= 0) { throw new ArgumentOutOfRangeException(nameof(width)); } if (height <= 0) { throw new ArgumentOutOfRangeException(nameof(height)); } Destroy(); mWidth = width; mHeight = height; Execution.ExecuteOnUiThread(() => { mOffScreenWindow = new Form(); mOffScreenWindow.Left = -65535; mOffScreenWindow.Top = -65535; mOffScreenWindow.FormBorderStyle = FormBorderStyle.None; mOffScreenWindow.Width = 1; mOffScreenWindow.Height = 1; mOffScreenWindow.ShowInTaskbar = false; mOffScreenWindow.Show(); mOffScreenWindow.Hide(); }); var description = new SwapChainDescription { BufferCount = 1, IsWindowed = true, ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.B8G8R8A8_UNorm), SampleDescription = new SampleDescription(1, 0), Usage = Usage.RenderTargetOutput | Usage.Shared, OutputHandle = mOffScreenWindow.Handle }; mSwapChain = mDevice.CreateSwapChain(description); mPixelShader = new PixelShader(Device, Bytecode); mVertexShader = new VertexShader(Device, mVertexShaderBytecode); mVertexBuffer = CreateVertexBuffer(out mVertices); Execution.ExecuteOnUiThread(() => { mOffScreenWindow.Width = mWidth; mOffScreenWindow.Height = mHeight; }); mSwapChain.ResizeBuffers(1, mWidth, mHeight, Format.B8G8R8A8_UNorm, SwapChainFlags.None); Device.ImmediateContext.Rasterizer.SetViewports(new Viewport(0.0f, 0.0f, mWidth, mHeight)); Device.ImmediateContext.Rasterizer.State = RasterizerState.FromDescription(Device, new RasterizerStateDescription { CullMode = CullMode.None, FillMode = FillMode.Solid }); mRenderTarget = new HardwareRenderTarget(mDevice, mSwapChain); }