Дублирование рабочего стола и C++ AMP несовместимы?
Я хочу захватить и сжать экран на графическом процессоре. C++ AMP и DXGI Desktop Duplication работают по отдельности, но, похоже, не работают вместе.
Пример:
Этот проект прекрасно работает, но добавление минимального кода C++ AMP в верхней части DesktopDuplication.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 намного предпочтительнее.)
1 ответ
MSDN не устанавливает это как обязательное требование, однако все же предлагает не использовать API в многопоточной среде:
Приложение может использовать
IDXGIOutputDuplication
в отдельном потоке для получения изображений с рабочего стола и подачи их в конкретный конвейер обработки изображений.
То есть предлагается, чтобы у вас был один цикл, выровненный по определенному потоку, который захватывает обновления, и в дальнейшем вы можете использовать многопоточность для ускорения обработки.