【问题标题】:Write to DX11 backbuffer from C++AMP从 C++AMP 写入 DX11 后备缓冲区
【发布时间】:2014-09-25 07:31:40
【问题描述】:

根据这篇 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_RENDER_TARGET 并且我至少需要 D3D11_BIND_UNORDERED_ACCESS 或 D3D11_BIND_SHADER_RESOURCE 才能使 Concurrency::graphics::direct3d::make_texture 起作用。

如果我设置了 bindflags,我可以轻松地制作任何其他 d3d 纹理并将其连接到 amp,但对于后缓冲区上设置的标志,我无法连接它们。

然后我找到了这个帖子 http://social.msdn.microsoft.com/Forums/vstudio/en-US/15aa1186-210b-4ba7-89b0-b74f742d6830/c-amp-and-direct2d

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

我试图直接写入交换链的后台缓冲区。据我了解,这是无法做到的,因为创建后台缓冲区纹理时可以使用的使用标志与 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_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT;

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

这不是很丰富。

【问题讨论】:

  • 编辑了原帖

标签: c++ direct3d c++-amp


【解决方案1】:

我认为原始论坛帖子可能具有误导性。对于纹理和缓冲区互操作,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_array 来创建 使用加速器视图的数组,dxView,它是在 上一节:HRESULT hr = S_OK;

-- C++ AMP Book

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

Sobel Filter Compute Shader

【讨论】:

  • 感谢您的链接。似乎它也只是转向 UnorderedAccess,我确实尝试过,但如所述失败。我想我将不得不看看我是否可以以不同的方式设置 dx 设备。我没有提到的一件事是这是针对 Windows 商店应用程序的,这可能会使事情复杂化。
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多