Использование C++ AMP с Direct2D

Можно ли использовать текстуру, сгенерированную C++ AMP, в качестве буфера экрана?

Я хотел бы создать изображение с моим кодом C++ AMP (уже выполненным) и использовать это изображение, чтобы заполнить весь экран приложения Windows 8 Metro. Изображение обновляется 60 раз в секунду.

Я совсем не владею Direct3D. В качестве отправной точки я использовал приложение-шаблон Direct2d.

Сначала я пытался напрямую манипулировать буфером из цепочки подкачки в коде C++ AMP, но любая попытка записи в эту текстуру вызывала ошибку.

Обработка данных с помощью AMP на графическом процессоре, а затем их перемещение в память ЦП для создания растрового изображения, которое я могу использовать в D2D API, кажется неэффективным.

Может ли кто-нибудь поделиться фрагментом кода, который позволил бы мне напрямую манипулировать текстурой буфера цепи обмена с C++ AMP (без выхода данных из графического процессора) или, по крайней мере, заполнить этот буфер данными из другой текстуры, которая не покидает графический процессор?


person Ghostrider    schedule 17.03.2013    source источник


Ответы (1)


Вы можете взаимодействовать между текстурой AMP‹> и буфером ID3D11Texture2D. Полный код и другие примеры взаимодействия можно найти в примерах главы 11 здесь.

//  Get a D3D texture resource from an AMP texture.

texture<int, 2> text(100, 100);
CComPtr<ID3D11Texture2D> texture;
IUnknown* unkRes = get_texture(text); 
hr = unkRes->QueryInterface(__uuidof(ID3D11Texture2D), 
    reinterpret_cast<LPVOID*>(&texture));   
assert(SUCCEEDED(hr));

// Create a texture from a D3D texture resource

const int height = 100; 
const int width = 100;

D3D11_TEXTURE2D_DESC desc; 
ZeroMemory(&desc, sizeof(desc)); 
desc.Height = height; 
desc.Width = width; 
desc.MipLevels = 1; 
desc.ArraySize = 1; 
desc.Format = DXGI_FORMAT_R8G8B8A8_UINT; 
desc.SampleDesc.Count = 1; 
desc.SampleDesc.Quality = 0; 
desc.Usage = D3D11_USAGE_DEFAULT; 
desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; 
desc.CPUAccessFlags = 0; 
desc.MiscFlags = 0;

CComPtr<ID3D11Texture2D> dxTexture = nullptr; 
hr = device->CreateTexture2D(&desc, nullptr, &dxTexture);
assert(SUCCEEDED(hr));

texture<uint4, 2> ampTexture = make_texture<uint4, 2>(dxView, dxTexture);
person Ade Miller    schedule 26.03.2013