我正在努力解决这个问题一个星期..我希望我能说出来 问题很清楚:
所以,我设置了我的自定义分配器/演示器,并在InitializeDevice()中 为VMR9创建纹理
然后,VMR9每次有新的时调用我的PresentImage()函数 帧。
我显示将此纹理渲染到四边形并呈现()它。如果 Present()返回D3DERR_DEVICELOST然后我将PostMessage()返回给我 WndProc()表示设备复位。
然后我的WndProc()在我的自定义对象上调用ResetDevice()。 ResetDevice()释放所有DEFAULT_POOL资源并调用Reset() 装置。现在让我们暂停一下
此时Direct3d给我一个错误,告诉我我仍然坚持 引用一些DEFAULT_POOL表面......我很确定我这样做 不是因为我释放了我分配的唯一纹理。这个问题是 据我所知,这是一个谜......有许多未经答复的论坛 关于这个问题的帖子可以追溯到2003年..
让我们改变车道。在这个论坛帖子
http://www.eggheadcafe.com/software/aspnet/29909616/i-did-some-more-e ...
据说你应该停止图表,断开所有引脚 VMR9,重置设备然后重新连接并再次运行图形。
当我这样做时,我得到另一个Direct3d投诉: Direct3D9 :(错误):尝试创建纹理失败 Direct3D9 :(错误):纹理宽度大于设备 支持。 CreateTexture失败。
我将问题追溯到某些功能,我在某些功能中看到了这个问题 VMR9深度计算之前宽度为2的下一个幂 创建一些纹理(除了我成功创建的纹理之外) 我的A / P)。在追踪时我意识到了这一点:
我的视频宽度为640. 640的2的下一个功率是1024.我明白了 这个值不知何故变成10240.虽然我甚至没有设置 分配宽度为1024.我只是通过640,因为我的视频卡没有 需要pow2纹理尺寸。
这是我卡住的地方..
有没有人知道有关重置/刷新的事情 VMR9设备??请帮忙。
提前致谢。
法提赫
答案 0 :(得分:0)
由于您有自定义分配器/演示者,我假设您正在使用IVMRSurfaceAllocatorNotify9 :: AllocateSurfaceHelper();并且这种方法可以潜在地分配多个表面,你确定在重置设备之前它们都被释放了吗?