【D3D补遗】二 丢失设备

Posted on 2008-12-04 23:33  活着就是幸福  阅读(466)  评论(0编辑  收藏  举报
D3D设备可能处于可操作状态或者丢失状态。前者是正常状态。后者可能由失去键盘焦点或者全屏程序无法渲染造成。丢失状态的特点是所有的渲染操作都会返回成功值,但是渲染操作实际上失败了。这时 IDirect3DDevice9::Present会返回D3DERR_DEVICELOST。

会引起设备丢失的情况可能有:失去焦点,比如按下ALT+TAB 或者弹出一个系统对话框。也可能是由电源管理事件或者其他尝试全屏操作的程序引起。最后,IDirect3DDevice9::Reset 会把设备设为丢失状态。

丢失后,从 IUnknown接口继承的方法都担保会起作用。每个函数通常会有三种办法:

1. 返回D3DERR_DEVICELOST。
2. 悄悄失败。返回成功值。这时程序无法区别“成功”和“悄悄失败”。
3. 返回其他值。

Direct3D 9 和 Direct3D 9Ex(貌似针对Vista)区别:
前者等IDirect3DDevice9::Present返回D3DERR_DEVICELOST后所有的未来调用都失败,除非设备成功reset.
后者返回一些新状态。

设备丢失后,当reset时必须重新创建资源(包括显存资源)。如果设备丢失则程序查询设备是否可restore直到成功。

当restore设备后,程序需要释放所有显存资源和交换链,调用Reset方法。此方法是设备丢失后唯一起作用和唯一可以重置设备的方法。
如果没有释放由D3DPOOL_DEFAULT创建的资源则此方法失败。

但是实际上,IDirect3DDevice9::DrawPrimitive之类的方法可以继续画,只是在内部被丢弃了,直到设备被重置。可以调用IDirect3DDevice9::TestCooperativeLevel 来查询状态。

Locking 操作在设备丢失后仍然成功,但是不保证其作用。

设备丢失是切断程序和显卡内资源的联系。丢失设备后进行资源创建可能不会成功,但是看上去像成功了,可能只是分配了无用的系统内存。设备重置后所有的显卡资源都会释放,不存在溢出问题。这些无用的资源可能看上去正常地工作,直到IDirect3DDevice9::Present 调用发现设备丢失了。

顶点Shader和像素Shader不必重建。