2014-10-19 3 views
1

Я не могу найти способ позволить себе прочитать данные из моего массива AMP.Чтение данных буфера с использованием C++ AMP

Что я хочу иметь, это взять мой буфер, скопировать его в вектор, а затем использовать вектор. Я знаю, что я должен установить флаги доступа к процессору, но у меня возникают проблемы с этим.

Во-первых, я пытаюсь получить доступ к буферу. Я делаю это здесь сначала на всякий случай, когда я сделал что-то, как это не должно быть сделано. Возможно, есть встроенная функция, которую я пропустил, что делает это для меня?

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 должно реализовать интерфейс ID3D11Device с уровнем D3D_FEATURE_LEVEL_11_0 или выше. C++ AMP accelerator_views можно получить из нескольких потоков, поэтому устройство не должно создаваться с помощью набора D3D11_CREATE_DEVICE_FLAG D3D11_CREATE_DEVICE_SINGLETHREADED.

Буфер Direct3D должен реализовывать интерфейс ID3D11Bufferinterface. Он должен поддерживать необработанные представления (D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) и разрешать SHADER_RESOURCE и UNORDERED_ACCESSbinding. Сам буфер должен иметь правильный размер, размер которого равен , умноженному на размер типа буфера.

Вы можете создать C++ AMP accelerator, используя create_accelerator_view, как показано здесь.

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); 

Это все взято из главы 11 C++ AMP Book.

Смежные вопросы