Jump to content

  • Log In with Google      Sign In   
  • Create Account

DirectX Invalid Call when ResizeBuffers


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 LightStriker   Members   -  Reputation: 110

Like
0Likes
Like

Posted 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]

Sponsor:

#2 LightStriker   Members   -  Reputation: 110

Like
0Likes
Like

Posted 23 October 2012 - 07:31 AM

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.

#3 Starnick   Members   -  Reputation: 1214

Like
0Likes
Like

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.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS