从C++AMP写入DX11后缓冲区

Write to DX11 backbuffer from C++AMP

本文关键字:缓冲区 DX11 写入 C++AMP      更新时间:2023-10-16

根据这篇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计算着色器