2014-10-19 69 views
1

我似乎無法找到讓我自己讀取來自AMP數組的數據的方法。使用C++讀取緩衝區數據AMP

我想要做的就是拿走我的緩衝區,將它複製到一個矢量中,然後使用矢量。我知道我應該設置CPU訪問標誌,但是我很難這樣做。首先,這是我試圖訪問緩衝區的方式。我先把這個放在這裏,以防萬一我做了一些不該做的事情。也許有一個內置的功能,我錯過了這個對我來說呢?

std::vector<Pticle> vecParticles; 
    ID3D11Buffer* pBuffer = reinterpret_cast<ID3D11Buffer *>(concurrency::direct3d::get_buffer(m_arrParticles)); 
    D3D11_MAPPED_SUBRESOURCE MappedResource; 
    m_pDeviceContext->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource); 
    { 
     auto pData = (Pticle*)MappedResource.pData; 
     for (unsigned i = 0; i < m_uiNumParticles; ++i) 
     { 
      vecParticles.push_back(pData[i]); 
     } 
    } 
    m_pDeviceContext->Unmap(pBuffer, 0); 

基本上它應該從緩衝區中的所有數據寫入到載體

現在我知道我應該把我的訪問標誌,但我似乎無法做到這一點。我寫在下面的函數在我的initialise:

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

但是它打破,並出現以下錯誤

"Invalid access_type specified. accelerator does not support zero copy." 

我不知道這意味着什麼,如果我試圖將其設置閱讀和寫作,沒有通過測試?它也適用於我嘗試的任何訪問類型。

如何設置它,以便我可以從緩衝區中讀取數據?

回答

0

您可以創建一個DX緩衝區,然後使用make_array創建一個C++ AMP array

HRESULT hr = S_OK; 
UINT bufferSize = 1024; 
D3D11_BUFFER_DESC bufferDesc = 
{ 
    bufferSize * sizeof(float), 
    D3D11_USAGE_DEFAULT, 
    D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_SHADER_RESOURCE | 
     D3D11_BIND_UNORDERED_ACCESS, 
    0 /* no CPU access */, 
    D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS /* misc flags */, 
    sizeof(float) 
}; 
D3D11_SUBRESOURCE_DATA resourceData; 

ZeroMemory(&resourceData, sizeof(D3D11_SUBRESOURCE_DATA)); 
std::vector<float> vertices(bufferSize, 1.0f); 
resourceData.pSysMem = &vertices[0]; 
CComPtr<ID3D11Buffer> buffer; 
hr = device->CreateBuffer(&bufferDesc, &resourceData, &buffer); 
assert(SUCCEEDED(hr)); 

array<float, 1> arr = make_array<float, 1>(extent<1>(bufferSize), dxView, buffer); 
std::wcout << "Created array<float,1> on " 
    << arr.accelerator_view.accelerator.description << std::endl; 

請注意,設備和緩衝區必須滿足一組要求才能工作。 Direct3D設備必須實現具有D3D_FEATURE_LEVEL_11_0或更高功能級別的ID3D11設備接口。 C++ AMP accelerator_views可以從多個線程訪問,因此不應使用D3D11_CREATE_DEVICE_FLAG D3D11_CREATE_DEVICE_SINGLETHREADED集創建設備。

Direct3D緩衝區必須實現ID3D11Buffer接口。它必須支持原始視圖(D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS),並允許SHADER_RESOURCE和 UNORDERED_ACCESS綁定。緩衝區本身必須具有正確的大小,範圍的大小乘以緩衝區類型的大小。

您可以使用create_accelerator_view創建一個C++ AMP accelerator,如下所示。

HRESULT hr = S_OK; 
UINT createDeviceFlags = 0; 
#ifdef _DEBUG 
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; 
#endif 
std::array<D3D_FEATURE_LEVEL, 1> featureLevels = { D3D_FEATURE_LEVEL_11_0 }; 
CComPtr<ID3D11Device> device; 
D3D_FEATURE_LEVEL featureLevel; 
CComPtr<ID3D11DeviceContext> immediateContext; 
hr = D3D11CreateDevice(nullptr /* default adapter */, 
    D3D_DRIVER_TYPE_HARDWARE, 
    nullptr /* No software rasterizer */, 
    createDeviceFlags, 
    featureLevels.data(), 
    UINT(featureLevels.size()), 
    D3D11_SDK_VERSION, 
    &device, 
    &featureLevel, 
    &immediateContext); 
assert(SUCCEEDED(hr)); 

accelerator_view dxView = create_accelerator_view(device); 

這全部來自C++ AMP Book的第11章。