使用C ++访问缓冲区 - AMP

时间:2014-11-09 15:59:09

标签: c++ buffer directx-11 c++-amp

有人可以帮我理解一下这里不起作用的步骤吗?

我正在尝试使用C ++ - AMP来执行并行for循环,但是尽管我的过程没有遇到任何问题或错误,但我无法获取最终数据。

我想通过映射来提取数据

m_pDeviceContext->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource);
{
    blah
}

但是我连续几天都在研究这个问题而且没有任何进展。

以下是我使用C ++做的所有事情 - AMP:

构造函数:我初始化我的变量因为我必须

: m_AcceleratorView(concurrency::direct3d::create_accelerator_view(reinterpret_cast<IUnknown *>(_pDevice)))
, m_myArray(_uiNumElement, m_AcceleratorView)

我将初始数据复制到C ++ - AMP数组

concurrency::copy(Data.begin(), m_myArray);

我对数据做了什么

concurrency::parallel_for_each(...) restrict(amp)
{
   blah
}

所有这一切似乎都很好,我没有遇到任何错误。

然而,我想要做的下一步是从缓冲区中提取数据,这似乎不起作用:

ID3D11Buffer* pBuffer = reinterpret_cast<ID3D11Buffer *>(concurrency::direct3d::get_buffer(m_myArray));

当我映射此数据(deviceContext-&gt; Map)时,内部数据为0x00000000

我忘记了哪一步可以让我阅读这些数据?即使我尝试设置CPU读/写访问类型,我也会收到错误,而且我甚至没有看到我的任何引用都这样做:

m_Accelerator.set_default_cpu_access_type(concurrency::access_type::access_type_read_write);

这会产生一个错误,说&#34;加速器不支持零复制&#34;

任何人都可以帮助我并告诉我为什么我无法读取缓冲区以及如何解决它?

1 个答案:

答案 0 :(得分:0)

以下代码应该适用于此。您还应该检查您的DX设备和C ++ AMP加速器是否与相同的硬件相关联。

HRESULT hr = S_OK;
array<int, 1> arr(1024);
CComPtr<ID3D11Buffer> buffer;
IUnknown* unkBuf = get_buffer(arr);
hr = unkBuf->QueryInterface(__uuidof(ID3D11Buffer), reinterpret_cast<LPVOID*>(&buffer));

这个问题有一个答案,告诉你如何做相反的事情。

Reading Buffer Data using C++ AMP