Reputation: 21469
I've been working on a DirectX application in C#, and I noticed that when I lock the workstation, the DirectX "Device" becomes lost. After looking up the information about what to do upon when a device is lost (and when a DeviceLostException
is thrown by Device.Present
), I re-wrote the code to reset the Device
. This simply meant that I made a call to Device.Reset
.
Calling Device.Reset
recovered the Device
. No problem. But when I lost the device a second time (for example, when the computer was locked, went to sleep, or activated a screen-saver), an exception was thrown by Device.Reset
.
The exception was InvalidCallException
, which (according to the documentation) means something went wrong with the call. So I assumed it was a problem with the arguments to the function. So instead of passing the same copy of PresentParams
that I used to create the Device, I created a new instance of PresentParams (at first using the copy constructor, and later by re-creating without it) and passed that to Device.Reset
.
Doesn't work. Device.Reset
still dies with the InvalidCallException
. Oh, and the message of the exception? "Error in application." Not helpful.
Can you point me in the direction of either a solution, or some documentation about how to get more debug information out of DirectX?
Upvotes: 3
Views: 2045
Reputation: 21469
OK, I know how silly is seems to answer my own question, but I figured someone else might need this, eh?
The answer is: there were too many calls to the Dispose
method of the VertexBuffer
s in the scene. The reason being that the internal Device
reset-handlers were calling the Dispose
method. And why was that happening? Because I had neglected to read the .NET DirectX SDK documentation regarding the Pool Enumeration, and was allocating the VertexBuffer
s using Pool.Default
instead of Pool.Managed
.
So obviously, after a few thousand badly done allocate-and-release cycles, something went wrong.
Oh, and how did I discover this? I attached a listener to VertexBuffer.Dispose
which incremented a counter that I displayed on-screen. Imagine my suprise when I noticed this counter kept growing as I resized the window!
Upvotes: 3