从C++AMP写入DX11后缓冲区
Write to DX11 backbuffer from C++AMP
根据这篇ms博客文章http://blogs.msdn.com/b/nativeconcurrency/archive/2012/07/02/interop-with-direct3d-textures-in-c-amp.aspx
您可以从C++AMP直接写入后缓冲区。
使用Interop,您可以使用IDXGISwapChain获取与窗口关联的后台缓冲区的纹理对象,并直接在C++AMP内核中更新它。
我从dx设备创建了一个amp设备描述符,我得到了一个指向backbuffer的指针,然后试图从中创建一个amp纹理,但我发现backbuffer中的纹理描述符bindFlags只有D3D11_BIND_REDR_TARGET,我至少需要D3D11_ BIND_UNDERED_ACCESS或D3D11_BIND_SHADER_RESOURCE才能使Concurrent::graphics::direct3d::make_texture发挥作用。
如果我设置了bindflags,我可以很容易地制作任何其他d3d纹理并将其连接到amp,但对于在backbuffer上设置的标志,我无法连接它们。
然后我找到这个帖子http://social.msdn.microsoft.com/Forums/vstudio/en-US/15aa1186-210b-4ba7-89b0-b74f742d6830/c-amp-and-direct2d
以下是微软社区贡献者的回答
我试图直接写入交换链的缓冲区。据我所知,这是不可能的,因为在创建后缓冲区纹理时可以使用的使用标志与C++AMP操作纹理所需的使用标志不兼容。
因此,一方面,它(从c++AMP写入后缓冲区)被用作互操作的一个示例,另一方面,这被解释为不可能。。。?
我目前的要求只是在C++AMP中生成一个光线跟踪图像,并在d3d显示器上显示,而无需每帧都从图形卡中复制数据。我意识到我可以生成自己的纹理,然后用它渲染一个四边形,但直接写入后缓冲区会更简单,如果可以做到,那就是我想做的。
也许这里有人可以解释是否可以做到这一点,以及需要采取哪些步骤来实现这一点;或者解释说,不,这真的不可能做到。
提前感谢您对本主题的任何帮助。
[编辑]我现在找到了此信息https://software.intel.com/en-us/articles/microsoft-directcompute-on-intel-ivy-bridge-processor-graphics
//这使后缓冲区成为计算着色器写入的目标sd.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT|DXGI_USAGE_URDERED_ACCESS|DXGI_USAGE_SHADER_INPUT;
我以前确实尝试过,但对CreateSwapChainForCoreWindow的调用失败TestDxAmp.exe中0x75251D4D处的首次机会异常:内存位置0x0328E484处的Microsoft C++异常:平台:InvalidArgumentException^。HRESULT:0x80070057参数不正确
这不是很有信息。
我认为最初的论坛帖子可能有误导性。对于纹理和缓冲区互操作,AMP互操作需要无序访问绑定。AMP建立在DX/DirectCompute之上,因此这两种情况都适用,如Intel链接中所述。
您的程序可以创建与现有Direct3D关联的数组使用make_array()函数缓冲。
template<typename T, int N>
array<T,N> make_array(const extent& ext, IUnknown* buffer);
Direct3D缓冲区必须实现ID3D11Buffer接口。它必须支持原始视图(D3D11_RESOURCE_MISC_BUFFER_ALLOW_raw_views)和允许SHADER_RESOURCE和UNORDERED_ACCESS绑定。缓冲区本身必须具有正确的大小,即范围的大小乘以缓冲区类型的大小。以下代码使用make_array创建使用accelerator_view dxView的数组,该数组是在上一节:HRESULT hr=S_OK;
--C++AMP图书
我不是DX专家,但从下面的帖子来看,你可以配置交换链来支持无人机。
Sobel Filter计算着色器
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- DX11 C++着色器无法接收实例缓冲区内容
- DX11 将顶点缓冲区映射为 WRL::ComPtr
- 从C++AMP写入DX11后缓冲区
- DX11正在丢失实例缓冲区数据
- DX11 OpenGL 互操作:无法复制缓冲区
- DX11动态大小的缓冲区