Совместное использование ресурсов Direct3D9ex и Direct3D10

Direct3D9ex позволяет обмениваться ресурсами между устройствами. Возможно ли использовать эти общие ресурсы с устройствами Direct3D10?

3 ответа

Решение

Да, вы можете разделять ресурсы между устройствами D3D9Ex и D3D10, используя методику, описанную здесь:

Обзор функций (Direct3D 9 для Windows Vista) - общие ресурсы

Обратите внимание, что доступ графического процессора к совместно используемым поверхностям не синхронизирован - например, если вы выполняете рендеринг на одну и ту же поверхность рендеринга одновременно на двух устройствах, ожидайте всевозможных повреждений и гонок.

Чтобы обойти это, убедитесь, что одно устройство завершило рендеринг на общую поверхность, прежде чем другое будет использовать его. Одним из вариантов является запрос события (IDirect3DQuery9), другой выполняет StretchRect на небольшой поверхности и блокирует его (если блокировка завершается успешно, GPU завершил всю предыдущую работу)

Вы можете делиться ресурсами Direct3D9 между устройствами или процессами.

Обзор функций (Direct3D 9 для Windows Vista) - общие ресурсы

Подобная техника работает для ресурсов Direct3D10 (вы также указываете дескриптор совместного использования).

В этом разделе GameDev.net подробно обсуждается совместное использование D3D9Ex и D3D10. Выводы в этой теме, как представляется, заключаются в том, что, хотя на основе документации это должно быть возможно (с некоторыми ограничениями), на практике это не работает вообще (возможно, ограничения настолько серьезны, что они препятствуют любому практическому сценарию использования?)

Кто-то поправит меня, если я ошибаюсь, но нет и нет.

Что вы намерены? Есть статическая текстура на двух устройствах? Если это так, это легко сделать, загрузив одну и ту же текстуру дважды в два разных пула по умолчанию. Просто знайте, что изменение одного не обязательно изменит другое.

Если вы пытаетесь поделиться управляемой текстурой на двух устройствах, я не думаю, что это достижимо при каком-либо контроле. SLI может сделать это за сценой, но вы не будете иметь никакого контроля над этим.

Если вы хотите явно использовать текстуру, сгенерированную с одного устройства на другом устройстве, вам придется загружать ее с исходного устройства и загружать ее на целевое устройство каждый кадр. Это будет медленно, но если это абсолютно необходимо, это можно сделать таким образом.

Другие вопросы по тегам