从C ++ AMP写入DX11 backbuffer

时间:2014-09-25 07:31:41

标签: c++ direct3d 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设备创建了一个放大器设备描述符,我得到了一个指向后缓冲区的指针,然后尝试从它做一个放大器纹理,但是我发现backbuffer的纹理描述符bindFlags只有D3D11_BIND_RENDER_TARGET和我需要至少D3D11_BIND_UNORDERED_ACCESS或D3D11_BIND_SHADER_RESOURCE才能使Concurrency :: graphics :: direct3d :: make_texture正常运行。

我可以很容易地制作任何其他d3d纹理并将其连接到放大器,如果我设置了绑定标志,但是对于后备缓冲区上设置的标志,我无法连接它们。

然后我发现这篇文章 http://social.msdn.microsoft.com/Forums/vstudio/en-US/15aa1186-210b-4ba7-89b0-b74f742d6830/c-amp-and-direct2d

其中有以下标记为Microsoft社区贡献者的回答

  

我试图直接写入交换链的后台缓冲区。据我所知,这是无法做到的,因为在创建后缓冲区纹理时可以使用的使用标记与C ++ AMP操作纹理所需的标记不兼容。

所以,一方面,它(从c ++ AMP写入backbuffer)用作互操作的一个例子,另一方面它被解释为不可能......?

我目前的要求只是在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_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT;

我之前确实尝试过,但是对CreateSwapChainForCoreWindow的调用失败了 TestDxAmp.exe中0x75251D4D的第一次机会异常:Microsoft C ++异常:Platform :: InvalidArgumentException ^在内存位置0x0328E484。 HRESULT:0x80070057参数不正确。

这不是很有用。

1 个答案:

答案 0 :(得分:0)

我认为原来的论坛帖子可能会产生误导。对于纹理和缓冲互操作,AMP互操作需要无序访问绑定。 AMP建立在DX / DirectCompute之上,因此这适用于英特尔链接中所述的两种情况。

  

您的程序可以创建与现有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_arrayto create   一个使用accelerator_view的数组,dxView,它是在   上一节:HRESULT hr = S_OK;

- C++ AMP Book

我不是DX专家,但从以下帖子看,您可以配置交换链以支持无人机。

Sobel Filter Compute Shader