问题
We recently upgraded from VS 2005
to VS 2008
(Windows XP). We use SlimDx
in one of our projects. All was working ok after the upgrade, except my Recover function, which gets called on devicelost/device reset which crashes with
D3DERR_INVALIDCALL: Invalid call (-2005530516)
I use Ctrl-Alt-Del and then Escape to simulate device lost.
void Recover()
{
try
{
if (res.Code == D3DERR_DEVICENOTRESET)
{
res = m_device.Reset(m_presentParams); //Crashes on this.
if (res.IsSuccess)
{
m_deviceLost = false;
}
}
}
catch(Exception e)
{}
}
Is this something to do with VS 2008
, as it used to work nicely with VS 2005
?
回答1:
I found some helpful information in this forum post. Note the question on that forum related to VB but this is still good info. Full credit to Simon O'Connor.
Reformatted and edited slightly.
INVALIDCALL usually means that either a parameter you've passed to D3D is invalid or an operation you've requested isn't possible.
The easiest way to find out why a D3D call returned an INVALIDCALL error is to let it tell you:
- Make sure you're using the DEBUG version of the D3D runtime is installed (you were given the option when you installed the SDK).
- Make sure that the DEBUG version of the runtime is enabled. Go to the DirectX applet in the Control Panel and look under the Direct3D tab.
- Whilst in the DirectX control panel applet, increase the debug output level for Direct3D to maximum. I've not used Visual BASIC for over 10 years so I've forgotten what debugging support is available and I don't have it installed on this machine to check... If VB DOES have a debug output window:
- Run your program and let it fail with the INVALIDCALL error.
- Now look at all the text in your debug output window. D3D will log information, warnings, and importantly errors to that. It'll also explain the reason WHY a D3D call has failed.
If VB doesn't have a simple debug output window, download and run DebugView from http://www.sysinternals.com or use the command line debug viewer that comes with the DirectX SDK
回答2:
This usually happens when you didn't dispose all you resources (vertex buffer, texture, ...)
回答3:
void Recover()
{
try {
if (res.Code == D3DERR_DEVICENOTRESET)
{
res = m_device.Reset(m_presentParams); //Crashes on this.
if (res.IsSuccess)
{
m_deviceLost = false;
}
}
} catch(Exception e) {}
}
来源:https://stackoverflow.com/questions/2497641/slimdx-device-reset-crashes-with-a-d3derr-invalidcall-invalid-call-200553051