Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 16 Oct 2012
Offline Last Active Nov 12 2012 04:14 AM

Topics I've Started

DirectX Invalid Call when ResizeBuffers

16 October 2012 - 07:26 AM

I'm writing a very simple modeling software, more as a challenge than anything else.
Up to about 3 weeks ago, I had no real problem with the SwapChain.ResizeBuffers() function.

I changed of PC, switched to Visual Studio Express 2012 (from Pro 9), and switch my solution to x64 with the corresponding SlimDX.dll.
It still runs fine, but when I resize my window hosting the viewport, it get : DXGI_ERROR_INVALID_CALL (-2005270527).

A quick search on google tells me Battlefield 3 also may have that problem with some specific drivers. Is it possible?

I've read everything I could find about that function, and somehow I can't find what changes that is now messing things up. Hopefully, someone can see what I'm doing wrong.

[source lang="csharp"] // Form we are attached to. private Dockable dock; // Rendering stuff. private Device device; private Viewport viewport; private SwapChain swapChain; private RenderTargetView renderView; private DepthStencilView depthView; public Renderer(Dockable form) { if (form == null) return; dock = form; CreateSwapchain(); Resize(); } private void CreateSwapchain() { // Swap Chain & Device SwapChainDescription description = new SwapChainDescription() { BufferCount = 1, Usage = Usage.RenderTargetOutput, OutputHandle = dock.Handle, IsWindowed = true, ModeDescription = new ModeDescription(dock.ClientSize.Width, dock.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm), SampleDescription = new SampleDescription(1, 0), Flags = SwapChainFlags.AllowModeSwitch, SwapEffect = SwapEffect.Discard }; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain); } private void CreateRenderView() { // Dispose before resizing. if (renderView != null) renderView.Dispose(); if (depthView != null) depthView.Dispose(); swapChain.ResizeBuffers(0, 0, 0, Format.Unknown, 0); // ERROR : DXGI_ERROR_INVALID_CALL when resizing the window, but not when creating it. renderView = new RenderTargetView(device, Resource.FromSwapChain<Texture2D>(swapChain, 0)); Texture2DDescription depthBufferDesc = new Texture2DDescription() { ArraySize = 1, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None, Format = Format.D16_UNorm, Height = dock.ClientSize.Height, Width = dock.ClientSize.Width, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default }; depthView = new DepthStencilView(device, new Texture2D(device, depthBufferDesc)); } public void Resize() { CreateRenderView(); viewport = new Viewport(0.0f, 0.0f, dock.ClientSize.Width, dock.ClientSize.Height); device.ImmediateContext.Rasterizer.SetViewports(viewport); device.ImmediateContext.OutputMerger.SetTargets(depthView, renderView); }[/source]