我正在使用SharpDX开发一个应用程序,并在我的一台机器上调用
_swapChain = new SwapChain(factory, _device, desc);
错误消息失败。
HRESULT:0x887A0001,模块:SharpDX.DXGI,ApiCode:DXGI_错误_无效_呼叫/伤残电话,消息:未知
当我搜索错误时,我找到了这,它在其中声明:
DXGI_ERROR_INVALID_CALL (0x887A0001)应用程序提供了无效的参数数据;在应用程序释放之前,必须对其进行调试和修复。
但是怎么做呢?
错误消息没有给我任何关于为什么创建失败的指示。
我检查了调试层的输出,但这只显示了Info。没有警告,没有错误,没有。工厂和设备都创建得很好,我在我的SwapChainDescription中尝试了几个参数组合,但是错误始终保持不变。
我该如何找出是什么触发了这个错误?
我只想说清楚:我并不是在为我的具体问题寻找解决方案,而是想知道我将如何调试这样的问题。
这是简化的代码:
const int MAXFPS = 60;
const Format PIXELFORMAT = Format.R8G8B8A8_UNorm;
// Create device
_device = new Device(DriverType.Hardware, DeviceCreationFlags.None); // Or DeviceCreationFlags.Debug
// SwapChain description
var desc = new SwapChainDescription()
{
BufferCount = 2, // I tried 1 too
ModeDescription = new ModeDescription(_renderSize.Width, _renderSize.Height,
new Rational(MAXFPS, 1), PIXELFORMAT),
IsWindowed = true,
OutputHandle = _hwnd,
SampleDescription = _samples,
SwapEffect = SwapEffect.Discard,
Usage = Usage.RenderTargetOutput
};
// Create SwapChain
var factory = new SharpDX.DXGI.Factory();
_swapChain = new SwapChain(factory, _device, desc);
我确认示例描述是有效的,使用
_device.CheckMultisampleQualityLevels(PIXELFORMAT, _samples.Count) > _samples.Quality
(不过,这些都是1和0),它支持使用
_device.CheckFormatSupport(PIXELFORMAT).HasFlag(FormatSupport.RenderTarget)
同时也检查了
_hwnd != IntPtr.Zero
_renderSize.Width > 0
_renderSize.Height > 0
还有什么要查的?
更新:我按照这里的建议修复了这个问题:
我换了这个
Device device = new Device(DriverType.Hardware, DeviceCreationFlags.None);
Factory factory = new Factory();
SwapChain swapChain = new SwapChain(factory, device, desc);
至
Factory factory = new Factory();
var adapter = factory.GetAdapter(0);
Device device = new Device(adapter, DeviceCreationFlags.None);
SwapChain swapChain = new SwapChain(factory, device, desc);
发布于 2014-03-07 00:31:00
这通常发生在使用无效参数调用D3D函数时(例如,不允许使用空指针)。这正是SwapChain构造函数文档所说的:
InvalidCallException
方法调用无效。例如,方法的参数可能包含无效值。
您需要逐一检查为该函数提供的参数,特别是在这种情况下,您需要检查当前提供的参数是否正确(请参阅那些的C++文档,它提供了很多详细信息)。
在您的例子中,由于它在一台特定的机器上失败,您可能要求的是它的硬件不支持的东西,例如,对于图形芯片来说,D3D功能级别太高。
有时,它有助于检查Microsoft提供的示例,以检查它们传递哪些参数,并查看可能导致问题的差异。
https://gamedev.stackexchange.com/questions/71451
复制相似问题