+-

我正在编写一个非常简单的建模软件,这比其他任何事情都更具挑战性.
直到大约三周前,我对SwapChain.ResizeBuffers()函数没有真正的问题.
直到大约三周前,我对SwapChain.ResizeBuffers()函数没有真正的问题.
我更换了PC,切换到Visual Studio Express 2012(从Pro 9开始),并使用相应的SlimDX.dll将解决方案切换到x64.
它仍然可以正常运行,但是当我调整承载视口的窗口的大小时,它将得到:DXGI_ERROR_INVALID_CALL(-2005270527).
在Google上进行的快速搜索告诉我《战地风云3》在某些特定驱动程序上也可能存在该问题.可能吗?
我已经阅读了有关该功能的所有内容,并且以某种方式找不到现在使事情变得混乱的更改.希望有人能看到我在做什么错.
// 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);
}
最佳答案
您需要释放与交换链相关的所有资源,然后才能调整其大小.
这样就包括了渲染视图(您可以执行此操作),但是在创建渲染目标视图时会在资源上添加addref.
Resource.FromSwapChain<Texture2D>(swapChain, 0)
向纹理添加一个引用计数器.由于您不缓存它,因此无法释放它.
因此,您需要执行以下操作:
Texture2D resource = Texture2D.FromSwapChain<Texture2D>(swapChain, 0);
renderView = new RenderTargetView(device, resource);
然后在调用调整大小之前:
if (resource != null) { resource.Dispose(); }
刚刚在我的引擎上对其进行了测试,它就可以工作(也可以使用0,它也可以工作).
点击查看更多相关文章
转载注明原文:c#-ResizeBuffers时DirectX无效调用 - 乐贴网