Проблема со сбросом устройства в режиме без рендеринга VMR9

Я борюсь с этой проблемой уже неделю. Надеюсь, я смогу достаточно ясно изложить проблему:

Итак, я настраиваю свой собственный распределитель/презентатор и в InitializeDevice() создаю текстуры для VMR9.

Затем VMR9 вызывает мою функцию PresentImage() каждый раз, когда появляется новый кадр.

Я отображаю визуализацию этой текстуры на четырехугольнике и использую Present(). Если 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: (ОШИБКА): Ширина текстуры больше, чем поддерживает устройство. Не удалось создать текстуру.

Я проследил проблему до какого-то момента, где я вижу, что в какой-то функции глубоко в VMR9 вычисляется следующая степень двойки ширины перед созданием некоторых текстур (кроме тех, которые я успешно создаю в своем A/P). И во время трассировки я понял следующее:

У меня ширина видео 640. Следующая степень двойки от 640 это 1024. И я вижу, что это значение каким-то образом становится 10240. Хотя я даже ширину выделения не ставлю 1024. Я просто передаю 640 так как моя видеокарта не требуют размеров текстуры pow2.

Вот тут я застрял..

Кто-нибудь знает что-нибудь о сбросе/обновлении устройства с помощью VMR9?? Пожалуйста помоги.

Заранее спасибо.

Фатих


person fgungor    schedule 06.05.2010    source источник


Ответы (1)


Поскольку у вас есть собственный распределитель/презентатор, я предполагаю, что вы используете IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper(); и этот метод потенциально может выделить несколько поверхностей, вы уверены, что все они будут освобождены до сброса устройства?

person thomas-t1    schedule 23.07.2010