• Advertisement


  • Content count

  • Joined

  • Last visited

Community Reputation

110 Neutral

About Marc-Andr

  • Rank
  1. Someone managed to find my error. Disposing the RenderTargetView isn't enough... You need to dispose the Texture2D used to create it too. A bit surprised, but works fine.
  2. 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]
  • Advertisement