• Advertisement
Sign in to follow this  

DirectX Invalid Call when ResizeBuffers

This topic is 1914 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Share this post


Link to post
Share on other sites
Advertisement
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.

Share this post


Link to post
Share on other sites
It's not that surprising, a [url="http://msdn.microsoft.com/en-us/library/windows/desktop/ff476900%28v=vs.85%29.aspx"]resource can have multiple views[/url] 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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement