DirectX Invalid Call when ResizeBuffers

Started by
1 comment, last by Starnick 11 years, 6 months ago
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
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.
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.

This topic is closed to new replies.

Advertisement