我想在GPU上捕获并压缩屏幕。 C ++ AMP和DXGI桌面复制各自单独工作,但似乎无法协同工作。
示例:
This project效果很好,但在DesktopDuplication.cpp顶部附近添加最小的C ++ AMP代码会使其失败:
#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()
产生相同的结果。)
在我自己的项目中,当我尝试使用C ++ AMP时,IDXGIOutput1::DuplicateOutput()
会返回DXGI_ERROR_UNSUPPORTED
。
发生了什么事?
更新:在NVIDIA控制面板中,将“首选图形处理器”更改为“集成图形”。 (但是,使用NVIDIA显卡很多首选。)
答案 0 :(得分:0)
MSDN并未将此声明为强制性要求,但still suggests您未在多线程环境中使用该API:
应用程序可以在单独的线程上使用
IDXGIOutputDuplication
来接收桌面映像并将其提供给特定的图像处理管道。
也就是说,建议您使用与捕获更新的特定线程对齐的单个循环,并且您可以自由地利用各种多线程来加速处理。