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]
DirectX Invalid Call when ResizeBuffers
Started by LightStriker, Oct 16 2012 07:26 AM
2 replies to this topic
Sponsor:
#3 Members - Reputation: 568
Posted 23 October 2012 - 12:39 PM
It's not that surprising, a resource can have multiple views associated with it. E.g. your render target may also be used in a shader (say a shadow map), which would require a shader resource view.
Edited by Starnick, 23 October 2012 - 12:39 PM.
Starnick
Tesla Graphics Engine | AssimpNet | DevILNet |






