首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何调试DXGI_ERROR_INVALID_CALL错误?

如何调试DXGI_ERROR_INVALID_CALL错误?
EN

Game Development用户
提问于 2014-03-06 12:44:06
回答 1查看 12.4K关注 0票数 6

我正在使用SharpDX开发一个应用程序,并在我的一台机器上调用

代码语言:javascript
运行
复制
_swapChain = new SwapChain(factory, _device, desc);

错误消息失败。

HRESULT:0x887A0001,模块:SharpDX.DXGI,ApiCode:DXGI_错误_无效_呼叫/伤残电话,消息:未知

当我搜索错误时,我找到了,它在其中声明:

DXGI_ERROR_INVALID_CALL (0x887A0001)应用程序提供了无效的参数数据;在应用程序释放之前,必须对其进行调试和修复。

但是怎么做呢?

错误消息没有给我任何关于为什么创建失败的指示。

我检查了调试层的输出,但这只显示了Info。没有警告,没有错误,没有。工厂和设备都创建得很好,我在我的SwapChainDescription中尝试了几个参数组合,但是错误始终保持不变。

我该如何找出是什么触发了这个错误?

我只想说清楚:我并不是在为我的具体问题寻找解决方案,而是想知道我将如何调试这样的问题。

这是简化的代码:

代码语言:javascript
运行
复制
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);

我确认示例描述是有效的,使用

代码语言:javascript
运行
复制
_device.CheckMultisampleQualityLevels(PIXELFORMAT, _samples.Count) > _samples.Quality

(不过,这些都是1和0),它支持使用

代码语言:javascript
运行
复制
_device.CheckFormatSupport(PIXELFORMAT).HasFlag(FormatSupport.RenderTarget)

同时也检查了

代码语言:javascript
运行
复制
_hwnd != IntPtr.Zero
_renderSize.Width > 0
_renderSize.Height > 0

还有什么要查的?

更新:我按照这里的建议修复了这个问题:

我换了这个

代码语言:javascript
运行
复制
Device device = new Device(DriverType.Hardware, DeviceCreationFlags.None);
Factory factory = new Factory();
SwapChain swapChain = new SwapChain(factory, device, desc);

代码语言:javascript
运行
复制
Factory factory = new Factory();
var adapter = factory.GetAdapter(0);
Device device = new Device(adapter, DeviceCreationFlags.None);
SwapChain swapChain = new SwapChain(factory, device, desc);
EN

回答 1

Game Development用户

回答已采纳

发布于 2014-03-07 00:31:00

这通常发生在使用无效参数调用D3D函数时(例如,不允许使用空指针)。这正是SwapChain构造函数文档所说的:

InvalidCallException方法调用无效。例如,方法的参数可能包含无效值。

您需要逐一检查为该函数提供的参数,特别是在这种情况下,您需要检查当前提供的参数是否正确(请参阅那些的C++文档,它提供了很多详细信息)。

在您的例子中,由于它在一台特定的机器上失败,您可能要求的是它的硬件不支持的东西,例如,对于图形芯片来说,D3D功能级别太高。

有时,它有助于检查Microsoft提供的示例,以检查它们传递哪些参数,并查看可能导致问题的差异。

票数 2
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/71451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档