Дублирование рабочего стола и 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 в отдельном потоке для получения изображений с рабочего стола и подачи их в конкретный конвейер обработки изображений.

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

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