Дублирование рабочего стола и С++ AMP несовместимы?

Я хочу захватить и сжать экран на GPU. C++ AMP и DXGI Desktop Duplication работают по отдельности, но, похоже, не работают вместе.

Пример:

Этот проект отлично работает, но добавление минимального кода C++ AMP почти верхняя часть DesktopDupplication.cpp приводит к сбою:

#include <amp.h>
//void f() { Concurrency::direct3d::create_accelerator_view( nullptr ); }
//void f() { Concurrency::accelerator default_acc; }
void f() { Concurrency::accelerator::get_all(); }

Хотя f() никогда не вызывается, m_Factory->CreateSwapChainForHwnd(...) возвращает E_ACCESSDENIED. (Закомментированные версии f() дают тот же результат.)

В моем собственном проекте IDXGIOutput1::DuplicateOutput() возвращает DXGI_ERROR_UNSUPPORTED, когда я пытаюсь использовать C++ AMP.

В чем дело?


Обновление: в панели управления NVIDIA изменение «Предпочитаемого графического процессора» на «Встроенная графика» работает. (Но использование карты NVIDIA намного предпочтительнее.)


person Tom Sirgedas    schedule 22.11.2016    source источник


Ответы (1)


MSDN не называет это обязательным требованием, однако по-прежнему предлагает что вы не используете API в среде с несколькими потоками:

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

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

person Roman R.    schedule 25.07.2017