Темы Consumer-Producer с DirectX-фреймами рабочего стола - PullRequest
0 голосов
/ 14 мая 2018

Я пишу приложение DirectX с двумя потоками:

  • Поток производителя захватывает кадры рабочего стола с помощью DirectX (как в примере Desktop Duplication Desktop *1006*)

    IDXGIResource* DesktopResource = nullptr;
    ID3D11Texture2D *m_AcquiredDesktopImage = nullptr;
    HRESULT hr = m_DeskDupl->AcquireNextFrame(500, &FrameInfo, &DesktopResource);
    hr = DesktopResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void **>(&m_AcquiredDesktopImage));
    DesktopResource->Release();
    // The texture pointer I'm interested is m_AcquiredDesktopImage
    
  • Поток-потребитель выполняет операции обработки изображения на графическом процессоре.

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

Мой вопрос: я должен скопировать текстуру m_AcquiredDesktopImage в другую и вызвать ReleaseFrame, как только копирование будет завершено, и вернуть эту новую текстуру в поток производителя для обработки, или я могу просто уйти с возвратом m_AcquiredDesktopImage текстура указателя на потребительский поток? Это копия текстуры кадрового буфера или это текстура кадрового буфера, и я могу сгенерировать гонку данных, вернув ее?

Как правильно обращаться с производителем захваченных кадров и потребителем текстур GPU?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

... я должен скопировать текстуру m_AcquiredDesktopImage в другую и вызвать ReleaseFrame, как только копирование будет завершено, и вернуть эту новую текстуру в поток производителя для обработки или ...

Да, это путь.Вы получили свою текстуру, с ней покончено, и вы отпускаете ее, потому что данные больше не действительны после выпуска.

... могу ли я просто уйти с возвращением указателя текстуры m_AcquiredDesktopImage напотребительская нить?Является ли это копией текстуры кадрового буфера или текстурой кадрового буфера, и я могу сгенерировать гонку данных, вернув ее?

API продолжает обновлять эту текстуру.Вам обещают, что между успешным возвратом из AcquireNextFrame и вашим ReleaseFrame вызовом API не касается текстуры, и вы можете использовать ее.Если вы не можете завершить свое использование между упомянутыми вызовами (что является вашим случаем, после того как вы создали поток потребителя для асинхронного запуска для захвата), вы копируете данные и ReleaseFrame.После того, как вы выпустили его, API возобновит обновление.

Попытка использовать текстуру после ReleaseFrame приведет к одновременному доступу к текстуре, дальнейшим обновлениям вашего и API.

0 голосов
/ 14 мая 2018

Документация MSDN на ReleaseFrame немного запутана. В нем конкретно говорится, что вам нужно освободить текущий кадр перед обработкой следующего, и что состояние поверхности «недействительно» после выпуска, что указывает на то, что это не копия, или не копия, которой владеет ваш процесс (что приведет к тот же эффективный результат). В нем также говорится, что вам следует отложить вызов до ReleaseFrame до того момента, как вы вызовете AcquireNextFrame по соображениям производительности, что может вызвать некоторые интересные проблемы синхронизации, особенно с используемой моделью потоков.

Я думаю, вам лучше сделать копию (поэтому ReleaseFrame из предыдущего снимка AcquireNextFrame, CopyResource). Если вы не используете заборы, у вас нет никаких гарантий, что графический процессор будет потреблять ресурс до того, как поток вашего производителя вызовет ReleaseFrame, что может дать вам неопределенные результаты. И если вы используете , используя заборы, и вызов AcquireNextFrame откладывается до тех пор, пока графический процессор не завершит потребление данных предыдущего кадра, вы введете задержки и потеряете многие преимущества способности ЦП работать впереди графического процессора.

Мне любопытно, почему вы работаете с этой моделью потоков, когда работа выполняется на GPU. Я подозреваю, что это делает жизнь немного сложнее. Хотя создание копии текстуры устранит многие из этих осложнений.

...